找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4100|回复: 2
打印 上一主题 下一主题
收起左侧

一个电机+蓝牙+按键+PWM控制的小作品,大家看看可以给我什么建议

[复制链接]
跳转到指定楼层
楼主


  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar ch,temp=0;
  5. uchar news[]="gdmec--G1-717";
  6. uchar speed[14]="Speed:   r/s";
  7. sbit K1=P1^1;//减速
  8. sbit K2=P1^2;//加速
  9. sbit K3=P1^3;//启动
  10. sbit K4=P1^4;//停止
  11. sbit RS=P2^0;    //指示命令、状态或数据的引脚
  12. sbit RW=P2^1;   //读写引脚
  13. sbit EN=P2^2;   //使能引脚
  14. sbit LED=P1^0;
  15. sbit motor=P2^4;
  16. uchar motornum=50;
  17. bit stratflag;
  18. //----------------------------------------------
  19. void delay(uchar x)
  20. {
  21.         while(x--);
  22. }
  23. void delay_ms(uchar x)
  24. {
  25.         uchar i,y;
  26.         for(i=0;i<x;i++)
  27.                 for(y=0;y<200;y++);
  28. }
  29. //----------------------------------------------
  30. bit lcd1602_read_status()
  31. {//读取LCD1602的状态,结果为0说明不忙,可以对LCD1602写入数据或命令
  32.         uchar temp;
  33.         RW = 1;  //RW=1为读操作:单片机将LCD1602中的数据读出来
  34.         delay(2);
  35.         RS = 0;  //RS=0为读写命令或状态,=1读写数据
  36.         delay(2);
  37.         EN = 1;  //使能LCD1602
  38.         delay(2);
  39.         temp = P0;//将从LCD1602读到的信息存入临时变量temp中
  40.         delay(2);
  41.         EN = 0;  //关LCD1602
  42.         delay(2);
  43.         return (bit)(temp&0x80);//返回读到数据的最高位也即状态位
  44. }
  45. //----------------------------------------------
  46. void lcd1602_write_cmd(uchar cmd)
  47. {//对LCD1602写入命令的函数
  48.         while(lcd1602_read_status()!=0);
  49.         RW = 0;
  50.         delay(2);
  51.         RS = 0;
  52.         delay(2);
  53.         EN = 1;
  54.         delay(2);
  55.         P0 = cmd;
  56.         delay(2);        
  57.         EN = 0;
  58.         delay(2);
  59. }
  60. //---------------------------------------------
  61. void lcd1602_write_dat(uchar dat)
  62. {//对LCD1602写入数据的函数
  63.         while(lcd1602_read_status()!=0);
  64.         RW = 0;
  65.         delay(2);
  66.         RS = 1;
  67.         delay(2);
  68.         EN = 1;
  69.         delay(2);
  70.         P0 = dat;
  71.         delay(2);
  72.         EN = 0;
  73.         delay(2);        
  74. }
  75. //---------------------------------------------
  76. void lcd1602_init()
  77. {
  78.         lcd1602_write_cmd(0x38);//设置LCD1602的数据位数
  79.         lcd1602_write_cmd(0x0c);//设置LCD1602的显示开关和光标
  80.         lcd1602_write_cmd(0x01);//清屏,将光标置于第1行第1列
  81.         lcd1602_write_cmd(0x06);//设置光标移动的方式并确定整体显示是否移动        
  82.         delay(200);             //仿真中这里的延时要足够长,否则有可能出错
  83. }
  84. void motor_init(uchar num)
  85. {
  86.         motor=1;
  87.         delay_ms(num);
  88.         motor=0;
  89.         delay_ms(100-num);
  90. }
  91. /*串口初始化程序*/
  92. void Uart_init()
  93. {         
  94.         PCON|=0X80;
  95.         TMOD=0X20;
  96.         SCON = 0x50;                //8位数据,可变波特率
  97.         TL1 = 0xFA;                //设定定时初值        0xFA为11.0592MHz的晶振频率
  98.         TH1 = 0xFA;                //设定定时初值        0xFD为12MHz的晶振频率
  99.         ET1 = 0;                //禁止定时器1中断
  100.         TR1 = 1;                //启动定时器1
  101.         EA=1;
  102.         ES=1;
  103. }
  104. uchar key_init()
  105. {
  106.         if(stratflag)
  107.         {
  108.                 if(K1==0)
  109.                 {
  110.                         delay_ms(2000);
  111.                         if(K1==0)
  112.                         {
  113.                                 delay_ms(2000);
  114.                                 motornum=motornum-5;
  115.                                 if((motornum<1)||(motornum>230))
  116.                                 motornum=1;        
  117.                         }
  118.                 }
  119.                 if(K2==0)
  120.                 {
  121.                         delay_ms(2000);
  122.                         if(K2==0)
  123.                         {
  124.                                 delay_ms(2000);
  125.                                 motornum=motornum+5;
  126.                                 if(motornum>=99)
  127.                                 motornum=99;
  128.                         }        
  129.                 }
  130.         }
  131.         if(K3==0)
  132.         {
  133.                 delay_ms(2000);
  134.                 if(K3==0)
  135.                 {
  136.                         delay_ms(2000);        
  137.                         stratflag=1;        
  138.                 }
  139.         }
  140.         if(K4==0)
  141.         {
  142.                 delay_ms(2000);
  143.                 if(K4==0)
  144.                 {
  145.                         delay_ms(2000);
  146.                         stratflag=0;        
  147.                 }
  148.         }
  149.          return motornum;
  150. }
  151. /*液晶显示函数*/
  152. void display()
  153. {
  154.         uchar i;
  155.         speed[6]=temp/100+'0';
  156.         speed[7]=temp%100/10+'0';
  157.         speed[8]=temp%10+'0';
  158.         lcd1602_write_cmd(0x80+1);
  159.         for(i=0;i<14;i++)
  160.         {
  161.                  lcd1602_write_dat(news[i]);
  162.         }
  163.         lcd1602_write_cmd(0xC0+1);
  164.         for(i=0;i<14;i++)
  165.         {
  166.                  lcd1602_write_dat(speed[i]);
  167.         }
  168. }
  169. /*主函数*/
  170. void main()
  171. {
  172.         lcd1602_init();
  173.         Uart_init();
  174.         while(1)
  175.         {         
  176.                 key_init();
  177.                 if(stratflag)
  178.                 {
  179.                         LED=0;
  180.                          temp=key_init();
  181.                          display();
  182.                         motor_init(temp);
  183.                 }
  184.                  else
  185.                  {
  186.                          LED=1;
  187.                          display();
  188.                         motor=1;
  189.                  }                 
  190.         }        
  191. }
  192. /*串口外部中断函数*/
  193. void Uart_server() interrupt 4
  194. {
  195.         if(RI==1)
  196.         {
  197.                 ch=SBUF;
  198.                 RI=0;
  199.         }
  200.         switch(ch)
  201.         {
  202.                 case'a':
  203.                         if(stratflag)
  204.                         {
  205.                                 motornum=motornum-5;
  206.                                 if((motornum<1)||(motornum>230))
  207.                                 motornum=1;
  208.                         };break;
  209.                 case's':
  210.                         if(stratflag)
  211.                         {
  212.                                 motornum=motornum+5;
  213.                                 if(motornum>=99)
  214.                                 motornum=99;
  215.                         };break;
  216.                 case'd':stratflag=1;break;
  217.                 case'f':stratflag=0;break;
  218.                 temp=motornum;
  219.         }
  220. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:260645 发表于 2017-12-12 14:18 | 只看该作者
大哥,有成品吗
回复

使用道具 举报

板凳
ID:260645 发表于 2017-12-12 14:18 | 只看该作者
大哥,有成品吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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