更多单片机学习笔记:
单片机学习笔记 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 intsbit 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]; //亮shiDU = 0;//进入锁存delay(5); //延时5ms//第三个数码管P0 = 0xff; //清除断码,让位锁存器哪个都不选WE = 1;//位选锁存打开P0 = 0xfb;//选第三个管WE = 0; //关上位选锁存器,进入锁存DU = 1;//段选锁存打开P0 = table[ge]; //亮geDU = 0;//进入锁存delay(5); //延时5ms
}//定时器0初始化,定时50ms
void timer0Init()
{TR0 = 1; //启动定时器0TMOD = 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;//重新定时50msmSec++;//已过了50msif(mSec == 20)//如果已经过了20个50ms 也就是1s{ mSec = 0;//mSec清零Sec++;//秒就加1 }if(Sec > 10)Sec = 0;//秒就清零}display(Sec);}
}
实物展示: