属于基本问题,
定时器初始化,设定count变量,选择定时器工作于方式1,装初值可以装到65ms左右,设置50ms引起中断,当中断20次,大概为1s。
写一个显示子程序,在中断中,当计满1s,秒变量加1,秒计满60.分钟变量++。以此类推。
再写按键编码程序,
main函数中始终检测键盘扫描程序
#include"reg51.h"
#include "intrins.h" //_nop_();延时函数用
#define uchar unsigned char
#define uint unsigned int
#define SEG_OUT P2 //段码输出口
#define BIT_OUT P3 //扫描口
sbit dot=P2^7; //LED小数点控制
sbit sperk=P2^6; //蜂鸣器
sbit key=P1^0;
sbit key1=P1^1;
sbit key2=P1^2;
uchar code tab[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};
/* 共阳LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" */
uchar data dis_buff[6]={1,2,0,0,0,0}; //待显示单元数据,共6个数据
uchar data t10ms=0,ts=0,thour=12;
/*************1毫秒延时程序**************/
delay1ms(int t)
{
int i,j;
for(i=0;i
;
}
//
/***********LED显示动态扫描函数**********/
display()
{
char k;
char m=0xfe;
for(k=0;k<6;k++) //6位LED扫描控制
{ BIT_OUT=0xff;
SEG_OUT=tab[dis_buff[k]];
if(k==1|k==3) {dot=0;}
BIT_OUT=m;
if((flag!=0)&(t50ms>=10))
{
switch(flag)
{
case 1:BIT_OUT|=0x03;break;
case 2:BIT_OUT|=0x0c;break;
case 3:BIT_OUT|=0x30;break;
default:break;
}
}
delay1ms(3);
m=(m<<1)|0x01;
}
}
/**************初始化程序****************/
void initiation()
{
TMOD=0x01;
TH0=-10000/256;
TL0=-10000%256; //10MS定时初值(T0计时用)
ET0=1;
TR0=0;
EA=1;
}
/****************定时器0中断服务程序*****/
void init_timer0(void) interrupt 1
{
TH0=-10000/256;
TL0=-10000%256; //10MS定时初值(T0计时用)
t10ms++;
if(t10ms==100)
{
t10ms=0;
ts--;
if(ts==-1)
{
ts=59;
tmin--;
if(tmin==0)
{
tmin=59;
ts=59;
thour--;
if(thour==0)
{
thour=0;
tmin=0;
ts=0;
sperk=0;
}
}
}
}
dis_buff[0]=thour/10;
dis_buff[1]=thour%10;
dis_buff[2]=tmin/10;
dis_buff[3]=tmin%10;
dis_buff[4]=ts/10;
dis_buff[5]=ts%10;
}
/****************按键******************/
void cankey(void)
{
if(!key&&!key1&&!key2)
{
delay1ms(5);
if(!key)
{
tmin++;
if(tmin == 59)
{
thour++;
tmin=0;
if(tour == 24)
{
thour=0;
tmin=0;
}
}
}
if(!key1)
{
tmin--;
if(tmin == 0)
{
thour--;
tmin=0;
if(tour == 0)
{
thour=0;
tmin=0;
}
}
}
if(!key2)
{
TR0=~TR0;//控制开关
}
/****************主程序******************/
main()
{
initiation();
while(1)
{
display();
cankey();
}
}
定时闹钟,你稍微改一下时间就行了,六位数码管显示的
用一个状态机来完成,比如:TimeFlag,默认它是0,责表示是1-99s范围内,那就可以实现秒可调,如果秒大于99,责TimeFlag=1,那表示在min可调,至于怎么衔接,你可以秒到120之后再到分,你自己看。中断定时器就判断TimeFlag和现在的时间就可以了。不明白找我310217562