常见元件符号
定时器三大寄存器:
- 存储 寄存器
- 控制 寄存器
- 模式 寄存器
后缀是0,代表是定时器 0;后缀是1,代表是定时器1
SFR代表特殊功能寄存器,TH0 存储高8位 TL0存储低8位,TL0由0 【0x00】开始自动加1至255 【0xff】 时,在16位中,如再加1,则溢出,产生进位,使TH0变成0x01,自身变成0x00
【即TH0 存储高8位 TL0存储低8位】
硬件置1: 单片机自动置1
软件xx: 由程序xx
TR0 定时器0运行控制位,给1/0,让计数器运行或停止
”INT0“ ———— 以前常用来测量 脉冲宽度
C/T 定时器/计数器选择位 ———— 计数器不常用,直接给0选择 定时器功能即可
重点要掌握的是 M1 / M0 工作模式
第2工作模式:
TL0递增至 255时,再加一就溢出,溢出后由TH0给TL0置数为0x55,然后TL0从0x55继续递增
OSC:时钟源 —— 晶振
d : 分频值 一个机器周期 = 12个时钟周期 ——> d = 12
Tn 是计数器功能,不看
开关打到上方就是 定时器 ,打到Tn 就是计数器
最后的TFn 是 16位定时器的 溢出【可参见 控制寄存器】
示例程序: —————— 利用计时器 精确延时 LED的亮灭
(1)确定延时时间,设置TH0 TL0的初值
x * 一个机器周期的时间 = 0.02 s ————> ,x是多少个机器周期
11059200是晶振周期
T0 是 TH0 TL0的初值
65536 = 2^16 ,即溢出值
即 初值 + 延时时间对应的机器周期数 = 溢出值 ————> 从而通过: 达到时间,就发生溢出 来 “定时” ————> TF0 = 1,溢出一次,就是20ms
(2)视频程序如下:
#includesbit LED = P0^0; sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; void main(){ unsigned char cnt = 0; ENLED = 0; ADDR3 = 1; ADDR2 = 1; ADDR1= 1; ADDR0 = 0; TMOD = 0x01;//配置工作模式 TH0 = 0xB8;//设置初值 TL0 = 0x00; TR0 = 1;//启动定时器 while(1){ if(TF0 == 1){ //判断溢出位 TF0 = 0; TH0 = 0xB8;//溢出后,变为0,重新赋值 TL0 = 0x00; cnt++;//溢出一次,20ms,50次,就是1s if(cnt >= 50){ cnt = 0; LED = ~LED; } } } }
dp 是小数点
视频示例程序: 数码管显示1
#includesbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; void main(){ ENLED = 0; ADDR3 = 1; ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = 0xF9; while(1); }
【视频所用板子 为 共阳极 数码管】
数码管真值表
此节 是 静态显示,下节是 动态显示
写错了,,,,是“ 节省内存空间”
视频示例程序 —— 静态秒表程序
#includesbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; unsigned char code LedChar[] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E }; void main(){ unsigned char cnt = 0; unsigned char sec = 0; ENLED = 0; ADDR3 = 1; ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; TMOD = 0x01; TH0 = 0xB8; TL0 = 0x00; TR0 = 1; while(1){ if(TF0 == 1){ TF0 = 0; TH0 = 0xB8; TL0 = 0x00; cnt++; if(cnt >= 50){ cnt = 0; P0 = LedChar[sec]; sec++; if(sec >= 16){ sec = 0; } } } } }