《单片机应用项目式教程——基于Keil和Proteus第2版思考和练习题答案汇总第1--6章.docx》由会员分享,可在线阅读,更多相关《单片机应用项目式教程——基于Keil和Proteus第2版思考和练习题答案汇总第1--6章.docx(44页珍藏版)》请在课桌文档上搜索。
1、第1章思考和练习解答IJ什麽是单片机?答:参阅教材书Rl。1.2单片机应用的主要领域有哪些?试举出10个以上的应用实例。答:参阅教材书任务Ll1.3 80C51共有几个8位并行I/On?各有什么功能?其中P3口的第二功能是什么?答:参阅教材书P21。1.4 试述80C51存储空间结构,各有什么功能?答:参阅教材书P.21P.22080C51存储空间配置如图2-1所示。(MOVC指令操作域)ROM地址空间ffh雌雄: 寄存器80H (21 个)7FHOoH内部RAM(I28B)(MOV指令操作域)FFFFH外部RAM(64KB)OOOOH (MOVX指令操作域)RAM地址空间图2-180C51存
2、储空间配置.图从组织结构上可以分为3个不同的存储空间,分别是:(D64KB程序存储器(ROM),包括片内ROM和片外ROM;64KB外部数据存储器(称为外RAM);(3)256B(包括特殊功能寄存器)内部数据存储器(称为内RAM)。3个不同的存储空间用不同的指令和控制信号实现读、写功能操作:(1)ROM空间用MOVC指令实现只读功能操作,用PSEN信号选通读外ROMo外RAM空间用MOVX指令实现读写功能操作,用S5信号选通读外RAM,用诉信号选通写外RAMo(3)内RAM(包括特殊功能寄存器)用MoV指令实现读、写功能操作。1.5 80C51内RAM的组成是如何划分的,各有什么功能?答:从广
3、义上讲,80C51内RAM(I28B)和特殊功能寄存器(128B)均属于片内RAM空间,读写指令均用MOV指令。但为加以区别,内RAM通常指OoH7FH的低128B空间80C51内RAM可以分成三个物理空间:工作寄存器区、位寻址区和数据缓冲区。参阅教材书P221.6 简述程序状态字寄存器PSW各位定义名、位编号和功能作用。答:参见教材书P.24。1.7 在计算机中为什么要用二进制数和十六进制数?答:参阅教材书P.34。18在8位计算机中,数的正负号如何表示?答:在计算机中,数的正负在最高位分别用“0”和“1”表示。对于8位有符号数,微型计算机中约定,最高位D7表示正负号,其他7位表示数值,D7
4、=l表示负数,D7=0表示正数。19试在KeilVsion创建一个新项目key.ctrl,设置单片机工作频率bsc=6MHz,需生成可执行HeX文件,输入如下源程序,并添加到目标项目组,存盘。答:参阅教材书任务2.1、任务2.2。1.10 试重新打开题1.9创建项目key_ctrl,编译链接调试,并用全速运行、单步结合过程单步运行和断点运行3种操作方法,观测运行过程和结果(提示:全速运行时,为便于观测,调用延时子函数delayl实参可修改为HoOO0)。答:参阅教材书任务2.3。Ml试在已经画好的图130所示ProteusISIS虚拟电路中,装入题1.9调试后自动生成的HeX文件,并仿真运行,
5、观测运行过程和结果,答:参阅教材书任务3.2、任务3.3。第2章思考和练习解答参阅本书P.34。2.1 C51编程与80C51汇编语言相比,主要有什麽优势?答:C51编程与80C51汇编语言相比,主要的优势是编程相对方便。具体如下:C51软件编程不需过多关注具体的存储单元。用汇编语言编程,几乎每一条指令(除NoP指令)操作都与具体的存储单元有关,80C51单片机的片内存储空间容量有限,编程之初即需安排好片内存储单元的用途,且一般不能重复使用。当一些应用项目较大时,片内存储单元有可能捉襟见肘,稍有不慎就将出错。因此,编程时,不但要注意用哪一条指令正确操作,而且要注意指令在哪一个存储单元操作,编程
6、相对复杂。而C51编程能自动完成变量存储单元的分配和使用,且对函数内局部变量占用的存储单元,仅在调用时临时分配,使用完毕即行释放,大大提高了片内有限存储空间的利用效率。使用者只需专注于软件编程,不需过多关注具体的存储单元及其操作指令。因此,编程相对方便。便于实现各种复杂的运算和程序。C语言有丰富且功能强大的运算符,能以简单的语句方便地实现各种复杂的运算和程序。相比之下,汇编语言要实现较复杂的运算和程序,就比较困难。例如,双字节的乘除法,汇编语言要用许多条指令操作才能完成;而C51只需一条语句便能实现。又例如,循环、查表和散转等程序,C51语句实现起来也相对简单方便。可方便地调用各已有程序模块。
7、已有程序模块包括C51编译器中丰富的库函数、用户自编的常用接口芯片功能函数和以前己开发项目中的功能函数。读者可能会说,汇编程序不也一样可以调用吗?不一样。汇编程序调用时,涉及到模块中具体的存储单元,这些存储单元很可能与主调用程序有重复,会引起冲突而出错。而C51程序函数中的变量一般为局部变量,主函数调用前不占用存储单元,仅在调用时由C51编译器根据空余情况临时分配,使用完毕即行释放,因而一般不会发生冲突而出错。因此,C51程序可方便地调用各已有程序模块,减少重复劳动,大大提高编程效率。(4)编译生成的代码效率比汇编语言低一些;实时时效不如汇编语言快捷;一条C语言指令编译后,会转换成很多机器码,
8、占用单片机片内资源较多。2.2 C51基本数据类型有哪几种?其数据长度为多少?答:参阅教材书基础知识4.1,图232.3 C51标识符命名有何要求?答:在C51程序中,数据、变量和函数等常用标识符表示。实际上,标识符就是一个代号或名字。C51规定:标识符只能由字母、数字和下划线三种字符组成,且须以字母或下划线开头。(2)标识符不能与“关键词”同名。英文字母区分大小写。即标识符中的英文字母大小写不能通用。2.4 怎样理解变量的存储器类型和编译模式?答:存储器类型和编译模式是确定变量存放在那一存储区域,不同的存储区域与访问速度有关。存储器类型是在变量定义时确定,而未定义存储器类型的变量由编译模式默
9、认。存储种类与变量存放在那一存储区域基本无关(除寄存器类变量),与变量值的生存期和作用范围有关。中、小型程序一般可采用默认的存储种类auto。变量的存储种类与变量的存储器类型、编译模式是两个完全不同的概念,不能混淆。2.5 为什么变量要尽量使用无符号字符型格式?答:C51变量的基本数据类型主要有字符型Char、整型int和长整型Iong,又可分别分为有符号Signed和无符号UnSigned。80C51是8位机,本身并不支持有符号运算。若变量使用有符号格式,C51编译器要进行符号位检测并需调用库函数,生成的代码比无符号时长得多,占用的存储空间会变大,程序运行速度会变慢,出错的机会也会增多080
10、C51单片机主要用于实时控制,变量一般为8bit无符号格式,16bit较少,有符号和有小数点的数值计算也很少。因此,在已知变量长度和正整数的情况下,应尽量采用无符号格式:UnSignedChar。2.6 为什么变量要尽量使用局部变量?答:与80C51汇编语言相比,C5I编程的突出优点是能自动完成变量存储单元的分配和使用,对函数内局部变量占用的存储单元,仅在调用时临时分配,使用完毕即行释放,大大提高了片内有限存储空间的利用效率。使用者只需专注于软件编程,不需过多关注具体的存储单元及其操作指令。因此,编程相对方便。使用全局变量的缺点:一是始终占用一个固定的存储单元,降低了内部存储单元的利用率;二是
11、降低了函数的通用性。若函数涉及某一全局变量,该函数移植到其他文件时需同时将全局变量一起移植。否则,若全局变量名与其他文件中的变量同名,就会出现问题。三是过多使用全局变量,降低了程序的清晰度。若程序较大,人们较难清晰地判断程序执行过程中每个瞬间全局变量的变化状况,易出错。因此,应尽量减少全局变量的使用,能不用就尽量不用。2.7 for循环语句括号内3个表达式分别表示什麽含义?能否缺位?答:第一个表达式是循环变量初值,第二个表达式是循环终止条件,第三个表达式是循环变量更新。3个表达式之间必须用分号“;”分隔,允许有一个或多个缺位。2.8 while(1)和for(;)表示什麽含义?答:While(
12、I)和for(;)均表示一个循环条件始终满足的无限循环。若后面有循环体语句,则反复无限执行循环体语句;若后面无循环体语句,则表示程序在原地踏步。2.9 什麽是数组?如何定义和表示?答:数组是一组具有相同类型数据的有序集合。例如:intaj10=10,11,22,33,44,55,66,77,88,99);上式表示:数组名为a,数组内的数据类型为int,元素个数(也称为数组长度,即数组内数据的个数)有10个。10个数组元素分别为:a0=10,al=ll,a2=22,a3=33,a4=44,a5=55,a6=66,a7=77,a8=88,a9=99o需要注意的是,数组定义时,方括号内是数组元素个数
13、;数组元素引用时,方括号内是数组元素的序号。而且,数组元素序号是从0开始编号的。因此,上述数组a10中没有a10这个数组元素,其最后个数组元素是a9。2.10 函数参数传递,值传递与地址传递有什麽不同?答:函数的实参传递给形参,称为值传递。值传递是单向的,即不会影响主调用函数中实参值的变化。指针变量或数组作为实参传递给形参时,是将一个变量的地址传送到另一个函数中去,称为地址传递,其结果具有双向性。若在被调用函数中该地址存储单元中的内容发生了变化,在调用结束后这些变化将被保留下来,即其结果会被返回到主调用函数。2.11 已知双键控3灯电路如图211所示,要求实现:So单独按下,红灯亮,其余灯灭;
14、Sl单独按下,绿灯亮,其余灯灭;S。、Sl均未按下,黄灯亮,其余灯灭;So、Sl均按下,红绿黄灯全亮。试按任务4.1中3种形式编写C51程序,画出ProteusISIS虚拟电路,并仿真调试。解:-5V叩Pl.7.HSO-H=F-5.1KDl AVSM5TK80C5LPl 2红22OaNPl.b2206 -I=F-Pl.0.-M-220* co图双键控3灯电路.(1) if-else语句include sbit sO=P 17;sbit s1=P16;sbit R=P12;sbit G=P11;sbit Y=P10;void main () while(l)头文件包含访问血库函数reg51.h定
15、义位标识符So为PL7定义位标识符Sl为Pl.6定义位标识符R为PL2定义位标识符G为Pl.1定义位标识符Y为PLO无类型主程序if(sO!=O)(sl!=O) Y=0: R=G=IJ/SO. SI均未按下,黄灯亮,其余灯灭无限循环elseif(sO!=l)&(sl!=0)R=0;G=Y=1;/SO单独接下,红灯亮,其余灯灭elseif(sO!=0)&(sl!=l)G=0;R=Y=1;/Sl单独按下,球灯亮,其余灯灭elseR=G=Y=0z/SO、SI均按下,3灯均亮if语句嵌套includesbitsO=P17;sbits1=P16;sbitR=P12;sbitG=P11;sbitY=P10
16、;voidmain()whfle(l)if(s!=l)头文件包含访问.近库函数reg5Lh定义位标识符0为P1.7定义位标识符Sl为PL6定义位标识符R为PL2定义位标识符G为PLl定义位标识符Y为PLO/无类型主程序无限循环/若SO按下if(sl!=l)R=G=Y=0;)SO、SI均按下,3灯均亮elseR=0;G=Y=I;/SO按下,Sl未按下,则红灯亮,其余灯灭else若So未按下if(sl!=l)G=O;R=Y=1;/SO未按下,Sl按下,则绿灯亮,其余灯灭elseY=O;R=G=1;S0、SI均未按下,则黄灯亮,其余灯灭(3)switch语句includevoidmain()unsi
17、gnedcharx;Pl=Pl0xc7;头文件包含访问政库函数reg5Lh无类型主程序定义无符号字符型变量X,置P1.7、P1.6输入态,红绿黄灯灭,其余端口状态不变while(l)无限循环x=Pl0xc0;读Pl口中PL7、P1.6开关状态switch(x)/switch语句开头,根据表达式x的值判断case0:Pl=Pl&0xf8OxcO;break:SO、Sl均按下,3灯均亮,终止SWitCh语句case0x80:Pl=Pl&0xf8Oxc5:break:/Sl单独按下,绿灯亮,其余灯灭,终止switch语句CaSeoX40:Pl=Pl&0xf8Oxc3;break;SO单独按下,红灯亮
18、,其余灯灭,终止SWitCh语句default:Pl=Pl0xf80xc6JS0、Sl均未按下,黄灯亮,其余灯灭2.12求:SUm=I+3+5+99。试用“while循环”编写、输入源程序并调试运行。解:voidmain()unsignedcharn=l:unsignedintsum=0;while(n=99)sum=sum+x;n=n+2;While(1);无类型主程序定义无符号字符型变量n,并赋初值定义无符号整型变量sum,并核初值循环条件判断:当nW99时循环,否则跳出循环/循环体语句:累加求和修正循环变量,n=n+2,并返回循环条件判断原地等待2.13求:SUm=2+4+6+100。试
19、用dowhile循环”编写、输入源程序并调试运行。解:voidmain()/主程序Ounsignedcharn=2:一定义无符号字符型变量n,并赋初值JUnsignedintsum=0:定义无符号整型变量SUm,并赋初值.dosum=sum+n:u=n+2:/,循环体语句:累加求和,并修正循环变量while(n=100);*/循环条件判断:当nW100时循环,否则跳出循环,WhiIe(1);原地等待.2.14求:SlIm=I!+2!+10!。试用“for循环”编写、输入源程序并调试运行。解:include include void main () unsigned char n=l;unsig
20、ned long fac=l;unsigned long sum=0;for(: n=10; n+)*=n;sum=fac;)头文件包含访问或癖函数reg5Lh头文件包含基本输入输出库函数stdio.h/无类型主程序定义无符号字符型变量n,并赋初值定义无符号长整型变量绿,并赋初值定义无符号长整型变量Sum.并赋初值/for语句:初值已赋n=l,循环条件n=0x20;THl=TLl=0xE6;SCON=Ox52;TCON=OX40;串口初始化P11ntf(10!=%lu.sum=%luW.fac.sum):力输出最后阶乘值和累加值while(l);)原地等待2.15 电路如图25所示,按以下要求
21、亮灯循环,间隔约1秒,试编写程序,并仿真调试。从两边到中心依次点亮,每次增加2个,直至全亮:从两边到中心依次暗灭,每次减少2个,直至全暗;重复上述过程,不断循环重复。解:2.16 ./include包含访问sfi库函数reg5l.hUnsignedcharCOdeIed口=定义花样循环码数组,存在ROM中.0x7ej0x3c,0xl8A从两边到中心依次点亮,每次增加2个,直至全亮.0x8l,0xc3.0xe7,Oxfl;从两边到中心依次暗灭,每次减少2个,直至全暗.voidmain()/主函数Unsigncdchari;T定义循环变量Vunsignedlongt;T定义长整型延时参数匕whil
22、e(l)T无限循环.fbr(i=0;i8;i+)花样循环Pl=ledi;一读亮灯数组,并输出至Pl口.,fbr(t=O;t=11000;t+);延时1秒,2.17 电路和亮灯循环同上题,要求用指针指向并输出数组元素,试编写程序,并仿真调试。从两边到中心依次点亮,每次增加2个,直至全亮:从两边到中心依次暗灭,每次减少2个,直至全暗:重复上述过程,不断循环重复。解:2.16-include包含访问sfi库函数reg51hunsignedcharcodeled=定义花样循环码数组,存在RoM中“0x7e,0x3c,0xl8,0,一从两边到中心依次点亮,每次增加2个,直至全亮.0x81j0xc3,0x
23、e7,0xfl);T从两边到中心依次暗灭,每次减少2个,直至全暗.voidmain()T主函数“Unsignedchar*p;定义指向数组的指针变量p.unsignedlong七-定义长整型延时参数匕while(l)T无限循环一for(p=led;pled+8;p+-)T花样循环,循环变量为指针变量pPl=*p;T按指针变量P读亮灯数组,并输出至PI口.,for(t=0;t=11000;t+);延时1秒12.18 电路如图25所示,按以下要求亮灯循环,间隔约0.5秒,试编写程序,并仿真调试。从上至下依次点亮,点亮灯先闪烁3次,后保持点亮,直至全亮:全亮全暗闪烁3次;重更上述过程,不断循环重更。
24、解:2.17,#include包含访问sfi库函数reg51hunsignedcharcodeled=-定义花样循环码数组,存在RoM中,Oxfe5OxffrOxfe,OxffOxfe.Oxff,T从上至下依次点亮,PLo先闪烁3次,后保持点亮.0xfc.0xfe,0xfc,0xfe.0xfc.0xfe,-/PLl先闪烁3次,后保持点亮.0xf8,0xfc,OxfBjOxfcjOxfBjOxfc,-/PL2先闪烁3次,后保持点亮.OxfD,0xf8j0xft),OxfBjOxfOrOxfB,/P1.3先闪烁3次,后保持点亮.OxeOjOxfD5OxeO,0xfl),0xc0;0xfD;-/PL
25、4先闪烁3次,后保持点亮.OXeO,0xe0,OxcO,OxcO,OxcO,OxcO,P1.5先闪烁3次,后保持点亮.0x80,OxcO,0x80,0xc0,0x80,0xc0,-/P1.6先闪烁3次,后保持点亮.0,0x80,0,0x80,0,0x80,P1.7先闪烁3次,后保持点亮.OjOxffjOyOxffjO5OxffjOjOxfl;一全亮全暗闪烁3次.voidmain()T主函数“Unsigncdchari;T定义循环变量Lunsignedlongt;T定义长整型延时参数twhilc(l)T无限循环“fbr(i=0;i54;i+)T花样循环.Pl=ledi;一读亮灯数组,并输出至PI
26、 .试。Cr(t=O;tv=55OO;t+);“/延时0.5秒.2.18电路如图25所示,按以下要求亮灯循环,间隔约0.5秒,试编写程序,并仿真调全亮,保持2秒;从上至下依次暗灭,暗灭灯先闪烁3次,后保持暗灭,直至全暗;全暗,保持2秒;重更上述过程,不断循环重复。解:2.19 ,#include包含访问sfi库函数reg5Ihunsignedcharcodeled=定义花样循环码数组,存在RoM中“0,0,0,0,一全亮2秒.0x01,0,0x01,0,0x01,0,“/从上至下依次暗灭,PLO先闪烁3次,后保持暗灭.0x03,0x01,0x03j0x01j0x03,0x01,-/PLl先闪烁
27、3次,后保持暗灭.OXo7。乂03,0乂07、领03,0乂07、0乂03、/?1.2先闪烁3次,后保持暗灭.第3章思考和练习解答3.1 什么叫中断?为什么要设置中断?答:CPU暂时中止其正在执行的程序,转去执行请求中断的那个外设或事件的服务程序,等处理完毕后再返回执行原来中止的程序,叫做中断。设置中断的优点和功能:可以提高CPU工作效率,CPU不必花费大量时间等待和查询外设工作。具有实时处理功能,对实时控制系统中的各种参数和状态做出快速响应、及时处理。具有故障处理功能,在掉电中断服务程序中将需要保存的数据和信息及时转移到具有备用电源的存储器中保护起来,待电源正常时再恢复。(4)实现分时操作,控
28、制多个外设同时工作。此外,中断系统还能用于程序调试、多机连接等方面。因此,中断系统是计算机中重要的组成部分。可以说,只有有了中断系统后,计算机才能比原来无中断系统的早期计算机演绎出多姿多彩的功能。3.2 80C51有几个中断源?答:参阅教材书P85增强型80C51单片机,例如,80C52系列单片机增加了一个定时/计数器,有6个中断源。3.3 涉及80C51单片机中断控制的有哪几个特殊功能寄存器?各有什么作用?答:参阅教材书P.85、P.86、P.87。3.4 80C51中断优先控制,有什么基本原则?答:参阅教材书P90。3.5 中断初始化包括哪些内容?答:中断初始化内容包括:设置堆栈指针SP、
29、定义中断优先级、定义外中断触发方式、开放中断和中断发生前主程序应完成的操作内容。3.6 80C51定时/计数罂在什么情况下是定时器?什么情况下是计数器?答:80C51定时/计数器归根到底是一个计数器,基本功能是加1。对外部事件脉冲(TO必须从P3.4输入、Tl必须从P3.5输入)计数,是计数器;对片内机周脉冲计数,是定时器。因为片内机周脉冲频率是固定的,是/bsc的l2o若ybsc=12MHz,1机周为ls;若Tbsc=6MHz,1机周为2s,机周脉冲时间乘以机周数就是定时时间。3.7 80C51定时/计数器有哪几种工作方式?各有什麽特点?答:8OC51定时/计数器有四种工作方式,由TMOD中
30、MlMO的状态确定。方式。是13位计数器,最大计数值23=8192,计数范围比方式1小,计算定时初值比较麻烦,容易出错。方式1是16位计数器,最大计数值为26=65536,计数范围大,适用于定时范围较大的应用场合。方式2是8位计数器,最大计数值为28=256,缺点是计数范围小,优点是定时初值可自动恢复,适用于需要重免定时,而定时范围不大的应用场合.方式3是8位计数器,仅适用于TO,Tl无方式3。TO方式3时,被拆成二个独立的8位计数器TH0、TLO:TLO使用To原有的控制寄存器资源组成一个8位的定时/计数器;THO借用Tl的TF1、TRl,只能对机内机周脉冲计数,组成另一个8位定时器。TO方
31、式3时通常Tl方式2用作串行口波特率发生器。3.8 80C51定时/计数器,当bsc=6MHz和bsc=12MHz时,最大定时各为多少?答:叙c=6MHz时,最大定时131.072ms(方式1);用SC=I2MHz时,最大定时65.536ms(方式1)。3.9 定时/计数器初始化应设置哪些参数?答:设置TMoD。TMoD用于选择定时器或计数器、选择To或Tl、选择工作方式、选择门控位是否参与定时/计数器控制,应根据程序要求,合理选择。一般来讲,定时时间长,用方式1(尽量不用方式0);定时时间短(W255机周)且需重复使用自动恢复定时初值,用方式2;串行通信波特率,用Tl方式2。(2)设置定时/
32、计数器定时初值:T三=2n-机周时间其中,N与工作方式有关。方式0时,N=13;方式1时,N=16;方式2时,N=8;方式3时,N=8o若定时/计数器采用中断方式,应设置中断参数:堆栈指针SP、中断允许控制正、中断优先级控制IP以及安排好等待中断或中断发生前主程序应完成的操作内容。(4)最后,启动定时/计数器开始运行。3.10 已知P1.0端口接一个发光二极管,要求定时控制该发光二极管闪烁(亮暗各0.5秒)。解:可设置TO工作方式1,定时50ms,计数10次为0.5秒。定时初值计算:TOwtfl=2,6-50000sls=65536-50000=15536=3CB0Hinclude/包含访问毋
33、库函数reg5l.hsbitP10=P10;定义PlO为Pl口第。位unsignedcharms50=0;定义50ms计数器(全局变量)voidmain()主函数TMOD=OxOI;/TO定时器方式1THO=OX3c;TLo=OXb0;置To初值50msIP=0x02;/STO为高优先级中断正=0x82;/TO开中TRO=I;/TO运行while(1);无限循环,等待To中断voidt()interrupt1/TO中断函数TH0=0x3c;TL0=0xb0;重置TO初值50msms50+;5OmS计数器加1if(ms50=10)若计满05秒P10=!P10;/PLO取反ms50=05OmS计数
34、器清03.11 已知sc=12MHZ,要求在80C51PLO、PLKPL2和P1.3引脚分别输出周期为500s1ms、5ms和IomS的脉冲方波,试编制程序,画出PrOteUSISlS虚拟电路,并仿真调试。解:采用Tl工作方式2,定时250s,正好是500s方波脉宽,再对250s计数,可得1ms、5ms和IOmS的方波脉宽,计数值分别为2、10和20。定时初值计算:Tl初值=28250sls=256-250=6因此,THl=TLl=06HC51程序如下:include Sbit P1O=P1O;sbit P11=P11;sbit P12=P12;sbit P13=P13;unsigned ch
35、ar plms=0;unsigned char p5ms=0;unsigned char plOms=O;void main ()TMOD=0x20;THl=TLl=0x06;IP=0x08;IE=Oxff;TR1=1;P1O=P11=P12=P13=O:While(I);)void tl() intcmt 3 P10=!P10;pirns+: p5ms+; plms+;if(plms=2) plms=0:Pll=! PH;if (p5ms=10) p5ms=0;P12=!P12;)if(pl0ms=20) p 10ms=0;P13=!P13J头文件包含访问蜓库函数reg5Lh定义PlO为PL
36、O(周期500s方波输出端)定义PIl为PLl(周期ImS方波输出端)定义P12为P12(周期5ms方波输出端)定义P13为P1.3(周期IOmS方波输出端)定义ImS计数器(全局变量),并清。除值定义5ms计数器(全局变量),并清0赋值定义IOmS计数器(全局变量),并清。赋值无类型主函数/TMOD=OO100000B,置Tl定时器方式2置Tl定时初值250USJP=00001000B.置Tl高优先级/IE=IlllllllBf全部开中/m运行脉冲方波初始输出为低电平无限循环,等待Tl中断/Tl中断函数/PLO引脚端输出电平取反周期为500s脓冲方波)/lmsx5ms、IomS计数器分别计数
37、加1若ImS计数器到位,则:/Ims计数器清0/PLl引脚端输出电平取反(周期为ImS脉冲方波)若5ms计数器到位,则:5ms计数器清0/PL2引脚端输出电平取反(周期为5ms脉冲方波)若IomS计数器到位,则:/IOms计数器清0/PL3引脚端输出电平取反(周期为IomS脉冲方波)KeilC51软件调试:编译(汇编程序扩展名用.asm,C51程序扩展名用.c)连接并进入调试状态后,打开Pl对话窗口,全速运行,可看到Pl对话窗口中的P1.0PL3端口状态不断跳变,从“到空白,再从空白至适当加大定时脉冲宽度,可更清晰观察。3.12 已知tbsc=6MHz,要求80C51PI.7输出如图314所示
38、连续矩形脉冲。JH1111IA40ms360ms图3-14连续矩形脉冲波解:根据题目要求,设将TO用作定时器方式1,定时40ms。TMOD=0000000IBTOrj值=26-40000s2s=65536-20000=45536=B1EOHC51编程如下:include Sbit P17=P17;bit )=0;void main () unsigned char i=9;P17=l:TMOD=OxOI:THO=Oxbl; TLO=OxcO;IP=Ox02;TRO=I;IE=0x82;while(l)if(ft=l)AM);if(P17=l) Pl7=0;else if (T=O)P17=1;
39、ifvoid t() interrupt 1 TH0=0xbl: TLO=OxeO: fO=l;头文件包含访问 血库函数reg51.h定义位标识符P17为P1.7定义40ms标志f无类型主函数定义40ms计数器,并置初值/PL7输出高电平置TO定时器方式1置TO定时初值40ms置TO为高优先级“TO启动/TO开中无限循环,等待TO中断后40ms标志置“1”若无40ms标志,跳出循环等待若有,则40ms标志清0若P1.7高电平,则PL7 -低电平若PL7低电平,则40ms计数,并判36OmS满否?满360ms, PL7一高电平40ms计数器恢复初值/TO中断函数重置To定时初值40ms4OmS标
40、志置“1”3.13 乐曲播放电路如图3-5所示,世上只有妈妈好曲谱如图3-15所示,设人c=12MHz,试编制该歌曲程序,并仿真调试。I=Cj世上只有妈妈好6535H656-35J53265_32-23!55-632!1-5321615-:|图3-15世上只有妈妈好歌谱解:分析任务9.1程序,不难看到,只要编制音符序号数组SH和音符节拍长度数组U,同时修改音符节拍循环的中止条件(音符总数),即可实现播放新的乐曲。全速运行后,鼠标左键单击KO(不锁定),可听到播放世上只有妈妈好歌。播完后,再次单击K0,再次播放。C51编程如下:mdude sbit KO=PlY);sbit SONDNPl7;u
41、nsigned Chaf ij;unsigned char code 22=12,4,8,8,8,4A16,8A4,8t4f4,4,4A4ji6,l4,8A4,12,4s16,12A4,4A4l16)void main() unsigned mt TMODeOxlO;THl=0x3c;TLl=0xb0;IP=0x02; E=OxSa;while (1)while (K0=l);while (K0=0);fbr(t=O; i34; t+) if(si=O) SOND=0;TRO=OJ else TH0=s;IL0iH;TRO-1;) j=LiiTRl=l; While(TRl=I); TRO=O
42、; SOND=O; for(t=0;t-SOND; THO=4s(i;TL(HiSi; void tl () mtempt 3 THl=OxScjTLl=OxbO; if(G-D) TR1O;包含访问盘库函数reg51.hT定义启动键KO为PLWT定义发声器30ND为PLWT定义字符型循环变量i(音符序数j(50三整倍数),定义音符频率定时数组高S位(12MH,总寸方式0)0s196,202j20SlU16r220,224r22629f23233s236r238t24041r242,244l,246f247r248i皿SIgnedCharcodeti22=定义音符频率定时数组低S位(12MHz
43、,赵寸方式0)OJ22“1,416241292O2S,62乂526”unsignedchars34-“定义世上只有蚂妈好音符序数数组,134240J2J5.13112J3,10,12,13,1110j9r812,10910J2J2,13,10s9,8,12,1019,8,6,8,5i1UnSlgnedcharL34=定义世上只有妈妈好音符节拍长度数组(50ms整倍数)一主函数f定义循环变里t(用于音符发声后间隙延时),TTO定时器方式0,Tl定时器方式2STl初值50ms-置To为高优先级中断,TOvTl开中。无限循环“一等待Ko按下,T等待Ko释放,T歌曲音符节拍循环“T若歌曲音符序数为0,停发声一TTO停运行Cf否则,置TO初值高位(音符方波半周期)置TO初值低位(音符方波半周期)P,TO运行“置50ms计数器初值,Tl运行,等待TI停