|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
学C语言两个月了,忍不住就写了这个电子种程序。这是我学单片机的开初理由,就是有朝一日我要自已写一个电子钟程序,也是我坚持学下去的动力。今天我终于完成了这个愿望!这个程序已运行通过,在我的仿真板上运行良好。特此贴出来,请高手指点不足之处。
/*程序所用晶振频率为11.0592MHz,程序开始显示00:00:00。
SW1秒调整按钮,SW2为分钟调整按钮,SW3为小时调整按钮。*/
#include "reg52.h"
#include "intrins.h"
void display();
scan_key();
regulate_key();
sbit SW1=P3^2; //秒调整
sbit SW2=P3^3; //分调整
sbit SW3=P3^4; //小时调整
unsigned char key_s, key_v;
unsigned int count=0,sec,min,hour;
unsigned char displayTab[]={
0x28,/*0*/
0x7E,/*1*/
0xA2,/*2*/
0x62,/*3*/
0x74,/*4*/
0x61,/*5*/
0x21,/*6*/
0x7A,/*7*/
0x20,/*8*/
0x60,/*9*/
};
void delay10ms(unsigned int delay10ms) /*延时程序10ms*/
{
unsigned char i=0;
for(; delay10ms>0; delay10ms--)
{
for(; i<124; i++)
{;}
}
}
void time0() interrupt 1 using 0 /*中断程序*/
{
TH0 = 0xdb;
TL0 = 0xfb; //重置定时值10ms
count++;
if(count>=100)
{ count=0;
sec++;
if(sec>59)
{ sec=0;
min++;
if(min>59)
{ min=0;
hour++;
if(hour>23)
hour=0;
}
}
}
display();
}
void main() /*主程序*/
{
TMOD = 0x01; //T0工作方式1
TH0 = 0xdb;
TH1 = 0xfb; //预置定时值10ms
EA = 1; //开总中断
TR0 = 1; //开始计时
ET0= 1; // 允许T0定时中断
while(1)
{
if(scan_key()) //有键按下进入按键程序
{
delay10ms(10);
if(scan_key())
{
key_v = key_s;
regulate_key();
}
}
}
}
scan_key() //按键程序
{
key_s = 0x00;
key_s |= SW1;
key_s <<= 1;
key_s |= SW3;
key_s<<=1;
key_s |= SW2;
return(key_s ^ key_v);
}
regulate_key() //调时函数
{
EA=0;
if((key_v&0x01)==0) //SW1按下分调整
{
min++;
if(min>59)
{
min=0;
}
}
if((key_v&0x02)==0) //SW2按下小时调整
{
hour++;
if(hour>23)
{
hour=0;
}
}
if((key_v&0x04)==0) //SW3按下秒调整
{
sec++;
if(sec>59)
{
sec=0;
}
}
EA=1;
}
void display() /*显示程序*/
{
unsigned char tmp1,tmp2;
tmp1=sec/10; //秒显示程序
tmp2=sec%10;
P0=displayTab[tmp1];
P2=0xf7;
delay10ms(20);
P0=displayTab[tmp2];
P2=0xef;
delay10ms(20);
tmp1=min/10; //分显示程序
tmp2=min%10;
P0=displayTab[tmp1];
P2=0xfd;
delay10ms(20);
P0=displayTab[tmp2];
P2=0xfb;
delay10ms(20);
tmp1=hour/10; //小时显示程序
tmp2=hour%10;
P0=displayTab[tmp1];
P2=0x7f;
delay10ms(20);
P0=displayTab[tmp2];
P2=0xfe;
delay10ms(20);
} |
|