单片机定时闹钟程序分布解释

单片机定时闹钟程序分布解释,第1张

//头文件

#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=0xd8

TL1=0xef 要改变的,7个音节的初值都是不同的。由于蜂鸣器电路太简单,做成后音质较差。

问题不是很清晰!

首先,定时器溢出时间较短,需要在定时器中断外另设计数单元

其次,什么叫“检验对准时间”?我的理解是:使用一段程序来检验当前时间与设定时间(闹钟的定时值)的差值,差值为零时报时。基于该理解,有两种方式(根据你自己的情况自选):

1)先设计出一个时钟,然后将时钟值与设定值比对,具体语句可以使用“异或”(两时间相同时,异或值为零),或cjne指令本人倾向于后者(如:万一出现干扰在两值相同时没有比较,前者就失效了,而后者还能继续比较)。

2)

预置一个变量,每个固定时间间隔(使用定时中断)减一,到零时报时但要注意,直接在定时中断程序中减一时一定要在中断中判断到零否,否可能则会出现不报时的问题。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/yw/11141787.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-13
下一篇2023-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存