单片机C语言邓智盛个人复习用2014-01-05因为个人使用旧版(第4版),页码统一也旧版页码为准,望见谅。个人纯手打,若有错漏,望多多包含。祝大家考试顺利!07-08A卷一、问答题1、用单片机C语言针对外部扩展接口芯片编程时,为什么需要absacc.h头文件?答:(详见课本P342即附录B6.头文件的内容)该头文件中包含的宏定义允许用户直接访问8051单片机的不同存储区。包括:(具体区别见P335-337)(可省略)CBYTE:允许用户访问程序存储器中某一字节;XBYTE:允许用户访问8051外部数据存储器中某一字节;DBYTE:允许用户访问8051单片机内部数据存储器中某一字节;PBYTE:允许用户访问按页访问8051外部数据存储器中某一字节;CWORD:允许用户访问程序存储器中某一字节;XWORD:允许用户访问8051外部数据存储器中某一字节;DWORD:允许用户访问8051单片机内部数据存储器中某一字节;PWORD:允许用户按页访问8051外部数据存储器中某一字节;当51单片机通过8255(8155)和锁存器74LS273等来扩展IO时,需要用到外部数据存储器,常使用宏XBYTE。2、单片机C语言Cx51对单片机内部资源和外部资源变量和地址的定义是否与普通C语言兼容,为什么?答:详见章节3.4P64-67不兼容。8051单片机片内有21个特殊功能寄存器(SFR),分散在片内RAM区的高128字节中,地址为80H~0FFH,对SFR的操作,只能用直接寻址方式。为了直接访问这些特殊功能寄存器,KEILCx51提供了一种自主形式的定义方法。这种定义方法与标准C语言不兼容,只适用于对8051系列单片机进行C编程。这种定义的方法是引入关键字“sfr”,语法为:sfrsfr_nameˊ=ˊintconstantˊ;ˊ3、单片机C语言编程定义变量时,为什么通常需要定义变量的存储类型?答:详见章节3.3P59-63因为KEILCx51是面向8051系列单片机及其硬件控制系统的开发工具,它定义的任何数据类型必须以一定的存储类型的方式定位在8051的某一存储区中,否则便没有任何的实际意义。二、简述题1、以走马灯的实验为例,简述用单片机C语言编程、上机、实验调试的过程。解:详见附录AP308-3222、简述单片机C语言取代单片机汇编语言的发展趋势。解:详见章节2.1P41-42三、电路图绘制略单片机C语言邓智盛个人复习用2014-01-05四、编程题1、对于P1口步进电机控制电路,P1.0:A相;P1.1:B相;P1.2:C相。当P3.3为低电平时,步进电机停转,当P3.3为高电平时,步进电机运转。单向三拍正转顺序A→B→C→A;单向三拍反转顺序A→C→B→A。应用定时器定时(定时17ms)中断方式编制单向三拍正、反转控制程序(用一个程序编制完成),单片机的fosc=12MHz。解:可以参考P235-238章节10.3例1、2f1212/f=1usoscoscMHzT机器周期17ms/1us=17000,定时器初值65536-17000单向三拍正转脉冲顺序为A→B→C→A,数字控制字为01H→02H→04H→01H;单向三拍反转脉冲顺序为A→C→B→A,数字控制字为01H→04H→02H→01H。2、设80051单片机的fosc=12MHz,编程实现在P1.7端口输出100Hz的方波,在P1.6端口输出50Hz的方波。解:可以参考P188例2单片机C语言邓智盛个人复习用2014-01-05111222f1212/f=1us501/0.0220.1001/0.0110.oscoscMHzTfHztfsmsfHztfsms机器周期其中10ms高低电平互换其中5ms高低电平互换以5ms为基准,5ms/1us=5000,定时器初值65536-5000程序如下:单片机C语言邓智盛个人复习用2014-01-053、应用定时器定时20ms,每20ms从8255的A口(地址参见绘制的电路图)读入8位新数据(new),并和上一次输入值(old)相与,其结果存入rel变量中,单片机的fosc=12MHz解:可参考章节9.2P210-214f1212/f=1usoscoscMHzT机器周期20ms/1us=20000,定时器初值65536-2000011-12B卷一、简答题1、单片机C语言编程定义数组变量时,为什么通常需要定义数组变量的存储类型?答:见A卷。2、单片机串行通信时,为什么通常选择11.059MHz晶振?答:详见章节8.3P193-197一般选用11.0592MHz或其倍数。因为对其整数分频后可以得到4800、9600、57600等常用波特率。而12MHz或6MHz晶振数值看上去很美,分频后总是无法精确得到以上常用波特率。3、头文件REG51.H主要的功能是什么?单片机C语言编程是否必须使用该头文件?答:1)关于单片机的一些符号的定义,即规定符号名与地址的对应关系。特别是4个并行口(P0、P1、P2、P3)、特殊功能寄存器(IE、IP、TMOD、TR0、EA、TH0、TL0等)、第二功能等。单片机C语言邓智盛个人复习用2014-01-052)若编程并不需要头文件REG51.H里所定义的,可不使用该头文件。但编程所面对的硬件为8051系列单片机,一般还是需要的。当然在自己非常熟悉8051的结构时,也可以自行定义需要使用的符号,就不必使用该头文件。二、简述题1、以A/D数据采集的实验为例,简述用单片机C语言编程、上机、实验调试的具体过程和步骤。解:详见附录AP308-3222、简述单片机C语言程序结构。解:详见章节2.5P53-54三、电路图绘制1、2、3、略4、设绘制电路图中P1.3~P1.7连接5个发光二极管,设单片机晶振为12MHz,按照P1.7(亮200ms之后灭)→P1.6(亮200ms后灭)→P1.5(亮200ms后灭)→P1.4(亮200ms后灭)→P1.3(亮200ms后灭)→P1.7(亮200ms后灭)的顺序发光,编制程序实现上述功能。要求:应用定时器中断方式编程;写出对题目的分析。解:其实,这是一个走马灯,时间间隔200ms。如果间隔不同,可以参照P192例5。要产生200ms的定时,可以20ms循环10次得到。(或者通过计数器计数10次)f1212/f=1usoscoscMHzT机器周期20ms/1us=20000,定时器初值65536-20000单片机C语言邓智盛个人复习用2014-01-05四、编程与绘制程序流程图编程用单片机和定时器来产生矩形波。要求频率为50kHz,占空比2:1(高电平的时间长)。设单片机的fosc=6MHz(1)绘制程序流程图(2)编程解:可以参考P190例4(1)流程图我就不在word里编辑了,很是麻烦。(2)编程5612/6=250,1/210202:1202/3=13.3us201/3=6.7us6.7us/2us=3,65536-3oscfMHzMHzusfkHztfsususus机器周期占空比为,则高电平时间:低电平时间:以低电平时间为基准:需要计数次数则定时器初值为个人认为,6MHz的晶振并不能产生占空比2:1的50kHz矩形波。单片机一般执行单周期指令或双周期指令(可能会是4周期指令)。一条语句就可以达到2或4us,低电平时间也只是7us不到。误差会非常大,完全否决了题目。看来只能用作考查,无实际意义。