求 C51单片机 时钟程序 用C 语言编写 显示分秒 复位键重新记时

求 C51单片机 时钟程序 用C 语言编写 显示分秒 复位键重新记时,第1张

#include<reg51.h>

#define uint unsigned int

#define uchar unsigned char

uchar code segcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}//0,1,2,3,4,5,6,7,8,9,-

uchar code dispbit[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}//数码管位选码

uchar buffer[]={0,0,0,0,0,0,0,0}

uint hour,min,sec

uint status

//函数声明

void delayMS(uint t)

void keyprocess(unsigned char key)

void display()

void timer0()

main() //主函数

{

bit keyrelease

uchar buf

uchar keyinput

keyrelease=1

buf=0xff

TMOD=0x01 //T0工作在方式1,16位计数器

TH0=(65536-1000)/256 // 定时器0设置延时1ms中断初始值

TL0=(65536-1000)%256

TR0=1

IE=0x82 //开定时器0中断

status=0

while(1)

{ //键扫描程序

keyinput=P1&0xf0

if(keyinput!=0xf0)

{

delayMS(10)

if(keyinput!=0xf0)

{

if(keyrelease==1)

{

keyrelease=0

buf = keyinput //buf用来暂时存放键值

}

}

else

{

keyrelease=1

keyprocess(buf) //调用按键处理函数

buf = 0xff

}

}

else

{

keyrelease=1

keyprocess(buf)

buf=0xff

}

display()

}

}

//延时函数

void delayMS(uint t) // 晶振频率12M

{

uint i

while(t--)

for(i=0i<125i++)

}

//按键处理函数

void keyprocess(unsigned char key) //键值处理,正常计时,设置时分秒

{ switch (key)

{

case 0xe0:status++ //按下设置键

if (status>=4) status = 0

break

case 0xd0:switch(status)//按下加1键,3种模式下加1

{

case 0x01:if(hour<23) hour++

else hour=0break

case 0x02:if(min<59) min++

else min=0break

case 0x03:if(sec<59) sec++

else sec=0break

}

break

case 0xb0:switch(status) //按下减1键

{

case 0x01:if(hour>0) hour--

else hour=23 break

case 0x02:if(min>0) min--

else min=59 break

case 0x03:if(sec>0) sec--

else sec=59 break

}

break

default:break

}

}

//数码管显示函数

void display()

{

uchar i

//正常计时显示

{

buffer[0]=hour/10 // 显示时的十位

buffer[1]=hour%10 // 显示时的个位

buffer[2]=10 // 显示‘-’

buffer[3]=min/10// 显示分的十位

buffer[4]=min%10// 显示分的个位

buffer[5]=10

buffer[6]=sec/10// 显示秒的十位

buffer[7]=sec%10// 显示秒的个位

for(i=0i<8i++)

{

P0=segcode[buffer[i]]

P2=dispbit[i]

delayMS(1)//防止数码管显示的时候闪动

P2=0x0

}

}

}

//定时器0中断函数

void timer0() interrupt 1 using 2

{

static uint count

TH0=(65536-1000)/256 // 定时器0设置初始值1ms中断初始值

TL0=(65536-1000)%256

TR0=1

count++ //正常计时

if(count>=1000)// 定时 1S 到,以下为时钟的正常走钟逻辑

{

count=0

sec++

if(sec>= 60)

{

sec=0min++

if(min>= 60)

{

min=0hour++

if(hour>= 24)

{

hour=0

}

}

}

}

}

计算自然时间干嘛用两个中断?用一个外部中断就行了,加一个计时器

思路就是给计时器付初值(控制时间长短),没计一秒就进入中断,中断中就把显示的时间加一,然后又计一秒,又中断显示加一,循环就行了。

写个大概结构吧:

void main()

{

TMOD=0x00//设置定时器0为工作方式1

TL0=(65536-5000)/256;//计时器低四位附初值

TH0=(65536-5000)%256//计时器高四位赋值,12MHz晶振,那么这样计时

溢出时刚好为50ms。重复20次就为1s。

EA=1//开总中断

ET0=1;//开定时器0中断

TRO=1;//启动定时器

display()//控制显示程序

}

接下来每计满一次就会进入中断,在中断中就可以这样写:

{

num++

if(num==20)

{

num=0//清零,为下一秒记时准备

miao++

}

}

那么每计20次刚好一秒,miao就加1。在dispaly中显示就可以了。记得把计时器付初值放在循环里就行了。

大概思路就这样,希望能帮到。

............

CJNE 31H,#04H,GOON

CJNE 30H,#02H,GOON

MOV 31H,#00H

MOV 30H,#00H

GOON:

...........


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

原文地址: http://outofmemory.cn/yw/11343180.html

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

发表评论

登录后才能评论

评论列表(0条)

保存