b=tab[j]; EX0=1;}
void delay(void){ int x;
for(x=0;x<1000;x++); }
第7章 定时计数器
7.1 8XX51单片机内部设有几个定时/计数器?它们是南哪些专用寄存器组成的? 7.2 8XX51单片机的定时/计数器有哪几种工作方式?各有什么特点?
7.3 定时/计数器用做定时时,其定时时间与哪些因素有关?用做计数时,对外界计数频率有何限制? 7.1~7.3参7.1节
7.4 设单片机的fosc=6MHz,定时器处于不同工作方式时,最大定时范围分别是多少? 7.4 方式0:16.38ms,方式1:131ms,方式2:512us
7.5 利用8XX51的T0计数,每计10个脉冲,P1.0变反一次,用查询和中断两种方式编程。
7.5 使用方式2,计数初值c=100H—OAH=F6H 查询方式: 0RG 0000H MOV TMOD,#06H MOV THO,#0F6H MOV TL0,#0F6H SETB TR0
ABC:JNB TF0,$ CLR TF0 CPL P1.0 SJMP ABC 中断方式: ORG 0000H AJMP MAIN ORG OOOOBH CPL P1.0 RETI
MAIN:MOV TMOD,#06H MOV TH0,#OF6H SETB EA SETB ET0 SETB TR0
SJMP $ ;等待中断 C语言程序查询方式: #include
25
TMOD=Ox06;THO=-10;TLO=-10; TRO=1:{ while(1)
dO{}while(TF0==0) TF0=0;p10=~p10; }}
中断方式:#include
EA=1;ET0=1;TMOD=0x06; TH0=0xf6;TL0=0xf6;TR0=1; while(1);}/*等待中断*/
7.6 在P1.0引脚接一驱动放大电路驱动扬声器,利用T1产生lOOOHz的音频信号从扬声器输出。 7.6 1000Hz的周期为1ms,即要求每500us P1.0变反一次,使用T1方式1,MC=12/fosc=1us,C=216-500us/1us=FE0CH,除TMOD=10H,TH0=FEH,Tl0=0CH外,程序与7.5题相同,注意每次要重置TH0和TL0。
7.7 已知8XX51单片机系统时钟频率为6MHz,利用定时器T0使P1.2每隔350us,输出一个50us脉宽的正脉冲。
7.7 fosc=6MHz,MC=2us,方式2的最大定时为512us,合乎题目的要求。50us时,计数初值为C1=256-25=E7H,350us时,计数初值为C2=256-175=51H 汇编语言程序 ORG 0000H MOV TMOD,#02H
NEXT:MOV TH0,#51H MOV TL0,#51H CLR P1.2 SETB TR0
AB1:JBC TF0,EXT
SJMP AB1 EXT:SETB P1.2 MOV TH0,#0E7H
MOV TL0,#0E7H AB2:JBC TF0,NEXT SJMP AB2 C语言程序
#include
void timet(unsigned char t); sbit p1_2=P1^2 main(){for(;;)
p1_2=O;timer(7); p1_2=1;timer(1); }
26
void timer(unslgned char t) {unsigned char i;
for(i=0;i TH0=-25/256;TL0=-25%6; TR0=1: While(TF0!=1); TR0=0: }} 上述的计数初值没有考虑指令的执行时间。因此误差较大,查每条指令的机器周期,扣除这些时间.算得 C—E3H,这样误差较小。 7.8 在8XX51单片机中,已知时钟频率为12MHz,编程使P1.0和P1.1分别输出周期为2ms和50us的方波。 7.8 P1.0输出2ms脉冲,P1.1输出50us脉冲。 汇编语言程序 ORG 0000H MOV TMOD,#02H MOV TH0,#06H MOV TL0,#06H SETB TR0 MOV R0,#04H NE: JNB TF0,$ CLR TF0 CPL P1.1 DJNZ R0,NE CPL P1.O AJMP NE C语言程序 #include TMOD=0x02;TH0=06;TL0=06:TR0=1; while(1){ for(i=0;i<4:i++){ do{}while(!TF0); P11=~P11: } P10=~P10: }} 7.9 设系统时钟频率为6MHz,试用定时器T0。作为外部计数器,编程实现每计到1000个脉冲后,使T1定时2ms,然后T0又开始计数,这样反复循环。 7.9 C语言程序 T0计数1000个脉冲,采用方式1;T1定时2ms,fosc=6MHz,C=-2ms/2us=-1000 27 include counter(){ TH0=-1000/256; TLO=-1000%6; TR0=1;TR1=0; while(TF0!=1); TF0=0; } timer(){ TH1=-1000/256;TL1=-1000%6;TR1=1;TR0=0; while(TF1!=0); TF1=0; } main() TMOD=0x15; for(;;){ counter(): timer(): 7.10 利用8XX51单片机定时器T0测量某正单脉冲宽度,已知此脉冲宽度小于10ms,主机频率为12MHz。编程测量脉宽,并把结果转换为BCD码,顺序存放在以片内50H单元为首地址的内存单元中(50H单元存个位)。 7.10 C语言程序 #lnclue unsingcd char *P,i; int a; P=0x50; TMOD=0x09; TL0=0;TH0=0; while(P3_2==1);/*等待INT0变低*/ TR0=1; while(P3_2==0);/*等待-INT0变高*/ while(P3_2==1);/*等待-INT0变低*/ TR0=0; i=TH0; a=i*256+TL0; for(;a!=O;) { /*转换为非压缩IR7D码*/ *P=a; a=a/10; P++; } } 第8章 串行口 28