#include<reg51.h>#define uchar unsigned char#define uint unsigned int#define delay_
time 3uchar k,dat[]={0,0,0,0,0,0,0,0};uint tcount,t,u;uchar dat1[]={0,0,0,0,0,0,0,0};uchar dat2[]={0,0,0,0,0,0,0,0};uchar al
ARMs[]={0,0,0,0,0,0,0,0};uchardis_bit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};unsigned char code SEG7[11]={0xC0,/*0*/ 0xF9,/*1*/ 0xA4,/*2*/ 0xB0,/*3*/ 0x99,/*4*/ 0x92,/*5*/ 0x82,/*6*/ 0xF8,/*7*/ 0x80,/*8*/ 0x90,/*9*/ 0xBF,/*-*/ };sbit miaobiao1=P1^0;sbit tminute=P1^1;sbit thour=P1^2;sbit miaobiao2=P1^3;sbit alarm=P1^4;sbit P0_0=P0^0;sbit P1_5=P1^5;sbit P1_6=P1^6;sbit P1_7=P1^7;uchar ms=0;uchar flag=0;uchar sec=0;uchar minit=0;struct time{uchar second;uchar minute;ucharhour;}time1; uchar n,i;void delay(n) { while(n--) { for(i=120;i>0;i--); } }
voidmodify(void){ EA=0; if(thour==0) { if(flag==0) { dat1[6]++;delay(180); if(dat1[6]>9) { dat1[6]=0;dat1[7]++; if(dat1[7]>2) { dat1[7]=0; } } } if(flag==1) { alarms[6]++;delay(200); if(alarms[6]>9) { alarms[6]=0;alarms[7]++; if(alarms[7]>2) { alarms[7]=0; } } dat[6]=alarms[6]; dat[7]=alarms[7]; } } if(tminute==0) { if(flag==0) { dat1[3]++;delay(180); if(dat[3]>=10) { dat1[4]++;dat1[3]=0; if(dat1[4]>5) { dat1[4]=0; } } } if(flag==1) { alarms[3]++; delay(200); if(alarms[3]>9) { alarms[4]++;alarms[3]=0; if(alarms[4]>5) { alarms[4]=0; } } dat[3]=alarms[3]; dat[4]=alarms[4]; } } if(miaobiao1==0) { TR0=0;ET0=0;TR1=1;ET1=1; } if(miaobiao2==0) { TR0=1;ET0=1;TR1=0;ET1=0; dat2[0]=0; dat2[1]=0; dat2[3]=0; dat2[4]=0; dat2[6]=0; dat2[7]=0; ms=0; sec=0; minit=0;
} if(P1_5==0) { TR0=0;ET0=0;TR1=0;ET1=0; } if(alarm==0) { TR0=0;ET0=0;TR1=0;ET1=0;flag=1; dat[0]=0; dat[1]=0; dat[2]=10; dat[3]=0; dat[4]=0; dat[5]=10; dat[6]=0; dat[7]=0; } EA=1;
}
void init(void){
TMOD= 0x11; TH0= 0xDB; TL0=0xFF; TH1=0xDB; TL1=0xFF; ET0 = 1; //10ms ET1=1;// TR1=1; TR0=1; tcount=0; ms=0; sec=0; minit=0; EA= 1;
}
void test(void) { for(k=0;k<8;k++) { P3=dis_bit[k];P2=SEG7[dat[k]];delay(1);P3=0X00; }
}
void main() { init();
delay(10); while(1) { modify(); test(); }}
void diplay() interrupt 1{ ET0=0; TR0=0; TH0 = 0xDB; TL0 = 0xff; TR0=1; tcount++; if(tcount==100) { time1.second++; tcount=0; dat1[0]=(time1.second)%10; dat1[1]=(time1.second)/10; } if(time1.second==60) { time1.second=0; time1.minute++; dat1[3]=(time1.minute)%10; dat1[4]=(time1.minute)/10; } if(time1.minute==60) { time1.minute=0; time1.hour++; dat1[6]=time1.hour%10; dat1[7]=time1.hour/10; } if(time1.hour>23) { time1.hour=0; } dat[5]=10; dat[2]=10; dat[0]=dat1[0]; dat[1]=dat1[1]; dat[3]=dat1[3]; dat[4]=dat1[4]; dat[6]=dat1[6]; dat[7]=dat1[7]; flag=0; P0=0x00; if((alarms[7]==dat1[7])&&(alarms[6]==dat1[6])&&(alarms[4]==dat1[4])&&(alarms[3]==dat1[3])) { P0=0x01; }
ET0=1;
}
void time_2(void)interrupt 3{ EA=0; TR0=0; TH1=0xDB; TL1=0xFF; TR1=1; ms++; dat2[0]=ms%10; dat2[1]=ms/10; if(ms>=100) { ms=0; sec++; dat2[3]=sec%10; dat2[4]=sec/10; if(sec>=60) { sec=0; minit++; dat2[6]=minit%10; dat2[7]=minit/10; } } dat[5]=10; dat[2]=10; dat[0]=dat2[0]; dat[1]=dat2[1]; dat[3]=dat2[3]; dat[4]=dat2[4]; dat[6]=dat2[6]; dat[7]=dat2[7]; EA=1; }
这是一个数码管
电子时钟的程序,
用一片AT89C51A
单片机通过编程去驱动8
个数码管实现的。通过6
个开关控制,
从上到下6
个开关KEY1~KEY6
的功能分别为:KEY1,
切换至秒表;KEY2,
调节时间,
每调一次时加1
;KEY3,
调节时间,
每调一次分加1
;KEY4,
从其它状态切换至时钟状态;KEY5,
切换至闹钟设置状态,
也可以对秒表清零;KEY6,
秒表暂停.
控制键分别与P1.0~P1.5
口连接.其中:A.通过P2口和P3口去控制数码管的显示如图所示P2口接数码管的a——g端,是控制输出编码,P3口接数码管的1——8端,是控制动态扫描输出.B.从P0.0输出一个信号使二极管发光,二极管在设置的闹钟时间到了时候发光,若有乐曲可以去驱动扬声器实现。
功能说明:1.各个控制键的功能:可对时间进行校准调节(只能加1);按下设置键数字时钟进入闹钟设置状态,设置闹钟的时间;时加1、分加1键是在校准时间时或设置闹钟时间对小时数或分钟数调节而设置的;按下秒切换键就可以进入秒表模式,同时秒表也开始计时,按下秒表暂停、复位键就暂停、归零,如果要重新对秒计时则可以按秒表开始、复位;清零键可以对闹钟清零。2. AT89C51单片机,通过编写程序对数码显示进行控制。3.八个7段数码管显示时钟和秒表信号。希望能详细一些,这个程序用的AT89C51A
仿真,我用STC90C516RD+可以不 - -
一周热门 更多>