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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12324|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)電子鐘設(shè)計6位共陽數(shù)碼管顯示的PCB及仿真源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:408881 發(fā)表于 2018-10-13 09:12 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
Altium Designer畫的8位共陽數(shù)碼管顯示51單片機(jī)時鐘原理圖和PCB圖如下:(51hei附件中可下載工程文件)


仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. uchar sec,min,hour;//定義時、分、秒變量
  5. uchar counter10ms0,counter10ms1; //定義T0和T1的10ms計數(shù)變量
  6. uchar counter05s0;//定義0.5秒變量

  7. uchar KeyCounter; //定義保存功能按鍵計數(shù)值變量

  8. uchar OldKey;  //定義保存按鍵狀態(tài)變量
  9. bit AddFlag,SubbFlag;//定義加、減按鍵標(biāo)志
  10. bit FlashFlag; //定義閃爍標(biāo)志
  11. sbit LED1=P1^0;
  12. sbit LED2=P1^1;
  13. sbit LED3=P1^2;
  14. sbit LED4=P1^3;
  15. uchar Disbuff[8]={0,0,10,0,0,10,0,0};//定義數(shù)碼管顯示緩沖區(qū)單元
  16. uchar code DisCode[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};        //共陽數(shù)碼管段碼,0~9及“-”“熄滅”字符的字型碼

  17. sbit LED=P3^4; //工作指示燈

  18. /****************************************
  19. * 延時函數(shù)Delaynms(uint dly)          *
  20. * 延時時間 dly x 1ms    12MHz           *
  21. ****************************************/
  22. void Delaynms(uint dly)
  23. {
  24.         uchar i;
  25.         while(dly--)
  26.                 for(i=0;i<123;i++);
  27. }
  28. /***************************************/

  29. /****************************************
  30. * 顯示函數(shù)Display()                     *
  31. * 功能:根據(jù)將8個數(shù)碼管顯示一遍         *
  32. ****************************************/
  33. void Display(void)
  34. {
  35.         uchar i,n=0x01;
  36.         for(i=0;i<8;i++)
  37.         {
  38.                  P0=DisCode[Disbuff[i]];         //送段碼  
  39.                 P2=~n;                        //開位選
  40.                 Delaynms(1);   //延時
  41.                 n=n<<1;           //位選移位
  42.                 P0=0xff;                //段碼低電平全滅
  43.                 P2=0xff;           //經(jīng)過非門后變成高電平,使得位選關(guān)閉
  44.         }
  45. }
  46. /****************************************/

  47. /****************************************
  48. * BIN碼變換成BCD碼函數(shù)TimeDataBin2Bcd() *
  49. * 功能:將時、分、秒分離出十位和個位    *
  50. ****************************************/
  51. void TimeDataBin2Bcd()
  52. {
  53.          Disbuff[0]=hour/10;//分離小時十位
  54.          Disbuff[1]=hour%10;//分離小時個位
  55.          Disbuff[3]=min/10;//分離分鐘十位
  56.          Disbuff[4]=min%10;//分離分鐘個位
  57.          Disbuff[6]=sec/10;//分離秒十位
  58.          Disbuff[7]=sec%10;//分離秒個位

  59. }
  60. /***************************************/

  61. /****************************************
  62. * 讀入按鍵函數(shù)ReadKey()                 *
  63. * 功能:若有按鍵按下,返回按鍵值        *
  64. *       若沒有按鍵按下,返回255         *
  65. ****************************************/
  66. uchar ReadKey()
  67. {
  68.         uchar Key;
  69.         Key=P3&0xe0; //讀入按鍵值  P3&1110 0000
  70.         if(Key!=0xe0)
  71.         {                          //若有鍵按下
  72.                  
  73.                 Delaynms(10);
  74.                 Key=P3&0xe0; //重新讀入按鍵值
  75.                 if(Key!=0xe0)
  76.                 {                         //若有鍵按下
  77.                         if((Key!=0xe0)&&(OldKey==0xe0))        //判斷是否下降沿  
  78.                          {
  79.                                 OldKey=Key;         //保存本次按鍵值
  80.                                 return(Key); //返回按鍵值
  81.                         }
  82.                 }        
  83.         }
  84.         OldKey=Key;        //無鍵按下,保存本次按鍵值,返回255
  85.         return(255);        //不能夠刪,否則出錯   
  86. }
  87. /***************************************/

  88. /****************************************
  89. * 按鍵分析函數(shù)KeyAnalysis(uchar Key)    *
  90. * 功能:對功能鍵計數(shù)                    *
  91. *       對加、減鍵設(shè)標(biāo)志                *
  92. ****************************************/
  93. void KeyAnalysis(uchar Key)
  94. {
  95.         if(Key!=255)
  96.         {        //有鍵按下
  97.                 switch(Key)
  98.                 {
  99.                 case 0x60:        KeyCounter++;        //功能鍵按下           0110 0000  因為85行Key=P3&0xe0; //重新讀入按鍵值
  100.                                                 if(KeyCounter==3)KeyCounter=0;
  101.                                                 break;
  102.                 case 0xa0:  if(KeyCounter!=0)AddFlag=1;break;  //+鍵按下        1010 0000         
  103.                 case 0xc0:  if(KeyCounter!=0)SubbFlag=1;break; //-鍵按下        1100 0000
  104.                 }
  105.         }
  106. }
  107. /***************************************/

  108. /****************************************
  109. * 時間調(diào)整函數(shù)AdjTime()                 *
  110. * 功能:對分鐘、小時加、減設(shè)置          *
  111. *                                       *
  112. ****************************************/
  113. void AdjTime()
  114. {
  115.          if(KeyCounter==1)
  116.         {                                 //設(shè)置分鐘
  117.                  if(AddFlag)
  118.                 {                         //分鐘+設(shè)置
  119.                          AddFlag=0; //標(biāo)志位要清零 ,否則影響下次按鍵判斷
  120.                         min++;
  121.                         if(min==60)min=0;
  122.                 }
  123.                 if(SubbFlag)
  124.                 {                   //分鐘-設(shè)置
  125.                          SubbFlag=0;                 //標(biāo)志位要清零 ,否則影響下次按鍵判斷
  126.                         min--;
  127.                         if(min==255)min=59;        //分鐘減到0的時候,unsigned char型的變量回到255
  128.                 }
  129.         }
  130.         if(KeyCounter==2)
  131.         {                          //設(shè)置小時
  132.                  if(AddFlag)
  133.                 {                  //小時+設(shè)置
  134.                          AddFlag=0;
  135.                         hour++;
  136.                         if(hour==24)hour=0;
  137.                 }
  138.                 if(SubbFlag)
  139.                 {                   //小時-設(shè)置
  140.                          SubbFlag=0;
  141.                         hour--;
  142.                         if(hour==255)hour=23;
  143.                 }
  144.         }
  145. }
  146. /***************************************/


  147. /****************************************
  148. * 閃爍控制函數(shù)FlashControl()            *
  149. * 功能:對調(diào)整的分鐘、小時進(jìn)行熄滅設(shè)置  *
  150. *                                       *
  151. ****************************************/
  152. void FlashControl()
  153. {
  154.         if(FlashFlag)
  155.         {
  156.                  if(KeyCounter==1)
  157.                 {
  158.                            Disbuff[3]=11;        //DisCode[11]=0x00,數(shù)碼管滅
  159.                          Disbuff[4]=11;
  160.                 }
  161.                  if(KeyCounter==2)
  162.                 {
  163.                            Disbuff[0]=11;
  164.                          Disbuff[1]=11;
  165.                 }
  166.         }
  167. }
  168. /******************************?????*********/

  169. /*void LEDFLASH(void)                  
  170. {
  171.         LED1=~LED1;
  172.         LED2=~LED2;
  173.         LED3=~LED3;
  174.         LED4=~LED4;
  175.         
  176. }
  177. */

  178. void main(void)
  179. {
  180.         uchar Key;
  181.         P1=0XF0;   //時分間隔的兩個LED燈亮
  182.         TMOD=0x11;         //定時器0,1都設(shè)置為工作方式一
  183.         TH0=(65536-10000)/256;
  184.         TL0=(65536-10000)%256;
  185.         TH1=(65536-10000)/256;
  186.         TL1=(65536-10000)%256;
  187.         ET0=1;ET1=1;   //開定時器0,1的中斷
  188.         EA=1;                //開總中斷
  189.         while(1)
  190.         {
  191.                 Key=ReadKey();                //讀取按鍵,檢測按鍵是否按下
  192.                 KeyAnalysis(Key);        //判斷哪個按鍵按下
  193.                 if(KeyCounter==0)         //假如沒有按下功能鍵
  194.                 {        TR0=1;                         //啟動定時器0,秒計數(shù)
  195.                         TR1=0;
  196.                         TimeDataBin2Bcd();           //分離變量以便后面數(shù)碼管的顯示
  197.                 }
  198.                 else
  199.                 {
  200.                          TR0=0;                //關(guān)閉定時器0,
  201.                         TR1=1;                   //啟動定時器1
  202.                         AdjTime();        //調(diào)整時間
  203.                         TimeDataBin2Bcd(); //分離變量以便后面數(shù)碼管的顯示
  204.                         FlashControl();           //對調(diào)整的分鐘、小時進(jìn)行熄滅數(shù)碼管設(shè)置
  205.                 }
  206.                 Display();         //顯示數(shù)碼管
  207.         }
  208. }

  209. void Timer0(void) interrupt 1
  210. {
  211.         TH0=(65536-10000)/256;
  212.         TL0=(65536-10000)%256;
  213.         counter10ms0++;
  214.         
  215.         if(counter10ms0==50)
  216.         {
  217.                  counter10ms0=0;
  218.                 counter05s0++;
  219.                 LED=0;                //LED=P3^4; //工作指示燈亮

  220.                 if(counter05s0==2)         //1s到來
  221.                 {         
  222.                         counter05s0=0;
  223.                         sec++;
  224. ……………………

  225. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
電子時鐘資料全.zip (2.56 MB, 下載次數(shù): 181)


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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 女同久久另类99精品国产 | 免费黄色片在线观看 | 黄网站涩免费蜜桃网站 | 成人网在线 | 日韩福利 | 久久99精品久久久97夜夜嗨 | 久久久久国色av免费观看性色 | 亚洲色欧美另类 | 中文字幕第十一页 | 午夜男人天堂 | 日韩欧美在线观看 | 欧美日韩大片 | 免费一级做a爰片久久毛片潮喷 | 精品视频一区二区三区 | 精品乱码一区二区 | 超碰97免费在线 | 亚洲高清一区二区三区 | 久久机热 | 一区精品视频 | 在线视频一区二区三区 | 午夜免费视频 | 成人精品一区 | 亚洲电影一级片 | 美女久久久久久久 | 久久久久久久91 | 日韩欧美精品在线 | av中文在线 | 国产色99| 精品免费 | 日韩一区二区福利视频 | 国产目拍亚洲精品99久久精品 | 亚洲永久精品国产 | 久久国产高清视频 | 视频在线亚洲 | 精国产品一区二区三区 | 成人性视频免费网站 | 手机av免费在线 | 天天插天天射天天干 | 91精品国产99| 福利视频网 | av中文字幕在线 |