|
時鐘顯示時、分、秒,程序和制作較簡單,誤差每天小于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電阻串聯代替)解決光線太暗時,數碼管不會全滅,調整半可調電阻顯示最低亮度。
制作出來的實物圖如下:
單片機源程序如下:
- //采用8位數碼管動態顯示程序
- //使用AT89C51單片機,12MHz晶振,P0輸出字段碼,P2口輸出位選碼
- //用共陽極LED數碼管,key0為調時分位選擇鍵,key1為加1鍵,key2為減1鍵,key3為確定鍵
- #include "reg51.h"
- //包含頭文件
- #define char unsigned char
- //定義無符號字符型
- //char code dis_7[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff}; //共陰極
- char code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //共陽極LED數碼管"0~9","-"的字段碼
- //char code scan_con[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
- char code scan_con[8] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; // P2口
- //位選擇碼
- char data dis[8]={0x00,0x00,0x0a,0x00,0x00,0x0a,0x00,0x00}; //00-00-00
- //顯示緩沖區,時、分、秒初始為0,0x0a為"-"的編碼
- char data timedata[3]={0x00,0x00,0x00}; //初始化
- //分別為秒、分和小時的值
- char data ms50=0x00,con=0x00,con1=0x00,con2=0x00;
- //定義四個按鍵
- sbit dian=P0^7;
- sbit key0=P1^0;
- sbit key1=P1^1;
- sbit key2=P1^2;
- sbit key3=P1^3;
- //1ms延時函數
- delay1ms(int t)
- {
- int i,j;
- for (i=0;i<t;i++)
- {
- for(j=0;j<120;j++);
- }
- }
- keyscan()//按鍵處理函數
- {
- EA=0; //關總中斷
- if (key0==0)//判斷第一個按鍵是否按下
- { //按鍵消抖
- delay1ms(10);
- while (key0==0);//再次判斷按鍵是否按下
- con++;
- TR0=0;
- ET0=0; //關定時/計數器,關T0中斷
- if (con>=3)
- {
- con=0;
- TR0=1;
- ET0=1;
- }
- }
- if (con!=0)
- {
- if (key1==0) //如果第二個按鍵按下
- {
- delay1ms(10);
- while (key1==0);
- timedata[con]++;//加一功能
- if (con==2)
- con1=24;
- else con1=60;
- if (timedata[con]>=con1)
- {timedata[con]=0;}
- }
- }
- if (con!=0)
- {
- if (key2==0)
- //如果第三個按鍵按下
- {
- delay1ms(10);
- while (key2==0);
- timedata[con]--;
- //減一功能
- if (con==2)
- con2=23;
- else con2=59;
- if (timedata[con]<=0)
- {
- timedata[con]=con2;
- }
- }
- }
- if(key3==0)//如果第四個按鍵按下
- {
- delay1ms(10);
- while(key3==0);
- EA=1;
- TR0=1;
- ET0=1;
- }
- EA=1;//開總中斷
- }
- //數碼管顯示函數
- scan()
- {
- char k;
- dis[0]=timedata[0]%10;
- dis[1]=timedata[0]/10;
- dis[2]=timedata[1]%10;
- dis[3]=timedata[1]/10;
- dis[4]=timedata[2]%10; //【1】顯示"分";【2】顯示"時";【0】顯示"秒"
- dis[5]=timedata[2]/10; //【1】顯示"分";【2】顯示"時";【0】顯示"秒"
- for (k=0;k<8;k++)
- {
- P0=dis_7[dis[k]];
- if (k==1|k==2|k==3|k==4)
- {
- dian=0;
- }
- else
- {
- dian=1;
- }
- P2=scan_con[k];
- delay1ms(1);
- P2=0x00; //數碼管消隱
- P2=0xff; //數碼管消隱
- }
- }
-
- //主函數
- main()
- {
- //TH0=0x4c;
- //TL0=0xb0;
- TH0=(65536-52615)/256; //12M,52615數值越大,走時越慢;數值越小,走時越快。
- TL0=(65536-52615)%256; //12M,52615數值越大,走時越慢;數值越小,走時越快?
- TMOD=0x01;
- //選擇工作方式1
- ET0=1;
- TR0=1;
- EA=1;
- while (1)
- {
- scan();
- //調用數碼管顯示scan()子函數
- keyscan();
- //調用按鍵處理keyscan()子函數
- }
- }
- //定時器/計數器T0中斷服務函數
- void time_intt0(void) interrupt 1
- {
- ET0=0;
- TR0=0;
- //TH0=0x4c; //12M 應該是TH00=0x4c
- //TL0=0xb0; //11.0592M 應該是TL00=0x00
- TH0=(65536-52615)/256; //12M,52615數值越大,走時越慢;數值越小,走時越快?
- TL0=(65536-52615)%256; //12M,52615數值越大,走時越慢;數值越小,走時越快?
- TR0=1;
- ms50++;
- if (ms50==19)
- {
- ms50=0x00;
- timedata[0]++;
- if (timedata[0]==60)
- {
- timedata[0]=0;
- timedata[1]++;
- if (timedata[1]==60)
- {
- timedata[1]=0;
- timedata[2]++;
- if (timedata[2]==24)
- {
- timedata[2]=0;
- }
- }
- }
- }
- ET0=1;
- //開T0中斷
- }
復制代碼
|
-
-
-
-
-
-
-
-
-
視頻.7z
2023-5-11 18:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
9.56 MB, 下載次數: 12, 下載積分: 黑幣 -5
-
-
Keil程序.7z
2023-5-11 18:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
16.83 KB, 下載次數: 21, 下載積分: 黑幣 -5
評分
-
查看全部評分
|