|
自己做的小時鐘--沒用時鐘芯片。。。 注: 時鐘精度取決于晶振精度(這是用單片機(jī)產(chǎn)生時鐘的) 功能詳見資料和源程序。。。。 本人是新手,請別介意
長按P2.5的按鍵,進(jìn)入下一項(xiàng)調(diào)整;
在正常顯示狀態(tài)下,短按2.2的按鍵進(jìn)行亮度調(diào)整;
在調(diào)時狀態(tài)下,短按2.2的按鍵進(jìn)行加1調(diào)整;
在鬧鐘鳴響狀態(tài)下,輕觸單片機(jī)的3.3進(jìn)行關(guān)閉鬧鐘;程序下載:http://www.zg4o1577.cn/bbs/dpj-186560-1.html
51hei圖片_20200503111828.jpg (128.56 KB, 下載次數(shù): 38)
下載附件
2020-5-3 11:34 上傳
單片機(jī)源程序如下:
- /*********************************************************************************************
- 程序名: 數(shù)碼管時鐘 ZJW48
- 編寫人: 張晉瑋
- 編寫時間: 2020年5月2日
- 硬件支持: 一定要用型號為4563BS的數(shù)碼管,否則可能無法正常顯示
- 接口說明: 無
- /*********************************************************************************************
- 說明:先要把STC12C5608AD的頭文件復(fù)制到Keil/C51/INC里
- (如果有的話就不用)
- /*********************************************************************************************/
- #include <STC12C5630AD.H>
- /**********************************************************************************************/
- //-------程序調(diào)試設(shè)置項(xiàng)-------
- #define LI 5 //設(shè)置LED顯示的亮度(值域:1~9)
- #define DELAY 9 //設(shè)置每一個點(diǎn)顯示的時間長度(1~20)
- /**********************************************************************************************/
- sbit LED_H1 =P2 ^ 0; //設(shè)置LED數(shù)碼管連接的I/O口
- sbit LED_H2 =P3 ^ 7; //設(shè)置LED數(shù)碼管連接的I/O口
- sbit LED_H3 =P2 ^ 7; //設(shè)置LED數(shù)碼管連接的I/O口
- sbit LED_H4 =P2 ^ 6; //設(shè)置LED數(shù)碼管連接的I/O口
- sbit LED_L1 =P1 ^ 7; //設(shè)置LED數(shù)碼管連接的I/O口
- sbit LED_L2 =P1 ^ 0; //設(shè)置LED數(shù)碼管連接的I/O口
- sbit LED_L3 =P1 ^ 3; //設(shè)置LED數(shù)碼管連接的I/O口
- sbit LED_L4 =P1 ^ 5; //設(shè)置LED數(shù)碼管連接的I/O口
- sbit LED_L5 =P1 ^ 6; //設(shè)置LED數(shù)碼管連接的I/O口
- sbit LED_L6 =P1 ^ 1; //設(shè)置LED數(shù)碼管連接的I/O口
- sbit LED_L7 =P1 ^ 2; //設(shè)置LED數(shù)碼管連接的I/O口
- sbit LED_L8 =P1 ^ 4; //設(shè)置LED數(shù)碼管連接的I/O口
- sbit BEEP = P2 ^ 4; //揚(yáng)聲器
- sbit KEY1 = P2 ^ 5; //按鍵1(M鍵)
- sbit KEY2 = P2 ^ 2; //按鍵2(+鍵)
- sbit KEY3 = P3 ^ 3; //按鍵3(關(guān)蜂鳴器鍵)
- #define P3M0SET 0x08 //設(shè)置I/O口工作方式//00001000(左到右,高到低位)
- #define P3M1SET 0x80 //設(shè)置I/O口工作方式//10000000
- #define P1M0SET 0x00 //設(shè)置I/O口工作方式//00000000
- #define P1M1SET 0x00 //設(shè)置I/O口工作方式//00000000
- #define P2M0SET 0x00 //設(shè)置I/O口工作方式//00000000
- #define P2M1SET 0xc1 //設(shè)置I/O口工作方式//11000001
- unsigned char TIME_FH,TIME_FM,TIME_HH,TIME_MM,TIME_SS=0;
- unsigned char cou = 0; // 軟計數(shù)器,對50ms時基信號累加到1s
- unsigned char PWM; //顯示亮度
- unsigned char MENU=0; //菜單值
- bit r=1; //秒點(diǎn)閃爍標(biāo)志位
- unsigned char code disdata[]={
- 0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f //無小數(shù)點(diǎn)數(shù)碼管段碼表(0~9)
- };
- /*********************************************************************************************/
- void delay (unsigned int a){ // 用于點(diǎn)掃描的延時
- unsigned int i;
- while( --a != 0){
- for(i = 0; i < DELAY; i++);
- }
- }
- /*********************************************************************************************/
- void MCU_YS (unsigned int a){
- unsigned int i;
- while( --a != 0){
- for(i = 0; i < 600; i++);
- }
- }
- /*********************************************************************************************/
- void dis_off (void){
- P3 = ~P3M1SET; //關(guān)所有顯示
- P1 = ~P1M1SET;
- P2 = ~P2M1SET;
- delay(10-PWM);
- }
- /*********************************************************************************************/
- void displayHH1 (unsigned char d){ //第1列橫向顯示程序
- unsigned char i;
- i = d & 0x01;
- if(i == 0x01){
- LED_H1 = 1;LED_L1 = 0;}delay(PWM);dis_off();
- i = d & 0x02;
- if(i == 0x02){
- LED_H1 = 1;LED_L2 = 0;}delay(PWM);dis_off();
- i = d & 0x04;
- if(i == 0x04){
- LED_H1 = 1;LED_L3 = 0;}delay(PWM);dis_off();
- i = d & 0x08;
- if(i == 0x08){
- LED_H1 = 1;LED_L4 = 0;}delay(PWM);dis_off();
- i = d & 0x10;
- if(i == 0x10){
- LED_H1 = 1;LED_L5 = 0;}delay(PWM);dis_off();
- i = d & 0x20;
- if(i == 0x20){
- LED_H1 = 1;LED_L6 = 0;}delay(PWM);dis_off();
- i = d & 0x40;
- if(i == 0x40){
- LED_H1 = 1;LED_L7 = 0;}delay(PWM);dis_off();
- i = d & 0x80;
- if(i == 0x80){
- LED_H1 = 1;LED_L8 = 0;}delay(PWM);dis_off();
- }
- /*********************************************************************************************/
- void displayHH2 (unsigned char d){ //第2列橫向顯示程序
- unsigned char i;
- i = d & 0x01;
- if(i == 0x01){
- LED_H2 = 1;LED_L1 = 0;}delay(PWM);dis_off();
- i = d & 0x02;
- if(i == 0x02){
- LED_H2 = 1;LED_L2 = 0;}delay(PWM);dis_off();
- i = d & 0x04;
- if(i == 0x04){
- LED_H2 = 1;LED_L3 = 0;}delay(PWM);dis_off();
- i = d & 0x08;
- if(i == 0x08){
- LED_H2 = 1;LED_L4 = 0;}delay(PWM);dis_off();
- i = d & 0x10;
- if(i == 0x10){
- LED_H2 = 1;LED_L5 = 0;}delay(PWM);dis_off();
- i = d & 0x20;
- if(i == 0x20){
- LED_H2 = 1;LED_L6 = 0;}delay(PWM);dis_off();
- i = d & 0x40;
- if(i == 0x40){
- LED_H2 = 1;LED_L7 = 0;}delay(PWM);dis_off();
- i = d & 0x80;
- if(i == 0x80){
- LED_H2 = 1;LED_L8 = 0;}delay(PWM);dis_off();
- }
- /*********************************************************************************************/
- void displayHH3 (unsigned char d){ //第3列橫向顯示程序
- unsigned char i;
- i = d & 0x01;
- if(i == 0x01){
- LED_H3 = 1;LED_L1 = 0;}delay(PWM);dis_off();
- i = d & 0x02;
- if(i == 0x02){
- LED_H3 = 1;LED_L2 = 0;}delay(PWM);dis_off();
- i = d & 0x04;
- if(i == 0x04){
- LED_H3 = 1;LED_L3 = 0;}delay(PWM);dis_off();
- i = d & 0x08;
- if(i == 0x08){
- LED_H3 = 1;LED_L4 = 0;}delay(PWM);dis_off();
- i = d & 0x10;
- if(i == 0x10){
- LED_H3 = 1;LED_L5 = 0;}delay(PWM);dis_off();
- i = d & 0x20;
- if(i == 0x20){
- LED_H3 = 1;LED_L6 = 0;}delay(PWM);dis_off();
- i = d & 0x40;
- if(i == 0x40){
- LED_H3 = 1;LED_L7 = 0;}delay(PWM);dis_off();
- i = d & 0x80;
- if(i == 0x80){
- LED_H3 = 1;LED_L8 = 0;}delay(PWM);dis_off();
- }
- /*********************************************************************************************/
- void displayHH4 (unsigned char d){ //第4列橫向顯示程序
- unsigned char i;
- i = d & 0x01;
- if(i == 0x01){
- LED_H4 = 1;LED_L1 = 0;}delay(PWM);dis_off();
- i = d & 0x02;
- if(i == 0x02){
- LED_H4 = 1;LED_L2 = 0;}delay(PWM);dis_off();
- i = d & 0x04;
- if(i == 0x04){
- LED_H4 = 1;LED_L3 = 0;}delay(PWM);dis_off();
- i = d & 0x08;
- if(i == 0x08){
- LED_H4 = 1;LED_L4 = 0;}delay(PWM);dis_off();
- i = d & 0x10;
- if(i == 0x10){
- LED_H4 = 1;LED_L5 = 0;}delay(PWM);dis_off();
- i = d & 0x20;
- if(i == 0x20){
- LED_H4 = 1;LED_L6 = 0;}delay(PWM);dis_off();
- i = d & 0x40;
- if(i == 0x40){
- LED_H4 = 1;LED_L7 = 0;}delay(PWM);dis_off();
- i = d & 0x80;
- if(i == 0x80){
- LED_H4 = 1;LED_L8 = 0;}delay(PWM);dis_off();
- }
- /*********************************************************************************************/
- void diplay_data (unsigned char l,unsigned char d){
- switch (l){ //顯示的列位置
- case 1: displayHH1(d); break; //將顯示數(shù)據(jù)送入
- case 2: displayHH2(d); break; //將顯示數(shù)據(jù)送入
- case 3: displayHH3(d); break; //將顯示數(shù)據(jù)送入
- case 4: displayHH4(d); break; //將顯示數(shù)據(jù)送入
- }
- }
- /*********************************************************************************************/
- void init (void){ //上電初始化
- P3M0 = P3M0SET;
- P3M1 = P3M1SET;
- P1M0 = P1M0SET;
- P1M1 = P1M1SET;
- P2M0 = P2M0SET;
- P2M1 = P2M1SET;
- ////
- BEEP=1;
- dis_off();
- PWM = LI;
- ////
- AUXR &= 0x7F; //定時器時鐘12T模式
- TMOD &= 0xF0; //設(shè)置定時器模式
- TMOD |= 0x01; //設(shè)置定時器模式
- EA = 1; // 開總中斷
- TH0 = 0x3C; //設(shè)置定時初值
- TL0 = 0xB0; //設(shè)置定時初值
- ET0 = 1; // 定時/計數(shù)器0允許中斷
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //定時器0開始計時
- ////
- //TIME_HH = 19; //初始時間:19時13分40秒
- //TIME_MM = 13;
- //TIME_SS = 40;
- }
- /*********************************************************************************************/
- void main (void){ //主程序
- init(); //初始化
- while (1){
- switch (MENU){
- case 0:
- TR0 = 1; //定時器0開始計時
- if(r){
- diplay_data (1,disdata[TIME_HH/10]);
- diplay_data (2,disdata[TIME_HH%10]+0x80);
- diplay_data (3,disdata[TIME_MM/10]);
- diplay_data (4,disdata[TIME_MM%10]);
- }else{
- diplay_data (1,disdata[TIME_HH/10]);
- diplay_data (2,disdata[TIME_HH%10]);
- diplay_data (3,disdata[TIME_MM/10]);
- diplay_data (4,disdata[TIME_MM%10]);
- }
- if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU++;}}
- if(KEY2==0){MCU_YS(85);if(KEY2==0){PWM++;if(PWM>=10){PWM=1;}}}
- break;/// MENU為0時 (正常顯示狀態(tài))
- case 1:
- BEEP=1;
- TR0 = 0; //關(guān)閉定時器0
- diplay_data (1,disdata[TIME_HH/10]);
- diplay_data (2,disdata[TIME_HH%10]+0x80);
- if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU++;}}
- if(KEY2==0){MCU_YS(85);if(KEY2==0){TIME_HH++;if(TIME_HH>=24){TIME_HH=0;}}}
- break; /// MENU為1時 (小時調(diào)整)
- case 2:
- TR0 = 0; //關(guān)閉定時器0
- BEEP=1;
- diplay_data (2,0x80);
- diplay_data (3,disdata[TIME_MM/10]);
- diplay_data (4,disdata[TIME_MM%10]);
- if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU++;}}
- if(KEY2==0){MCU_YS(85); if(KEY2==0){TIME_MM++;if(TIME_MM>=60){TIME_MM=0;}}}
- break; /// MENU為2時 (分鐘調(diào)整)
-
- case 3:
- BEEP=1;
- TR0 = 0; //關(guān)閉定時器0
- diplay_data (1,disdata[TIME_FH/10]);
- diplay_data (2,disdata[TIME_FH%10]+0x80);
- if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU++;}}
- if(KEY2==0){MCU_YS(85);if(KEY2==0){TIME_FH++;if(TIME_FH>=24){TIME_FH=0;}}}
- break; /// MENU為3時 (鬧鐘小時調(diào)整)
- case 4:
- TR0 = 0; //關(guān)閉定時器0
- BEEP=1;
- diplay_data (2,0x80);
- diplay_data (3,disdata[TIME_FM/10]);
- diplay_data (4,disdata[TIME_FM%10]);
- if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU=0;}}
- if(KEY2==0){MCU_YS(85);if(KEY2==0){TIME_FM++;if(TIME_FM>=60){TIME_FM=0;}}}
- break; /// MENU為4時 (鬧鐘分鐘調(diào)整)
- }
- if(TIME_FH+TIME_FM!=0){if(TIME_HH==TIME_FH){if(TIME_MM==TIME_FM){BEEP=0;if(KEY3==1){TIME_FM=0;TIME_FH=0;}}}}
- } //while
- } //main
- /**********************************************************************************************/
- void tiem0(void) interrupt 1{ // T/C0中斷服務(wù)程序(產(chǎn)生50ms時基信號)
- cou++; // 軟計數(shù)器加1
- if(cou >= 20){ // 計數(shù)值到100(1s)
- cou = 0; // 軟計數(shù)器清零
- TIME_SS++; // 秒計數(shù)器加1(進(jìn)位50ms*20=1s)
- r=~r; // 秒點(diǎn)閃爍
- if(TIME_SS >= 60){ // 秒計數(shù)值到60
- TIME_SS = 0; // 秒計數(shù)器清零
- TIME_MM++; // 分計數(shù)器加1(進(jìn)位60s=1m)
- if(TIME_MM >= 60){ // 分計數(shù)到60
- TIME_MM = 0; // 分計數(shù)器清零
- TIME_HH++; // 時計數(shù)器加1(進(jìn)位60m=1h)
- if(TIME_HH >= 24){ // 時計數(shù)到23
- TIME_HH = 0; // 時計數(shù)器清零
- }
- }
- }
- }
- TH0 = 0x3C; //設(shè)置定時初值
- TL0 = 0xB0; //設(shè)置定時初值
- }
- /**********************************************************************************************/
復(fù)制代碼
|
評分
-
查看全部評分
|