找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4627|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

一個電機+藍牙+按鍵+PWM控制的小作品,大家看看可以給我什么建議

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:203208 發(fā)表于 2017-6-3 20:12 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式


  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;    //指示命令、狀態(tài)或數(shù)據(jù)的引腳
  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的狀態(tài),結(jié)果為0說明不忙,可以對LCD1602寫入數(shù)據(jù)或命令
  32.         uchar temp;
  33.         RW = 1;  //RW=1為讀操作:單片機將LCD1602中的數(shù)據(jù)讀出來
  34.         delay(2);
  35.         RS = 0;  //RS=0為讀寫命令或狀態(tài),=1讀寫數(shù)據(jù)
  36.         delay(2);
  37.         EN = 1;  //使能LCD1602
  38.         delay(2);
  39.         temp = P0;//將從LCD1602讀到的信息存入臨時變量temp中
  40.         delay(2);
  41.         EN = 0;  //關(guān)LCD1602
  42.         delay(2);
  43.         return (bit)(temp&0x80);//返回讀到數(shù)據(jù)的最高位也即狀態(tài)位
  44. }
  45. //----------------------------------------------
  46. void lcd1602_write_cmd(uchar cmd)
  47. {//對LCD1602寫入命令的函數(shù)
  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寫入數(shù)據(jù)的函數(shù)
  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);//設(shè)置LCD1602的數(shù)據(jù)位數(shù)
  79.         lcd1602_write_cmd(0x0c);//設(shè)置LCD1602的顯示開關(guān)和光標
  80.         lcd1602_write_cmd(0x01);//清屏,將光標置于第1行第1列
  81.         lcd1602_write_cmd(0x06);//設(shè)置光標移動的方式并確定整體顯示是否移動        
  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位數(shù)據(jù),可變波特率
  97.         TL1 = 0xFA;                //設(shè)定定時初值        0xFA為11.0592MHz的晶振頻率
  98.         TH1 = 0xFA;                //設(shè)定定時初值        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. /*液晶顯示函數(shù)*/
  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. /*主函數(shù)*/
  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. /*串口外部中斷函數(shù)*/
  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. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:260645 發(fā)表于 2017-12-12 14:18 | 只看該作者
大哥,有成品嗎
回復(fù)

使用道具 舉報

板凳
ID:260645 發(fā)表于 2017-12-12 14:18 | 只看該作者
大哥,有成品嗎
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表