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

QQ登錄

只需一步,快速開始

帖子
查看: 4647|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)時(shí)間片輪詢法(數(shù)碼管顯示—中斷消抖)源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
時(shí)間片輪詢法(數(shù)碼管顯示——中斷消抖)
    本文章是關(guān)于運(yùn)用時(shí)間片輪詢法(前后臺(tái)系統(tǒng)),完成對(duì)時(shí)鐘的簡(jiǎn)單控制,同時(shí)通過(guò)中斷完成對(duì)按鍵的消失抖,顯示程序中靜態(tài)變量變量的定義是關(guān)鍵,
    對(duì)按鍵消抖應(yīng)該是未按下(抬起——1)——按下(0)——抬起(1),之間需要20ms左右的延時(shí)消抖。假如按鍵按下(k1 = 0),同時(shí)由于(keydelay<<1)|k1,16ms之后keydelay = 0x00;如果按鍵未按下(k1 = 1),(keydelay<<1)|k1,16ms之后keydelay = oxff,及k1一直都未按下。

電路原理圖如下:

主函數(shù)
  1. #include "reg52.h"

  2. //#include "Delay.h"
  3. #include "Display.h"
  4. #include "Timer.h"
  5. void main()
  6. {
  7.     Timer0Init(); //中斷初始化  
  8.     while(1)
  9.     {     
  10.      Datapros();
  11.        TaskProcess();
  12.      KeyProcess();
  13.     }
  14.    
  15. }
  16. Displsy.c模塊函數(shù)
  17. #include "Display.h"
  18. //#include "Delay.h"
  19. #include "Timer.h"
  20. unsigned char Bit_Selection[8]={0xfe,0Xfd,0Xfb,0Xf7,0Xef,0Xdf,0Xbf,0x7f};   //位選
  21. unsigned char smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段選0123456789
  22. unsigned char hour = 20,min = 51,sec = 58; //定義變量
  23. unsigned char DisplayData[8];
  24. bit keyback = 1;//按鍵之前的狀態(tài)
  25. bit keystay = 1;   //按鍵現(xiàn)在的狀態(tài)
  26. void DigDisplay()
  27. {
  28.    static unsigned char i;   //定義靜態(tài)變量

  29.        P0 = 0x00;            //消影
  30.       P2 = Bit_Selection[i];  //位選
  31.       P0 = DisplayData[i];    //段選         
  32.                      
  33.        i++;
  34.         if(i==8)
  35.         {
  36.          i = 0;
  37.         }
  38. }
  39. void Datapros()
  40. {   
  41.     DisplayData[0]=smgduan[hour/10];
  42.     DisplayData[1]=smgduan[hour%10];
  43.     DisplayData[2]=0x40;
  44.     DisplayData[3]=smgduan[min/10];
  45.     DisplayData[4]=smgduan[min%10];
  46.     DisplayData[5]=0x40;
  47.     DisplayData[6]=smgduan[sec/10];
  48.     DisplayData[7]=smgduan[sec%10];
  49.   
  50.    
  51. }
  52. void Clock_Chang()//時(shí)間自加函數(shù)
  53. {  
  54.     sec++;        //每一秒鐘執(zhí)行一次
  55.     if(sec==60)
  56.    {
  57.     sec = 0;
  58.     min++;
  59.     if(min==60)
  60.      {
  61.       min = 0;
  62.       hour++;
  63.      if(hour==24)
  64.          hour = 0;
  65.      }        
  66.    }
  67.         
  68. }
  69. void KeyProcess()
  70. {
  71. static unsigned char keymin;
  72.      keymin=min;
  73.     if(keystay!=keyback)//判斷按鍵現(xiàn)在狀態(tài)與之前狀態(tài)是否有變化
  74.    {  
  75.         if(keyback==0)   //如果之前狀態(tài)是零,則說(shuō)明按鍵有觸發(fā)
  76.     {
  77.          keymin++;
  78.       if(keymin==60)
  79.        keymin=0;
  80.     }      
  81.    }
  82.     min=keymin;
  83.    keyback = keystay;  //按鍵狀態(tài)賦值
  84. }
  85. void Keyscan()//按鍵掃描,在中斷中處理
  86. {  
  87.     static unsigned char keydelay=0xff;
  88.     keydelay=(keydelay<<1)|k1;  //通過(guò)Keydelay移位延時(shí),每2ms移動(dòng)一位
  89.     //keydelay=(keydelay<<1)|k2;
  90.     //keydelay=(keydelay<<1)|k3;
  91.     if(keydelay==0x00)  //如果16ms后keydelay=0x00,則按鍵狀態(tài)置為0(按下)
  92.    {
  93.       keystay = 0;
  94.    }
  95.    if(keydelay==0xff)
  96.    {      
  97.        keystay = 1;
  98.    }

  99. }
  100. void ClockProcess()//鬧鐘判斷函數(shù)
  101. {   
  102.    unsigned char nhour = 20,nmin = 52,nsec = 1; //定義變量
  103.    if((nsec==sec)&&(nmin==min)&&(nhour==hour))
  104.   {         
  105.      beep=~beep;   
  106.       D1 = 0;         
  107.   }
  108.   if(sec==nsec+2)//兩秒鐘之后在發(fā)生變化
  109.   {            
  110.     beep=~beep;   
  111.       D1 = 1;
  112.   }
  113.   
  114. }
  115. Timer.c模塊函數(shù)
  116. #include "Timer.h"
  117. #include "Display.h"
  118. //#include "Delay.h"  
  119. typedef struct SUSPEND_VARIABLE
  120. {
  121.      unsigned char Flag;                 // 程序運(yùn)行標(biāo)記:0-不運(yùn)行,1運(yùn)行
  122.      unsigned long Time;              // 計(jì)時(shí)器

  123.         unsigned long ItvTime;              // 任務(wù)運(yùn)行間隔時(shí)間
  124.   
  125.      void (*Function)(void);    // 要運(yùn)行的任務(wù)函

  126. }VARIABLE;
  127. VARIABLE TaskCount[] =
  128. {
  129.                     {0,5,5,DigDisplay},//顯示
  130.                     {0,1000,1000,Clock_Chang},//時(shí)鐘秒自加
  131.           {0,1000,1000,ClockProcess},//鬧鐘
  132.           {0,2,2,Keyscan},//按鍵掃描
  133. };//聲明
  134. void Timer0Init()
  135. {   
  136.     TMOD = 0X01;   //選擇為定時(shí)器0模式,工作方式1,僅用TR0打開啟動(dòng)。
  137.     TH0 = 0Xfc;  //給定時(shí)器賦初值,定時(shí)100us
  138.     TL0 = 0X18;  //給定時(shí)器賦初值如何是FF,定時(shí)1us
  139.     ET0 = 1;     //打開定時(shí)器0中斷允許
  140.     EA = 1;     //打開總中斷
  141.     TR0 = 1;    //打開定時(shí)器   
  142. }
  143. void Timer0() interrupt 1     
  144. {
  145.     unsigned char i;[align=left][color=#007000][backcolor=transparent][font=Tahoma,&][size=14px]               [/size][/font][/backcolor][/color][/align][align=left][color=#007000][backcolor=transparent][font=Tahoma,&][size=14px]//#define COUNT 4    //中斷函數(shù)運(yùn)行函數(shù)數(shù)量 [/size][/font][/backcolor][/color][/align]
  146.     TH0 = 0Xfc;                             //給定時(shí)器賦初值,定時(shí)100us
  147.     TL0 = 0x18;
  148.     for(i = 0;i<COUNT;i++)              //循環(huán)掃描,判斷哪一個(gè)任務(wù)定時(shí)時(shí)間已到
  149.     {
  150.      if(TaskCount[i].Time)
  151.     {
  152.       TaskCount[i].Time--;             //如果定時(shí)時(shí)間已到則清零,標(biāo)記置一
  153.       if(TaskCount[i].Time==0)
  154.        {
  155.        TaskCount[i].Flag = 1;
  156.        TaskCount[i].Time = TaskCount[i].ItvTime;       // 恢復(fù)計(jì)時(shí)器值,從新下一次
  157.        }
  158.     }
  159.    }   
  160. }
  161. void TaskProcess()   //處理函數(shù)
  162. {
  163.      unsigned char i;  
  164.     for (i=0; i<COUNT; i++)           // 循環(huán)判斷那一個(gè)任務(wù)需要運(yùn)行,逐個(gè)任務(wù)時(shí)間處理
  165.    {
  166.       if (TaskCount[i].Flag)               // 時(shí)間不為0
  167.          {
  168.              TaskCount[i].Function();         // 運(yùn)行任務(wù)
  169.              TaskCount[i].Flag = 0;          // 標(biāo)志清0
  170.            }
  171.    }   
  172. }
復(fù)制代碼

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:95059 發(fā)表于 2021-4-9 23:29 | 只看該作者
沒(méi)有貼出來(lái)原程序啊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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