自上次數碼管時鐘為完善版本(玩了幾天后,懶啊不想動,汗)終于解決了不能進入調試的BUG
不來廢話上程序: /*************************************************************** * 程序名稱:51單片機數碼管電子鐘+定時鬧鐘 晶振:12.00 * 實驗對象:51hei單片機學習開發板 * 單 片 機:AT89S52或STC89C52 鬧鐘時間:7:10分(程序自定義) *使用定時器方式,數碼管顯示24小時“00-00-00”(增加中斷進入對時功能 P1為按鍵,P2為段選,P0為位選, ****************************************************************/ /***使用定時器方式,數碼管顯示24小時“00-00-00”(增加進入對時功能) P1為按鍵,P2為段選,P0為位選,{鬧鐘暫時不可調待完善})***/ #include <reg52.h> #define uchar unsigned char /*宏定義 */ #define uint unsigned int /*宏定義 */ uchar hour,hour_h,hour_l; /*定義小時,小時的高位,小時的低位*/ uchar min,min_h,min_l; /*分*/ uchar sec,sec_h,sec_l; /*秒*/ uchar int_num; /*定時溢出作用標號*/ sbit key_secadd=P1^1; /*定義了 p1.1為秒增1鍵,用在調時中斷里*/ sbit key_minadd=P1^2; /*定義了 p1.2為分增1鍵,用在調時中斷里*/ sbit key_houradd=P1^3; /*定義了 p1.3為時增1鍵,用在調時中斷里*/ sbit key_intime=P1^0; //按P1.0進入調時 sbit key_quit=P1^5; //P1.5退出調時 sbit bell=P1^5; //小喇叭 void delay(uchar time); /*延時子函數聲明*/ void display(); /*顯示子函數聲明*/ void inter_init(); /*定時器初始化子函數聲明*/ void time24(); /****專用數碼管顯示表***/ uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; /*0x40顯示“一”符號*/ uchar code wema[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00}; /*小時hour 分min 秒sec*/ //---------------------延時子函數-------------------------------- void delay(uchar time) /*延時子函數*/ { uchar time_1; for (;time>0;time--) for (time_1=100;time_1>0;time_1--); } //---------------------初始化T0函數-------------------------- void time0(void) interrupt 1 /*定時器T0服務子程序*/ { TH0=(65535-50000)/256; TL0=(65535-50000)%256; int_num++; } //---------------------定時器函數-------------------------- void inter_init() /*定時器初始化子函數*/ { EA=1; /*開總中斷*/ EX0=1; /*開外部中斷0*/ ET0=1; /*打開定時器T0*/ TMOD=0x01; /*工作方式1*/ TCON = 0x00; /*觸發方式*/ IP = 0x01; /*中斷優先級別,T0優先*/ TH0=(65535-50000)/256; /*置初值,大約50ms一個中斷 */ TL0=(65535-50000)%256; TR0=1; /*置位TR0,啟動定時器0*/ } //---------------------24小時時間自加 -------------------------- void time24() /*時間遞增*/ { if(int_num==20) /*值滿20,大約就是一秒的時間。*/ { /* 其值設為2,則定時時間快10倍,可做毫秒計時*/ int_num=0; sec++; /*秒值加1*/ if(sec==60) /*如果秒值滿60,就歸0*/ { sec=0; min++; /*分值加1*/ if(min==60) { min=0; hour++; /*分值歸0,時值加1*/ if(hour==24) { hour=0; /*時值滿24歸0*/ } } } } } //-----------按鍵調整子函數------------------------------------- void key(void) //按鍵調整子函數 { if(key_intime==0) {EA=0; // 關中斷 sec=0; //秒歸零 while(100) //正確 { display(); if(key_quit==0) { EA=1; break; } if(key_secadd==0) { delay(1); if(key_secadd==0) { sec++; while(!key_secadd); if(sec==60) { sec=0; } } } if(key_minadd==0) { delay(80); if(key_minadd==0) { min++; while(!key_minadd); if(min==60) { min=0; } } } if(key_houradd==0) { delay(80); if(key_houradd==0) { hour++; while(!key_houradd); if(hour==24) { hour=0; } } } } } } //---------------------數碼管顯示子函數------------------------------------- void display() /*數碼管顯示子函數*/ { sec_h=sec/10; /*求出秒高位需要顯示的字符*/ sec_l=sec%10; /*求出秒低位需要顯示的字符*/ min_h=min/10; min_l=min%10; hour_h=hour/10; hour_l=hour%10; P2=duma[sec_h]; /*顯示秒高位*/ P0=wema[6]; delay(10); P2=duma[sec_l]; /*顯示秒低位*/ P0=wema[7]; delay(10); P2=duma[10]; /* “一”符號的顯示 */ P0=wema[5]; delay(10); P2=duma[min_h]; /*分*/ P0=wema[3]; delay(10); P2=duma[min_l]; P0=wema[4]; delay(10); P2=duma[10]; /* “一”符號的顯示 */ P0=wema[2]; delay(10); P2=duma[hour_h]; /*時*/ P0=wema[0]; delay(10); P2=duma[hour_l]; P0=wema[1]; delay(10); } //---------------------主函數-------------------------------- /*void alarm_clock() //鬧鐘子函數-變頻發聲 { uint i,j,y,m; if(hour==00)//時到了00點? { if(min>=01){m=0;} //分大于或等于01就把m清零,若不成立向下執行 if(min==00)//到了00分? { if(m<15) { do{ //循環-變頻 m++; display(); for(i=0;i<2000;i++) {bell=~bell;for(j=0;j<24;j++);} //取反/ for(y=0;y<2000;y++) {bell=~bell;for(j=0;j<25;j++);} //取反/ for(i=0;i<2000;i++) {bell=~bell;for(j=0;j<26;j++);} //取反/ for(i=0;i<2000;i++) {bell=~bell;for(j=0;j<27;j++);} //取反/ } while(m<15); //鬧15次結束 } } } }*/ //---------------------主函數-------------------------------- void main() { inter_init(); /*定時器初始化*/ hour=23; /*自定義一個初值,方便快速觀察翻轉狀態(可修改)*/ min=59; sec=50; while(1) { key(); time24(); /*分開時間,分別顯示字符*/ //alarm_clock();//鬧鐘函數 display(); /*調用顯示函數來顯示*/ } }