STC12C2052AD单片机控制的数码管时钟,数码管是共阳4位时钟数码管,由于使用单片机真驱,电路比较简单,且使用的材料和工具也很简单,用数码管显示,单片机控制,两个按键调时,蜂鸣器整点报时。所需要的元件如下:
材料有以下这些:
STC12C2052AD单片机一片
黄色共阳4位时钟数码管一块
6mm×6mm按键两个
杜邦线插针2p两个
无源蜂鸣器一个
20脚+14脚芯片座各一个
洞洞板一块(截取一小部分)
100欧电阻4个
源程序如下:
- #include
//声明头文件 -
- sbit key1=P3^4; //按键接口定义
- sbit key2=P3^5; //按键接口定义
- sbit speaker=P3^7; //蜂鸣器接口定义
- /************************************************************************************/
- unsigned char code LED[10]={0x20,0xA7,0x90,0x82,0x07,0x42,0x40,0xA6,0x00,0x02};//数码管段位码定义
- unsigned int time; //全局秒基准定义
- /*-------------------------------------延时函数-------------------------------------*/
- void delayms (unsigned int a){
- unsigned int i;
- while( --a != 0){
- for(i = 0; i < 600; i++);
- }
- }
- /*----------------------------------蜂鸣器驱动函数----------------------------------*/
- void beep (void)
- {
- unsigned char i=30;
- while(i--)
- {
- speaker=~speaker;
- delayms(3);
- }
- }
- /*----------------------------------数码管驱动函数----------------------------------*/
- void display (unsigned char hour,min)
- {
- unsigned char H1,H2,M1,M2;
- P3=0xf8; //数码管位选
- P1 = LED[H1]; //数码管段选
- delayms (2); //扫描延时
- P3=0xf4; //数码管位选
- P1 = LED[H2]; //数码管段选
- delayms (2); //扫描延时
- P3=0xf2; //数码管位选
- P1 = LED[M1]; //数码管段选
- delayms (2); //扫描延时
- P3=0xf1; //数码管位选
- P1 = LED[M2]; //数码管段选
- delayms (2); //扫描延时
- /*--------------------------------------分定义--------------------------------------*/
- M1=min/10;//取分十位
- min=min%10;//取余
- M2=min;//取分个位
- /*--------------------------------------时定义--------------------------------------*/
- H1=hour/10;//取时十位
- hour=hour%10;//取余
- H2=hour;//取时个位
- }
- /*-----------------------------------按键去抖函数-----------------------------------*/
- void qudou (unsigned char hour,min)
- {
- unsigned char i;
- for(i=0;i<25;i++){//循环显示,等于键盘去抖的功能
- display (hour,min);
- }
- }
- /*--------------------------------------主函数--------------------------------------*/
- void main(void)
- {
- ////定时器初始设置
- TMOD=0x01;//定时器工作方式1
- TH0=0x3C;//定时器初始产生50ms时基信号
- TL0=0xB0;//定时器初始产生50ms时基信号
- ET0=1;//开定时器中断
- EA=1;//开总中断
- TR0=1;//启动定时器
- /*************************************************************************************/
- while(1)
- {
- unsigned char hour,min;//定义时分
- display (hour,min);//调用显示函数
- if (time>59)//60秒向分进1
- {
- time=0;
- min++;
- }
- if (min>59)//60分向时进1
- {
- min=0;
- hour++;
- beep ();
- }
- if (hour>23)//24时时分秒清零
- {
- hour=0;
- min=0;
- time=0;
- }
- /*-----------------------------------按键判断程序-----------------------------------*/
- if(key1==0)
- qudou (hour,min);
- if (key1==0) {hour++;}
- if(key2==0)
- qudou (hour,min);
- if (key2==0) {min++;}
- }
- }
- /*-----------------------------------中断服务程序-----------------------------------*/
- void Timer0_Routine(void) interrupt 1
- {
- unsigned char a;
- TH0=0x3C;//定时器初始产生50ms时基信号
- TL0=0xB0;//定时器初始产生50ms时基信号
- a++;//定时器循环计数20次为一秒
- if (a==20){//定时器循环计数20次为一秒
- a=0;//次数清零,从新循环计数
- time++;//秒加一
- }
- }