之所以贴出来,一个也是因为这个电路并不像实验板那么整洁,大家看附件的仿真文件就清楚,另一方面也是之前学习的笔记吧
程序- /* 本程序仅应用于‘4位单片机电子钟电路’
- 2051
- 晶振 3.579MHz
- main.c
- */
- #include <STC11.H>
- #define uint unsigned int
- #define uchar unsigned char
- uchar code table[]={0xfd,0x25,0xbb,0xaf,0x67,0xcf,0xdf,0xa5,0xff,0xef}; //0~9仅限本电路,正常显示
- uchar code table2[]={0xfc,0x24,0xba,0xae,0x66,0xce,0xde,0xa4,0xfe,0xee};
- uchar x,h,m,s,flag,ID,flag_set; //ID=1调整分钟 ID=2调整时钟
- void delay(uint a) //延时函数0~65535
- {
- while(a--);
- }
- void display() //显示函数
- {
- uchar x=1000; //x延时时间
- if(flag_set!=1)
- {
- P37=0; //显示分个位
- P1=table[m%10];
- delay(x);
- P37=1;
- P32=0; //显示分十位
- P1=table[m/10];
- delay(x);
- P32=1;
- }
- else
- {
- if (flag)
- {
- P37=0; //显示分个位
- P1=0x01;
- delay(x);
- P37=1;
- P32=0; //显示分十位
- P1=0x01;
- delay(x);
- P32=1;
- }
- else
- {
- P37=0; //显示分个位
- P1=table[m%10];
- delay(x);
- P37=1;
- P32=0; //显示分十位
- P1=table[m/10];
- delay(x);
- P32=1;
- }
- }
- if(flag_set!=2)
- {
- P31=0; //显示时个位
- P1=table[h%10];
- delay(x);
- P31=1;
- if (flag) //闪烁秒和显示时十位
- {
- P30=0;
- P1=table[h/10];
- delay(x);
- P30=1;
- }
- else
- {
- P30=0;
- P1=table2[h/10];
- delay(x);
- P30=1;
- }
- }
- else
- {
- if(flag)
- {
- P31=0; //显示时个位
- P1=0x01;
- delay(x);
- P31=1;
- P30=0;
- P1=0x01;
- delay(x);
- P30=1;
- }
- else
- {
- P31=0; //显示时个位
- P1=table[h%10];
- delay(x);
- P31=1;
- P30=0; //显示时十位
- P1=table[h/10];
- delay(x);
- P30=1;
- }
- }
- }
- void keyscan()
- { uchar x=1000; //x消抖延时系数
- delay(x);
- if(P34==0)
- { while(P34==0)
- display();
- ID++;
- switch(ID)
- {
- case 1: //set m flag_set=1
- flag_set=1;
- while(P34)
- {if(P35==0)
- { while(P35==0)
- display();
- m++;
- if(m==60)
- m=0;
- }
- else
- {
- display();
- }
- }
- break;
- case 2: //set h flag_set=2
- flag_set=2;
- while(P34)
- {if(P35==0)
- { while(P35==0)
- display();
- h++;
- if(h==24)
- h=0;
- }
- else
- {
- display();
- }
- }
- break;
- case 3:
- ID=0;
- flag_set=0;
- break;
- }
- }
- }
- void main(void)
- {
- TH0=(65536-29825)/256; //中断初始化,100ms
- TL0=(65536-29825)%256;
- TMOD=0x01; //定时器0方式1
- ET0=1; //中断T0允许
- TR0=1; //开T0
- //EX0=1; //开外部中断0
- //IT0=1; //下降沿触发
- EA=1; //开总中断
- while(1)
- {
- display();
- if (P34==0)
- keyscan();
- }
- }
- void t0() interrupt 1
- { x++;
- if(x%5==0) //闪烁标志
- flag=~flag;
- if(x==10) //定时1s
- { x=0;
- s++;
- if(s==60)
- { s=0;
- m++;
- if(m==60)
- { m=0;
- h++;
- if(h==24)
- { h=0; }
- }
- }
- }
- TH0=(65536-29825)/256; //晶振3.579MHz,定时4ms减1193;定时100ms减29825;定时200ms减59650
- TL0=(65536-29825)%256;
- }
|