5.2 软件仿真电路全图
图7 软件仿真电路全图
此图为时钟显示模式,显示内容为15时9分49秒
图8 软件仿真电路全图
此图为日期和星期显示模式,显示内容为6月4日星期二
5.3 源程序代码
#include
#define uint unsigned int #define uchar unsigned char sfr p0 = 0x80;
16
sfr p1 = 0x90; sfr p2 = 0xA0; sfr p3 = 0xB0;
unsigned char seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char con[8]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80}; unsigned char mm=0; //定义秒初始值 unsigned char ff=0; //定义分初始值 unsigned char hh=0; //定义时初始值
unsigned char sf=0; //定义时和分中间初始值 unsigned char fm=0; //等义分和秒中间初始值 unsigned char yue=1;//定义月初始值 unsigned char ri=1; //定义日初始值
unsigned char xingqi=0;//定义星期初始值,星期日用”0“表示 sbit shijia=P1^0;//定义P1.0按键为调整”时“+和”月“+ sbit shijian=P1^1;//定义P1.1按键为调整”时“-和”日“+ sbit fenjia=P1^2;//定义P1.2按键为调整”分“+和”星期“+ sbit fenjian=P1^3;//定义P1.3按键为调整”分“- sbit xianshiqih=P1^4;//定义P1.4按键为时钟和日期切换按键,当不按下此按键时数
码显示时钟,当按下此按键时数码管显示日期和星期
unsigned char count=100;
void xianshi();//定义显示子程序 void tiaoshi();//定义调整子程序 void delay(uint z);//定义延时子程序
void main() {
TMOD=0x01; TH0=-10000>>8; TL0=-10000; EA=1; ET0=1; TR0=1; while(1); }
void isr_time0()interrupt 1 {
TMOD=1;
TH0=-10000>>8; TL0=-10000; count--;
if(count==0) {
count=100; mm++;
17
if(mm==60) {
mm=0;ff++; if(ff==60) {
ff=0;hh++; if(hh==24) {
hh=0;ri++;xingqi++; if(ri==32) {
ri=1;yue++;
if(yue==13){yue=1;} }
if(xingqi==7){xingqi=0;} if(yue==2) {
if(ri==29){ri=1;yue++;} }
if(yue==1||yue==3||yue==5||yue==7 ||yue==8||yue==10||yue==12) {
if(ri==32){ri=1;yue++;} }
if(yue==4||yue==6||yue==9||yue==11) {
if(ri==31){ri=1;yue++;} } } } } }
tiaoshi(); xianshi(); }
void xianshi() //显示时间或日期程序 {
if(xianshiqih==1)//显示时间 {
unsigned int i=0,j; unsigned char time[8];
time[0]=hh/10;time[1]=hh; time[2]=sf/10;time[5]=fm;
18
time[3]=ff/10;time[4]=ff; time[6]=mm/10;time[7]=mm; for(i==0;i<8;i++) {
p2=con[i]; if(i==2||i==5) p0=0xbf;
else p0=seg[time[i]]; for(j=100;j>0;j--); } }
if(xianshiqih==0)//显示日期和星期 {
unsigned int i=0,j; unsigned char time[8];
time[0]=yue/10;time[1]=yue; time[2]=sf/10;time[5]=fm; time[3]=ri/10;time[4]=ri;
time[6]=xingqi/10;time[7]=xingqi; for(i==0;i<8;i++) {
p2=con[i]; if(i==2||i==5) p0=0xbf;
else if(i==6)p0=0xff; else p0=seg[time[i]]; for(j=100;j>0;j--); } } }
void tiaoshi() //调时程序 {
if(xianshiqih==1) {
if(shijia==0) {
hh++; mm=0;
delay(400);
if(hh==24){hh=0;} }
if(shijian==0) {
hh--;
19
mm=0;
delay(400);
if(hh==0){hh=23;} }
if(fenjia==0) {
ff++; mm=0;
delay(400);
if(ff==60){ff=0;} }
if(fenjian==0) {
ff--; mm=0;
delay(400);
if(ff==0){ff=59;} } }
if(xianshiqih==0) {
if(shijia==0) {
yue++;
delay(400);
if(yue==13){yue=1;} }
if(shijian==0) {
ri++;
delay(400);
if(ri==32){ri=1;} }
if(fenjia==0) {
xingqi++; delay(400);
if(xingqi==7){xingqi=0;} } } }
void delay(uint z) //延时程序 {
uint x,y;
20