更多单片机学习笔记:
单片机学习笔记 1. 点亮一个LED灯
单片机学习笔记 2. LED灯闪烁
单片机学习笔记 3. LED灯流水灯
单片机学习笔记 4. 蜂鸣器滴~滴~滴~
单片机学习笔记 5. 数码管静态显示
单片机学习笔记 6. 数码管动态显示
单片机学习笔记 7. 独立键盘
单片机学习笔记 8. 矩阵键盘按键检测
单片机学习笔记 9. 8×8LED点阵屏
单片机学习笔记 10. 中断系统(理论)
单片机学习笔记 11. 外部中断
目录
0、实现的功能
1、Keil工程
1-1 什么是定时/计数器及用处
1-2 如何使用单片机的定时/计数器
1-3 定时/计数器相关的寄存器
2、代码实现
0、实现的功能
用T0定时器定时50ms的,满1s就数码管显示1,到10s时候清零,重新定时
1、Keil工程
1-1 什么是定时/计数器及用处
是有两个功能。65535是16位1,所以单次计时最大为71.1ms。PWM一般用于调节电机转速、台灯的亮度调节、波形发生器
1-2 如何使用单片机的定时/计数器
启动---TCON,模式选择----TMOD,查询溢出----TCON的TF位
1-3 定时/计数器相关的寄存器
TR0=1时启动计数;定时器T0加到65535时溢出,用软件去一直查询TF0是否为1,为1就表示定时结束,再用软件清零,进行下一次定时
选择模式TMOD。GATE默认为0,C/T=0为定时器、=1为计数器,M1和M0确定具体模式,共四种。需要注意,T0计时器需要设置初值。初值靠设置TH0和TL0
因为16位T0计时器最大从0计到65535,也就是能定时71.1ms。但如果想定时10ms,就需要设置初值为56319。因为10ms=10000us,10000us/1.085(一个机器周期)=9216,也就是定时10ms需要进行9216个机器周期,那初值就要从65535-9216=56319开始。此时TH0=DB,TL0=FF
如果定时到了,T0溢出,此时TCON寄存器的TF0会为1。这时一直查询TF0是否为1即可
2、代码实现
写一个定时50ms的,满1s就数码管显示1s,到10s时候清零
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit WE = P2^7;
sbit DU = P2^6;
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f} ;
//延时模块
void delay(uint z)
{
uint x;
uint y;
for(x = z; x > 0; x--)
for(y = 114; y > 0; y--);
}
void display(uint i)
{
uchar bai, shi , ge;
bai = i / 100;
shi = i % 100 /10;
ge = i % 10;
//第一个数码管
P0 = 0xff;
WE = 1;
P0 = 0xfe;
WE = 0;
DU = 1;
P0 = table[bai];
DU = 0;
delay(5);
//第二个数码管
P0 = 0xff; //清除断码,让位锁存器哪个都不选
WE = 1;//位选锁存打开
P0 = 0xfd;//选第二个管
WE = 0; //关上位选锁存器,进入锁存
DU = 1;//段选锁存打开
P0 = table[shi]; //亮shi
DU = 0;//进入锁存
delay(5); //延时5ms
//第三个数码管
P0 = 0xff; //清除断码,让位锁存器哪个都不选
WE = 1;//位选锁存打开
P0 = 0xfb;//选第三个管
WE = 0; //关上位选锁存器,进入锁存
DU = 1;//段选锁存打开
P0 = table[ge]; //亮ge
DU = 0;//进入锁存
delay(5); //延时5ms
}
//定时器0初始化,定时50ms
void timer0Init()
{
TR0 = 1; //启动定时器0
TMOD = 0x01;//启动定时器0的工作模式1:16位定时
TH0 = (65535 - 46082) / 256; //取65535-46082的高八位
TL0 = (65535 - 46082) % 256;//取65535-46082的低八位
}
void main()
{
uchar mSec, Sec;//毫秒和秒的存储变量
timer0Init();//定时器0初始化
while(1)
{
if(TF0 == 1)//定时溢出时已过50ms
{
TF0 = 0;//软件清零溢出标志位
TH0 = 0x4b;
TL0 = 0xfd;//重新定时50ms
mSec++;//已过了50ms
if(mSec == 20)//如果已经过了20个50ms 也就是1s
{
mSec = 0;//mSec清零
Sec++;//秒就加1
}
if(Sec > 10)
Sec = 0;//秒就清零
}
display(Sec);
}
}
实物展示: