解:
#include %unsigned char i=0x01; void main() {
EX1=1; EA=1; for(;;) {
P1=i; } }
void int1() interrupt 2 {
if(i<0x80) i=i*2; else i=0x01; }
习题6
2.MCS-51定时/计数器的定时功能和计数功能有什么不同?分别应用在什么场合下? 答:
定时器主要完成系统运行过程中的定时功能,而计数器主要用于对外部事件的计数。此外,定时器/计数器还可作为串行通信中波特率发生器。
3.简述MCS-51单片机定时/计数器四种工作方式的特点、如何选择和设定? 答:四种工作方式的选择是通过设定工作方式寄存器TMOD中的M1M0两位来完成的。 1) 当MlM0=00时,定时/计数器工作于方式0,构成一个13位定时器/计数器。 2) 当M1M0=01时,定时/计数器工作于方式1,构成一个16位定时器/计数器。方
式1与方式0的区别在于方式0是13位计数器
3) 当M1M0=10时,定时/计数器工作于方式2,在方式2情况下,定时/计数器为
8位,能自动恢复定时/计数器初值。在方式0、方式1时,定时/计数器的初值不能自动恢复,计满后若要恢复原来的初值.须在程序指令中重新给TH0、TL0赋值,这不仅导致编程麻烦,而且影响定时时间精度。但方式2时与方式0、方式1不同,方式2具有初值自动装入功能。
4) 当M1M2=11时,定时/计数器处于工作方式3,但方式3 仅适用于T0,T1无方式
3。方式3时,定时器T0被分解成两个独立的8位计数器TL0和TH0。
11
5.定时/计数器初始化包括哪些步骤? 答:初始化步骤如下:
(1) 根据设计要求先给工作方式寄存器TMOD送一个方式控制字,以设定定时/计数器相应的工作方式。
(2) 根据实际需要给定时/计数器选送定时器初值或计数器初值,以确定需要定时的时间和需要计数的初值。
(3) 根据需要给中断允许寄存器IE选送中断控制字,并给中断优先级寄存器IP选送中断优先级字,以开放相应中断并设定中断优先级。
(4) 给控制寄存器TCON送命令字,以便启动或禁止定时器/计数器的运行。
6.已知单片机时钟频率fosc=12MHz,当要求定时时间为2ms或5ms,定时器分别工作在方式0、方式1和方式2时,定时器计数初值各是多少?
解:因为单片机时钟频率fosc=12MHz,所以机器周期Tcy=12/fosc=1us,根据初值公式
Count=2n-Td/Tcy 得
1)Td=2ms=2000us时:
方式0时 Count=213-2000us/1us=8192-2000=6192
方式1时 Count=216-2000us/1us=65536-2000=63536=F830H,即TH0=F8H,TL0=30H TH0=-2000/256;TL0=-2000%6; 方式2时 ,单次溢出最长只能延时256us,因此可设定每次溢出延时200us,累计10次溢出即可得2ms,因此设定初值可设置为
Count=28-200us/1us=256-200=56=38H,即TH0=38H,TL0=38H 2)Td=5ms=5000us时:
方式0时 Count=213-5000us/1us=8192-5000=3192
方式1时 Count=216-5000us/1us=65536-5000=60536=EC78H,即TH0=ECH,TL0=78H TH0=-5000/256;TL0=-5000%6; 方式2时 ,单次溢出最长只能延时256us,因此可设定每次溢出延时200us,累计25次溢出即可得5ms,因此设定初值可设置为
Count=28-200us/1us=256-200=56=38H,即TH0=38H,TL0=38H
7.已知MCS-51单片机的fosc=6MHz,请利用中断技术和T0,从P1.0端输出高电平宽度为50?s、低电平宽度为200?s的矩形波。
解:
设定时长度为Td=50us,高电平延时1个Td,低电平延时4个Td 延时时间较短,可采用方式2,则初值计算为
Count=28-50us/2us=256-25=231=E7H T0工作于方式2,有TOMD.3=0 ,TMOD.2=0,TMOD.1=1,TOMD.0=0;
T1未使用,因此(TMOD)=02H #include
unsigned char Td1=1, Td4=4; void main(void){
12
TMOD=0x02; TL0=0xe7; TH0=0xe7; ET0=1; EA=1; TR0=1 ;
rect_wave=1;
for(;;) ; }
void int0 () interrupt 1 { Td1--;
Td4--; if(Td1==0) {
rect_wave=0; Td4=4; }
if(Td4==0) {
rect_wave=1; Td1=1;
} }
8.已知MCS-51单片机的fosc=6MHz,用Tl定时。试编程由P1.0和P1.1引脚分别输出周期为2ms和500?s的方波。
解:
周期为2ms的方波延时时间长度为1ms即1000us 周期为500us的方波延时时间长度为250us
设定时长度为Td=250us,延时时间较短,可采用方式2,则初值计算为 Count=28-250us/2us=256-125=131=83H P1.0需4个延时长度即4*250us=1000us才切换电平
P1.1只需要1个延时长度就要切换电平 T1工作于方式2,有TOMD.7=0 ,TMOD.6=0,TMOD.5=1,TOMD.4=0; T1未使用,因此(TMOD)=20H
#include
unsigned char Td4=4; void main(void){ TMOD=0x20; TL0=0x83; TH0=0x83; ET1=1; EA=1; TR1=1 ;
13
for(;;) ; }
void int0 () interrupt 3 { Td4--;
P11=!P11; if(Td4==0) {
P10=!P10; Td4=4; } }
11.设计一个8灯闪烁的控制电路,系统晶振为12MHz,编程实现8灯轮流闪烁其个每盏灯点亮时间为2s。
/************************************** 采用定时计数器T0 工作于方式1
1、因此:TMOD Gate C/T M1 M0 Gate C/T M1 M0 0 0 0 0 0 0 0 1 TMOD=0x01; 2、初值计算
周期为4s,则延时时间长度需2s 因为工作在方式1下,且机器周期为1us,最长延时时间长度为65536us,即65.536ms 因此我们可以让定时计数器每次延时50ms,并且让其溢出40次,则延时时间长度Td=50ms*40=2000ms=2s
因此初值为Count=2^16-50ms/1us=65536-50000us/1us=15536=0x3cb0 ***************************************/ #include
TMOD=0x01; TH0=0x3c;
TL0=0xb0; //TH1=-50000/256; //TL1=-50000%6; TR0=1; EA=1;
ET0=1; // 1000 1000 0x88 for(;;); }
void timer0() interrupt 1 {
TH0=0x3c;
TL0=0xb0; //TH1=-50000/256; //TL1=-50000%6;
14
i--; if(i==0) { i=40;
P1=_crol_(0x01,j)
j++;
if(j==8) j=0; } }
15