简单啊。
大致说来就是
你先开启个定时器,根据你选用的晶振,计算出你要用定时器定时的基准时间,
就假设是10毫秒吧。
然后给定时器的THx,TLx写入初值,开启中断,进行定时。
然后就等待中断。
在你响应中断的程序中,再次给单片机送入初值,
由于是10毫秒中断一次,因此我们设置几个“软件计数器”
比如每此中断,软甲计数器+1,
例如“软件计数器1”在中断程序中计数100次,则是10ms*100=1s
而“软件计数器2”在1的基础上继续计数100次,则是1S*100=100S
而“软件计数器3”在2的基础上继续计数36次,则是100S*36=3600S=1小时。
这么简单的要求,不用大动干戈。
看看下面的程序,是不是最简单:
ORG 0000H
SETB TR0 ;启动T0
MOV R2, #250 ;定时计数初值
LOOP:
MOV TH0, #(8192 - 8000) / 32 ;定时8ms
MOV TL0, #(8192 - 8000) MOD 32
JNB TF0, $ ;等待8ms
CLR TF0
DJNZ R2, LOOP ;每隔8ms,R2减一次一
CPL P1.0 ;R2为0则LED亮灭转换
LJMP 0000H
END
本程序,已经实验成功。
#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=0x3c;TL0=0xb4; //50ms
ms_50++;
if(ms_50==20) {sec++;ms_50=0;}
if(sec==60) {sec=0;min++;}
if(min==60) {min=0;hour++;}
if(hour==24) {hour=0;}
}
//#######定时器T1中断服务程序########//
Timer1() interrupt 3
{
TH1=0xd8;TL1=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=0;m4;m++)
{
ZIXING=zixing[k%10];
if(ms_5010)
dp=0;
ZIWEI=~ziwei[m];
for(n=0;n500;n++);
ZIXING=0xff;
for(n=0;n100;n++);
k=k/10;
}
}
//显示 on 定时编号//
show_on(uchar id) //id:定时编号//
{
uchar m;
uint n;
for(m=0;m2;m++)
{
ZIXING=zixing[id%10];
dp=0;
ZIWEI=~ziwei[m];
for(n=0;n500;n++);
ZIXING=0xff;
for(n=0;n80;n++);
id=id/10;
}
ZIXING=0xc8; //字母n//
ZIWEI=~ziwei[2];
for(n=0;n500;n++);
ZIXING=0xff;
for(n=0;n200;n++);
ZIXING=0xc0; //字母0//
ZIWEI=~ziwei[3];
for(n=0;n500;n++);
ZIXING=0xff;
for(n=0;n200;n++);
}
/*************启动秒表***************/
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单片机定时器设置程序的介绍到此就结束了,感谢您耐心阅读,谢谢。
本文标签:51单片机定时器设置程序