2021-05-15
作者:互联网
目录
0x00 前言
- 抄袭可以得到公之于众的结果,理解过程则可销毁最后的证据。 --涂寐
0x01 定时器/计数器的控制
一、定时器/计数器的方式控制寄存器(TMOD)
位序 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
位符号 | GATE | C/~T | M1 | M0 | GATE | C/~T | M1 | M0 |
| 高4位(T1) | 低4位(T0) | ||||||
例:TMOD=0x05(0000 0101),则T1=0,T0=5。在T0中,GATE=0,C/~T=0,M1M2=01 |
位符号 | 取值 | 功能 |
GATE | 0 | 仅受TCON寄存器控制 |
1 | 还受外部中断引脚(INT0/INT1)上电平影响 | |
C/~T | 0 | 定时器模式 |
1 | 计数器模式 | |
M1M0 | 00 | 方式0,13位定时器/计数器。高8位,低5位。2^13=最高计数值8192 |
01 | 方式1,16位定时器/计数器。高8位,低8位。2^16=最高计数值65536 | |
10 | 方式2,带初值自动重装的8位定时器/计数器 | |
11 | 方式3,仅T0,且T0分成两个独立的8位寄存器,此时T1停止工作 | |
注: 1、TMOD寄存器:特殊功能寄存器,用于控制定时器/计数器T0、T1的工作方式 2、TMOD寄存器的字节地址为89H,只能进行字节操作,即仅能对TMOD寄存器整体赋予初值 |
二、定时器/计数器控制寄存器(TCON)
位地址 | 8F | 8E | 8D | 8C | 8B | 8A | 89 | 88 |
位符号 | TF1 | TR1 | TF0 | TR0 |
|
|
|
|
位符号 | 取值 | 功能 |
TF1/TF0 | 0 | 定时器/计数器的溢出标志位。溢出时TF*=1,则定时器/计数器中断请求 注:若查询该标志位,当检测到TF*=1时,需要软件清0(TF*=0) 例:while(TF0==0); TF=0; //不断查询TF0是否为1,来判断时间的到达 |
1 | ||
TR1/TR0 | 0 | 定时器/计数器的启动/停止位 启动:TR*=1,若GATE=0,则直接启动;反之(GATE=1),则需要INT*为高电平才能启动 |
1 |
0x02 题目要求与解题
一、题目
- 选用定时/计数器T0,工作方式1,按键按三次加1。
- 选用定时/计数器T1,工作方式2,按键按五次加1。
- 仿真原理图:
二、解题
1、步骤理解
2、代码与成品图
1.选用定时/计数器T0,工作方式1,按键按三次加1
#include <reg51.h>
//要求:选用定时/计数器T0(只用寄存器TMOD的低四位),工作方式1(16位定时器),按键按三次加1
unsigned char num[10]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09}; //共阳极
unsigned char s[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极
unsigned char count=0;
void main(){
TMOD=0x05; //0000 0101
TH0=(65536-3)/256; //按三下,即减去3,再右移八位作为最高位
TL0=(65536-3)%256;
TR0=1;
P0=num[count];
P2=s[count];
while(1){
while(TF0==0);
TF0=0;
count++;
P0=num[count%10];
P2=s[count%10];
TH0=(65536-3)/256;
TL0=(65536-3)%256;
}
}
2.选用定时/计数器T1,工作方式2,按键按五次加1
#include <reg51.h>
//要求:选用定时/计数器T1(只用寄存器TMOD的高四位),工作方式2(8位定时器,初值自动重装载),按键按五次加1
unsigned char num[10]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09}; //共阳极
unsigned char s[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极
unsigned char count=0;
void main(){
TMOD=0x60; //0110 0000
TH1=256-5; //按五下,即减去5得初值
TL1=256-5;
TR1=1;
P0=num[count];
P2=s[count];
while(1){
while(TF1==0);
TF1=0;
count++;
P0=num[count%10];
P2=s[count%10];
//TH1=256-5;
//TL1=256-5;
}
}
0x03 反思与总结
- 有些IO口的驱动电流不够大,建议接共阳极的数码管
- 宁愿线路弯曲,也不建议旋转数码管,避免显示结果与预期相反(仅因旋转)
- 亲手敲击相较于复制粘贴,是截然不同的,它能产生叩击记忆之门的声响。 --涂寐
标签:count,定时器,15,05,T0,计数器,TMOD,2021,寄存器 来源: https://blog.csdn.net/weixin_46318141/article/details/116858984