51单片机定时/计数器使用方法
时间:01-20 10:58 阅读:833次
*温馨提示:点击图片可以放大观看高清大图
简介:本文介绍了51单片机定时/计数器使用方法,并给出相对应的程序。
定时/计数器的使用方法:
1、根据要求选择方式,确定方式控制字,写入方式控制寄存器TMOD。
2、根据要求计算定时/计数器的计数值,再由计数值求得初值,写入初值寄存器TH0/TH1和TL0/TL1。
3、根据需要开放定时/计数器中断(后面需要编写中断服务程序)。
4、设置定时/计数器控制寄存器TCON的值,启动定时/计数器开始工作。
5、等待定时/计数器时间到,到则执行中断服务程序;如用查询处理则编写查询程序判断溢出标志,溢出标志等于1,则进行相应处理。
/******************************************************************************************/
/* */
/* 采用定时/计数器设计的60分钟倒计时程序,实现60分钟倒计时。利用4位数码管显示分、秒。*/
/* 数码管每秒更新一次,秒表由59倒计时到00,则分钟减1。 */
/* */
/******************************************************************************************/
#include <REG51.h>
#define uint unsigned int
#define uchar unsigned char
#define LED P2 // 数码管段选
// 数码管位选
sbit WE1 = P0^0;
sbit WE2 = P0^1;
sbit WE3 = P0^2;
sbit WE4 = P0^3;
uint min = 59;
uint sec = 59;
uint i;
uchar num_table[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; // 0~9十六进制代码。
void display(); // 数码管显示程序
void delay(uint x); // 延时程序
void main() {
TMOD = 0x01;// 使用方式1
TH0 = 0xD8;// 初值寄存器高8位
TL0 = 0xF0;// 初值寄存器低8位
EA = 1;// 允许中断请求总控制
ET0 = 1;// 定时/计数器T0溢出中断允许
TR0 = 1;// 定时/计数器T0的启动位
i = 0;
while (1)
{
display();
}
}
void time0_int(void) interrupt 1 {// 中断服务程序
TH0 = 0xD8;
TL0 = 0xF0;
i++;
if (i == 100) {
sec--;
i = 0;
if (sec == 0) {
sec = 59;
min--;
if (min == 0) min = 59;
}
}
}
void display() {
uint min_s = min/10;
uint min_g = min%10;
uint sec_s = sec/10;
uint sec_g = sec%10;
WE1 = 1;
LED = num_table[min_s];
delay(1);
WE1 = 0;
WE2 = 1;
LED = ~(~num_table[min_g]|0x80); // 显示时后添加一个小数点
delay(1);
WE2 = 0;
WE3 = 1;
LED = num_table[sec_s];
delay(1);
WE3 = 0;
WE4 = 1;
LED = num_table[sec_g];
delay(1);
WE4 = 0;
}
void delay(uint x) {
uint i;
while (x-- != 0)
{
for (i = 0; i < 300; i++);
}
}