這個時鐘我之前發過,今天我把程序升級成了 V1.2
原帖:http://www.zg4o1577.cn/bbs/dpj-186559-1.html
單片機源程序如下: - /*********************************************************************************************
- 程序名: 數碼管時鐘 ZJW48 V1.2正式版
- 編寫人: 張晉瑋
- 編寫時間: 2020年5月14日
- 硬件支持: 一定要用型號為4563BS的數碼管,否則可能無法正常顯示
- 接口說明: 無
- /*********************************************************************************************
- 說明:先要把STC12C5630AD的頭文件復制到Keil/C51/INC里
- (如果有的話就不用)
- /*********************************************************************************************/
- #include <STC12C5630AD.H>
- /**********************************************************************************************/
- //-------程序調試設置項-------
- #define LI 4 //設置LED顯示的亮度(值域:1~9)
- #define DELAY 10 //設置每一個點顯示的時間長度(1~20)
- /*********************************************************************************************/
- sbit LED_H1 =P2 ^ 0; //設置LED數碼管連接的I/O口
- sbit LED_H2 =P3 ^ 7; //設置LED數碼管連接的I/O口
- sbit LED_H3 =P2 ^ 7; //設置LED數碼管連接的I/O口
- sbit LED_H4 =P2 ^ 6; //設置LED數碼管連接的I/O口
- sbit LED_L1 =P1 ^ 7; //設置LED數碼管連接的I/O口
- sbit LED_L2 =P1 ^ 0; //設置LED數碼管連接的I/O口
- sbit LED_L3 =P1 ^ 3; //設置LED數碼管連接的I/O口
- sbit LED_L4 =P1 ^ 5; //設置LED數碼管連接的I/O口
- sbit LED_L5 =P1 ^ 6; //設置LED數碼管連接的I/O口
- sbit LED_L6 =P1 ^ 1; //設置LED數碼管連接的I/O口
- sbit LED_L7 =P1 ^ 2; //設置LED數碼管連接的I/O口
- sbit LED_L8 =P1 ^ 4; //設置LED數碼管連接的I/O口
- sbit BEEP = P2 ^ 4; //揚聲器
- sbit KEY1 = P2 ^ 5; //按鍵1(M鍵)
- sbit KEY2 = P2 ^ 2; //按鍵2(+鍵)
- sbit KEY3 = P3 ^ 3; //按鍵3(關蜂鳴器鍵)
- #define P3M0SET 0x08 //設置I/O口工作方式//00001000(左到右,高到低位)
- #define P3M1SET 0x80 //設置I/O口工作方式//10000000
- #define P1M0SET 0x00 //設置I/O口工作方式//00000000
- #define P1M1SET 0x00 //設置I/O口工作方式//00000000
- #define P2M0SET 0x00 //設置I/O口工作方式//00000000
- #define P2M1SET 0xc1 //設置I/O口工作方式//11000001
- unsigned char TIME_HH,TIME_MM,TIME_SS=0;
- unsigned char TIME_FH,TIME_FM,TIME_RH,TIME_RM,TIME_TH,TIME_TM=0;
- unsigned char cou = 0; // 軟計數器,對50ms時基信號累加到1s
- unsigned char PWM; //顯示亮度
- unsigned char MENU=0; //菜單值
- bit r=1; //秒點閃爍標志位
-
- unsigned char code disdata[]={
- 0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f //無小數點數碼管段碼表(0~9)
- };
- /*********************************************************************************************/
- void delay (unsigned int a){ // 點掃描用的延時
- 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; //關所有顯示
- 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; //將顯示數據送入
- case 2: displayHH2(d); break; //將顯示數據送入
- case 3: displayHH3(d); break; //將顯示數據送入
- case 4: displayHH4(d); break; //將顯示數據送入
- }
- }
- /**********************************************************************************************/
- void ChuLi (void){
- 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時 (正常顯示狀態)
- case 1:
- BEEP=1;
- TR0 = 0; //關閉定時器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時 (小時調整)
- case 2:
- TR0 = 0; //關閉定時器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時 (分鐘調整)
-
- case 3:
- BEEP=1;
- TR0 = 0; //關閉定時器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時 (鬧鐘1小時調整)
- case 4:
- TR0 = 0; //關閉定時器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++;}}
- if(KEY2==0){MCU_YS(85);if(KEY2==0){TIME_FM++;if(TIME_FM>=60){TIME_FM=0;}}}
- break; /// MENU為4時 (鬧鐘1分鐘調整)
-
- case 5:
- BEEP=1;
- TR0 = 0; //關閉定時器0
- diplay_data (1,disdata[TIME_RH/10]);
- diplay_data (2,disdata[TIME_RH%10]+0x80);
- if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU++;}}
- if(KEY2==0){MCU_YS(85);if(KEY2==0){TIME_RH++;if(TIME_RH>=24){TIME_RH=0;}}}
- break; /// MENU為3時 (鬧鐘2小時調整)
- case 6:
- TR0 = 0; //關閉定時器0
- BEEP=1;
- diplay_data (2,0x80);
- diplay_data (3,disdata[TIME_RM/10]);
- diplay_data (4,disdata[TIME_RM%10]);
- if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU++;}}
- if(KEY2==0){MCU_YS(85);if(KEY2==0){TIME_RM++;if(TIME_RM>=60){TIME_RM=0;}}}
- break; /// MENU為4時 (鬧鐘2分鐘調整)
-
- case 7:
- BEEP=1;
- TR0 = 0; //關閉定時器0
- diplay_data (1,disdata[TIME_TH/10]);
- diplay_data (2,disdata[TIME_TH%10]+0x80);
- if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU++;}}
- if(KEY2==0){MCU_YS(85);if(KEY2==0){TIME_TH++;if(TIME_TH>=24){TIME_TH=0;}}}
- break; /// MENU為3時 (鬧鐘2小時調整)
- case 8:
- TR0 = 0; //關閉定時器0
- BEEP=1;
- diplay_data (2,0x80);
- diplay_data (3,disdata[TIME_TM/10]);
- diplay_data (4,disdata[TIME_TM%10]);
- if(KEY1==0){MCU_YS(2000);if(KEY1==0){MENU=0;}}
- if(KEY2==0){MCU_YS(85);if(KEY2==0){TIME_TM++;if(TIME_TM>=60){TIME_TM=0;}}}
- break; /// MENU為4時 (鬧鐘2分鐘調整)
-
- }
- }
- /*********************************************************************************************/
- void init (void){ //上電初始化
- P3M0 = P3M0SET;
- P3M1 = P3M1SET;
- P1M0 = P1M0SET;
- P1M1 = P1M1SET;
- P2M0 = P2M0SET;
- P2M1 = P2M1SET;
- ////
- KEY1=1;
- KEY2=1;
- BEEP=1;
- dis_off();
- PWM = LI;
- ////
- AUXR &= 0x7F; //定時器時鐘12T模式
- TMOD &= 0xF0; //設置定時器模式
- TMOD |= 0x01; //設置定時器模式
- EA = 1; // 開總中斷
- TH0 = 0x3C; //設置定時初值
- TL0 = 0xB0; //設置定時初值
- ET0 = 1; // 定時/計數器0允許中斷
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- ////
- //TIME_HH = 10; //初始時間:10時55分00秒
- //TIME_MM = 55;
- //TIME_SS = 00;
- }
- /*********************************************************************************************/
- void main (void){ //主程序
- init(); //初始化
- while (1){
- ChuLi();
-
- 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;}}}}
-
- if(TIME_RH+TIME_RM!=0){if(TIME_HH==TIME_RH){if(TIME_MM==TIME_RM){
- BEEP=0;if(KEY3==1){TIME_RM=0;TIME_RH=0;}}}}
-
- if(TIME_TH+TIME_TM!=0){if(TIME_HH==TIME_TH){if(TIME_MM==TIME_TM){
- BEEP=0;if(KEY3==1){TIME_TM=0;TIME_TH=0;}}}}
- } //while
- } //main
- /**********************************************************************************************/
- void tiem0(void) interrupt 1{ // T/C0中斷服務程序(產生50ms時基信號)
- cou++; // 軟計數器加1
- if(cou >= 20){ // 計數值到100(1s)
- cou = 0; // 軟計數器清零
- TIME_SS++; // 秒計數器加1(進位50ms*20=1s)
- r=~r; // 秒點閃爍
- if(TIME_SS >= 60){ // 秒計數值到60
- TIME_SS = 0; // 秒計數器清零
- TIME_MM++; // 分計數器加1(進位60s=1m)
- if(TIME_MM >= 60){ // 分計數到60
- TIME_MM = 0; // 分計數器清零
- TIME_HH++; // 時計數器加1(進位60m=1h)
- if(TIME_HH >= 24){ // 時計數到23
- TIME_HH = 0; // 時計數器清零
- }
- }
- }
- }
- TH0 = 0x3C; //設置定時初值
- TL0 = 0xB0; //設置定時初值
- }
- /**********************************************************************************************/
復制代碼
全部資料51hei下載地址:
Clock_ZJW48 V1.2.7z
(392.72 KB, 下載次數: 25)
2020-5-15 12:14 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|