- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
余锡存 习题与思考题参考答案
1、8051单片机内设几个可编程的定时/计数器?它们有几种工作方式?如何选择和设定?作为定时器或计数器,它们的波特率各为多少?
8051单片机内设有两个钧为16位的可编程的定时/计数器,共有4种工作方式,即:方式0—13位定时/计数器、方式1—16位定时/计数器、方式2—自动重载初值得8位定时/计数器和方式3—T0为两个独立的8位定时/计数器,在方式3下,T1停止工作。
8051定时/计数器的工作方式由控制寄存器TMOD的M0、M1两位设置,因为TMOD的地址为89H,所以M0、M1不能位寻址,只能通过字节操作的方式对M0、M1的值进行设定。
当用定时/计数器作为波特率发生器时,根据串口的工作模式,有三种情形:
方式0的波特率为主振频率fosc的十二分之一;
方式2的波特率依照下式确定:,其中,SMOD为PCON寄存器中的波特率倍增位。
方式1和方式3的波特率计算依照下列关系求的TH1即可:
2、定时/计数器作定时器用时,其定时时间有哪些因素有关?做计数器用时,对外部计数频率有何限制?
8051的定时/计数器工作在定时器状态时,输入的时钟脉冲是由晶体振荡器的输出经12分频得到的,故其频率为晶振频率的十二分之一。所以,定时输出是晶振频率处以12再除以计数值。
8051的定时/计数器工作在计数器状态时,需要两个机器周期才能识别一个从“1”到“0”的跳变,故最高计数频率不大于晶振频率的二十四分之一。
3、8051单片机的晶振频率为6MHz,若只使用T0产生500微秒定时,可以选择哪几种定时方式?分别写出定时器的方式控制字和计数器初值。
选择方式0或方式1,计数器初值为8192-250,或65536-250。.
此处给一个C语言写的程序段,定时信号由P1.0输出:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TO_INTERRUPT
MAIN:SETB EA
MOV TH0, (65536-250)/256
MOV TL0, (65536-250)%256
SETB TR0
SETB ET0
SJMP $
T0_INTERRUPT:
CLR TR0
MOV TH0, (65536-125)/256
MOV TL0, (65536-125)%256
P1^0 = ~P1^0
SETB TR0
RETI
4、某8051系统晶振频率为6MHz,先欲从P1.7引脚输出一个连续5Hz的方波信号,请编写程序。
5Hz的方波周期为200毫秒,高低电平各持续100毫秒,若晶振频率为6MHz,则机器周期为2微秒,故其计数值应为:
N=100ms/2μs=50000
采用方式1进行计数,则 X=M-N=65536-50000=15536H=0C350H
程序编写如下:
MOV TMOD, #05H; 设置T0工作方式,定时,方式1
MOV TH0,#0C3H; 写入计数器初值
MOV TL0,#050H;
SETB TR0; 启动T0
LOOP: JBC TF0,$; 查询定时器溢出标志
MOV TH0,#0C3H;
MOV TL0,#050H
CPL P1.7
SJMP LOOP;
END
也可以用C语言编写:
用定时/计数器T0从P1.7输出周期为5s的方波,晶振频率为6MHz。#include reg52.h#define uchar unsigned char#define uint unsigned intsbit D1=P1^0;uchar a;void init()?????????????? //初始化{??? TMOD=0x01;???????????? //选择定数计数器0的工作方式为16位定时器??? TH0=(65535-50000)%256; //赋初值,定时100ms??? TL0=(65535-50000)/256;??? EA=1;????????????????? //中断控制允许??? ET0=1;??? a=0;??? TR0=1;???????????????? //启动定时器0}void time0() interrupt 1 //定时器0中断函数{
??? TH0=(65535-50000)%256; //赋初值,定时100ms??? TL0=(65535-50000)/256;??? a++;??? TR0=1;??? }void main(){??? init();??? while(1)??? {?????
文档评论(0)