单片机第7章答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图
LED 数码管显示的秒表原理电路及仿真
参考程序如下: #include<reg51.h> //包含 51 单片机寄存器定义的头文件 unsigned char code discode1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //数码管显示 0~9 的段码表, 带小数点 unsigned char code discode2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管显示 0~9 的段码表,不带小数点 unsigned char timer=0; //记录中断次数 unsigned char second; //储存秒 unsigned char key=0; //记录按键次数 main() //主函数 { TMOD=0x01; //定时器 T0 方式 1 定时 ET0=1; //允许定时器 T0 中断 EA=1; //总中断允许 second=0; //设初始值 P0=discode1[second/10]; //显示秒位 0 P2=discode2[second%10]; //显示 0.1s 位 0 while(1) //循环 { if((P3&0x80)==0x00) //当按键被按下时 { key++; //按键次数加 1 switch(key) //根据按键次数分三种情况 { case 1: //第一次按下为启动秒表计时 TH0=0xee; //向 TH0 写入初值的高 8 位 TL0=0x00; //向 TL0 写入初值的低 8 位,定时 5ms TR0=1; //启动定时器 T0 break; case 2: //按下两次暂定秒表 TR0=0; //关闭定时器 T0 break;
if(keyvalue0) //如果有按键按下,继续检测 { if(keyvalue0==1) //按键 1,走时停止,开始判断更改值,直到按键 4 按下 { while(~key0) ; //防抖,直到按键松开时才进行下一步的操作 TR0=0; do{ keyvalue1=keyscan();//检测按键按下 if(keyvalue1==2)//如果按键 2 按下,改变时间 { while(~key1);//防抖 if(hour<23)//如果小时数小于 23 则加 1 { hour++; } else//如果小时数为 23,置位为 0 { hour=0; } } else if(keyvalue1==3)//如果按键 3 按下,改变分钟 { while(~key2);//防抖 if(minute<59)//如果分钟数小于 59 则加 1 { minute++; } else//如果分钟数为 59,置位为 0 { minute=0; } clock_write(); } }while(keyvalue1!=4);//重复对时间的修改直到按键 4 按下 while(~key3==0);//防抖 TR0=1;//调整时间后重新开始走时 } } } 必须注意,程序设计中,小时、分钟、秒变量 hour、minute、second 必须置为全局变量,才能如上述函 数一样在各处函数中直接进行修改,如为局部变量,则上述形式的直接修改无效。 1602 液晶显示模块以及基于单片机定时器的时钟实现见教材的介绍,不再赘述。 LCD 时钟原理电路图如下图。程序执行后工作指示灯 D1 闪动一下,表示时钟开始运行。按下按键 K1 后,D1 停止闪烁,即时钟停止走时,时钟停在当前时刻;按下按键 K2 和 K3 后,可改变小时和分钟;按下 按键 K4 后,时钟从修改后的时间重新开始运行。 为加强 AT89C51 的驱动能力,原理图中加入作为上拉电阻的排电阻(CTRESPACK-7) ,即图中的 RP1。 //控制走时的中断停止
图 控制蜂鸣器发出 1kHz 的音频信号 先计算 T1 初值,系统时钟为 12MHz,则方波的周期为 1µs。1kHz 的音频信号周期为 1ms,要定时计数 的脉冲数为 a。则 T1 的初值:
TH1=(65 536 −a)/256; TL1=(65 536 −a) %256 参考程序如下: #include<reg51.h> //包含头文件 sbit sound=P1^7; //将 sound 位定义为 P1.7 引脚 #define f1(a) (65536-a)/256 //定义装入定时器高 8 位的时间常数 #define f2(a) (65536-a)%256 //定义装入定时器低 8 位的时间常数 unsigned int i = 500; unsigned int j = 0; void main(void) { EA=1; //开总中断. ET1=1; //允许定时器 T1 中断 . TMOD=0x10; //TMOD=0001 000B,使用 T1 的方式 1 定时 TH1=f1(i); //给定时器 T1 高 8 位赋初值. TL1=f2(i); //给定时器 T1 低 8 位赋初值. TR1=1; //启动定时器 T1 while(1) { //循环等待 i=460; while(j<2000) ; j=0; i=360; while(j <2000) ; j=0; } } void T1(void) interrupt 3 using 0 { TR1= 0; sound=~sound; TH1=f1(i); TL1=f2(i); j++; TR1=1; } //定时器 T1 中断函数 //关闭定时器 T1 //P1.7 输出求反 //定时器 T1 的高 8 位重新赋初值. //定时器 T1 的低 8 位重新赋初值. //启动定时器 T1
case 3: //按下 3 次秒表清 0 key=0; //按键次数清 0 second=0; //秒表清 0 P0=discode1[second/10]; //显示秒位 0 P2=discode2[second%10]; //显示 0.1s 位 0 break; } while((P3&0x80)==0x00); } } } void int_T0() interrupt 1 using 0 //定时器 T0 中断函数 { TR0=0; //停止计时,执行以下操作(会带来计时误差) TH0=0xee; //向 TH0 写入初值的高 8 位 TL0=0x00; //向 TL0 写入初值的低 8 位,定时 5ms timer++; //记录中断次数 if (timer==20) //中断 20 次,共计时 20*5ms=100ms=0.1s { timer=0; //中断次数清 0 second++; //加 0.1s P0=discode1[second/10]; //根据计时时间,即时显示秒位 P2=discode2[second%10]; //根据计时时间,即时显示 0.1s 位 } if(second==99) //当计时到 9.9s 时 { TR0=0; //停止计时 second=0; //秒数清 0 key=2; //按键数置 2,当再次按下按键时,key++,即 key=3,秒表清 0 复原 } else //计时不到 9.9s 时 { TR0=1; //启动定时器继续计时 } } 8. Proteus 虚拟仿真 制作一个采用 LCD1602 显示的电子钟,在 LCD 上显示当前的时间。显示格式为“时时:分分:秒秒”。 设有 4 个功能键 k1~k4,功能如下: (1)k1—进入时间修改。 (2)k2—修改小时,按一下 k2,当前小时增 1。 (3)k3—修改分钟,按一下 k3,当前分钟增 1。 (4)k4—确认修改完成,电子钟按修改后的时间运行显示。 答:本题难点在于处理功能键 K1~K4 的输入,由于每个功能键都具有相应的一种或多种功能,因此程 序中需要大量使用 do{}while 或 while{}循环结构,以检测是否有按键按下的具体功能。按键检测函数如下: void time_change() { unsigned char keyvalue0=0,keyvalue1=0; keyvalue0=keyscan(); //检测是否有按键按下 //如果按键时间过长在此循环
第7章
思考题及习题 7 1.如果采用的晶振的频率为 24MHz,定时器/计数器工作在方式 0、1、2 下,其最大定时时间各为多少? 答:晶振的频率为 24MHz, 机器周期为 0.5µs。 方式 0 最大定时时间=0.5µs×213=0.5µs×8192=4096µs 方式 1 最大定时时间=0.5µs×216=0.5µs×65536=327686µs 方式 2 最大定时时间=0.5µs×28=0.5µs×256=128µs 2.定时器/计数器用作计数器模式时,对外界计数频率有何限制? 答:外部输入的计数脉冲的最高频率为系统振荡器频率的 1/24。 3.定时器/计数器的工作方式 2 有什么特点?适用于哪些应用场合? 答:方式 2 为初值自动装入的 8 位定时器/计数器,克服了在循环定时或循环计数应用时就存在用指令反 复装入计数初值影响定时精度的问题。适用于精确定时,比如波特率的产生。 4.THx 与 TLx(x = 0,1)是普通寄存器还是计数器?其内容可以随时用指令更改吗?更改后的新值是 立即刷新还是等当前计数器计满后才能刷新? 答:THx 与 TLx(x = 0,1)是计数器,其内容可以随时用指令更改,但是更改后的新值要等当前计数器 计满后才能刷新。答:THX 与 TLX(X=0,1)是由特殊功能寄存器构成的计数器,其内容可以随时用指令更改, 更改后的新值是立即刷新。但在读 THX、TLX 的值时,应该先读 THX 值,后读 TLX,再读 THX。若两次读 得 THX 相同,则可确定读得的内容正确。若前后两次读得的 THX 有变化,再重复上述过程。 5.Proteus 虚拟仿真 使用定时器 T0,采用方式 2 定时,在 P1.0 脚输出周期为 400µs,占空比为 4:1 的矩形脉冲,要求在 P1.0 脚接有虚拟示波器,观察 P1.0 脚输出的矩形脉冲波形。 答:略 6.Proteus 虚拟仿真 利用定时器 T1 的中断来使 P1.7 控制蜂鸣器发出 1kHz 的音频信号,假设系统时钟频率为 12MHz。 答:利用定时器 T1 的中断控制 P1.7 引脚输出频率为 1kHz 的方波音频信号,驱动蜂鸣器发声。系统时钟 为 12MHz。方波音频信号的周期为 1ms,因此 T1 的定时中断时间为 0.5 ms,进入中断服务程序后,对 P1.7 求反。电路如图所示。
图Leabharlann LCD 电子钟电路原理电路图与仿真
一、填空题 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. MCS-51 单片机中有 2 个 16 位的定时器/计数器。 定时/计数器有( 4 )种工作方式,方式 2 的是一个 8 位自动重装初值 的定时/计数器。 定时器/计数器 T0 可以工作于方式 0、1、2、3 。 方式 0 为 13 位定时器/计数器。 若系统晶振频率为 12MHz,则 T0 工作于定时方式 1 时最多可以定时 65536 µs。 若系统晶振频率为 6MHz,则定时器可以实现的最小定时时间为 2 µs。 欲对 300 个外部事件计数,可以选用定时器/计数器 T1 的方式 0 或方式 1 。 TMOD 中的 M1M0= 11 时,定时器工作于方式 3 。 MCS-51 单片机工作于定时状态时,计数脉冲来自 单片机内部的机器周期 。 MCS-51 单片机工作于计数状态时,计数脉冲来自 单片机外部事件 。 当 GATE=0 时, 则当软件控制位 TR0=1 时 启动 T0 开始工作。 MCS-51 单片机有两个定时器/计数器,即定时器/计数器 0 和 1,简称为 T0 和 T1 。 T0 和 T1 都具有 定时 和 计数 的功能,可以通过特殊功能寄存器来选择。 寄存器 TMOD 的 C/ T 位又称为 工作模式选择位 ,可以选择定时功能或者计数功能。 中断控制寄存器 TCON 包含三个部分, TF1 和 TR1 位用于控制 T1, TF0 和 TR0 位用于控制 T0,其余的 4 位为 定时中断控制位 。 定时/记数器的工作方式由寄存器 TMOD 决定,中断请求标志由寄存器 TCON 控制。 外部中断 0 的中断入口地址为 0003H ,定时/记数器 T1 的中断入口地址为 001BH 。 定时/计数器 T0 工作在方式 2 的定时状态, 已知晶振周期为 12MHZ, 定时时间为 250us, 计数初值为 6 , 如果定时时间为 256us,则计数初值为 0 当 AT89S51 单片机的定时/计数器设置为计数方式时,外部事件的最高计数频率为振荡频率的 1/24 。 设 MCS-51 单片机晶振频率为 12MHz,定时器作计数器使用时,其最高的输入计数频率应为_0.5MHz 若单片机的时钟频率为 8MHz,则时钟周期为 ,机器周期 TM= 。 0.125us 1. 5us 若要利用定时器 T1 产生串行通信的波特率,则 T1 工作在方式 2 下。
7. Proteus 虚拟仿真 最小计时单位为“百毫秒”, 计时范围 0.1~ 制作一个 LED 数码管显示的秒表, 用 2 位数码管显示计时时间, 9.9s。当第 1 次按下并松开计时功能键时,秒表开始计时并显示时间;第 2 次按下并松开计时功能键时,停止 计时,计算两次按下计时功能键的时间,并在数码管上显示;第 3 次按下计时功能键,秒表清 0,再按 1 次 计时功能键,重新开始计时。如果计时到 9.9s 时,将停止计时,按下计时功能键,秒表清零,再按下重新开 始计时。 答:本秒表应用了 AT89C51 的定时器工作模式,计时范围 0.1~9.9s。此外还涉及如何编写控制 LED 数 码管显示的程序。 LED 数码管显示的秒表原理电路如图所示。