找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7186|回复: 10
收起左侧

单片机电机转速表设计+仿真+C程序

  [复制链接]
ID:195660 发表于 2017-7-22 16:24 | 显示全部楼层 |阅读模式
366-电机转速表设计仿真原理图+C程序
0.png 0.png
单片机源程序如下:
  1. //实例100:电机转速表设计
  2. #include<reg51.h>    //包含单片机寄存器的头文件
  3. #include<intrins.h>  //包含_nop_()函数定义的头文件
  4. sbit RS=P2^0;    //寄存器选择位,将RS位定义为P2.0引脚
  5. sbit RW=P2^1;    //读写选择位,将RW位定义为P2.1引脚
  6. sbit E=P2^2;     //使能信号位,将E位定义为P2.2引脚
  7. sbit BF=P0^7;    //忙碌标志位,,将BF位定义为P0.7引脚
  8. unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字
  9. unsigned int v;   //储存电机转速
  10. unsigned char count;  //储存定时器T0中断次数
  11. bit flag;      //计满1秒钟标志位
  12. /*****************************************************
  13. 函数功能:延时1ms
  14. (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
  15. ***************************************************/
  16. void delay1ms()
  17. {
  18.    unsigned char i,j;       
  19.          for(i=0;i<10;i++)
  20.           for(j=0;j<33;j++)
  21.            ;                 
  22. }
  23. /*****************************************************
  24. 函数功能:延时若干毫秒
  25. 入口参数:n
  26. ***************************************************/
  27. void delay(unsigned char n)
  28. {
  29.    unsigned char i;
  30.         for(i=0;i<n;i++)
  31.            delay1ms();
  32. }

  33. /*****************************************************
  34. 函数功能:判断液晶模块的忙碌状态
  35. 返回值:result。result=1,忙碌;result=0,不忙
  36. ***************************************************/
  37. unsigned char BusyTest(void)
  38.   {
  39.     bit result;
  40.         RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态
  41.     RW=1;
  42.     E=1;        //E=1,才允许读写
  43.     _nop_();   //空操作
  44.     _nop_();
  45.     _nop_();
  46.     _nop_();   //空操作四个机器周期,给硬件反应时间       
  47.     result=BF;  //将忙碌标志电平赋给result
  48.    E=0;         //将E恢复低电平
  49.    return result;
  50.   }
  51. /*****************************************************
  52. 函数功能:将模式设置指令或显示地址写入液晶模块
  53. 入口参数:dictate
  54. ***************************************************/
  55. void WriteInstruction (unsigned char dictate)
  56. {   
  57.     while(BusyTest()==1); //如果忙就等待
  58.          RS=0;                  //根据规定,RS和R/W同时为低电平时,可以写入指令
  59.          RW=0;   
  60.          E=0;                   //E置低电平(根据表8-6,写指令时,E为高脉冲,
  61.                           // 就是让E从0到1发生正跳变,所以应先置"0"
  62.          _nop_();
  63.          _nop_();             //空操作两个机器周期,给硬件反应时间
  64.          P0=dictate;            //将数据送入P0口,即写入指令或地址
  65.          _nop_();
  66.          _nop_();
  67.          _nop_();
  68.          _nop_();               //空操作四个机器周期,给硬件反应时间
  69.          E=1;                   //E置高电平
  70.          _nop_();
  71.          _nop_();
  72.          _nop_();
  73.          _nop_();               //空操作四个机器周期,给硬件反应时间
  74.           E=0;                  //当E由高电平跳变成低电平时,液晶模块开始执行命令
  75. }
  76. /*****************************************************
  77. 函数功能:指定字符显示的实际地址
  78. 入口参数:x
  79. ***************************************************/
  80. void WriteAddress(unsigned char x)
  81. {
  82.      WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
  83. }
  84. /*****************************************************
  85. 函数功能:将数据(字符的标准ASCII码)写入液晶模块
  86. 入口参数:y(为字符常量)
  87. ***************************************************/
  88. void WriteData(unsigned char y)
  89. {
  90.     while(BusyTest()==1);  
  91.           RS=1;           //RS为高电平,RW为低电平时,可以写入数据
  92.           RW=0;
  93.           E=0;            //E置低电平(根据表8-6,写指令时,E为高脉冲,
  94.                        // 就是让E从0到1发生正跳变,所以应先置"0"
  95.           P0=y;           //将数据送入P0口,即将数据写入液晶模块
  96.           _nop_();
  97.           _nop_();
  98.           _nop_();
  99.      _nop_();       //空操作四个机器周期,给硬件反应时间
  100.           E=1;          //E置高电平
  101.           _nop_();
  102.           _nop_();
  103.           _nop_();
  104.          _nop_();        //空操作四个机器周期,给硬件反应时间
  105.          E=0;            //当E由高电平跳变成低电平时,液晶模块开始执行命令
  106. }
  107. /*****************************************************
  108. 函数功能:对LCD的显示模式进行初始化设置
  109. ***************************************************/
  110. void LcdInitiate(void)
  111. {
  112.    delay(15);             //延时15ms,首次写指令时应给LCD一段较长的反应时间
  113.    WriteInstruction(0x38);  //显示模式设置:16×2显示,5×7点阵,8位数据接口
  114.         delay(5);               //延时5ms ,给硬件一点反应时间
  115.    WriteInstruction(0x38);
  116.         delay(5);
  117.         WriteInstruction(0x38); //连续三次,确保初始化成功
  118.         delay(5);
  119.         WriteInstruction(0x0c);  //显示模式设置:显示开,无光标,光标不闪烁
  120.         delay(5);
  121.         WriteInstruction(0x06);  //显示模式设置:光标右移,字符不移
  122.         delay(5);
  123.         WriteInstruction(0x01);  //清屏幕指令,将以前的显示内容清除
  124.         delay(5);

  125. }
  126. /******************************************************************************
  127. 函数功能:显示速度提示符                       
  128. ******************************************************************************/
  129. void display_sym(void)
  130. {
  131.    WriteAddress(0x00);  //写显示地址,将在第1行第1列开始显示
  132.         WriteData('v');      //将字符常量v写入LCD
  133.         WriteData('=');      //将字符常量=写入LCD

  134. }
  135. /******************************************************************************
  136. 函数功能:显示速度数值                        
  137. ******************************************************************************/
  138. void display_val(unsigned int x)
  139. {
  140. unsigned char i,j,k,l;     //j,k,l分别储存温度的百位、十位和个位
  141.         i=x/1000;         //取千位
  142.         j=(x%1000)/100;   //取百位
  143.    k=(x%100)/10;     //取十位
  144.    l=x%10;           //取个位
  145.         WriteAddress(0x02);     //写显示地址,将在第1行第3列开始显示
  146.         WriteData(digit[i]);    //将千位数字的字符常量写入LCD
  147.         WriteData(digit[j]);    //将百位数字的字符常量写入LCD
  148.         WriteData(digit[k]);    //将十位数字的字符常量写入LCD
  149.         WriteData(digit[l]);    //将个位数字的字符常量写入LCD
  150.          
  151. }
  152. /*******************************************************
  153. 函数功能:显示速度单位“r/min”
  154. ********************************************************/
  155. void display_unit(void)
  156. {
  157.    WriteAddress(0x06);    //写显示地址,将在第2行第7列开始显示
  158.         WriteData('r');    //将字符常量r写入LCD
  159.         WriteData('/');    //将字符常量/写入LCD
  160.         WriteData('m');    //将字符常量m写入LCD
  161.         WriteData('i');    //将字符常量i写入LCD
  162.         WriteData('n');    //将字符常量n写入LCD
  163. }
  164. /*******************************************************
  165. 函数功能:主函数
  166. ********************************************************/
  167. void main(void)
  168. {
  169.    LcdInitiate();            //调用LCD初始化函数       
  170.    TMOD=0x51;                //定时器T1工作于计数模式1,定时器T0工作于计时模式1;
  171.         TH0=(65536-46083)/256;    //定时器T0的高8位设置初值,每50ms产生一次中断
  172.         TL0=(65536-46083)%256;    //定时器T0的低8位设置初值,每50ms产生一次中断
  173.         EA=1;                     //开总中断
  174.         ET0=1;                    //定时器T0中断允许
  175.         TR0=1;                    //启动定时器T0
  176.         count=0;                  //将T0中断次数初始化为0
  177.         display_sym();            //显示速度提示符
  178.   display_val(0000);         //显示器工作正常标志
  179.   display_unit();            //显示速度单位
  180.          while(1)                 //无限循环
  181.           {
  182.              TR1=1;            //定时器T1启动
  183.                   TH1=0;            //定时器T1高8位赋初值0
  184.                   TL1=0;            //定时器T1低8位赋初值0
  185.                   flag=0;           //时间还未满1分钟
  186. ……………………

  187. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
366-电机转速表设计 仿真 C程序.zip (61.32 KB, 下载次数: 186)

评分

参与人数 1黑币 +6 收起 理由
Jeff_BlindCat + 6 备注明确,电路连接简单明了,授精。

查看全部评分

回复

使用道具 举报

ID:495287 发表于 2020-7-7 00:27 | 显示全部楼层
电路明确上手通,
代码工整好性情,
备注清晰不迷路,
疯狂调试共执行。
回复

使用道具 举报

ID:9474 发表于 2017-7-23 07:05 来自手机 | 显示全部楼层
好贴,非常好。
回复

使用道具 举报

ID:157975 发表于 2017-8-8 16:06 | 显示全部楼层
U2是个神马鬼?
回复

使用道具 举报

ID:226129 发表于 2017-8-9 14:55 | 显示全部楼层
感觉挺好的。
回复

使用道具 举报

ID:44165 发表于 2018-3-5 15:34 | 显示全部楼层

好贴,非常好。
回复

使用道具 举报

ID:330988 发表于 2018-5-16 14:04 | 显示全部楼层
电路图有吗  给看一下呗
回复

使用道具 举报

ID:465022 发表于 2019-1-9 02:31 | 显示全部楼层

电路图有吗  给看一下呗
回复

使用道具 举报

ID:524699 发表于 2019-4-29 19:49 | 显示全部楼层
同求电路图,有人能发一下吗
回复

使用道具 举报

ID:739012 发表于 2020-7-6 22:22 | 显示全部楼层
楼主左边的单片机是用做给脉冲的吗?请问有没有程序原件!
回复

使用道具 举报

ID:456595 发表于 2021-11-16 16:32 | 显示全部楼层
非常实用,下载了,谢谢楼主分享~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表