|
時(shí)鐘顯示時(shí)、分、秒,程序和制作較簡單,誤差每天小于1秒。缺點(diǎn)是斷電后不能保存時(shí)間。
制作過程:利用現(xiàn)有的電子元器件,參數(shù)選擇上可能不是最優(yōu)的,程序和軟件來源于互聯(lián)網(wǎng),整理后上傳主要是為初學(xué)者了解單片機(jī)。
在自學(xué)單片機(jī)C語言程序有問題時(shí),可以利用互聯(lián)網(wǎng)免費(fèi)的Chat GPT
提問“你是單片機(jī)C語言專家,再提出編程或解釋程序等問題”。
1、調(diào)整時(shí)間快慢時(shí),用手機(jī)時(shí)鐘比照,從大往小數(shù)值調(diào)整,調(diào)至個(gè)位數(shù)時(shí),增加數(shù)值1,單片機(jī)時(shí)鐘跑慢;
減少數(shù)值減1,單片機(jī)時(shí)鐘跑快,這時(shí)誤差能控制在兩天差1秒左右。
2、整機(jī)測試耗電5V,90ma左右,建議用5V充電頭供電。
3、按鍵P1.3確認(rèn)鍵,沒利用,可用P1.0鍵代替。
電子元器件:
1、一寸六個(gè)共陽數(shù)碼管LG10016BH。
2、P0是8個(gè)段腳;P2是6個(gè)位腳。
3、三個(gè)按鍵開關(guān)(P1.0調(diào)整時(shí)間;P1.1調(diào)整時(shí)間增;P1.2調(diào)整時(shí)間減)、六個(gè)1K電阻、六個(gè)S8550三極管和一片STC89C51RC。
附:1、加光敏電阻原理圖:利用原程序,加光敏電阻是解決晚上時(shí)鐘顯示太亮。加半可調(diào)電阻(因沒有現(xiàn)成大的半可調(diào)電阻,用5K的半可調(diào)電阻
和10K電阻串聯(lián)代替)解決光線太暗時(shí),數(shù)碼管不會全滅,調(diào)整半可調(diào)電阻顯示最低亮度。
制作出來的實(shí)物圖如下:
單片機(jī)源程序如下:
- //采用8位數(shù)碼管動態(tài)顯示程序
- //使用AT89C51單片機(jī),12MHz晶振,P0輸出字段碼,P2口輸出位選碼
- //用共陽極LED數(shù)碼管,key0為調(diào)時(shí)分位選擇鍵,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數(shù)碼管"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
- //顯示緩沖區(qū),時(shí)、分、秒初始為0,0x0a為"-"的編碼
- char data timedata[3]={0x00,0x00,0x00}; //初始化
- //分別為秒、分和小時(shí)的值
- char data ms50=0x00,con=0x00,con1=0x00,con2=0x00;
- //定義四個(gè)按鍵
- sbit dian=P0^7;
- sbit key0=P1^0;
- sbit key1=P1^1;
- sbit key2=P1^2;
- sbit key3=P1^3;
- //1ms延時(shí)函數(shù)
- delay1ms(int t)
- {
- int i,j;
- for (i=0;i<t;i++)
- {
- for(j=0;j<120;j++);
- }
- }
- keyscan()//按鍵處理函數(shù)
- {
- EA=0; //關(guān)總中斷
- if (key0==0)//判斷第一個(gè)按鍵是否按下
- { //按鍵消抖
- delay1ms(10);
- while (key0==0);//再次判斷按鍵是否按下
- con++;
- TR0=0;
- ET0=0; //關(guān)定時(shí)/計(jì)數(shù)器,關(guān)T0中斷
- if (con>=3)
- {
- con=0;
- TR0=1;
- ET0=1;
- }
- }
- if (con!=0)
- {
- if (key1==0) //如果第二個(gè)按鍵按下
- {
- 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)
- //如果第三個(gè)按鍵按下
- {
- 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)//如果第四個(gè)按鍵按下
- {
- delay1ms(10);
- while(key3==0);
- EA=1;
- TR0=1;
- ET0=1;
- }
- EA=1;//開總中斷
- }
- //數(shù)碼管顯示函數(shù)
- 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】顯示"時(shí)";【0】顯示"秒"
- dis[5]=timedata[2]/10; //【1】顯示"分";【2】顯示"時(shí)";【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; //數(shù)碼管消隱
- P2=0xff; //數(shù)碼管消隱
- }
- }
-
- //主函數(shù)
- main()
- {
- //TH0=0x4c;
- //TL0=0xb0;
- TH0=(65536-52615)/256; //12M,52615數(shù)值越大,走時(shí)越慢;數(shù)值越小,走時(shí)越快。
- TL0=(65536-52615)%256; //12M,52615數(shù)值越大,走時(shí)越慢;數(shù)值越小,走時(shí)越快?
- TMOD=0x01;
- //選擇工作方式1
- ET0=1;
- TR0=1;
- EA=1;
- while (1)
- {
- scan();
- //調(diào)用數(shù)碼管顯示scan()子函數(shù)
- keyscan();
- //調(diào)用按鍵處理keyscan()子函數(shù)
- }
- }
- //定時(shí)器/計(jì)數(shù)器T0中斷服務(wù)函數(shù)
- void time_intt0(void) interrupt 1
- {
- ET0=0;
- TR0=0;
- //TH0=0x4c; //12M 應(yīng)該是TH00=0x4c
- //TL0=0xb0; //11.0592M 應(yīng)該是TL00=0x00
- TH0=(65536-52615)/256; //12M,52615數(shù)值越大,走時(shí)越慢;數(shù)值越小,走時(shí)越快?
- TL0=(65536-52615)%256; //12M,52615數(shù)值越大,走時(shí)越慢;數(shù)值越小,走時(shí)越快?
- 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中斷
- }
復(fù)制代碼
|
-
-
-
-
-
-
-
-
-
視頻.7z
2023-5-11 18:10 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
9.56 MB, 下載次數(shù): 12, 下載積分: 黑幣 -5
-
-
Keil程序.7z
2023-5-11 18:03 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
16.83 KB, 下載次數(shù): 21, 下載積分: 黑幣 -5
評分
-
查看全部評分
|