怎样利用51单片机实现时钟功能程序?

怎样利用51单片机实现时钟功能程序?,第1张

#define uchar unsigned char //  (先定义改谨一下方便使碰清用)

#define uint unsigned int

#define ulong unsigned long

#include <reg52.h>//包括一个52标准内核的头文件

uchar code zixing[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}

uchar code ziwei[]={0x10,0x20,0x40,0x80}

uchar *h,*m

uchar hour=12,min=0,sec=0,h_ding,m_ding,count=0,ms_50,ms_10,miaobiao_sec

sbit dp=P0^7

sbit k1=P3^2

sbit k2=P3^3

sbit k3=P3^4

sbit sound=P2^3

sfr ZIXING=0x80//p0口输出字形

sfr ZIWEI=0xa0//P2口输出字位

typedef enum //枚举类型:4种状态//

{

CLOCK,

SET_RING1,

SET_RING2,

MIAOBIAO_RUN,

}STATE

STATE status

typedef struct //定时时间的数据结构//

{

uchar hour

uchar min

}DINGSHI_TIME

DINGSHI_TIME dingshi_time[2]

#define NO_KEY -1 //定义一下方便使用

#define KEY_1 1

#define KEY_2 2

#define KEY_3 3

bit show_on_flag

//#######定时器T0中断服务程序########//

Timer0() interrupt 1

{

TH0=0x3cTL0=0xb4//50ms

ms_50++

if(ms_50==20) {sec++ms_50=0}

if(sec==60) {sec=0min++}

if(min==60) {min=0hour++}

if(hour==24) {hour=0}

}

//#######定时器T1中断笑歼前服务程序########//

Timer1() interrupt 3

{

TH1=0xd8TL1=0xf4//10ms

ms_10++

if(ms_10==100)

{

miaobiao_sec++

ms_10=0

}

if(miaobiao_sec==60)

miaobiao_sec=0

}

//##############数码管显示#####################//

show(uchar time_high,uchar time_low)

{

uchar m

uint n,k

k=time_high*1000/10+time_low

for(m=0m<4m++)

{

ZIXING=zixing[k%10]

if(ms_50<10)

dp=0

ZIWEI=~ziwei[m]

for(n=0n<500n++)

ZIXING=0xff

for(n=0n<100n++)

k=k/10

}

}

//显示 on 定时编号//

show_on(uchar id) //id:定时编号//

{

uchar m

uint n

for(m=0m<2m++)

{

ZIXING=zixing[id%10]

dp=0

ZIWEI=~ziwei[m]

for(n=0n<500n++)

ZIXING=0xff

for(n=0n<80n++)

id=id/10

}

ZIXING=0xc8//字母n//

ZIWEI=~ziwei[2]

for(n=0n<500n++)

ZIXING=0xff

for(n=0n<200n++)

ZIXING=0xc0//字母0//

ZIWEI=~ziwei[3]

for(n=0n<500n++)

ZIXING=0xff

for(n=0n<200n++)

}

/*************启动秒表***************/

void run_miaobiao()

{

ms_10=0

miaobiao_sec=0

TH1=0xd8//标准是0xd8e4

TL1=0xf4

// TR1=1//启动定时器1

}

显示秒表:

void show_miaobiao()

{

show(miaobiao_sec,ms_10)

}

在51单片机中,可以使用定时器(Timer)来实现与主函数并行运行。以下是一般的步骤:

选择定时器:根据需要选择定时器0或定时器1。定时器0使用TH0和TL0寄存器,定时器握斗运1使用TH1和TL1寄存器。

设置定时器模式:可以选择模式0到模式3中的一个模式。模式0为13位定时模式,模式1为16位定时模式,模式2为8位自动重装模式,模式3为双重8位自动重装模式。

设置计数值:将计数值(需要倒数的时间值)写入THx和TLx寄存器中。

启动定时销棚器:段梁设置定时器控制寄存器的相应位,启动定时器。

处理定时器中断:可以使用定时器中断服务程序,在定时器溢出时执行相应的处理 *** 作。

以下是一个简单的例子,使用定时器1来实现每隔一定时间向P1口输出一个脉冲:

#include <reg52.h>

sbit P1_0 = P1^0  // 定义P1.0口

void Timer1() interrupt 3 {  // 定义定时器1中断服务程序

TF1 = 0  // 清除中断标志

P1_0 = ~P1_0  // 翻转P1.0口状态

}

void main() {

TMOD |= 0x10  // 设置定时器1为16位定时器模式

TH1 = 0xFC  // 设置计数值为65535-50000=15535

TL1 = 0x1B  // 50000的低8位为0x1B

ET1 = 1  // 允许定时器1中断

EA = 1  // 开启总中断

TR1 = 1  // 启动定时器1

while (1) {  // 主函数循环

// 这里可以写主函数的处理代码

}

}

在上面的例子中,使用定时器1的16位定时器模式,并设置计数值为50000,即每隔50000个机器周期定时器溢出一次。定时器1的中断服务程序中将P1.0口状态翻转,实现了每隔一定时间向P1.0口输出一个脉冲。同时,在主函数中可以编写相应的处理代码,实现与定时器并行运行的功能。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存