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

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

QQ登錄

只需一步,快速開(kāi)始

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

單片機(jī)+電機(jī)能加減速,但是LCD1062輸出轉(zhuǎn)速無(wú)法實(shí)時(shí)顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
300黑幣
C51單片機(jī)產(chǎn)生PWM輸入L298驅(qū)動(dòng)電機(jī),控制啟停,正反轉(zhuǎn),加減速,這些都可以實(shí)現(xiàn),可以以反饋到LCD1062上。但是通過(guò)T1定時(shí)器、外中斷INT1組合測(cè)速(脈沖頻率)無(wú)法實(shí)時(shí)顯示到屏幕,就是可以顯示,但是數(shù)值不變化。也不知道為啥。
個(gè)人認(rèn)為問(wèn)題應(yīng)該出在測(cè)速模塊或者外中斷1函數(shù)里,但是找不出原因,請(qǐng)大佬看看!

單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #include<string.h>
  3. #include <intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6.      
  7. sbit lcdrs=P2^0;       //寄存器選擇,0:數(shù)據(jù)寄存器。1:為狀態(tài)/命令寄存器
  8. sbit lcden=P2^1;         //--LCD控制引腳

  9. sbit speed=P3^2;                                        //測(cè)速端口
  10. sbit ENA=P2^2;                                        //電機(jī)使能控制端

  11. sbit key1=P1^0;         //啟動(dòng)按鍵
  12. sbit key2=P1^1;                                        //正轉(zhuǎn)按鍵
  13. sbit key3=P1^2;                                        //反轉(zhuǎn)按鍵
  14. sbit key4=P1^3;                                        //加速按鍵
  15. sbit key5=P1^4;                                        //減速按鍵
  16. sbit key6=P1^5;                                        //停止按鍵
  17. sbit Zheng=P1^6;                                                //正轉(zhuǎn)輸出端口
  18. sbit Fan=P1^7;                                                //反轉(zhuǎn)輸出端口

  19. uchar Timer0_flag=4;
  20. uchar Timer0_BiaoZhi=0;//初始化占空比為1:3(高:低)

  21. uchar gewei;
  22. uchar shiwei;
  23. uchar baiwei;

  24. /******標(biāo)志位設(shè)置*****/
  25. uchar KEY1=0;//優(yōu)先級(jí)標(biāo)志
  26. uchar KEY2=0;//加速標(biāo)志

  27. uchar INT1_FLAG=0;
  28. uchar COUNTER_high=0;
  29. uchar COUNTER_low=0;
  30. uchar SUM=0;
  31. uint TIMER1_COUNTER=0;
  32. uint INT1_tingzhi=0;                //在要測(cè)速時(shí)置0

  33. /****面板顯示****/
  34. uchar code lcd_desktop10[]="WUU";//不顯示
  35. uchar code lcd_desktop11[]="RUN";//運(yùn)行
  36. uchar code lcd_desktop12[]="FWD";//正轉(zhuǎn)
  37. uchar code lcd_desktop13[]="REV";//反轉(zhuǎn)
  38. uchar code lcd_desktop14[]="JIA";//加速
  39. uchar code lcd_desktop15[]="JAN";//減速
  40. uchar code lcd_desktop16[]="OFF";//停止
  41. uchar code num[]={'0','1','2','3','4','5','6','7','8','9'};//要顯示的轉(zhuǎn)速數(shù)字。

  42. //-----lcd液晶屏頭文件-----//
  43. /**延時(shí)函數(shù)**/
  44. void delayms(uchar xms)   
  45. {
  46.         uchar i,j;
  47.         for(i=xms;i>0;i--)
  48.         for(j=110;j>0;j--);
  49. }

  50. /****LCD寫(xiě)命令******/
  51. void write_command(uchar com)//com寫(xiě)入命令
  52. {
  53.         lcdrs=0;    //LED選擇輸入命令
  54.         P0=com;     //向P0口輸入命令39-32端口
  55.         delayms(2);  //延時(shí)
  56.         lcden=1;     //打開(kāi)LCD使能
  57.         delayms(2);  //一個(gè)高脈沖
  58.         lcden=0;     //關(guān)閉LED使能
  59. }

  60. /**************LCD寫(xiě)數(shù)據(jù),來(lái)源網(wǎng)上*********/
  61. void write_data(uchar date)//數(shù)據(jù)為DATA
  62. {
  63.         lcdrs=1;  //設(shè)置為輸入數(shù)據(jù)
  64.         P0=date;  //將數(shù)據(jù)賦給P0口
  65.         delayms(2);  //延時(shí)
  66.         lcden=1;     //置高
  67.         delayms(2);
  68.         lcden=0;     //置低完成高脈沖
  69. }

  70. /********LCD初始化,來(lái)源網(wǎng)上****************/
  71. void lcd_init()//顯示模式設(shè)置
  72. {
  73.         lcden=0;
  74.         write_command(0x38);   //設(shè)置16×2 顯示5×7點(diǎn)陣,8位數(shù)據(jù)接口
  75.         write_command(0x0c);   //設(shè)置開(kāi)始顯示不顯示光標(biāo)(指令4)
  76.         write_command(0x06);   //寫(xiě)一個(gè)字符后地址指針加一(指令3)
  77.         write_command(0x01);   //顯示清零數(shù)據(jù)指針清零(指令1)
  78. }

  79. /**電機(jī)初始化函數(shù)**/
  80. void motor_init(void)
  81. {
  82.         ENA=0;                                //        停止
  83. }

  84. void ZhongDuanKaiQi(void)
  85. {
  86.         EA=1;               
  87.         ET0=1;        //計(jì)時(shí)器0允許中斷。產(chǎn)生脈沖。
  88.         ET1=1;        //計(jì)時(shí)器1允許中斷。對(duì)低電平進(jìn)行計(jì)時(shí)。
  89.         //EX1=1;        //INT0允許中斷。測(cè)速。由外部來(lái)啟動(dòng)。
  90.         IT1=1;        //外部中斷1低電平觸發(fā)。
  91.         PX1=0;        //外中斷0為低級(jí)中斷。
  92.         PT0=1;  //定時(shí)器0為高優(yōu)先級(jí)中斷
  93.         PT1=0;  //外中斷1為低優(yōu)先級(jí)中斷
  94.         TMOD=0x12;//定時(shí)器工作方式控制
  95. }
  96. /***定時(shí)器T1初始化!!!等待外部脈沖的到來(lái)***/
  97. void Timer1_init(void)
  98. {
  99.         TH1=0;
  100.         TL1=0;                //等待外部脈的到來(lái)。INT1
  101. }
  102. /*****定時(shí)T0初始化*****/
  103. void Timer0_init(void)
  104. {
  105.         TH0=0;
  106.         TL0=0;
  107.         TR0=1;
  108. }
  109. /********測(cè)速模塊,顯示速度*******/
  110. void speed_test(void)
  111. {
  112. //        TIMER1_COUNTER;
  113.         COUNTER_high=TH1;
  114.         COUNTER_low=TL1;
  115.         SUM=COUNTER_high*256+COUNTER_low+TIMER1_COUNTER*65536;//得到的是多少u(mài)s。
  116.         //count:每百16位進(jìn)1,16位為65536;TH1:每8位進(jìn)1,8位為256;TL1:每次進(jìn)1;即TL1由0增加度到內(nèi)255時(shí),TH1加1,TL1回0,TH1由0增加到65535時(shí),count加1,TH1回0,三者之和為總次數(shù)。
  117.         SUM=SUM/1000;                                //化為毫秒。
  118.         SUM=1000/SUM;                                //圈每秒。
  119.         SUM=SUM*60;                                        //圈每分鐘;三位數(shù)。
  120.         gewei=SUM%10+0x30;
  121.         shiwei=SUM/10%10+0x30;
  122.         baiwei=SUM/100+0x30;
  123.         write_command(0x80+0x4c);
  124.         write_data(baiwei);
  125.         write_command(0x80+0x4d);
  126.         write_data(shiwei);
  127.         write_command(0x80+0x4e);
  128.         write_data(gewei);
  129.         SUM=0;
  130.         TIMER1_COUNTER=0;               
  131. }

  132. /********外中斷1函數(shù)**********/
  133. void INT1_QIDONG() interrupt 2
  134. {
  135.         INT1_tingzhi++;
  136.         if(INT1_tingzhi==5)
  137.         {
  138.                 INT1_tingzhi=5;EX1=0;//關(guān)閉中斷。
  139.         }
  140.         if(INT1_tingzhi<=4)
  141.         {
  142.                 INT1_FLAG++;
  143.           if(INT1_FLAG==2)
  144.                         {
  145.                                 INT1_FLAG=0;TR1=0;speed_test();
  146.                         }
  147.                 else
  148.                         {
  149.                                 Timer1_init();
  150.                                 TR1=1;
  151.                         }
  152.         }
  153. }
  154. /******定時(shí)器T1計(jì)數(shù)*******/
  155. void Timer1_QIDONG() interrupt 3
  156. {
  157.         TIMER1_COUNTER++;
  158. }



  159. /****T0中斷發(fā)出信號(hào)并進(jìn)行通道選擇****/
  160. void Timer0() interrupt 1
  161. {        
  162.         Timer0_flag--;
  163.         if((Timer0_BiaoZhi)>=(Timer0_flag))
  164.         {
  165.                 if(KEY2==0)
  166.                 {
  167.                         Zheng=1;Fan=0;
  168.                 }
  169.                 else
  170.                 {
  171.                         Zheng=0;Fan=1;
  172.                 }
  173.         }
  174.         else
  175.         {
  176.                 Zheng=0;Fan=0;                                
  177.         }        
  178.         if(Timer0_flag==0) Timer0_flag=5;
  179. }


  180. void Guan(void)
  181. {
  182.         ET0=0;
  183.         EX1=0;
  184.         ET1=0;        
  185. }


  186. void keyscan()                         //按鍵掃描函數(shù)
  187. {
  188.         uint i=0;
  189.         if(key1==0)   //按鍵K1啟動(dòng)按鈕。只有該位啟動(dòng)時(shí),后面的幾位才有效。啟動(dòng)T0計(jì)數(shù)開(kāi)始發(fā)出脈沖。
  190.         {
  191.                 delayms(10);
  192.                 if(key1==0)
  193.                 {
  194.                         while(!key1);
  195.                         KEY1=5;
  196.                         Fan=0;
  197.                         Zheng=0;
  198.                         ENA=1;
  199.                         KEY2=0;//初始化為正轉(zhuǎn)。
  200.                   Timer0_BiaoZhi=0;
  201.                         Timer0_flag=4;
  202.                         
  203.                         ZhongDuanKaiQi();//開(kāi)啟中斷        
  204.                         Timer0_init();//                初始化并開(kāi)始發(fā)出脈沖外中斷已經(jīng)開(kāi)啟。
  205.                         EX1=1;                                        //外中斷開(kāi)啟;測(cè)速,顯示速度。
  206.                         
  207.                         write_command(0x80);
  208.                         for(i=0;i<strlen(lcd_desktop10);i++)//顯示正轉(zhuǎn)。
  209.                         write_data(lcd_desktop11[i]);
  210.                 }
  211.         }
  212.         
  213.   if(key2==0&&KEY1==5) //按鍵K2按下,(正轉(zhuǎn))只改變轉(zhuǎn)向(標(biāo)志位改變輸出端口)
  214.         {
  215.                 delayms(10);
  216.                 if(key2==0)
  217.                 {
  218.                         while(!key2);
  219.                         KEY2=0;                //正轉(zhuǎn)標(biāo)志,電機(jī)正向旋轉(zhuǎn)。
  220.                         //KEY2=(~1);
  221.                
  222.                         KEY1=5;
  223.                         write_command(0x80);
  224.                         for(i=0;i<strlen(lcd_desktop11);i++)//顯示正轉(zhuǎn)。
  225.                         write_data(lcd_desktop12[i]);
  226.                 }
  227.         }
  228.         
  229.         if(key3==0&&KEY1==5) //按鍵K3按下,(反轉(zhuǎn))只改變轉(zhuǎn)向
  230.         {
  231.                 delayms(10);
  232.                 if(key3==0)
  233.                 {
  234.                         while(!key3);
  235.                         KEY2=~0;                        //反轉(zhuǎn)標(biāo)志。
  236.                         //KEY2=(~0);
  237.                
  238.                         KEY1=5;
  239.                         write_command(0x80);
  240.                         for(i=0;i<strlen(lcd_desktop12);i++)//顯示反轉(zhuǎn)。
  241.                         write_data(lcd_desktop13[i]);
  242.                 }
  243.         }
  244.    if(key4==0&&KEY1==5)        //按鍵K4按下,(加速)改變裝入的數(shù)值?循環(huán)次數(shù)?執(zhí)行if里面的語(yǔ)句,通過(guò)size++來(lái)改變幅值的頻率
  245.          {
  246.                  delayms(10);
  247.                  if(key4==0)
  248.                  {
  249.                          while(!key4);
  250.                          if(Timer0_BiaoZhi<4)
  251.                          {
  252.                                  Timer0_BiaoZhi++;
  253.                          }
  254.                          else
  255.                          {
  256.                                  Timer0_BiaoZhi=4;
  257.                          }
  258.                           EX1=1;
  259.                           KEY1=5;
  260.                          write_command(0x80);
  261.                         for(i=0;i<strlen(lcd_desktop13);i++)//顯示加速。
  262.                         write_data(lcd_desktop14[i]);
  263.                  }
  264.                
  265.          }
  266.          
  267.          if((key5==0)&&(KEY1==5))         //按鍵K5按下,(減速)對(duì)其它標(biāo)志位沒(méi)有影響。
  268.          {
  269.                  delayms(5);
  270.                  if(key5==0)
  271.                  {
  272.                          while(!key5);
  273.                          if(Timer0_BiaoZhi==0)
  274.                          {
  275.                                  Timer0_BiaoZhi=0;
  276.                          }
  277.                          else
  278.                          {
  279.                                  Timer0_BiaoZhi--;
  280.                          }
  281.                           EX1=1;
  282.                           KEY1=5;
  283.                          write_command(0x80);
  284.                         for(i=0;i<strlen(lcd_desktop14);i++)//顯示減速。
  285.                         write_data(lcd_desktop15[i]);
  286.                  }
  287.          }
  288.          if((key6==0)&&(KEY1==5))//按鍵K6按下,電機(jī)停止轉(zhuǎn)動(dòng)使能端和計(jì)數(shù)啟動(dòng)關(guān)閉,計(jì)數(shù)器工作否?設(shè)立標(biāo)志位。此按鍵按下后除K1外無(wú)法啟動(dòng)
  289.          {
  290.                  delayms(5);
  291.                  if(key6==0)
  292.                  {
  293.                          while(!key6);
  294.                          //置位,保證后續(xù)操作正常。
  295.                         
  296.                         
  297.                         
  298.                          EA=0;                                //總中斷關(guān)
  299.                          motor_init();                //電機(jī)關(guān)
  300.                          Guan();
  301.                          write_command(0x80);
  302.                         for(i=0;i<strlen(lcd_desktop15);i++)//顯示停止。
  303.                         write_data(lcd_desktop16[i]);                                 
  304.                  }
  305.          }
  306. }

  307. /*主函數(shù)*/
  308. void main()
  309. {

  310.         ZhongDuanKaiQi();//初始化
  311.         motor_init();                        //電機(jī)停止
  312.         lcd_init();
  313.         while(1)
  314.         {
  315.                 keyscan();
  316.                
  317.         }
  318. }
復(fù)制代碼






電路圖和程序,可以仿真。
電機(jī)控制及顯示.zip (68.96 KB, 下載次數(shù): 8)

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

使用道具 舉報(bào)

沙發(fā)
ID:749922 發(fā)表于 2020-5-18 11:13 | 只看該作者
沒(méi)人回答嗎
回復(fù)

使用道具 舉報(bào)

板凳
ID:682488 發(fā)表于 2020-5-18 11:27 | 只看該作者
用T2口試試,或許是片子質(zhì)量有問(wèn)題呢
回復(fù)

使用道具 舉報(bào)

地板
ID:749922 發(fā)表于 2020-5-18 13:24 | 只看該作者
大長(zhǎng)蟲(chóng) 發(fā)表于 2020-5-18 11:27
用T2口試試,或許是片子質(zhì)量有問(wèn)題呢

仿真的話,應(yīng)該和片子沒(méi)關(guān)系吧。然后我覺(jué)得程序的問(wèn)題在于那個(gè)函數(shù)sun算出來(lái)的是一個(gè)確定的值,但是我現(xiàn)在找不出問(wèn)題在哪里
回復(fù)

使用道具 舉報(bào)

5#
ID:754714 發(fā)表于 2020-5-18 13:44 | 只看該作者
建議調(diào)整測(cè)速函數(shù)與顯示函數(shù)各種的參數(shù),是否二者存在某項(xiàng)參數(shù)的不匹配。
回復(fù)

使用道具 舉報(bào)

6#
ID:749922 發(fā)表于 2020-5-18 14:56 | 只看該作者
1649293198 發(fā)表于 2020-5-18 13:44
建議調(diào)整測(cè)速函數(shù)與顯示函數(shù)各種的參數(shù),是否二者存在某項(xiàng)參數(shù)的不匹配。

我剛才把sum的函數(shù)去掉,發(fā)現(xiàn)沒(méi)有給sum(也就是輸出的速度)賦值,他也能輸出096,給他賦值也還是輸出096,也就是輸出的數(shù)字完全就不是我想要的,這是為啥??
回復(fù)

使用道具 舉報(bào)

7#
ID:749922 發(fā)表于 2020-5-18 15:02 | 只看該作者
1649293198 發(fā)表于 2020-5-18 13:44
建議調(diào)整測(cè)速函數(shù)與顯示函數(shù)各種的參數(shù),是否二者存在某項(xiàng)參數(shù)的不匹配。

我剛才把sum的函數(shù)去掉了,也就是沒(méi)有給sum(要輸出的速度)賦值,但是仿真的時(shí)候還是能出現(xiàn)096,給它賦值的時(shí)候也是輸出096,這是為什么?
回復(fù)

使用道具 舉報(bào)

8#
ID:749922 發(fā)表于 2020-5-18 16:17 | 只看該作者
現(xiàn)在的問(wèn)題就是,sum的值就是0,函數(shù)沒(méi)有用,是因?yàn)橥獠恐袛鄾](méi)有起作用開(kāi)始不能使T1開(kāi)始計(jì)時(shí)嗎?
回復(fù)

使用道具 舉報(bào)

9#
ID:752225 發(fā)表于 2020-5-18 17:04 來(lái)自手機(jī) | 只看該作者
你液晶程序在讀寫(xiě)數(shù)據(jù)時(shí)不用判斷忙不忙嗎?可以百度一下判忙哪里是不是出現(xiàn)了問(wèn)題
回復(fù)

使用道具 舉報(bào)

10#
ID:752225 發(fā)表于 2020-5-18 17:07 來(lái)自手機(jī) | 只看該作者
還有在哪里添加延時(shí)非常重要,不過(guò)51的應(yīng)該對(duì)延時(shí)要求不大,這個(gè)要參考數(shù)據(jù)手冊(cè),我兩個(gè)1602液晶發(fā)現(xiàn)不能公用一個(gè)程序,當(dāng)初困擾了很久,多半是延時(shí)和判忙哪里有問(wèn)題,個(gè)人建議
回復(fù)

使用道具 舉報(bào)

11#
ID:732506 發(fā)表于 2020-5-19 02:56 | 只看該作者
圖太小,看不清測(cè)速端口信號(hào)從何而來(lái)?如果不是來(lái)自電機(jī),應(yīng)該人為注入一定頻率的信號(hào)來(lái)模擬電機(jī)轉(zhuǎn)動(dòng)。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产综合久久香蕉麻豆 | 91久久精品国产91久久 | 成人黄页在线观看 | 日韩综合色| 91网在线观看 | 久久精品视频99 | 国产色网 | 五月天综合网 | 黄色一级大片在线免费看产 | 日韩高清中文字幕 | 国产在线一区二区三区 | 欧美成人精品激情在线观看 | 欧美一级视频在线观看 | 黄色大片免费观看 | 亚洲视频一区在线观看 | 欧美综合在线观看 | 中文字幕电影在线观看 | 午夜免费视频 | 99精品欧美一区二区三区 | 亚洲欧洲精品在线 | 99热国产免费 | 欧美国产日韩一区二区三区 | 国产日韩欧美 | 国产免费一区二区三区 | 三区在线| 日本久久一区 | 成人在线小视频 | 国产乱码精品一区二区三区五月婷 | 一区中文字幕 | 久久高清| 色偷偷人人澡人人爽人人模 | 欧美一区二区三区高清视频 | 九九热这里只有精品6 | 久久性| 久热久 | 最近中文字幕免费 | 免费看国产片在线观看 | 国产免费一区二区 | 亚洲3级 | 玖玖视频 | 国产真实乱对白精彩久久小说 |