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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機六位數碼管實現數字鐘,矩陣按鍵和蜂鳴器的程序

[復制鏈接]
跳轉到指定樓層
樓主

  1. //********************編譯預處理語句*******************************//
  2. #pragma SMALL        
  3. #include <reg51.h>
  4. #include <absacc.h>
  5. #include <intrins.h>
  6. //************************端口定義*********************************//
  7. sbit P3_6=P3^6;
  8. //************************全局變量定義*****************************//
  9. unsigned char clockbuf[3]={0,0,0};             //存放時鐘時、分、秒的十進制數
  10. unsigned char bellbuf[3]={0,0,0};             //存放鬧鐘時、分、秒的十進制數
  11. unsigned char msec1;                             //10ms中斷次數
  12. unsigned char msec2;                             //1s循環次數
  13. unsigned char timdata,rtimdata;                 //時鐘和鬧鐘修改標志位
  14. unsigned char count;                             //鬧鐘啟動后10s計時單元
  15. unsigned char *dis_p;                               //顯示緩沖區指針
  16. bit arm;                                 //鬧鐘標志,arm=0,鬧鐘沒有設定,arm=1鬧鐘已設定
  17. bit rtim;                                //鬧鐘是否啟動標志,rtim=1,鬧鐘已啟動
  18. bit rhour;                               //鬧鐘小時修改標志,rhour=1,正在修改鬧鐘小時
  19. bit rmin;                                //鬧鐘分修改標志,rmin =1,正在修改鬧鐘分鐘
  20. bit hour;                                //時鐘小時修改標志,hour=1正在修改時鐘小時
  21. bit min;                                 //時鐘分修改標志,min =1正在修改時鐘分鐘
  22. bit sec;                                 //時鐘秒修改標志,sec=1正在修改時鐘秒
  23. //***************************6位LED顯示函數*****************************//
  24. void display(unsigned char *p)
  25. {
  26.      unsigned char buffer[]={0,0,0,0,0,0};
  27.      unsigned char i,j,m,temp;
  28.      unsigned char  led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};    //0-9的顯示碼                                          
  29.      buffer[0]=p[0]/10;                         //將緩存區中數據的十位和各位分開
  30.      buffer[1]=p[0]%10;
  31.      buffer[2]=p[1]/10;
  32.      buffer[3]=p[1]%10;
  33.      buffer[4]=p[2]/10;
  34.      buffer[5]=p[2]%10;
  35. {                                      //沒有修改標志,正常顯示
  36.      temp=0x01;
  37.      for(i=0;i<6;i++)
  38.       {
  39.         P0=0x00;                            //關顯示
  40.         j=buffer[i];
  41.         P0=led[j];                                    //P0送段碼
  42.         P1=~temp;                                  //P1對應端口低電平選位
  43.        temp<<=1;
  44.        for(m=0;m<200;m++);                    //每一位顯示延時
  45.         }
  46.   }  
  47. }
  48. //********************************鍵盤檢測函數****************************//
  49. //函數名:keytest
  50. //函數功能:測試鍵盤有無鍵按下,讀出行輸入按鍵狀態碼,用于測試是否有按鍵按下
  51. //形式參數:無
  52. //返回值:鍵盤行輸入按鍵狀態碼,unsigned char類型
  53. unsigned char keytest()
  54.     {
  55.         unsigned char c;
  56.         P2=0xf0;                            //檢測是否有鍵按下, 行值全給1
  57.         c=P2;                                        //讀取P2的值
  58.         c=c&0xf0;                                //按鍵行輸入為P2.0~P2.3,屏蔽無關位
  59.         return(c);                                //返回c的值
  60.     }

  61. //*********************************查鍵值函數****************************//
  62. //函數名:search
  63. //函數功能:按鍵識別
  64. //形式參數:無
  65. //返回值:行列式按鍵的鍵碼,unsigned char類型
  66. unsigned char search()
  67. {
  68. unsigned char a,b,c,d,e;
  69. c=0x7f;                                       //首列掃描字送入變量c
  70. a=0;                                          //首行號送a
  71. while(1)
  72. {        
  73.    P2=c;                                       //給P2的賦值
  74.    d=P2;                                       //讀取P2的值
  75.    d=d&0x0f;                                   //屏蔽無關位h1-h4
  76. if(d==0x07){b=0;break;}                        //b為列號
  77. else if(d==0x0b){b=1;break;}
  78. else if(d==0x0d){b=2;break;}
  79. else if(d==0x0e){b=3;break;}
  80. a++;                                           //掃描行號加1
  81. c>>=1;                                        //修改列掃描字,掃描下一列
  82. if(a==4)  {a=0;c=0x7f;}                       //控制移位到h1
  83.   }
  84.   e=a*4+b;                                           //求鍵號
  85.   do{display(dis_p);}
  86.   while((d=keytest())!=0xf0);
  87.                                                //等待釋放按鍵                    
  88.    return(e);
  89. }
  90. //**************************鬧鐘判斷啟動函數****************************//
  91. //函數名:alarm
  92. //函數功能:啟動鬧鐘10s
  93. //形式參數:無
  94. //返回值:無
  95. void alarm()
  96. {
  97.    if((clockbuf[0]==bellbuf[0])&&(clockbuf[1]==bellbuf[1]))   
  98.    {                                                   //判斷時鐘與鬧鐘是否相等
  99.        P3_6=0;                                 //啟動鬧鐘
  100.        rtim=1;                                           //設置鬧鐘計時標志,鬧鐘將進行10s計時標志
  101.     }        
  102.    if(count==10)                               //判斷鬧鐘保持10s時間到否
  103.     {
  104.       count=0;                                 //清楚鬧鐘保持10s計時
  105.       P3_6=1;                                  //清除鬧鐘
  106.       arm=0;                                       //清鬧鐘標志,否則鬧鐘設置將繼續保持有效
  107.       rtim=0;                                       //鬧鐘關閉
  108.     }
  109. }
  110. //*****************************時鐘設置函數******************************//
  111. //函數名:ftion0
  112. //函數功能:時鐘修改,根據按鍵次數,修改時、分、秒修改標志全局變量
  113. //形式參數:無
  114. //返回值:無
  115. void ftion0()
  116. {
  117.   TR0=0;                                               //關定時器
  118.   rhour=0;                                               //禁止鬧鐘小時參數修改,清鬧鐘修改標志
  119.   rmin=0;                                                   //禁止鬧鐘分參數修改,清鬧鐘修改標志
  120.   dis_p=clockbuf;                                       //將時鐘緩存區首地址送顯示指針
  121.   rtimdata=0;                                           //清鬧鐘修改位置記錄
  122.   timdata++;                                           //將時鐘修改記錄值加1
  123.   switch(timdata)
  124.    {
  125.      case 0x01:sec=1;break;                           //記錄值為1,則將時鐘秒修改標志置1
  126.      case 0x02:sec=0;min=1;break;              //記錄值為2,則將時鐘分修改標志置1
  127.      case 0x03:min=0;hour=1;break;             //記錄值為3,則將時鐘小時修改標志置1
  128.      case 0x04:timdata=0;hour=0;TR0=1;break;   //按4次則清時鐘單元修改位置
  129.      default:break;                                           //記錄,定時器重新啟動
  130.         }
  131. }
  132. //****************************鬧鐘設置函數******************************//
  133. //函數名:ftion1
  134. //函數功能:鬧鐘修改,根據按鍵次數,修改時、分修改標志全局變量
  135. //形式參數:無
  136. //返回值:無

  137. void ftion1()
  138. {
  139.   sec=0;                                                   //禁止時鐘秒修改
  140.   min=0;                                                   //禁止時鐘分修改
  141.   hour=0;                                               //禁止時鐘小時修改
  142.   dis_p=bellbuf;                                    //設置鬧鐘顯示標志
  143.   timdata=0;                                           //清時鐘修改位置標志記錄
  144.   rtimdata++;                                           //將鬧鐘修改記錄值加1
  145.   switch(rtimdata)
  146.    {
  147.      case 0x01:rmin=1;break;                   //記錄值為1,則將鬧鐘分修改標志置1
  148.      case 0x02:rmin=0;rhour=1;break;           //記錄值為2,則將鬧鐘小時修改標志置1
  149.      case 0x03:rtimdata=0;rhour=0;arm=1;dis_p=clockbuf;break;   
  150.                                                //按3次則清鬧鐘單元修改位置記錄
  151.      default:break;                                       //恢復時鐘顯示標志               
  152.    }
  153. }
  154. //****************************加1修改功能函數**************************//
  155. //函數名:cum
  156. //函數功能:根據標志位對相應的時、分、秒單元加1
  157. //形式參數:無
  158. //返回值:無
  159. void cum()
  160. {
  161.   if(sec==1)                                           //若時鐘秒修改標志位為1,則秒單元內容加1
  162.    {
  163.     if(59==clockbuf[2]) clockbuf[2]=0;
  164.      else clockbuf[2]++;
  165.     }
  166.   else if(min==1)                              //若時鐘分修改標志為1,則分單元內容加1        
  167.    {
  168.      if(59==clockbuf[1]) clockbuf[1]=0;
  169.       else clockbuf[1]++;
  170.     }
  171.   else if(hour==1)                                   //若時鐘小時修改標志為1,則小時單元內容加1
  172.    {
  173.     if(23==clockbuf[0]) clockbuf[0]=0;
  174.     else clockbuf[0]++;
  175.     }
  176. else if(rmin==1)                                   //若鬧鐘分修改標志為1,則分單元內容加1
  177. {
  178. if(bellbuf[1]==59) bellbuf[1]=0;
  179. else bellbuf[1]++;
  180. }
  181. else if(rhour==1)                                   //若鬧鐘小時修改標志為1,則小時單元內容加1
  182. {
  183. if(bellbuf[0]==23) bellbuf[0]=0;
  184. else bellbuf[0]++;
  185. }
  186. }
  187. //***************************加1修改功能函數************************//
  188. //函數名:jian
  189. //函數功能:根據標志位對相應的時、分、秒單元減1
  190. //形式參數:無
  191. //返回值:無
  192. void jian()
  193. {
  194.   if(sec==1)                                      //若時鐘秒修改標志位為1,則秒單元內容減1
  195.   {
  196.     if(0==clockbuf[2]) clockbuf[2]=59;
  197.      else clockbuf[2]--;
  198.    }
  199.   else if(min==1)                             //若時鐘分修改標志為1,則分單元內容減1
  200.    {
  201.      if(0==clockbuf[1]) clockbuf[1]=59;
  202.        else clockbuf[1]--;
  203.     }
  204.   else if(hour==1)                            //若時鐘小時修改標志為1,則小時單元內容減1
  205.    {
  206.      if(0==clockbuf[0]) clockbuf[0]=23;
  207.       else clockbuf[0]--;
  208.      }
  209. else if(rmin==1)                                  //若鬧鐘分修改標志為1,則分單元內容減1
  210.    {
  211.      if(bellbuf[1]==0) bellbuf[1]=59;
  212.      else bellbuf[1]--;
  213.     }
  214.   else if(rhour==1)                           //若鬧鐘小時修改標志為1,則小時單元內容減1
  215.    {  
  216.     if(bellbuf[0]==0) bellbuf[0]=23;
  217.      else bellbuf[0]--;
  218.     }
  219. }
  220. //***************************定時器中斷函數******************************//
  221. //函數名:clock
  222. //函數功能:定時器T0定時中斷,interrupt  1
  223. //形式參數:無
  224. //返回值:無
  225. void clock() interrupt 1
  226. {
  227.   EA=0;                                                     //關中斷        
  228.   if(msec1!=0x28) msec1++;                   //6MHz晶振,到10ms否,不到則msec1加1
  229.    else
  230.    {
  231.      msec1=0;
  232.      if(msec2!=100) msec2++;                 //到1s否,不到則msec2加1
  233.       else
  234.         {
  235.         if(rtim==1) count++;                 //鬧鐘啟動標志計時10s
  236.         msec2=0;
  237.         if(clockbuf[2]!=59) clockbuf[2]++;          //到1min否,不到則clockbuf[2]加1
  238.         else                                    

  239. {
  240.   clockbuf[2]=0;
  241.   if(clockbuf[1]!=59) clockbuf[1]++;                 //到1h否,不到則clockbuf[1]加1
  242.    else
  243.    {   
  244.      clockbuf[1]=0;
  245.      if(clockbuf[0]!=23) clockbuf[0]++;      //到24h否,不到則clockbuf[0]加1
  246.      else clockbuf[0]=0;
  247.     }
  248. }
  249. }
  250. }
  251. EA=1;                                                         //開中斷
  252. }
  253. void main()
  254. {
  255.    unsigned char a;
  256.    arm=0;
  257.                                                             //清零鬧鐘標志位
  258.    P3_6=1;                                                 //P3_6置初值1
  259.    msec1=0;                                                 //設置10ms中斷次數初值
  260.    msec2=0;                                                 //設置1s中斷次數初值
  261.    timdata=0;                                             //時鐘內容修改位置記憶單元清零
  262.    rtimdata=0;                                             //鬧鐘內容修改位置記憶單元清零
  263.    count=0;                                                 //鬧鐘啟動后保持10s計時單元清零
  264.    TMOD=0x02;                                         //初始化定時器,定時器T0位工作方式2
  265.    TL0=0x06;                                              //定時250us初始化
  266.    TH0=0x06;                                       
  267.    EA=1;                                             //中斷允許控制
  268.    ET0=1;                                                 //定時器0開中斷
  269.    TR0=1;                                                 //啟動定時器0
  270.    dis_p=clockbuf;                                     //將時鐘值所在地址送人顯示指針
  271.    while(1)                                 
  272.      {
  273.         a=keytest();                             //調用鍵盤檢測子程序
  274.         if(a==0xf0)                          //判斷是否有鍵按下
  275.           {
  276. display(dis_p);                                         //無鍵輸入調用顯示程序
  277. if(arm==1) alarm();                                     //判斷鬧鐘設定否,若已設定則調用鬧鐘啟動子程序
  278. }
  279. else
  280.   {
  281.     display(dis_p);                                     //調用顯示子程序作為延時去抖            
  282.     a=keytest();
  283.     if(a!=0xf0)                                             //沒有抖動,則表示有鍵按下
  284.      {
  285.        a=search();                                     //調用查鍵值子程序
  286.        switch(a)
  287.       {
  288.        case 0x04:ftion0();break;             //是時鐘參數修改功能鍵,調用時鐘設置子程序
  289.        case 0x05:ftion1();break;             //是鬧鐘參數修改功能鍵,調用鬧鐘設置子程序
  290.        case 0x06:cum();break;                     //是加1功能鍵,則調用加1修改功能子程序
  291.        case 0x07:jian();break;                     //是減1功能鍵,則調用減1修改功能子程序
  292.        default:break;
  293.        }
  294.       }
  295.    }
  296.   }
  297. }
復制代碼

程序,代碼.rar

207.54 KB, 下載次數: 33, 下載積分: 黑幣 -5

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91成人在线视频 | 日韩一区二区在线视频 | 亚洲国产精品视频 | 天天插天天干 | 国产一区二区三区在线 | 国产二区av | 久久久噜噜噜久久中文字幕色伊伊 | 高清一区二区三区 | 国产精品久久久久久一区二区三区 | 成年人在线播放 | 久久精品在线 | 91亚洲国产成人精品一区二三 | 久久精品色欧美aⅴ一区二区 | 亚洲一区二区av | 国产欧美精品一区二区三区 | 亚洲精品一二区 | 99re在线视频 | 久久com | 国产探花在线精品一区二区 | 亚洲91视频 | 色婷婷综合久久久中字幕精品久久 | 精品久久久久久久久久 | av一级在线观看 | 中文字幕一区二区在线观看 | 久久久久久久久久久高潮一区二区 | 亚洲精品中文字幕在线 | 国产高清在线精品一区二区三区 | 精品国产乱码久久久久久蜜退臀 | 欧美激情视频一区二区三区在线播放 | 日本不卡高清视频 | 青青草精品 | 免费的av | 免费看黄色国产 | 久久精品久久久久久 | 国产精品成人久久久久 | 亚洲欧美日韩成人在线 | 日韩精品一区二区三区 | 欧美一区二区在线观看 | 天天色天天色 | 玖玖综合网| 最新超碰 |