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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機八位一體數碼管和矩陣鍵盤制作的可調時鐘程序+Proteus仿真

[復制鏈接]
跳轉到指定樓層
樓主
最近剛學了數碼管動態掃描和矩陣鍵盤,正好把這兩個內容合并在一起寫了這個可調時鐘
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include<at89x51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uint time_t;//毫秒統計值
  5. char hour_now,min_now,sec_now,// 實時時間
  6.           hour_a1,min_a1,sec_a1,
  7.           hour_a2,min_a2,sec_a2;//鬧鐘時間
  8. uchar key,key_num,time_cdk;//鍵盤掃描值,鍵盤鍵值
  9. uchar code led[10]={0xfc,0x60,0xda,0xf2,
  10. 0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//數碼管顯示0-9
  11. sbit beep=P3^7;//定義P3.7口為蜂鳴器控制口
  12. /********************************************************************/
  13. //函數名:delay_1ms(uint x)
  14. //功能:利用定時器0精確定時1ms; 自加 time_t的值為后面時間調整函數服務
  15. //調用函數:
  16. //輸入參數:x,1ms計數
  17. //輸出參數:
  18. //說明:延時的時間為1ms乘以x
  19. /********************************************************************/
  20. void delay_1ms(uint x)
  21. {
  22.         TMOD=0X01;//開定時器0,工作方式為1
  23.         TR0=1;//啟動定時器0;
  24.         while(x--)
  25.         {
  26.                 TH0=0Xfc;//定時1ms初值的高8位裝入TH0
  27.                 TL0=0X18;//定時1ms初值的低8位裝入TL0
  28.                 while(!TF0);//等待,直到TF0為1
  29.                 TF0=0;
  30.                 time_t++;//毫秒統計值自加1        
  31.         }               
  32.         TR0=0;//停止定時器0;
  33. }
  34. /**********************************************************/
  35. //函數名:display_num(uchar num,dis_w)
  36. //功能:2位數碼管顯示
  37. //調用函數:delay_1ms(uint x)
  38. //輸入參數:num,dis_w
  39. //輸出參數:
  40. //說明:P0口做數碼管段選,P2口做位選
  41. //通過dis_w的值確定num值在數碼管上顯示的位置
  42. /**********************************************************/
  43. void display_num(uchar num,dis_w)
  44. {
  45.         uchar j;
  46.         for(j=0;j<2;j++)
  47.         {
  48.                 P0=0xff;//段選口置高,消影
  49.                 P2=~dis_w;//裝入位選值
  50.                 if(j>0)
  51.                         P0=~led[num/10];//顯示num個位        
  52.                 else                        
  53.                         P0=~led[num%10];//顯示num十位        
  54.                 dis_w=dis_w<<1;         
  55.                 delay_1ms(5);//延時5ms        
  56.         }
  57. }
  58. /**********************************************************/
  59. //函數名:display_char()
  60. //功能:顯示時間分隔符“-”
  61. //調用函數:delay_1ms(uint x)
  62. //輸入參數:
  63. //輸出參數:
  64. //說明:
  65. /**********************************************************/
  66. void display_char()
  67. {
  68.         P0=0xff;//段選口置高,消影
  69.         P2=~0x24;
  70.         P0=~0x02;//顯示字符“-”
  71.         delay_1ms(5);//延時5ms
  72. }
  73. /**********************************************************/
  74. //函數名:display(uchar sec,min,hour)
  75. //功能:8位數碼管顯示
  76. //調用函數:display_num(uchar num,dis_w),display_char()
  77. //輸入參數:sec,min,hour
  78. //輸出參數:
  79. //說明:數碼管顯示完整的時間
  80. /**********************************************************/
  81. void display(uchar sec,min,hour)
  82. {
  83.                 display_num(sec,0x01);//顯示秒
  84.                 display_num(min,0x08);//顯示分
  85.                 display_num(hour,0x40);//顯示小時
  86.                 display_char();//顯示分隔符“-”
  87. }
  88. /**********************************************************/
  89. //函數名:time_take()
  90. //功能:時間調整
  91. //調用函數:
  92. //輸入參數:
  93. //輸出參數:
  94. //說明:通過time_t的值調整個時間單位,24小時制,定時報警
  95. /**********************************************************/

  96. void time_take()
  97. {
  98.         if(((hour_now==hour_a1&min_now==min_a1)|(hour_now==hour_a2&min_now==min_a2))&
  99.         ((sec_now<6&time_cdk==0)|(sec_now>55&time_cdk==1)))//判斷是否到定時值
  100.                 beep=0;//到定時值,啟動蜂鳴器
  101.         else
  102.                 beep=1;//未到定時值,關蜂鳴器               
  103.         if(time_t>=1000)//當總延時數為1s時
  104.         {
  105.                 time_t=0;//time_t清零        
  106.                 if(time_cdk==0)
  107.                 {
  108.                         sec_now++;//秒加1
  109.                         if(sec_now>=60)//當秒值等于60時
  110.                         {
  111.                                 sec_now=0;//秒值清零
  112.                                 min_now++;//分加1
  113.                                 if(min_now>=60)//當分等于60時
  114.                                 {
  115.                                         min_now=0;//分清零
  116.                                         hour_now++;//小時加1
  117.                                         if(hour_now>=24)//當小時等于24時
  118.                                         hour_now=0;//小時清零
  119.                                 }
  120.                         }
  121.                 }
  122.                 else
  123.                         sec_now--;//秒加1
  124.                         if(sec_now<0)//當秒值等于60時
  125.                         {
  126.                                 sec_now=59;//秒值清零
  127.                                 min_now--;//分加1
  128.                                 if(min_now<0)//當分等于60時
  129.                                 {
  130.                                         min_now=59;//分清零
  131.                                         hour_now--;//小時加1
  132.                                         if(hour_now<0)//當小時等于24時
  133.                                         hour_now=23;//小時清零
  134.                                 }
  135.                         }
  136.         }
  137. }
  138. /**********************************************************/
  139. //函數名:keyscan()
  140. //功能:得出4x4鍵盤的行列掃描值
  141. //調用函數:delay_1ms(uint x)
  142. //輸入參數:
  143. //輸出參數:
  144. //說明:通過P1口的掃描得出掃描值key,無鍵按下key為0
  145. /**********************************************************/
  146. uchar keyscan()
  147. {
  148.          uchar code_h;//行編碼                          
  149.         uchar code_l;//列編碼                        
  150.         P1=0XF0;                                 
  151.         if((P1&0xF0)!=0XF0)               
  152.         {
  153.                 delay_1ms(5);//調用定時函數                  
  154.                 if((P1&0xF0)!=0XF0)        
  155.                 {
  156.                         
  157.                         code_h=0xfe;  
  158.                         while((code_h&0x10)!=0x00)        
  159.              {
  160.                                 P1=code_h;                        
  161.                                 if((P1&0xF0)!=0XF0)         
  162.                                 {
  163.                                         code_l=(P1&0xF0|0x0F);         
  164.                                         return((~code_h)+(~code_l));         
  165.                                 }
  166.                                 else
  167.                                         code_h=(code_h<<1)|0x01;   
  168.                         }
  169.                 }
  170.         }
  171.         return(0);//無鍵按下返回0         
  172. }
  173. /**********************************************************/
  174. //函數名:keynum()
  175. //功能:得出4x4按鍵的鍵值
  176. //調用函數:keyscan()
  177. //輸入參數:
  178. //輸出參數:
  179. //說明:通過key的值確定安鍵鍵值
  180. /**********************************************************/
  181. void keynum()
  182. {
  183.    uchar i,j;
  184.    uchar code tab[4][4]={{1,2,3,4},{5,6,7,8},{9,0,11,12},{13,14,15,16}};
  185.    //4x4鍵盤各鍵值標注
  186.    key=0;
  187.           key=keyscan();//引入key值
  188.           if((key&0x01)!=0) i=0;
  189.           if((key&0x02)!=0) i=1;
  190.           if((key&0x04)!=0) i=2;
  191.           if((key&0x08)!=0) i=3;
  192.           if((key&0x10)!=0) j=0;
  193.           if((key&0x20)!=0) j=1;
  194.           if((key&0x40)!=0) j=2;
  195.           if((key&0x80)!=0) j=3;
  196.           if(key!=0) key_num=tab[i][j];//通過比較得出4x4鍵盤的鍵值   
  197. }
  198. /**********************************************************/
  199. //函數名:keyplay(uchar sec,min,hour,tkey)
  200. //功能:時間調整,包括定時時間
  201. //調用函數:display(uchar sec,min,hour);keynum()
  202. //輸入參數:
  203. //輸出參數:
  204. //說明:tkey的值確定調整的時間類型,帶除錯功能
  205. /**********************************************************/
  206. void keyplay(uchar sec,min,hour,tkey)
  207. {
  208.                 uchar data timenum[]={0,0,0,0,0,0};//建立時間各單位數組
  209.                 uchar i=0,take_key;               
  210.                 keynum();//調用鍵值程序
  211.                 if(key_num==16)//按鍵值為16時
  212.                 {
  213.                         time_cdk=1;//倒計時開關置1        
  214.                 }
  215.                 if(key_num==15)//按鍵值為15時
  216.                 {
  217.                         time_cdk=0;//倒計時開關置0
  218.                 }
  219.                 if(key_num==tkey)//判斷調整鍵有無按下
  220.                 {               
  221.                         take_key=1;//循環開關值設1
  222.                         timenum[0]=hour/10;
  223.                         timenum[1]=hour%10;
  224.                         timenum[2]=min/10;
  225.                         timenum[3]=min%10;//將原時間引入修改模式
  226.                         while(take_key)//判斷是否在設定模式中
  227.                         {                                                        
  228.                                 keynum();
  229.                                 while(key!=0)//鍵盤松手檢測
  230.                                 keynum();                           
  231.                                 if(key_num<11)//判斷鍵值是否為0-9數字鍵
  232.                                         {
  233.                                                 i++;
  234.                                                 timenum[i-1]=key_num;//鍵值賦值于數組
  235.                                                 key_num=17;//鍵值清空                        
  236.                                         }
  237.                                 if(key_num==12)//判斷有無按下確定鍵
  238.                                         take_key=0;//開關值置0,跳出循環
  239.                                 if(i==6)
  240.                                         take_key=0;//6位數調整結束,自動跳出循環        
  241.                                 hour=timenum[0]*10+timenum[1];
  242.                                 min=timenum[2]*10+timenum[3];
  243.                                 sec=timenum[4]*10+timenum[5];//調整值賦值于調整時間
  244.                                 display(sec,min,hour);
  245.                         }
  246.                         if(sec>59)
  247.                                 sec=0;
  248.                         if(min>59)
  249.                                 min=0;
  250.                         if(hour>23)
  251.                                 hour=0;//時間溢出排錯
  252.                         if(tkey==11)//調整鍵11為實時時間調整
  253.                         {
  254.                                 sec_now=sec;
  255.                                 min_now=min;
  256.                                 hour_now=hour;               
  257.                         }
  258.                         if(tkey==13)//調整鍵13為定時值a1調整
  259.                         {
  260.                                 sec_a1=sec;
  261.                                 min_a1=min;
  262.                                 hour_a1=hour;               
  263.                         }
  264.                         if(tkey==14)//調整鍵14為定時值a2調整
  265.                         {
  266.                                 sec_a2=sec;
  267.                                 min_a2=min;
  268.                                 hour_a2=hour;               
  269.                         }               
  270.                 }        
  271. }
  272. /**********************************************************/
  273. /**********************************************************/
  274. void main()
  275. {
  276.         sec_now=57;
  277.         min_now=59;
  278.         hour_now=23;
  279.         sec_a1=0;
  280.         min_a1=0;
  281.         hour_a1=0;
  282.         sec_a2=1;
  283.         min_a2=1;
  284.         hour_a2=1;        //各時間初始化
  285.         time_cdk=0;
  286.         while(1)
  287.         {
  288.                 display(sec_now,min_now,hour_now);//顯示實時時間
  289.                 time_take();//調用時間調整程序
  290.                 keyplay(sec_now,min_now,hour_now,11);//調整的時間為實時時間
  291.                 keyplay(sec_a1,min_a1,hour_a1,13);//調整的時間為定時值a1
  292.                    keyplay(sec_a2,min_a2,hour_a2,14);//調整的時間為定時值a2
  293.         }
  294. }
復制代碼
全部資料51hei下載地址:
八位一體時鐘加矩陣鍵盤.zip (58.54 KB, 下載次數: 38)

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区 日韩 | 91网在线观看 | 在线一区二区三区 | 久久区二区 | 日韩欧美在线视频 | 中文字幕亚洲在线 | h视频在线免费 | 国产区视频在线观看 | 中文字幕亚洲一区 | 粉嫩av| 午夜精品久久久久久久久久久久 | 五月婷婷中文 | 成人免费一区二区三区视频网站 | 国产成人网 | 久久国产一区 | 青青草综合 | 久久亚洲91 | 亚洲成人精品国产 | 天天草夜夜骑 | 高清免费在线 | 久久久精品综合 | 亚洲一区 | 天堂一区二区三区 | 亚洲视频观看 | 国产精品久久久久久高潮 | 日韩欧美在线观看视频网站 | 精品中文字幕一区 | 亚洲免费在线观看视频 | 亚洲国产精品久久久久秋霞不卡 | 亚洲精品久久久久久国产精华液 | 夏同学福利网 | 日韩精品在线播放 | www.久久艹| 狠狠操操 | 天天人人精品 | 毛片一区二区三区 | 欧美一区二区 | 阿v视频在线观看 | 久久里面有精品 | 欧美高清视频在线观看 | 国产精品久久久久久久久久 |