
#include<reg51.h>
//数据类型定义
#define ui unsigned int
#define uc unsigned char
//定义蜂鸣器管脚是BEEP
//数码管显示查表
uc code tab[]=
{0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,0xbf,0x89,0xc7,0xff}
uc t0,a,b,c,d,e,f,miao,fen,xs,n
void display(uc,uc,uc)
//延时1ms函数
void delay(ui z)//延时1毫秒
{
ui a,b
for(a=za>0a--)
for(b=100b>0b--)
}
void init()
void keyscan()
void main() //主函数,在主函数中设置定时的时间,当时间到达预定值时,蜂鸣器响起
{
BEEP=1
init()
while(1)
{
keyscan()
display(xs,fen,miao)
if(xs==7&&fen==0&&miao==0)
{
n=5
while(n--)
{
BEEP=0
delay(500)
BEEP=1
delay(500)
}
}
}
}
void keyscan() //键盘扫描子函数,通过按键来实现相应的动作
{
P3=0x7f
while(P3!=0x7f)
{
delay(10)
while(P3!=0x7f)
{
switch(P3)//按键检测程序段 可以一同按键来更改秒分时的数值
{
case 0x7e:{miao++if(miao==60)miao=0}//如果加到头了 就变0
break
case 0x7d:{miao--if(miao==0xff)miao=59}//如果减到头了 就变59
break
case 0x7b:{fen++if(fen==60)fen=0}//同上
break
case 0x77:{fen--if(fen==0xff)fen=59}//同上
break
}
while(P3!=0x7f)
delay(10)
while(P3!=0x7f)
}
}
P3=0xbf
while(P3!=0xbf)
{
delay(10)
while(P3!=0xbf)
{
switch(P3)
{
case 0xbe:{xs++if(xs==24)xs=0}//如果加到头了 就变0
break
case 0xbd:{xs--if(xs==0xff)xs=23}//如果减到头 就变23 因为小时最大为24 其实24:00=0:00
break
}
while(P3!=0xbf)
delay(10)
while(P3!=0xbf)
}
}
}
void init() //系统初始化开启定时器0中断
{
TMOD=0x01
TH0=(65536-50000)/256
TL0=(65536-50000)%256
EA=1ET0=1TR0=1
}
//秒 分 时 变量的实时计数 运用tmer1中断来实现 50ms中断一次 中断20次就是1s
void timer0() interrupt 1 //定时器1中断子程序,实现正常的走秒
{
TH0=(65536-50000)/256
TL0=(65536-50000)%256
t0++
if(t0==20)
{
t0=0
miao++
if(miao==60)
{
miao=0
fen++
if(fen==60)
{
fen=0
xs++
if(xs==24)
xs=0
}
}
}
}
//运用数码管的动态扫描方式,来驱动数码管
void display(uc xs,uc fen,uc miao) //显示函数,把数送到数码管显示
{
P2=0xfe//选择该位
P0=tab[miao%10]// 显示段码
delay(1)//延时
P0=0xff//断码关掉 防止扫描出现幻影 后面的同上 以此类推
P2=0xfd
P0=tab[miao/10]
delay(1)
P0=0xff
P2=0xfb
P0=tab[16]
delay(1)
P0=0xff
P2=0xf7
P0=tab[fen%10]
delay(1)
P0=0xff
P2=0xef
P0=tab[fen/10]
delay(1)
P0=0xff
P2=0xdf
P0=tab[16]
delay(1)
P0=0xff
P2=0xbf
P0=tab[xs%10]
delay(1)
P0=0xff
P2=0x7f
P0=tab[xs/10]
delay(1)
P0=0xff
}
单片机输出不同频率的信号,驱动蜂鸣器发出不同音。你设置的初值TH1=0xd8TL1=0xef 要改变的,7个音节的初值都是不同的。由于蜂鸣器电路太简单,做成后音质较差。
问题不是很清晰!首先,定时器溢出时间较短,需要在定时器中断外另设计数单元
其次,什么叫“检验对准时间”?我的理解是:使用一段程序来检验当前时间与设定时间(闹钟的定时值)的差值,差值为零时报时。基于该理解,有两种方式(根据你自己的情况自选):
1)先设计出一个时钟,然后将时钟值与设定值比对,具体语句可以使用“异或”(两时间相同时,异或值为零),或cjne指令本人倾向于后者(如:万一出现干扰在两值相同时没有比较,前者就失效了,而后者还能继续比较)。
2)
预置一个变量,每个固定时间间隔(使用定时中断)减一,到零时报时但要注意,直接在定时中断程序中减一时一定要在中断中判断到零否,否可能则会出现不报时的问题。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)