一、電路圖
二、使用說明:
功能按鍵說明:S1為功能選擇按鍵和移位的作用,S2為確認作用,S3為數值加一作用。
功能調節說明:
1、時鐘功能:
如果是芯片內部定時器的時鐘,上電后顯示00:00:00(掉電后時間不行走不保存,重新上電時間就歸0);
如果是外部時鐘DS1302的套件,上電后則顯示芯片的內部時間(這個時間掉電后可以保持行走,從新上電顯示當前的時間);
2、校時功能:按一次S1,數碼管顯示SET1(設置時間),這時按一次S2就進入修改時間,數碼管顯示00:00(秒位不可調)小時的十位閃爍狀態,再次按S1可以移動閃爍的位置,按一次移動一位,按S3時,對應閃爍位置的數據會加1,設置后后再按S2就保存并退出;
3、鬧鐘功能:按兩次S1,數碼管顯示SET2(設置鬧鐘),這時按一次S2就進入修改鬧鐘,數碼管顯示00:00 0(秒位不可調,后面的0代表鬧鐘的狀態,0代表鬧鐘關閉,1表示鬧鐘開啟)小時的十位閃爍狀態,再次按S1可以移動閃爍的位置,按一次移動一位,按S3時,對應閃爍位置的數據會加1,設置后后再按S2就保存并退出;
4、倒計時功能:按三次次S1,數碼管顯示SET3(設置倒計時),這時按一次S2就進入修改倒計時,數碼管顯示00:00:00,小時的十位閃爍狀態,再次按S1可以移動閃爍的位置,按一次移動一位,按S3時,對應閃爍位置的數據會加1,設置后后再按S2后,系統就開始倒計時;
5、秒表功能:按四次S1,數碼管顯示SET4(秒表功能),這時按一次S2就秒表功能,此時S2用來開啟或關閉秒表,S3退出秒表功能;
6、計數器功能:按五次S1,數碼管顯示SET5(計數器功能),這時按一次S2就進入計數器,按S3計數器的值加1,再次按S2退出計數器,系統恢復;
電路原理圖如下:
001.png (91.01 KB, 下載次數: 47)
下載附件
2022-9-14 10:54 上傳
單片機源程序如下:
- /*====================================================================
- 調試要求:
- 1.MCU:AT89S52芯片或AT89C52
- 2.晶振:12MHz
- 功能:啟動芯片內部計時
- ====================================================================*/
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit dis_bit1=P2^7;//定義數碼管控制口
- sbit dis_bit2=P2^6;//定義數碼管控制口
- sbit dis_bit3=P2^4;//定義數碼管控制口
- sbit dis_bit4=P2^3;//定義數碼管控制口
- sbit dis_bit5=P2^1;//定義數碼管控制口
- sbit dis_bit6=P2^0;//定義數碼管控制口
- sbit led1_bit=P2^2;//定時LED的控制口
- sbit led2_bit=P2^5;//定時LED的控制口
- sbit s1_bit=P1^0; //定義S1控制口
- sbit s2_bit=P1^1; //定義S2控制口
- sbit s3_bit=P1^2; //定義S3控制口
- sbit speak=P3^7; //定義蜂鳴器控制口
- #define smg_data P0//定義數碼管數據口
- void delay_50us(uint t);//延時50*T微妙函數的聲明
- void display1(uchar dis_data);//數碼管1顯示子程序
- void display2(uchar dis_data);//數碼管2顯示子程序
- void display3(uchar dis_data);//數碼管3顯示子程序
- void display4(uchar dis_data);//數碼管4顯示子程序
- void display5(uchar dis_data);//數碼管5顯示子程序
- void display6(uchar dis_data);//數碼管6顯示子程序
- void init_t0();//定時器0初始化函數
- void dis_led();//LED處理函數
- void judge_s1();//S1按鍵處理函數
- void judge_s2();//S2按鍵處理函數
- void judge_s3();//S3按鍵處理函數
- void dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1);//顯示子程序
- void dis_san(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1,uchar san);//閃爍顯示子程序
- void judge_dis();//顯示處理函數
- void judge_clock();//顯示處理函數
- //共陽數碼管斷碼表
- const unsigned char tabl1[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
- // 0 1 2 3 4 5
- 0x82,0xf8,0x80,0x90,0x86,0x87,0xFF,
- //6 7 8 9 E T B
- 0xc6,0xa1,0x8e,0xb6};
- // C D F 三
-
- uchar t0_crycle;
- uchar hour_count,minute_count,second_count,msecond_count;
- uchar clock_hour,clock_minute;
- uchar clock_en;//鬧鐘關閉和開啟的標志,1開啟,0關閉
- uchar flag1,zancun1,zancun2,zancun3;//,flag2;
- uchar clock_flag;
- uint speak_count;
- //主程序
- void main()
- {
- P3=0x00;
- flag1=0;
- zancun3=0;
- speak=1;//關閉蜂鳴器
- speak_count=0;
- clock_hour=0;
- clock_minute=0;
- clock_flag=0;
-
- clock_en=0;//開機時默認關閉鬧鐘
- init_t0();
- TR0=1;//
- //接下來開始編寫讓數碼管顯示的程序
- while(1)
- {
- judge_dis();//顯示處理
- judge_s1();
- judge_s2();
- judge_s3();
- judge_clock();//鬧鐘處理程序
- }
- }
- void timer0() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- t0_crycle++;
- if(t0_crycle==2)// 0.1秒
- {
- t0_crycle=0;
- msecond_count++;
- if(msecond_count==10)//1秒
- {
- msecond_count=0;
- second_count++;
- if(second_count==60)
- {
- second_count=0;
- minute_count++;
- if(minute_count==60)
- {
- minute_count=0;
- hour_count++;
- if(hour_count==24)
- {
- hour_count=0;
- }
- }
- }
- }
- }
- }
- //**************************************************
- //顯示處理函數
- void judge_dis()
- {
- if(flag1==0)
- {
- dis(hour_count/10,hour_count%10,minute_count/10,minute_count%10,second_count/10,second_count%10);
- dis_led();
- }
- if(flag1!=0)
- {
- switch(flag1)
- {
- case 1:
- dis(5,10,11,1,12,12);//顯示SET1
- led1_bit=1;
- led2_bit=1;
- break;
- case 2:
- dis(5,10,11,2,12,12);//顯示SET2
- break;
- case 3:
- dis(5,10,11,3,12,12);//顯示SET3
- break;
- case 4:
- dis(5,10,11,4,12,12);//顯示SET4
- break;
- case 5:
- dis(5,10,11,5,12,12);//顯示SET5
- break;
- case 6:
- dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,1);
- break;
- case 7:
- dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,2);
- break;
- case 8:
- dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,3);
- break;
- case 9://進入修改時間,時間分位個位閃爍
- dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,4);
- break;
- case 10://進入修改鬧鐘,鬧鐘小時十位閃爍
- dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,1);
- break;
- case 11://進入修改鬧鐘,鬧鐘小時個位閃爍
- dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,2);
- break;
- case 12://進入修改鬧鐘,鬧鐘小時十位閃爍
- dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,3);
- break;
- case 13://進入修改鬧鐘,鬧鐘小時個位閃爍
- dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,4);
- break;
- case 14://進入修改鬧鐘的開關
- dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,6);
- break;
- default:
- break;
- }
- }
- }
- //**************************************************
- //S1按鍵處理函數
- void judge_s1()
- {
- s1_bit=1;//置IO為1,準備讀入收據
- if(s1_bit==0)//判斷是否有按鍵按下
- {
- delay_50us(1);// 延時,去除機械抖動
- if(s1_bit==0)
- {
- switch(flag1)
- {
- case 0:
- flag1=1;
- break;
- case 1:
- flag1=2;
- break;
- case 2:
- flag1=3;
- break;
- case 3:
- flag1=4;
- break;
- case 4:
- flag1=5;
- break;
- case 5:
- flag1=0;
- break;
- case 6://在修改時間小時十位下按S1鍵
- flag1=7;
- break;
- case 7:
- flag1=8;
- break;
- case 8:
- flag1=9;
- break;
- case 9:
- flag1=6;
- break;
- case 10:
- flag1=11;
- break;
- case 11:
- flag1=12;
- break;
- case 12:
- flag1=13;
- break;
- case 13:
- flag1=14;
- break;
- case 14:
- flag1=10;
- break;
- default:
- break;
- }
- while(s1_bit==0)
- {
- judge_dis();
- }//等待按鍵釋放
- }
- }
- }
- //**************************************************
- //S2按鍵處理函數
- void judge_s2()
- {
- s2_bit=1;//置IO為1,準備讀入收據
- if(s2_bit==0)//判斷是否有按鍵按下
- {
- delay_50us(1);// 延時,去除機械抖動
- if(s2_bit==0)
- {
- switch (flag1)
- {
- case 1: //在顯示SET1狀態下按S2件,進入修改時間
- flag1=6;
- zancun1=hour_count;
- zancun2=minute_count;
- break;
- case 2://在顯示SET2狀態下按S2,進入設置鬧鐘
- zancun1=clock_hour;
- zancun2=clock_minute;
- flag1=10;
- break;
- case 6://修改時鐘小時十位狀態下按S2件
- hour_count=zancun1;
- minute_count=zancun2;
- second_count=0;
- flag1=0;
- break;
- case 7://修改時鐘小時個位狀態下按S2件
- hour_count=zancun1;
- minute_count=zancun2;
- second_count=0;
- flag1=0;
- break;
- case 8://修改時鐘分鐘十位狀態下按S2件
- hour_count=zancun1;
- minute_count=zancun2;
- second_count=0;
- flag1=0;
- break;
- case 9://修改時鐘分鐘個位狀態下按S2件
- hour_count=zancun1;
- minute_count=zancun2;
- second_count=0;
- flag1=0;
- break;
- case 10:
- clock_hour=zancun1;
- clock_minute=zancun2;
- clock_en=zancun3;
- flag1=0;
- break;
- case 11:
- clock_hour=zancun1;
- clock_minute=zancun2;
- clock_en=zancun3;
- flag1=0;
- break;
- case 12:
- clock_hour=zancun1;
- clock_minute=zancun2;
- clock_en=zancun3;
- flag1=0;
- break;
- case 13:
- clock_hour=zancun1;
- clock_minute=zancun2;
- clock_en=zancun3;
- flag1=0;
- break;
- case 14:
- clock_hour=zancun1;
- clock_minute=zancun2;
- clock_en=zancun3;
- flag1=0;
- break;
- default:
- break;
-
- }
- while(s2_bit==0)
- {
- judge_dis();
- }//等待按鍵釋放
- }
- }
- }
- //**************************************************
- //S3按鍵處理函數
- void judge_s3()
- {
- s3_bit=1;//置IO為1,準備讀入收據
- if(s3_bit==0)//判斷是否有按鍵按下
- {
- delay_50us(1);// 延時,去除機械抖動
- if(s3_bit==0)
- {
- switch (flag1)
- {
-
- case 6://修改時間小時的十位數
- zancun1+=10;
- if(zancun1>=24)zancun1=zancun1%10;
- break;
- case 7://修改時間小時的個位數
- zancun1=zancun1/10*10+(zancun1%10+1)%10;
- if(zancun1>=24)zancun1=20;
- break;
- case 8://修改時間分鐘的十位數
- zancun2+=10;
- if(zancun2>=60)zancun2-=60;
- break;
- case 9://修改時間分鐘的個位數
- zancun2=zancun2/10*10+(zancun2%10+1)%10;
- break;
- case 10://修改鬧鐘小時的十位數
- zancun1+=10;
- if(zancun1>=24)zancun1=zancun1%10;
- break;
- case 11://修改鬧鐘小時的個位數
- zancun1=zancun1/10*10+(zancun1%10+1)%10;
- if(zancun1>=24)zancun1=20;
- break;
- case 12://修改鬧鐘分鐘的十位數
- zancun2+=10;
- if(zancun2>=60)zancun2-=60;
- break;
- case 13://修改鬧鐘分鐘的個位數
- zancun2=zancun2/10*10+(zancun2%10+1)%10;
- break;
- case 14:
- zancun3^=1;
- break;
- default:
- break;
-
- }
- while(s3_bit==0)
- {
- judge_dis();
- }//等待按鍵釋放
- }
- }
- }
- //****************************************
- //顯示處理函數
- void judge_clock()
- {
- if(clock_hour==hour_count && clock_minute==minute_count)
- {
- if(clock_en==1 && clock_flag==0)
- {
- speak_count=0;//開啟蜂鳴器
- clock_flag=1;
- speak_count=0;
- }
- }
- else
- {
- clock_flag=0;
- }
- if(clock_flag==1 && speak_count<400)
- {
-
- if(msecond_count<=5)
- {
- speak=0;
- speak_count++;
- }
- else
- {
- speak=1;
-
- }
- }
- else
- {
- speak=1;
- }
- }
- //****************************************
- ////閃爍顯示子程序
- void dis_san(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1,uchar san)
- {
- if(san==1)
- {
- if(msecond_count<5)
- {
- display1(s6);
- }
- }
- else
- {
- display1(s6);
- }
- if(san==2)
- {
- if(msecond_count<5)
- {
- display2(s5);
- }
- }
- else
- {
- display2(s5);
- }
- if(san==3)
- {
- if(msecond_count<5)
- {
- display3(s4);
- }
- }
- else
- {
- display3(s4);
- }
- if(san==4)
- {
- if(msecond_count<5)
- {
- display4(s3);
- }
- }
- else
- {
- display4(s3);
- }
- if(san==6)
- {
- if(msecond_count<5)
- {
- display6(s1);
- }
- }
- else
- {
- display6(s1);
- }
- display5(s2);
- // display6(s1);
- }
- //****************************************
- //時鐘顯示程序
- void dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1)
- {
- display1(s6);
- display2(s5);
- display3(s4);
- display4(s3);
- display5(s2);
- display6(s1);
- }
- //********************************************************************************************
- void init_t0()
- {
- TMOD=0x01;//設定定時器工作方式1,定時器定時50毫秒
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;//開總中斷
- ET0=1;//允許定時器0中斷
- t0_crycle=0;//定時器中斷次數計數單元
- }
- //**************************************************
- //LED處理函數
- void dis_led()
- {
- if(msecond_count<5)
- {
- led1_bit=1;
- led2_bit=1;
- }
- else
- {
- led1_bit=0;
- led2_bit=0;
- }
- }
- //***************************************************************
- //功能:把數據1顯示在數碼管1上
- void display6(uchar dis_data)
- {
- smg_data=tabl1[dis_data];//送顯示斷碼
- dis_bit6=0;//鎖存數據
- delay_50us(40);
- dis_bit6=1;
- }
- //***************************************************************
- //功能:把數據1顯示在數碼管1上
- void display5(uchar dis_data)
- {
- smg_data=tabl1[dis_data];//送顯示斷碼
- dis_bit5=0;//鎖存數據
- delay_50us(40);
- dis_bit5=1;
- }
- //***************************************************************
- //功能:把數據1顯示在數碼管1上
- void display4(uchar dis_data)
- {
- smg_data=tabl1[dis_data];//送顯示斷碼
- dis_bit4=0;//鎖存數據
- delay_50us(40);
- dis_bit4=1;
- }//***************************************************************
- //功能:把數據1顯示在數碼管1上
- void display3(uchar dis_data)
- {
- smg_data=tabl1[dis_data];//送顯示斷碼
- dis_bit3=0;//鎖存數據
- delay_50us(40);
- dis_bit3=1;
- }
- //***************************************************************
- //功能:把數據1顯示在數碼管1上
- void display1(uchar dis_data)
- {
- smg_data=tabl1[dis_data];//送顯示斷碼
- dis_bit1=0;//鎖存數據
- delay_50us(40);
- dis_bit1=1;
- }
- //***************************************************************
- //功能:把數據1顯示在數碼管1上
- void display2(uchar dis_data)
- {
- smg_data=tabl1[dis_data];//送顯示斷碼
- dis_bit2=0;//鎖存數據
- delay_50us(40);
- dis_bit2=1;
- }
- //**************************************************************************************************
- //函數名稱:void delay_50US(unsigned int t)
- //功能: 延時50*t(us)
- void delay_50us(uint t)
- {
- unsigned char j;
- for(;t>0;t--)
- {
- for(j=19;j>0;j--);
- }
- }
復制代碼
|