单片机原理(余锡存)第六章答案.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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 int sbit 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)

yurixiang1314 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档