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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2264|回復: 7
打印 上一主題 下一主題
收起左側

單片機定時器程序看不太明白,有沒有大神能幫忙分析一波程序的流程?

[復制鏈接]
跳轉到指定樓層
樓主
ID:1017533 發表于 2022-4-26 15:59 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
求助大神,謝謝大家

void Init_Timer0(void)
{
        TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響                     
        TH0=(65536-20000)/256;                  //重新賦值 20ms
        TL0=(65536-20000)%256;
        EA=1;            //總中斷打開
        ET0=1;           //定時器中斷打開
        TR0=1;           //定時器開關打開


從這里開始就看不懂了,為啥中斷打開們還有定時器為啥也要打開?



單片機源程序如下:
  1. #include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
  2. #include "1602.h"
  3. #include "delay.h"

  4. sbit KeyC=P3^4;
  5. sbit KeyT=P3^5;
  6. sbit KeyQ=P3^6;

  7. sbit A1=P1^0; //定義步進電機連接端口
  8. sbit B1=P1^1;
  9. sbit C1=P1^2;
  10. sbit D1=P1^3;

  11. sbit buzzer=P1^4;
  12. sbit Yudi=P2^3;
  13. #define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通電,其他相斷電
  14. #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通電,其他相斷電
  15. #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通電,其他相斷電
  16. #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通電,其他相斷電
  17. #define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通電,其他相斷電
  18. #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通電,其他相斷電
  19. #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通電,其他相斷電
  20. #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通電,其他相斷電
  21. #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部斷電

  22. unsigned long time_2ms=0;                        //定時器計數
  23. void Init_Timer0(void);                                //初始化始終函數
  24. unsigned int TimeCount;                                 //步進電機轉動時間
  25. unsigned int DisNum;                                 //顯示的參數
  26. unsigned char ReportBuz=0;                         //蜂鳴器報警

  27. void main (void)
  28. {     
  29.         static unsigned char DisTCount;                 //記錄時間設置數
  30.         static unsigned char DisCCount;                //記錄容量設置數
  31.         static unsigned char KeyFlag0,KeyFlag1,KeyFlag2,KeyFlag3;
  32.         Init_Timer0();        //定時器0初始化
  33.                      
  34.         LCD_Init();           //初始化液晶
  35.         DelayMs(20);          //延時有助于穩定
  36.         LCD_Clear();

  37.         LCD_Write_String(0,0,"Capacity :150 ml");//顯示第一行
  38.         DisCCount=0;      
  39.         LCD_Write_String(0,1,"TimeCount:0.5 h ");//顯示第二行
  40.         DisTCount=0;
  41.         buzzer=1;
  42.         while(1)         //主循環
  43.         {
  44.                 if(KeyT==0)                  //掃描按鍵         輸液體容量選擇
  45.                 {
  46.                         if(KeyFlag0==0)
  47.                         {               
  48.                                 DelayMs(20);
  49.                                 if(KeyT==0)                  //確認按下
  50.                                 {
  51.                                         KeyFlag0=1;                          //防止重復按下
  52.                                         if(DisCCount==0)
  53.                                         {DisCCount=1;LCD_Write_String(0,0,"Capacity :250 ml");}         //更新顯示
  54.                                         else if(DisCCount==1)
  55.                                         {DisCCount=2;LCD_Write_String(0,0,"Capacity :500 ml");}         //更新顯示
  56.                                         else if(DisCCount==2)
  57.                                         {DisCCount=0;LCD_Write_String(0,0,"Capacity :150 ml");}         //更新顯示
  58.                                 }                       
  59.                         }
  60.                 }
  61.                 else
  62.                 {KeyFlag0=0;}

  63.                 if(KeyC==0)                  //掃描按鍵                                 //輸液時間選擇
  64.                 {
  65.                         if(KeyFlag1==0)
  66.                         {               
  67.                                 DelayMs(20);
  68.                                 if(KeyC==0)                  //確認按下
  69.                                 {
  70.                                         KeyFlag1=1;                          //防止重復按下
  71.                                         if(DisTCount==0)
  72.                                         {DisTCount=1;LCD_Write_String(0,1,"TimeCount:  1 h ");}          //更新顯示
  73.                                         else if(DisTCount==1)
  74.                                         {DisTCount=2;LCD_Write_String(0,1,"TimeCount:  2 h ");}         //更新顯示
  75.                                         else if(DisTCount==2)
  76.                                         {DisTCount=0;LCD_Write_String(0,1,"TimeCount:0.5 h ");}         //更新顯示
  77.                                 }                       
  78.                         }
  79.                 }
  80.                 else
  81.                 {KeyFlag1=0;}
  82.       
  83.                 if(KeyQ==0)                  //掃描按鍵                                   //確認輸液參數
  84.                 {
  85.                         if(KeyFlag2==0)
  86.                         {               
  87.                                 DelayMs(20);
  88.                                 if(KeyQ==0)                  //確認按下
  89.                                 {
  90.                                         KeyFlag2=1;                          //防止重復按下
  91.                                         DisNum=DisCCount+DisTCount;
  92.                                         if(DisNum==0)                 //顯示數值
  93.                                         {TimeCount=200;}         //填充數值
  94.                                         else if(DisNum==1)
  95.                                         {TimeCount=400;}         //填充數值
  96.                                         else if(DisNum==2)
  97.                                         {TimeCount=600;}         //填充數值
  98.                                         else if(DisNum==3)
  99.                                         {TimeCount=800;}        //填充數值
  100.                                         else if(DisNum==4)
  101.                                         {TimeCount=1000;}  //填充數值
  102.                                 }                       
  103.                         }
  104.                 }
  105.                 else
  106.                 {KeyFlag2=0;}

  107.                 if(Yudi==1)                  //掃描按鍵                                //液滴檢測模塊
  108.                 {
  109.                         if(KeyFlag3==0)
  110.                         {               
  111.                                 DelayMs(20);
  112.                                 if(Yudi==1)                  //確認按下
  113.                                 {
  114.                                         KeyFlag3=1;                          //防止重復按下
  115.                                         ReportBuz=1;
  116.                                 }                       
  117.                         }
  118.                 }
  119.                 else
  120.                 {KeyFlag3=0;buzzer=1;ReportBuz=0;}        //如果沒有檢測到雨滴
  121.         }
  122. }

  123. void Init_Timer0(void)
  124. {
  125.         TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響                     
  126.         TH0=(65536-20000)/256;                  //重新賦值 20ms
  127.         TL0=(65536-20000)%256;
  128.         EA=1;            //總中斷打開
  129.         ET0=1;           //定時器中斷打開
  130.         TR0=1;           //定時器開關打開
  131. }

  132. void Timer0_isr(void) interrupt 1
  133. {
  134.         static unsigned char MotorNum=0;
  135.         TH0=(65536-3000)/256;                  //重新賦值 2ms
  136.         TL0=(65536-3000)%256;

  137.         time_2ms++;
  138.         if(time_2ms%200==0)
  139.         {
  140.                 if(ReportBuz==1)   //蜂鳴器轉換標志
  141.                 {
  142.                         buzzer=!buzzer;      
  143.                 }               
  144.         }

  145.         if(TimeCount>0)                          //電機轉動時間不為零 設置了時間
  146.         {
  147.                 TimeCount--;
  148.                 MotorNum++;
  149.                 if(MotorNum==1)
  150.                 {Coil_D1;}
  151.                 else if(MotorNum==2)
  152.                 {Coil_C1;}
  153.                 else if(MotorNum==3)
  154.                 {Coil_B1;}
  155.                 else if(MotorNum==4)
  156.                 {Coil_A1;MotorNum=0;}
  157.         }
  158.         else
  159.         {
  160.                 {Coil_OFF;}      
  161.         }
  162. }
復制代碼


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

使用道具 舉報

沙發
ID:123289 發表于 2022-4-26 17:21 | 只看該作者
程序這他人寫的
函數是誰寫的就更不知道了。
上網去搜搜每個函數的解釋吧。
回復

使用道具 舉報

板凳
ID:624769 發表于 2022-4-26 17:22 | 只看該作者
        TR0=1;     這個是讓定時器跑起來, 就好像讓鐘走起來,鐘在停止狀態你任何鬧鐘都是無效的.
        ET0=1;     這是讓中斷有效, 就好像打開鬧鐘功能, 不開鬧鐘,時間到了你也不能立刻知道, 只能自己不停的抬頭看鐘.

基于,你問出的問題, 只能選擇比喻的方式來回答你了……,要是這樣也無法理解,我也沒轍了……
回復

使用道具 舉報

地板
ID:1017533 發表于 2022-4-26 17:59 | 只看該作者
188610329 發表于 2022-4-26 17:22
TR0=1;     這個是讓定時器跑起來, 就好像讓鐘走起來,鐘在停止狀態你任何鬧鐘都是無效的.
        ...

很貼切的回答,明白了,謝謝你
回復

使用道具 舉報

5#
ID:149451 發表于 2022-4-26 20:00 | 只看該作者
這程序看著像是微量輸液泵的控制程序。
回復

使用道具 舉報

6#
ID:1017533 發表于 2022-4-26 23:01 | 只看該作者
w1179benp 發表于 2022-4-26 20:00
這程序看著像是微量輸液泵的控制程序。

是的,輸液的程序,
回復

使用道具 舉報

7#
ID:390416 發表于 2022-4-27 08:10 | 只看該作者
這里定時器解釋非常清楚 https://www.acfun.cn/v/ac15187311_24
回復

使用道具 舉報

8#
ID:904095 發表于 2022-5-1 07:15 | 只看該作者
這個是定時器中斷呀 不打開定時器就沒中斷了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品va在线看黑人 | 性色的免费视频 | 成人午夜免费福利视频 | 亚洲成人第一页 | 成人在线视频免费观看 | 国产成人jvid在线播放 | 欧美日韩中文字幕在线 | 亚洲精品一区二三区不卡 | 精品国产一区二区三区性色av | 欧美一区日韩一区 | 中午字幕在线观看 | 91精品国产综合久久久久蜜臀 | 成人免费一级 | 免费观看日韩精品 | 丁香五月网久久综合 | 久久国产成人 | 免费性视频 | 成年人网站免费 | 国产精品一码二码三码在线 | 天天综合永久入口 | 日韩精品一区二区三区视频播放 | 日韩成人在线播放 | 国产精品区二区三区日本 | 久久久久无码国产精品一区 | 国产精品视频免费看 | 黄色免费观看网站 | 亚洲国产区 | www国产亚洲精品久久网站 | 男女在线网站 | 毛片国产| 日韩中文字幕在线免费 | 91九色网站| 亚洲一区二区久久 | 人人干人人干人人 | 成人av观看 | 中文字幕 视频一区 | 亚洲精品日韩欧美 | 国产欧美精品一区二区三区 | 人操人人 | 日韩欧美中文在线 | 一区二区三区视频在线观看 |