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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4551|回復: 1
打印 上一主題 下一主題
收起左側(cè)

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

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:655058 發(fā)表于 2019-12-3 13:23 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
時間片輪詢法(數(shù)碼管顯示——中斷消抖)
    本文章是關于運用時間片輪詢法(前后臺系統(tǒng)),完成對時鐘的簡單控制,同時通過中斷完成對按鍵的消失抖,顯示程序中靜態(tài)變量變量的定義是關鍵,
    對按鍵消抖應該是未按下(抬起——1)——按下(0)——抬起(1),之間需要20ms左右的延時消抖。假如按鍵按下(k1 = 0),同時由于(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ù)
  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)是零,則說明按鍵有觸發(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;  //通過Keydelay移位延時,每2ms移動一位
  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;                 // 程序運行標記:0-不運行,1運行
  122.      unsigned long Time;              // 計時器

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

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

評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 伊人性伊人情综合网 | 一级黄色片毛片 | 国产一区久久久 | 日韩精品 电影一区 亚洲 | 精品一区二区三区在线观看国产 | 在线播放中文字幕 | 午夜精品一区二区三区在线视频 | 亚洲综合99| 日韩一级二级片 | 欧美综合在线视频 | 理论片87福利理论电影 | 免费一级黄色 | 国产9久 | 日韩精品一区二区三区中文在线 | 黄免费观看视频 | 亚洲午夜精品视频 | 国产精品成人在线 | 天堂一区 | 天天爱av | 天天干 夜夜操 | 欧美精品网站 | 久久看看| 亚洲国产精品一区二区久久 | 欧美一区二区三区,视频 | 亚洲一区二区在线播放 | 天天看片天天干 | 欧美性video 精品亚洲一区二区 | 久操亚洲 | 国产99热精品 | 国产一级在线观看 | 高清一区二区三区 | 久久成人精品 | 久久久黄色 | 国产欧美一区二区三区久久手机版 | 色婷婷精品久久二区二区蜜臂av | 神马久久春色视频 | 免费黄色a级毛片 | 欧美成人在线影院 | 欧美高清一级片 | 欧美在线a | 毛片一级片 |