久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

單片機(jī)控制直流電機(jī)啟動(dòng)和正反轉(zhuǎn)程序,按鍵的時(shí)候要按鍵好幾次才啟動(dòng)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這段程序是控制直流電機(jī)啟動(dòng)和正反轉(zhuǎn)的,電路圖我也放上了,程序不太對(duì),按鍵的時(shí)候要按鍵好幾次才啟動(dòng),正反轉(zhuǎn)按鈕也不好使,有沒(méi)有大佬給改改。


單片機(jī)源程序如下:

  1. #include"reg51.h"
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. void delay1(uint ms);
  6. sbit k1=P1^0;                                  //啟停按鍵K1
  7. sbit k2=P1^1;                                  //正反轉(zhuǎn)按鍵K2
  8. sbit up=P1^2;                                  //加速按鍵up
  9. sbit down=P1^3;                                  //減速按鍵down
  10. sbit in1=P1^5;                                  //正反轉(zhuǎn)輸入口
  11. sbit in2=P1^6;
  12. sbit ENA=P1^7;                                  //PWM信號(hào)輸入口
  13. sbit LED1=P2^3;                                   //綠燈正轉(zhuǎn)
  14. sbit LED2=P2^4;                                   //紅燈反轉(zhuǎn)
  15. uchar a=1;
  16. uchar count=40;                              //速度上限
  17. uchar t=0;
  18. char speed=20;                              //初始速度

  19. /*-----------------------端口命名------------------------*/
  20. sbit rs=P2^0;                 //LCD的數(shù)據(jù)/命令選擇端
  21. sbit rw=P2^1;                  //LCD的讀寫選擇端
  22. sbit e=P2^2;                   //LCD的使能信號(hào)端  
  23. /*-------------------------------------------------------*/
  24. /*-----------------------定義參數(shù)------------------------*/
  25. uint i,z,cou,zhuan,msec;     //定義參數(shù)
  26. uchar display[]={"speed=     r/min "};     //定義顯示參數(shù)
  27. /*-------------------------------------------------------*/
  28. /*-----------------------正反轉(zhuǎn)延時(shí)函數(shù)------------------*/
  29. void delay(void)
  30. {
  31.         uchar i,j,k;
  32.         for(i=50;i>0;i--)
  33.         {
  34.                 for(j=100;j>0;j--)
  35.                         for(k=230;k>0;k--);
  36.         }
  37. }
  38. /*------------------------------------------------------*/
  39. /*-----------------------啟停函數(shù)------------------------*/
  40. void qiting()                                //b為啟停標(biāo)志
  41. {
  42.         if(k1==0)
  43.         {
  44.                                            delay1(20);
  45.              if(k1==0){

  46.                         LED1=1;
  47.                         LED2=0;
  48.                          ENA=1;



  49.         }}
  50.         else
  51.         {
  52.                 LED1=0;
  53.                 LED2=0;
  54.                 ENA=0;

  55.         }
  56. }         
  57. /*-------------------------------------------------------*/
  58. /*-----------------------正反轉(zhuǎn)函數(shù)----------------------*/
  59. void zhengfan()
  60. {        if(k1==1)
  61.         {
  62.                                              
  63.                 ENA=0;
  64.         }
  65.         else if(k2==1)                       //正轉(zhuǎn)
  66.         {
  67.                 LED1=1;
  68.                 LED2=0;
  69.                 delay();
  70.                 ENA=1;
  71.                 in1=1;
  72.                 in2=0;
  73.         }
  74.         else if(k2==0)                                  //開關(guān)按下反轉(zhuǎn)
  75.         {
  76.                 LED1=0;
  77.                 LED2=1;
  78.                 delay();
  79.                 ENA=1;
  80.                 in1=0;
  81.                 in2=1;
  82.         }               
  83. }
  84. /*--------------------------------------------------------*/
  85. /*-----------------------增減速函數(shù)-----------------------*/
  86. void speed_control()
  87. {

  88.         if(up==0)                                         //增速
  89.         {
  90.                 speed++;
  91.                 while(up==0)                     //即時(shí)對(duì)計(jì)滿數(shù)的speed值控制在設(shè)定范圍之內(nèi)
  92.                 if(speed>count)speed=count;
  93.         }
  94.         if(down==0)                                            //減速
  95.         {
  96.                 speed--;
  97.                 while(down==0)                 
  98.                 if(speed<0)speed=0;
  99.         }
  100. }
  101. /*----------------------------------------------------------------------------*/
  102. /*-------輸出PWM的定時(shí)器中斷(與增減函數(shù)配合輸出PWM信號(hào))---------------------*/
  103. void timer0_PWM() interrupt 3  //計(jì)滿1ms跳一次,有speed個(gè)之后PWM跳變
  104. {
  105.         if(k1==0)
  106.         {
  107.                 if(t<speed)        ENA=1;
  108.                 else ENA=0;
  109.                 t++;
  110.                 if(t>=count)t=0;
  111.         }
  112. }
  113. /*-------------------------------------------------------*/
  114. /*-----------------------毫秒延時(shí)------------------------*/
  115. void delay1(uint ms)
  116. {  
  117.         uint i,j;               //為延時(shí)引入i,j兩參數(shù)  
  118.         for (j=0;j<ms;j++)      //延時(shí)第一循環(huán)   
  119.         for (i=0;i<120;i++);    //延時(shí)第二循環(huán)  
  120. }
  121. /*-------------------------------------------------------*/
  122. /*--------------------向LCD1602寫命令--------------------*/
  123. void write_command(uchar command)
  124. {
  125.         rs=0;           //數(shù)據(jù)、命令選擇端0為命令
  126.         rw=0;           //讀、寫選擇端0為寫
  127.         P0=command;      //向LCD寫命令
  128.         delay1(5);      //稍做延遲,代替檢測(cè)忙狀態(tài)  
  129.         e=1;             //信號(hào)使能端高電平
  130.         delay1(5);      //稍做延遲,代替檢測(cè)忙狀態(tài)  
  131.         e=0;            //信號(hào)使能端低電平
  132. }
  133. /*-------------------------------------------------------*/
  134. /*--------------------向LCD1602寫數(shù)據(jù)--------------------*/
  135. void write_data(uchar data0)
  136. {
  137.         rs=1;       //數(shù)據(jù)、命令選擇端 1為數(shù)據(jù)
  138.         rw=0;       //讀、寫選擇端0為寫
  139.         P0=data0;      //向LCD寫數(shù)據(jù)
  140.         delay1(5);      //稍做延遲,代替檢測(cè)忙狀態(tài)
  141.         e=1;      //信號(hào)使能端高電平
  142.         delay1(5);     //稍做延遲,代替檢測(cè)忙狀態(tài)
  143.         e=0;      //信號(hào)使能端低電平
  144. }
  145. /*-------------------------------------------------------*/
  146. /*-------------------外部中斷1計(jì)數(shù)程序-------------------*/
  147. void counter(void) interrupt 2
  148. {   

  149.         cou++;  
  150.         if(cou==2)      //2次循環(huán)為發(fā)動(dòng)機(jī)轉(zhuǎn)一圈  
  151.         {   
  152.                 cou=0;     //初始化計(jì)數(shù)   
  153.              z++;      //轉(zhuǎn)圈計(jì)數(shù)加1
  154.           }   


  155. }
  156. /*-------------------------------------------------------*/
  157. /*------------------------LCD顯示------------------------*/
  158. void displaytolcd()
  159. {  
  160.   write_command(0x80);     //向LCD1602寫命令80H  
  161.   for (i=0;i<sizeof(display)-1;i++)   //循環(huán)要傳輸?shù)淖址麄(gè)數(shù)次,每一次傳一個(gè)字符  
  162.   {   
  163.     write_data(display[i]);   
  164.       delay1(5);  
  165.   }
  166. }
  167. /*-------------------------------------------------------*/  
  168. /*-----------------內(nèi)部中斷0計(jì)時(shí)計(jì)數(shù)程序-----------------*/
  169. void Timer_0(void) interrupt 1
  170. {  
  171.    TH0=0x3c;      //50ms定時(shí)  
  172.    TL0=0xb0;  
  173.    msec++;  
  174.    if(msec==20)      //50*20=1S  
  175.    {   
  176.         msec=0;
  177.         zhuan=60*z;        //每分鐘轉(zhuǎn)速
  178.         displaytolcd();   

  179.         z=0;

  180.    }
  181. }
  182. /*-------------------------------------------------------*/
  183. /*-----------------------數(shù)據(jù)處理------------------------*/
  184. void  disp_count()
  185. {  
  186. display[7]=(zhuan/1000+'0');    //轉(zhuǎn)換轉(zhuǎn)速的千位  
  187. display[8]=(zhuan/100%10+'0');    //轉(zhuǎn)換轉(zhuǎn)速的百位  
  188. display[9]=(zhuan/10%10+'0');    //轉(zhuǎn)換轉(zhuǎn)速的十位   
  189. display[10]=(zhuan%10+'0');    //轉(zhuǎn)換轉(zhuǎn)速的個(gè)位
  190. }
  191. /*-------------------------------------------------------*/
  192. /*----------------------端口初始化-----------------------*/
  193. void int_all()
  194. {  
  195.                   in1=1;                        //下面五行為啟停、正反轉(zhuǎn)初始化
  196.                 in2=0;                        //2
  197.                 LED1=0;                        //3
  198.                 LED2=0;                        //4
  199.                 ENA=0;                        //5
  200.         z=0;       //初始化z的值  
  201.         cou=0;      //初始化co的值  
  202.         zhuan=0;      //初始化轉(zhuǎn)的值  
  203.         rw=0;       //選擇LCD寫數(shù)據(jù)指令  
  204.         delay1(15);      //延時(shí)15ms  
  205.         write_command(0x38);     //向LCD1602寫命令38H  
  206.         delay1(5);      //延時(shí)5ms  
  207.         write_command(0x0e);     //向LCD1602寫命令0EH  
  208.         delay1(5);      //延時(shí)5ms  
  209.         write_command(0x06);     //向LCD1602寫命令06H
  210.         TMOD=0x21;      //內(nèi)部中斷定時(shí)器選擇;定時(shí)器0工作在方式1,定時(shí)器1工作在方式2
  211.         TH0=0x3C;      //50ms定時(shí)  
  212.         TL0=0xb0;
  213.                 TR0=1;         //定時(shí)器0工作,用于測(cè)速
  214.                 TH1=0xA3;                  //1ms定時(shí)
  215.             TL1=0xA3;
  216.                 TR1=1;                  //定時(shí)器1工作,用于調(diào)速
  217.         EA=1;       //開中斷總開關(guān)

  218.                 IT1=1;       //外部中斷1為下降沿觸發(fā)   
  219.                 ET1=1;                   //T1允許中斷
  220.                 ET0=1;                        //T0允許中斷
  221.                 EX1=1;                  //外部中斷1允許中斷

  222. }

  223. void main()
  224. {        
  225.         int_all();
  226.         ENA=0;
  227.         while(1)
  228.         {        
  229.                 qiting();
  230.                 zhengfan();
  231.                 if(k1==0)
  232.                 {
  233.                         speed_control();
  234.                 }
  235.                 disp_count();     //數(shù)據(jù)處理
  236.         displaytolcd();     //LCD顯示
  237.         }
  238. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:525089 發(fā)表于 2019-4-30 13:55 | 只看該作者
好好學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

板凳
ID:525089 發(fā)表于 2019-4-30 14:01 | 只看該作者
參考一下,謝謝樓主
回復(fù)

使用道具 舉報(bào)

地板
ID:525068 發(fā)表于 2019-4-30 15:26 | 只看該作者
可以在按鍵那里加一個(gè)上拉電阻,使單片機(jī)引腳不用時(shí)處于高電平,然后把銷抖的延時(shí)時(shí)間變短一點(diǎn),五毫秒左右就行了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久123| 黑人精品xxx一区一二区 | 韩三级在线观看 | 91视频一区二区三区 | 成人中文字幕av | 欧美不卡在线 | 天天操天天插天天干 | 中文字幕在线国产 | 欧美一级淫片免费视频黄 | 久久亚洲高清 | 黄色毛片网站在线观看 | 一级爱爱片 | 精品伊人 | 日本福利视频免费观看 | 亚洲视频免费 | 国产精品久久久久久久久久久久冷 | 1级毛片 | 欧美日韩亚洲二区 | 免费黄色大片 | 精品亚洲一区二区三区四区五区 | 久久丝袜| 黄色大全免费看 | 午夜影视 | 中文字幕在线看人 | 久久精品一区二区三区四区 | 日韩久久久久久 | 久久精品色视频 | 久久综合九九 | 天堂综合 | 亚洲九九 | 亚洲精品福利在线 | 久久一区二区三区电影 | 国产精品视频久久久久久 | 美女视频网站久久 | 国产91精品久久久久久久网曝门 | 美女视频黄色片 | 可以在线观看av的网站 | 国产成人99久久亚洲综合精品 | 欧美国产91 | 91精品国产日韩91久久久久久 | 久久99精品久久久久子伦 |