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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2261|回復: 0
收起左側

單片機六位數碼管時鐘制作 源碼、軟件、電路原理圖、視頻

[復制鏈接]
ID:378402 發表于 2023-5-10 18:07 | 顯示全部樓層 |閱讀模式
時鐘顯示時、分、秒,程序和制作較簡單,誤差每天小于1秒。缺點是斷電后不能保存時間。

制作過程:利用現有的電子元器件,參數選擇上可能不是最優的,程序和軟件來源于互聯網,整理后上傳主要是為初學者了解單片機。
             在自學單片機C語言程序有問題時,可以利用互聯網免費的Chat GPT
             提問“你是單片機C語言專家,再提出編程或解釋程序等問題”。
      1、調整時間快慢時,用手機時鐘比照,從大往小數值調整,調至個位數時,增加數值1,單片機時鐘跑慢;
           減少數值減1,單片機時鐘跑快,這時誤差能控制在兩天差1秒左右。
      2、整機測試耗電5V,90ma左右,建議用5V充電頭供電。
      3、按鍵P1.3確認鍵,沒利用,可用P1.0鍵代替。
電子元器件:
      1、一寸六個共陽數碼管LG10016BH。
      2、P0是8個段腳;P2是6個位腳。
      3、三個按鍵開關(P1.0調整時間;P1.1調整時間增;P1.2調整時間減)、六個1K電阻、六個S8550三極管和一片STC89C51RC。

附:1、加光敏電阻原理圖:利用原程序,加光敏電阻是解決晚上時鐘顯示太亮。加半可調電阻(因沒有現成大的半可調電阻,用5K的半可調電阻
            和10K電阻串聯代替)解決光線太暗時,數碼管不會全滅,調整半可調電阻顯示最低亮度。

制作出來的實物圖如下:
IMG_20230510_083749.jpg IMG_20230510_083438.jpg 六數碼管時鐘原理圖_光敏.png

單片機源程序如下:
  1. //采用8位數碼管動態顯示程序
  2. //使用AT89C51單片機,12MHz晶振,P0輸出字段碼,P2口輸出位選碼
  3. //用共陽極LED數碼管,key0為調時分位選擇鍵,key1為加1鍵,key2為減1鍵,key3為確定鍵


  4. #include  "reg51.h"
  5. //包含頭文件
  6. #define char unsigned char
  7. //定義無符號字符型
  8. //char code dis_7[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};   //共陰極
  9. char code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};     //共陽極LED數碼管"0~9","-"的字段碼
  10. //char code scan_con[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  11. char code scan_con[8] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; // P2口
  12. //位選擇碼
  13. char data dis[8]={0x00,0x00,0x0a,0x00,0x00,0x0a,0x00,0x00};                //00-00-00
  14. //顯示緩沖區,時、分、秒初始為0,0x0a為"-"的編碼
  15. char data timedata[3]={0x00,0x00,0x00};                //初始化
  16. //分別為秒、分和小時的值
  17. char data ms50=0x00,con=0x00,con1=0x00,con2=0x00;
  18. //定義四個按鍵
  19. sbit  dian=P0^7;
  20. sbit  key0=P1^0;
  21. sbit  key1=P1^1;
  22. sbit  key2=P1^2;
  23. sbit  key3=P1^3;

  24. //1ms延時函數
  25. delay1ms(int t)
  26. {
  27.         int i,j;
  28.         for (i=0;i<t;i++)
  29.         {
  30.                 for(j=0;j<120;j++);
  31.         }
  32. }

  33. keyscan()//按鍵處理函數
  34. {
  35.         EA=0; //關總中斷
  36.         if (key0==0)//判斷第一個按鍵是否按下
  37.         {                            //按鍵消抖
  38.                 delay1ms(10);
  39.                 while (key0==0);//再次判斷按鍵是否按下
  40.                   con++;
  41.                 TR0=0;
  42.                 ET0=0; //關定時/計數器,關T0中斷
  43.                 if (con>=3)  
  44.                 {
  45.                         con=0;
  46.                         TR0=1;
  47.                         ET0=1;
  48.                 }
  49.         }
  50.         if (con!=0)
  51.         {
  52.    if (key1==0)        //如果第二個按鍵按下
  53.                 {
  54.               delay1ms(10);
  55.               while (key1==0);
  56.               timedata[con]++;//加一功能
  57.               if (con==2)
  58.                 con1=24;
  59.                 else con1=60;                        
  60.                 if (timedata[con]>=con1)
  61.          {timedata[con]=0;}
  62.              }
  63.         }
  64.           if (con!=0)
  65.    {
  66.    if (key2==0)
  67.       //如果第三個按鍵按下
  68.                 {
  69.                         delay1ms(10);
  70.          while (key2==0);
  71.          timedata[con]--;
  72.          //減一功能
  73.          if (con==2)
  74.              con2=23;
  75.          else con2=59;                        
  76.             if (timedata[con]<=0)
  77.                {
  78.                                                 timedata[con]=con2;
  79.                }
  80.        }
  81.    }
  82.         if(key3==0)//如果第四個按鍵按下
  83.         {      
  84.                 delay1ms(10);
  85.            while(key3==0);
  86.            EA=1;
  87.            TR0=1;
  88.            ET0=1;        
  89.         }
  90.         EA=1;//開總中斷
  91. }

  92. //數碼管顯示函數

  93.         scan()
  94. {
  95.         char k;
  96.         dis[0]=timedata[0]%10;
  97.    dis[1]=timedata[0]/10;
  98.    dis[2]=timedata[1]%10;
  99.    dis[3]=timedata[1]/10;
  100.         dis[4]=timedata[2]%10;                //【1】顯示"分";【2】顯示"時";【0】顯示"秒"
  101.    dis[5]=timedata[2]/10;                //【1】顯示"分";【2】顯示"時";【0】顯示"秒"
  102.    for (k=0;k<8;k++)
  103.         {
  104.                 P0=dis_7[dis[k]];
  105.                 if (k==1|k==2|k==3|k==4)
  106.                 {
  107.                         dian=0;
  108.                 }
  109.                 else
  110.                 {
  111.                         dian=1;
  112.                 }
  113.                 P2=scan_con[k];
  114.                 delay1ms(1);
  115.                 P2=0x00;    //數碼管消隱
  116.                 P2=0xff;    //數碼管消隱
  117.         }
  118. }
  119.         
  120. //主函數
  121.         main()
  122. {
  123. //TH0=0x4c;
  124. //TL0=0xb0;
  125.         TH0=(65536-52615)/256;                //12M,52615數值越大,走時越慢;數值越小,走時越快。
  126.         TL0=(65536-52615)%256;                //12M,52615數值越大,走時越慢;數值越小,走時越快?
  127.         TMOD=0x01;
  128.         //選擇工作方式1
  129.         ET0=1;
  130.         TR0=1;
  131.         EA=1;
  132.    while (1)
  133.    {
  134.                 scan();
  135.         //調用數碼管顯示scan()子函數
  136.         keyscan();
  137.         //調用按鍵處理keyscan()子函數
  138.         }
  139. }

  140. //定時器/計數器T0中斷服務函數
  141. void time_intt0(void) interrupt 1
  142. {
  143.         ET0=0;
  144.         TR0=0;
  145.         //TH0=0x4c;         //12M 應該是TH00=0x4c
  146.         //TL0=0xb0;        //11.0592M 應該是TL00=0x00
  147.         TH0=(65536-52615)/256;                //12M,52615數值越大,走時越慢;數值越小,走時越快?
  148.         TL0=(65536-52615)%256;                //12M,52615數值越大,走時越慢;數值越小,走時越快?
  149.         TR0=1;
  150.         ms50++;
  151.         if (ms50==19)
  152.    {
  153.                 ms50=0x00;
  154.                 timedata[0]++;
  155.       if (timedata[0]==60)
  156.       {
  157.                         timedata[0]=0;
  158.                         timedata[1]++;
  159.                         if (timedata[1]==60)
  160.          {
  161.                                 timedata[1]=0;
  162.                                 timedata[2]++;
  163.             if (timedata[2]==24)
  164.             {
  165.                                         timedata[2]=0;
  166.             }
  167.          }
  168.             }
  169.    }
  170.     ET0=1;
  171.         //開T0中斷
  172. }
復制代碼

編程器連接.jpg
IMG_20230510_083610.jpg
IMG_20230510_083445.jpg
IMG_20230510_101320.jpg
線路板背面.jpg
線路板正面.jpg
六數碼管時鐘原理圖.png

視頻.7z

9.56 MB, 下載次數: 12, 下載積分: 黑幣 -5

Keil程序.7z

16.83 KB, 下載次數: 21, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +80 收起 理由
admin + 80

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲va国产日韩欧美精品色婷婷 | 欧美一级片中文字幕 | av片在线观看网站 | 天天影视网天天综合色在线播放 | 久久久这里只有17精品 | 男女羞羞视频在线观看 | 亚洲免费一区 | 色噜噜色综合 | 日日操操 | 久久久久久久国产精品视频 | 中文字幕欧美在线观看 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 日本高清aⅴ毛片免费 | 久久精品中文 | 亚洲欧美在线观看 | 欧美日韩精品一区二区三区视频 | 久久国内精品 | 日日夜夜精品免费视频 | 日韩欧美大片在线观看 | 免费黄色的视频 | 色偷偷人人澡人人爽人人模 | 久久精品视频免费观看 | 国产美女在线看 | 亚洲福利 | 国产精品三级久久久久久电影 | 龙珠z国语版在线观看 | 91久久精品一区二区二区 | 精品一区二区av | 中文字幕日韩欧美一区二区三区 | 免费观看的av | 久久中文视频 | 毛片免费在线 | 国产亚洲精品久久午夜玫瑰园 | 欧美午夜精品 | 天堂综合网 | 欧美精品一区二区三区一线天视频 | av网站免费在线观看 | 亚洲欧洲精品成人久久奇米网 | 国产二区在线播放 | 四虎影院新地址 | 欧美日韩视频 |