单片机原理及应用四章3-4
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.3 定时器/计数器编程
2. 定时器相关寄存器
TMOD:字节地址89H
TCON:字节地址88H
4.3 定时器/计数器编程
3. 工作方式:由TMOD决定
M1 M0 0 0 0 1 方式 方式0 方式1 描述 13位计数器,TH高8位,TL低五位为低 16位计数器,TH+TL
1
1
0
1
方式2
方式3
4.3 定时器/计数器编程
计数器的计数初值
在计数器方式下: 13 方式0的满计数值为2 =8192; 方式1的满计数值65536; 方式2的满计数值256; 有如下公式计算: 2L-x=n,x为计数初值、n为脉冲数。
4.3 定时器/计数器编程
6. 例子
设振荡频率为12MHz,用T1产生10kHz定时器 滴答中断。 分析:
机器周期Tc=1us;10KHz的中断,其周期即定时时 间为0.1ms=100us。 可用T1的方式2-8位计数器模式,最大定时时间为 256us,初值为256-100=156。
4.3 定时器/计数器编程
程序如下: #include<reg51.h> static unsigned long overflow_count=0; void timer1(void) interrupt 3 { overflow_count++; } void main(void) { TMOD=(TMOD&0x0F)|0x20; TH1=256-100; TL1=TH1; ET1=1; TR1=1; EA=1; While(1); }
4.4 串行口编程
查询方式程序如下 #include<reg51.h> #define uchar unsigned char sbit P3_3=P3^3; char code tab[]={0x88,0x83,0xc6,0xa1,0xf9,0xa4,0xb0,0x99}; void timer(uchar); main() {uchar I,a=3; SCON=0; for(;;) {P3_3=1; for(i=0;i<4;i++)
定时器的计数初值
若fosc=6MHz,则1个机器周期Tc=2us,则 13 方式0最大定时间隔,2 ×2us=16.384ms; 方式1最大定时间隔,131.072ms; 方式2最大定时间隔,512us; 有如下公式计算: t=Tc×(2L-TC)=12/fosc×(2L-TC),TC为计数初值
}
4.3 定时器/计数器编程
中断方式程序如下:
#include<reg51.h> sbit P1_0=P1^0; void timer0(void) interrupt 1 using 1 { P1_0=!P1_0; TH0=(65536-1000)/256; TL0=(65536-1000)%256; } void main(void) { TMOD=0x01; P1_0=0; TH0=(65536-1000)/256; TL0=(65536-1000)%256; EA=1; ET0=1;wenku.baidu.comTR0=1; do{}while(1); }
4.4 串行口编程
方式2和方式3
11位异步通信。 帧格式: 起
始
D0 D1 D2 D3 D4 D5 D6 D7 D8
停 止
波特率:方式2为 2SMOD×(fosc/64);方式3同方式1 输出时,第9位数据TB8输出后,置位TI 输入时,REN=1,第9位数据接收到后,RI=0时存入RB8, 并且置位RI RI、TI为软件清零
4. 初始化步骤
确定T1的工作方式:编程TMOD 计算T1的初值:装载TH1、TL1 启动T1:TCON的TR1 确定串行口的控制:编程SCON 串行口在中断方式时,须开中断:编程IE
4.4 串行口编程
5. 例子
利用AT89C51的串行口设计4位静态数码管显示器,要求4位显示器上每 隔1s交替显示“ABCD”和“1234”,电路图如下。
main() { TMOD=0x01; TH0=(65536-8333)/256;
TL0=(65536-8333)%256;
EA=1; ET0=1; TR0=1; do{}while(1); }
4.4 串行口编程
UART-Universal Asynchronous Receiver/Transmitter。 发送时数据由TXD送出, 接收时数据由RXD输入。 SCON 结构如右图,有发送及接收 缓冲器。 定时器单元 波特率时钟由T1获得。 接收SBUF 功能:与通用微机的通信、 TX 串行口控制逻辑 单片机间的通信、主从结构 RX 的分布式控制系统机间通信。 发送SBUF
申请中断
4.4 串行口编程
1. 相关SFR
SCON:字节地址98H,可位寻址。
位地址
位功能
9FH
SM0
9EH
SM1
9DH
SM2
9CH
REN
9BH
TB8
9AH
RB8
99H
TI
98H
RI
PCON
D7 与串行口无关 SMOD
4.4 串行口编程
2. 工作方式
四种工作方式,由SCON的SM0、SM1组合确定。
Y
次数=高电平? P1.0=0
N N
次数=周期?
Y
P1.0=1
返回
4.3 定时器/计数器编程
程序如下
#include<reg51.h> #define uchar unsigned char uchar time; uchar period=250; uchar high=50; timer0() interrupt 1 using 1 { TH0=(65536-8333)/256; TL0=(65536-8333)%256; if(++time==high) P1=0; else if(time==period) { time=0; P1=1; } }
4.3 定时器/计数器编程
设fosc=12MHz要求在P1.0输出周期为2ms的方 波。 分析:
周期为2ms的方波,定时间隔为1ms,每次时间到 时,P1.0取反。 机器周期Tc=1us,需计数1ms/1us=1000,可用定 时器0或1的方式0或方式1;设用方式1,初值为 65536-1000。 程序的编写,可以用查询方式实现,查询TF位;也 可用中断方式实现。
4.4 串行口编程
方式1
10位异步通信方式,起始位0+8位数据+停止位1。 帧格式 起 停
始 D0 D1 D2 D3 D4 D5 D6 D7 止
TI=0时,写SBUF可启动发送 REN=1,可接收。 波特率可变:波特率=2SMOD×(T1的溢出率)/32。其中, T1的溢出率为定时时间的倒数。
4.3 定时器/计数器编程
如图,在P1.7端接有一个LED,要求利用 T/C控制,使LED亮1s、灭1s,周而复始。
分析:
定时1s,3种工作方式不行。 采用复合定时。 T0方式1,定时100ms,定时 时间到P1.0反相;T1计数器方式 2,对P1.0输入脉冲计数,满5次, 定时1s到,将P1.7反相。 设晶振6MHz,Tc=2us,则 T1需计数100ms/2us=50000, 初值为65536-50000。
P1.7 LED P1.0 +5V
T1
8051
4.3 定时器/计数器编程
程序如下
#include<reg51.h> sbit P1_0=P1^0; sbit P1_7=P1^7; timer0() interrupt 1 using 1 { P1_0=!P1_0; TH0=(65536-50000)/256; TL0=(65536-50000)%256; } timer1() interrupt 3 using 2 { P1_7=!P1_7; }
自动再装入的8位计数器,TL计数器, TH存初值
T0分为2个8位计数器,T1停止计数
4.3 定时器/计数器编程
4. 编程初始化
确定T/C的工作方式:TMOD 计算T/C的计数初值,并装载到TH和TL T/C中断方式时,开中断:IE 启动T/C:TCON
4.3 定时器/计数器编程
5. 计数初值的计算
INT1 TXD
0
&
0
0
+5V A CLK CLR B 74LS164 A CLK CLR B 74LS164 CLK CLR 74LS164
RXD
...
200*4 AT89C51
...
...
...
LED
LED
...
LED
共阳
+5V
4.4 串行口编程
分析:
方式0,8位同步移位寄存器方式。 TXD输出时钟脉冲,RXD输出数据。不是多机通信,没有接收。 SCON写入控制字为00H。 “ABCD”与“1234”的字形码分别对应4个LED,由74164输出。 定时1s可以由定时器确定,也可由软件定时。 设定时器T0定时,假如fosc=12MHz,则机器周期TC=1us,定时1s需 要1000000次,定时器4种工作方式都不适合。须另想办法。 可以考虑T0定时与软件定时相结合的方式用来定时1s的时间。 串行口方式0,发送8位数据后,TI会置位。程序上,可以采用查询 方式与中断方式。
4.4 串行口编程
{SBUF=tab[a]; a--; while(!TI); TI=0; if(a==255) a=7; } P3_3=0; timer(100); }
main()
{ P1_7=0; P1_0=1; TMOD=0x61; TH0=(65536-50000)/256; TL0=(65536-5000)%256; TH1=256-5; TL1=256-5; IP=0x08;
EA=1;ET0=1;ET1=0;
TR0=1;TR1=1; for(;;){}
}
SM0 SM1
0 0 1 1 0 1 0 1
工作方式
方式0 方式1 方式2 方式3
功能描述
波特率
8位移位寄存器 fosc/12 10位UART 11位UART 11位UART 可变,定时器控制 fosc/64或fosc/32 可变,定时器控制
4.4 串行口编程
方式0
8位移位寄存器方式。串行数据由RXD输入、输出,低位在前, TXD输出移位时钟。波特率fosc/12。 发送以写sbuf开始,8位输出结束时TI置位。 REN=1、RI=0同时满足,接收开始。数据装入SBUF中,结 束时RI置位。 可以用CD4014(74LS165)扩展输入,CD4094(74LS164) 扩展输出。其中,CD4014为并入-串出移位寄存器,CD4094 为串入-并出移位寄存器。 还可以用于两个单片机之间的通信。
4.4 串行口编程
3. 串行口常用波特率
T1产生的波特率
常用bps Fosc(MHz) SMOD TH1初值
19200
9600 4800 2400 1200
11.0592
11.0592 11.0592 11.0592 11.0592
1
0 0 0 0
FDH
FDH FAH F4H E8H
4.4 串行口编程
4.3 定时器/计数器编程
设10MHz晶振,在P1.0脚上输出周期为2.5s,占空 比为20%的脉冲信号。 中断次数加1 分析:
对于10MHz,最大定时时间为 几十ms,取10ms定时,周期2.5s 需250次中断。占空比为20%,高 电平应为50次中断。 T0方式1,需计数次数为 10×1000×10/12=8333 程序流程图如右
4.3 定时器/计数器编程
1. 定时器/计数器的功能
2个16位,分为TH、TL,用来存放计数初值,TH存 高位。 定时:定时的发出脉冲,在发出定时脉冲的同时, 还可以向CPU申请中断。定时的起始时间、终止时 间的控制及时间间隔等均可由程序设定。 计数:对外部的事件计数。当达到程序所规定的计 数常数时,输出一脉冲信号,并可同时向CPU发出 中断请求信号。
4.3 定时器/计数器编程
查询方式程序如下:
#include<reg51.h> sbit P1_0=P1^0; void main(void) { TMOD=0x01; TR0=1; for(;;) { TH0=(65536-1000)/256; TL0=(65536-1000)%256; do{}while(!TF0); } P1_0=!P1_0; TF=0;