代码:
#include "reg51.h"
unsigned char count = 0, num = 0;
// 共阴数码管:0-9
unsigned char seg[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
void init(){
// 工作模式控制寄存器 TMOD
TMOD = 0x01;
EA = 1; // 开启总中断 ENABLE ALL
ET0 = 1; // 开启定时器0的溢出中断 ENABLE INTERRUPT
TR0 = 1; // 启动定时器0 TIMER RUN
TH0 = (65536 - 50000) / 256; // 延时初值
TL0 = (65536 - 50000) % 256;
}
void init_timer0() interrupt 1{ // 中断模式1:定时器T0
TH0 = (65536 - 50000) / 256; // 延时初值已经溢出变形,必须重新赋值
TL0 = (65536 - 50000) % 256;
count++;
if (count == 20){ // 50ms * 20 即为1s
num++; /* 功能区,在此区域使延时时间更长! */
count = 0;
}
}
void display(){
if (num == 10){ // 要放在 P2 = seg[num]; 前面, 否则会出现seg[10]!
num = 0;
}
P2 = seg[num];
}
void main(){
init();
while (1){
display();
}
}
仿真图:
原理:
1. 设置TMOD
2. TR0——计数运行控制位
TR0=1,启动定时器/计数器T1计数的必要条件。
TR0=0,停止定时器计数器计数。
该位可由软件置“1”或清“0”。(自己手动设置)
3. 设置TH0和TL0
延时时间 = (2 ^ 16 - X) × 12 / 晶振频率 (延时是ns级别的)
之后将X的高八位给TH0,低八位给TL0
设置晶振频率为12MHz,则X = 65536 - 延时时间 (50000us 即 50ms)
TH0 = X / 256 高八位
TL0 = X % 256 低八位
4. 中断模式选择