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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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

電路原理圖如下:

主函數
  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模塊函數
  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;//按鍵之前的狀態
  25. bit keystay = 1;   //按鍵現在的狀態
  26. void DigDisplay()
  27. {
  28.    static unsigned char 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()//時間自加函數
  53. {  
  54.     sec++;        //每一秒鐘執行一次
  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)//判斷按鍵現在狀態與之前狀態是否有變化
  74.    {  
  75.         if(keyback==0)   //如果之前狀態是零,則說明按鍵有觸發
  76.     {
  77.          keymin++;
  78.       if(keymin==60)
  79.        keymin=0;
  80.     }      
  81.    }
  82.     min=keymin;
  83.    keyback = keystay;  //按鍵狀態賦值
  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,則按鍵狀態置為0(按下)
  92.    {
  93.       keystay = 0;
  94.    }
  95.    if(keydelay==0xff)
  96.    {      
  97.        keystay = 1;
  98.    }

  99. }
  100. void ClockProcess()//鬧鐘判斷函數
  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)//兩秒鐘之后在發生變化
  109.   {            
  110.     beep=~beep;   
  111.       D1 = 1;
  112.   }
  113.   
  114. }
  115. Timer.c模塊函數
  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    //中斷函數運行函數數量 [/size][/font][/backcolor][/color][/align]
  146.     TH0 = 0Xfc;                             //給定時器賦初值,定時100us
  147.     TL0 = 0x18;
  148.     for(i = 0;i<COUNT;i++)              //循環掃描,判斷哪一個任務定時時間已到
  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()   //處理函數
  162. {
  163.      unsigned char i;  
  164.     for (i=0; i<COUNT; i++)           // 循環判斷那一個任務需要運行,逐個任務時間處理
  165.    {
  166.       if (TaskCount[i].Flag)               // 時間不為0
  167.          {
  168.              TaskCount[i].Function();         // 運行任務
  169.              TaskCount[i].Flag = 0;          // 標志清0
  170.            }
  171.    }   
  172. }
復制代碼

評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久亚洲一区二区 | 超黄毛片 | 日本不卡高字幕在线2019 | 日韩欧美在线不卡 | 国产乱码精品1区2区3区 | 久久久久国产精品一区二区 | 精品一区欧美 | 91精品国模一区二区三区 | 精品av| 欧洲视频一区 | 欧美一二三区 | 成人激情视频在线 | 美美女高清毛片视频免费观看 | 激情在线视频 | 一区二区三区四区视频 | 超碰在线人人 | 久久久激情视频 | 在线一区视频 | 一区二区三区国产精品 | 日韩精品一区二区三区中文字幕 | 亚洲精品一区二区三区蜜桃久 | 日韩中文字幕视频 | 欧美一级片在线看 | 玖玖综合在线 | 国产成人在线播放 | 古装人性做爰av网站 | 久久av网 | 精品日韩一区二区 | 欧美日韩久久精品 | 中文字幕免费视频 | 久久国产精品色av免费观看 | 成人国产精品久久久 | 有码一区| 色综合久 | 国产精品爱久久久久久久 | 国产精品亚洲成在人线 | 成人羞羞国产免费视频 | 99精品视频网 | 黄视频免费 | 欧美综合国产精品久久丁香 | 性色av网站 |