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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1304|回復: 1
收起左側

單片機電機控制程序程序不太對

[復制鏈接]
ID:447777 發表于 2019-4-23 21:57 | 顯示全部樓層 |閱讀模式
  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;                                  //正反轉按鍵K2
  8. sbit up=P1^2;                                  //加速按鍵up
  9. sbit down=P1^3;                                  //減速按鍵down
  10. sbit in1=P1^5;                                  //正反轉輸入口
  11. sbit in2=P1^6;
  12. sbit ENA=P1^7;                                  //PWM信號輸入口
  13. sbit LED1=P2^3;                                   //綠燈正轉
  14. sbit LED2=P2^4;                                   //紅燈反轉
  15. uchar a=1;
  16. uchar count=40;                              //速度上限
  17. uchar t=0;
  18. char speed=20;                              //初始速度

  19. /*-----------------------端口命名------------------------*/
  20. sbit rs=P2^0;                 //LCD的數據/命令選擇端
  21. sbit rw=P2^1;                  //LCD的讀寫選擇端
  22. sbit e=P2^2;                   //LCD的使能信號端  
  23. /*-------------------------------------------------------*/
  24. /*-----------------------定義參數------------------------*/
  25. uint i,z,cou,zhuan,msec;     //定義參數
  26. uchar display[]={"speed=     r/min "};     //定義顯示參數
  27. /*-------------------------------------------------------*/
  28. /*-----------------------正反轉延時函數------------------*/
  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. /*-----------------------啟停函數------------------------*/
  40. void qiting()                                //b為啟停標志
  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. /*-----------------------正反轉函數----------------------*/
  59. void zhengfan()
  60. {        if(k1==1)
  61.         {
  62.                                              
  63.                 ENA=0;
  64.         }
  65.         else if(k2==1)                       //正轉
  66.         {
  67.                 LED1=1;
  68.                 LED2=0;
  69.                 delay();
  70.                 ENA=1;
  71.                 in1=1;
  72.                 in2=0;
  73.         }
  74.         else if(k2==0)                                  //開關按下反轉
  75.         {
  76.                 LED1=0;
  77.                 LED2=1;
  78.                 delay();
  79.                 ENA=1;
  80.                 in1=0;
  81.                 in2=1;
  82.         }               
  83. }
  84. /*--------------------------------------------------------*/
  85. /*-----------------------增減速函數-----------------------*/
  86. void speed_control()
  87. {

  88.         if(up==0)                                         //增速
  89.         {
  90.                 speed++;
  91.                 while(up==0)                     //即時對計滿數的speed值控制在設定范圍之內
  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的定時器中斷(與增減函數配合輸出PWM信號)---------------------*/
  103. void timer0_PWM() interrupt 3  //計滿1ms跳一次,有speed個之后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. /*-----------------------毫秒延時------------------------*/
  115. void delay1(uint ms)
  116. {  
  117.         uint i,j;               //為延時引入i,j兩參數  
  118.         for (j=0;j<ms;j++)      //延時第一循環   
  119.         for (i=0;i<120;i++);    //延時第二循環  
  120. }
  121. /*-------------------------------------------------------*/
  122. /*--------------------向LCD1602寫命令--------------------*/
  123. void write_command(uchar command)
  124. {
  125.         rs=0;           //數據、命令選擇端0為命令
  126.         rw=0;           //讀、寫選擇端0為寫
  127.         P0=command;      //向LCD寫命令
  128.         delay1(5);      //稍做延遲,代替檢測忙狀態  
  129.         e=1;             //信號使能端高電平
  130.         delay1(5);      //稍做延遲,代替檢測忙狀態  
  131.         e=0;            //信號使能端低電平
  132. }
  133. /*-------------------------------------------------------*/
  134. /*--------------------向LCD1602寫數據--------------------*/
  135. void write_data(uchar data0)
  136. {
  137.         rs=1;       //數據、命令選擇端 1為數據
  138.         rw=0;       //讀、寫選擇端0為寫
  139.         P0=data0;      //向LCD寫數據
  140.         delay1(5);      //稍做延遲,代替檢測忙狀態
  141.         e=1;      //信號使能端高電平
  142.         delay1(5);     //稍做延遲,代替檢測忙狀態
  143.         e=0;      //信號使能端低電平
  144. }
  145. /*-------------------------------------------------------*/
  146. /*-------------------外部中斷1計數程序-------------------*/
  147. void counter(void) interrupt 2
  148. {   

  149.         cou++;  
  150.         if(cou==2)      //2次循環為發動機轉一圈  
  151.         {   
  152.                 cou=0;     //初始化計數   
  153.              z++;      //轉圈計數加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++)   //循環要傳輸的字符個數次,每一次傳一個字符  
  162.   {   
  163.     write_data(display[i]);   
  164.       delay1(5);  
  165.   }
  166. }
  167. /*-------------------------------------------------------*/  
  168. /*-----------------內部中斷0計時計數程序-----------------*/
  169. void Timer_0(void) interrupt 1
  170. {  
  171.    TH0=0x3c;      //50ms定時  
  172.    TL0=0xb0;  
  173.    msec++;  
  174.    if(msec==20)      //50*20=1S  
  175.    {   
  176.         msec=0;
  177.         zhuan=60*z;        //每分鐘轉速
  178.         displaytolcd();   

  179.         z=0;

  180.    }
  181. }
  182. /*-------------------------------------------------------*/
  183. /*-----------------------數據處理------------------------*/
  184. void  disp_count()
  185. {  
  186. display[7]=(zhuan/1000+'0');    //轉換轉速的千位  
  187. display[8]=(zhuan/100%10+'0');    //轉換轉速的百位  
  188. display[9]=(zhuan/10%10+'0');    //轉換轉速的十位   
  189. display[10]=(zhuan%10+'0');    //轉換轉速的個位
  190. }
  191. /*-------------------------------------------------------*/
  192. /*----------------------端口初始化-----------------------*/
  193. void int_all()
  194. {  
  195.                   in1=1;                        //下面五行為啟停、正反轉初始化
  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;      //初始化轉的值  
  203.         rw=0;       //選擇LCD寫數據指令  
  204.         delay1(15);      //延時15ms  
  205.         write_command(0x38);     //向LCD1602寫命令38H  
  206.         delay1(5);      //延時5ms  
  207.         write_command(0x0e);     //向LCD1602寫命令0EH  
  208.         delay1(5);      //延時5ms  
  209.         write_command(0x06);     //向LCD1602寫命令06H
  210.         TMOD=0x21;      //內部中斷定時器選擇;定時器0工作在方式1,定時器1工作在方式2
  211.         TH0=0x3C;      //50ms定時  
  212.         TL0=0xb0;
  213.                 TR0=1;         //定時器0工作,用于測速
  214.                 TH1=0xA3;                  //1ms定時
  215.             TL1=0xA3;
  216.                 TR1=1;                  //定時器1工作,用于調速
  217.         EA=1;       //開中斷總開關

  218.                 IT1=1;       //外部中斷1為下降沿觸發   
  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();     //數據處理
  236.         displaytolcd();     //LCD顯示
  237.         }
  238. }
復制代碼
回復

使用道具 舉報

ID:1 發表于 2019-4-23 22:27 | 顯示全部樓層
您這個問題給的信息不全,估計是沒人能回答得了的,先轉移到冷門區了,自行點擊編輯按鈕補充一下吧,審核員會幫你重新轉到熱門問答區的
回復

使用道具 舉報

ID:447777 發表于 2019-4-24 17:12
admin 發表于 2019-4-23 22:27
您這個問題給的信息不全,估計是沒人能回答得了的,先轉移到冷門區了,自行點擊編輯按鈕補充一下吧,審核員 ...

幫我刪了吧 我發錯了  重新再發一次

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品区二区三区日本 | 看羞羞视频 | 日韩在线免费观看视频 | 成人国产在线视频 | 美日韩免费视频 | www.欧美| 成人在线精品 | 一区二区三区欧美 | www.欧美| 日韩欧美成人一区二区三区 | 久久免费精品 | 中文在线播放 | 成人精品一区二区 | 天天草视频 | 99热精品在线 | 久草欧美视频 | 毛片免费在线 | 久久久xx | www.狠狠干 | 欧美日韩一区精品 | 亚洲欧美在线观看 | 国产午夜三级一区二区三 | 伊人色综合久久天天五月婷 | 欧美日韩在线一区 | 91欧美| 香蕉久久久 | 色吊丝2288sds中文字幕 | 久久久久久久久久久福利观看 | 亚洲精品久久久一区二区三区 | 中文字幕精品一区二区三区精品 | 欧美日韩一区精品 | 天堂素人约啪 | 在线观看www视频 | 国产精品一区二 | 成人av影院 | 亚洲网在线| 不卡视频在线 | 午夜精品一区二区三区在线观看 | 国产小视频在线 | 北条麻妃99精品青青久久主播 | 色综合一区二区 |