单片机原理与应用(C51编程+Proteus仿真) 习题及答案汇总 刘霞 第1-9章 单片机概述-模数数模转换_第1页
单片机原理与应用(C51编程+Proteus仿真) 习题及答案汇总 刘霞 第1-9章 单片机概述-模数数模转换_第2页
单片机原理与应用(C51编程+Proteus仿真) 习题及答案汇总 刘霞 第1-9章 单片机概述-模数数模转换_第3页
单片机原理与应用(C51编程+Proteus仿真) 习题及答案汇总 刘霞 第1-9章 单片机概述-模数数模转换_第4页
单片机原理与应用(C51编程+Proteus仿真) 习题及答案汇总 刘霞 第1-9章 单片机概述-模数数模转换_第5页
已阅读5页,还剩181页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章习题答案一、填空1.单片机通过内部总线连接在一起,集成于一块芯片上。答:CPU、存储器、I/O口、系统单片机是的简称。又称和。答:微型计算机、微控制器、嵌入式控制器AT89S52-24PI单片机的程序存储器为、工作频率上限为MHz、封装形式为。答:8KB的flash存储器、24、双列直插式AT89S52单片机片内集成KB的ROM、B的RAM、个中断源、个定时器/计数器。答、8、256、6、3单片机应用系统主要由和、两部分组成。答:硬件、软件二、选择1.AT89S52是位单片机。A.1位B.4位C.8位D.16位答:C2.下列不表示单片机的英文缩写。A.MCUB.EMCUC.SCMD.ATMEL答:D3.在家用电器中使用单片机应属于微计算机的。A.辅助设计应用 B.测量、控制应用C.数值计算应用 D.数据处理应用答:B三、问答题1.AT89S52单片机相当于MCS-51系列单片机中的哪一型号的产品?“S”的含义是什么?答:相当于MCS-51系列中的87C51,只不过是AT89S51芯片内的4K字节Flash存储器取代了87C51片内的4K字节的EPROM。2.解释什么是单片机的在系统编程(ISP)。答:单片机的在系统编程ISP(InSystemProgram),也称在线编程,只需一条与PC机USB口或串口相连的ISP下载线,就可把仿真调试通过的程序代码从PC机在线写入单片机的Flash存储器内,省去了编程器。3.举例说明单片机的主要应用领域。答:洗衣机、电冰箱、空调机、电风扇、电视机、微波炉、加湿机、消毒柜等消费类电子产品;在现代化的武器装备中,如飞机、军舰、坦克、导弹、鱼雷制导、智能武器装备、航天飞机导航系统,都有单片机嵌入其中;在调制解调器、各类手机、传真机、程控电话交换机、信息网络及各种通讯设备中,单片机也已经得到广泛应用。工业过程控制、智能控制、设备控制、数据采集和传输、测试、测量、监控等。在工业自动化的领域中,机电一体化技术将发挥愈来愈重要的作用,在这种集机械、微电子和计算机技术为一体的综合技术(如机器人技术)中,单片机发挥着非常重要的作用。目前对仪器仪表的自动化和智能化要求越来越高。单片机的使用有助于提高仪器仪表的精度和准确度,简化结构,减小体积而易于携带和使用,加速仪器仪表向数字化、智能化、多功能化方向发展。第2章单片机内部结构习题答案一、填空1.在AT89S52单片机中,如果采用12MHz晶振,一个机器周期为。答:1us2.单片机常采用的时钟电路为。答:内部时钟方式AT89S52单片机的机器周期等于个振荡周期。答:12内部RAM中,位地址为0x20所在字节的字节地址为。答:0x24AT89S52单片机复位时,程序指针PC中的内容为。答:0x0000使AT89S52单片机复位,需在RST引脚加上大于机器周期的高电平。答:2个7.若Acc中的内容为0x63,则P标志位的值为。答:08.

两个无符号数0x43和0x8A进行加法运算后,则CY=、AC=、OV=和P=的值。答:0、0、0、19.若PSW

=0x10。

这时的工作寄存器区是区工作寄存器。答:2

AT89S52

单片机程序存储器的寻址范围为KB。答:64二、选择题1.

程序在运行中,当前PC的值是。A.当前正在执行指令的前一条指令的地址B.当前正在执行指令的地址C.当前正在执行指令的下一条指令的首地址D.控制器中指令寄存器的地址答:C2.AT89S52单片机要使用片内ROM,EA引脚______。   A.必须接+5V   B.必须接地   C.必须悬空  D.没有限定答:A3.单片机上电复位后,SP的内容为______。   A.0x00   B.0x07  C.0xFF  D.随机数答:B4.单片机上电复位后,P0~P1的内容为______。  A.0x00   B.0x07  C.0xFF  D.随机数答:C5.MCS-51单片机的复位信号是______有效。 A.下降沿   B.上升沿   C.低电平   D.高电平答:D6.定义特殊功能位使用的关键字为______。A.sfr   B.sfr16   C.sbit   D.bit答:C7.将常数存储到ROM,使用的存储类型为______。A.data   B.xdata   C.bdata   D.code答:D8.采用绝对宏方式定义片内RAM0x30绝对地址的语句为#defineNRAM______[0x30]A.XBYTE   B.CBYTE   C.DBYTE   D.PBYTE答:C9.P1.0引脚外接一个按键,该特殊功能位的定义语句为sbitkey=______。A.P1.0   B.P1^0   C.P1.0;   D.P1^0;答:D10.哪个选项不适于填在sbitCY=______;里。A.PSW^7   B.0xD0   C.0xD0.7   D.0xD7答:B四、简答题1.AT89S52单片机片内都集成了哪些功能部件?答:集成了如下部件:1个CPU;256个数据存储器(RAM)单元;8KFlash程序存储器;4个8位可编程并行I/O口(P0口、P1口、P2口、P3口);1个全双工串行口;3个16位定时器/计数器;1个看门狗定时器;一个中断系统,6个中断源,2个优先级;32个特殊功能寄存器(SFR)。2.

AT89S52

单片机的64KB程序存储器空间有6个单元地址对应AT89S52

单片机6个中断源的中断入口地址,请写出这些单元的入口地址及对应的中断源。答:见下表表AT89S51各中断源的中断入口地址中断源入口地址外部中断00x0003定时器/计数器T00x000B外部中断10x0013定时器/计数器T10x001B串行口0x0023定时器/计数器T20x002B3.

说明AT89S52单片机的EA引脚接高电平或低电平的区别。答:当脚为高电平时,单片机读片内程序存储器(8K字节Flash)中的内容,但在PC值超过1FFFH(即超出8K字节地址范围)时,将自动转向读外部程序存储器内的程序;当脚为低电平时,单片机只对外部程序存储器的地址为0000H~FFFFH中的内容进行读操作,单片机不理会片内的8K字节的Flash程序存储器。4.AT89S52单片机有哪两种低功耗节电模式?说明两种低功耗节电模式的异同。答:AT89S52单片机有两种低功耗节电工作模式:待机模式(idlemode)和掉电模式(powerdownmode)。待机模式下,虽然振荡器仍然运行,但是CPU进入待机状态。此时,片内所有外围电路(中断系统、串行口和定时器)仍继续工作,SP、PC、PSW、A、P0~P3端口等所有其他寄存器,以及内部RAM和SFR中的内容均保持进入待机模式前的状态。因为CPU耗电量通常要占芯片耗电的80%~90%,因此CPU停止工作则会大大降低功耗。掉电模式下,振荡器停止工作。由于没有了时钟信号,内部的所有部件均停止工作,但片内的RAM和SFR的原来内容都被保留,有关端口的输出状态值都保存在对应的特殊功能寄存器中。5.

当单片机运行出错或者程序陷入死循环时,如何摆脱困境?答:可采用看门狗定时器。工作原理如下:“看门狗”技术就是使用一个“看门狗”定时器来对系统时钟不断计数,监视程序的运行。当看门狗定时器启动运行后,为防止看门狗定时器的不必要溢出而引起单片机的非正常的复位,应定期地把看门狗定时器清0,以保证看门狗定时器不溢出。当由于干扰,使单片机程序“跑飞”或陷入“死循环”时,单片机也就不能正常运行程序来定时地把看门狗定时器清0,当看门狗定时器计满溢出时,将在AT89S52的RST引脚上输出一个正脉冲(宽度为98个振荡周期),使单片机复位,在系统的复位入口0000H处重新开始执行主程序,从而使程序摆脱“跑飞”或“死循环”状态,让单片机归复于正常的工作状态。6.什么是单片机最小系统?请画出由89C51

单片机构成的最小系统。答:单片机最小系统也称单片机最小应用系统,是指用最少的元件组成的单片机可以工作的系统,由电源、晶振、复位电路和程序存储器选择电路组成。单片机最小应用系统电路如图所示。7.使用宏来访问绝对地址时,一般需要包含的库文件是什么?

答:absacc.h。8.根据指定的存储类型和数据类型,写出下列变量的说明形式。(1)在data区定义无符号字符型变量value1。答:unsignedchardatavalue1;(2)在idata区定义无符号整型变量value2。答:unsignedintidalavalue2(3)在xdata区定义无符号字符型数组val3[4]。答:unsignedcharxdataval3[4];(4)定义特殊功能寄存器P3。答:sfrP3=0xB0;(5)定义可位寻址变量flag。答:bitflag;(6)定义指向外部数据存储器的地址0x1020。答:#include

<

absacc.

h>#define

PORTA

XBYTE[0x1020]第3章单片机输出显示控制习题答案一、填空题1.AT89S52单片机的I/O引脚采用电平输出可获得较大的驱动能力。答:低2.采用_crol_函数需要包含头文件。答:intrins.h3.temp=0x80;temp=temp<<1;则(temp)=。答:0x004.temp=0x80;temp=_crol_(temp,1);则(temp)=。答:0x015.unsignedcharcodeseg[]={0xc0,0xf9},数组seg存在存储器。答:程序6.“8”字型的LED数码管有和两种。答:共阳,共阴7.对于共阴极带有小数点段的数码管,显示字符“0.”(a段对应段码的最低位)的段码为,对于共阳极带有小数点段的数码管,显示字符“0.”的段码为。答:0xBF,0x408.当显示LED数码管位数较多时,一般采用显示方式,这样减少I/O口的使用数目。答:动态9.16*16点阵显示器是由个8*8点阵显示器组成。答:410.LCD1602是型液晶显示模块,在其显示字符时,只需将待显示字符的码由单片机写入LCD1602的显示数据DDRAM,内部控制电路就可将字符在LCD上显示出来。可显示行,每行显示个字符。答:字符,2,16二、单项选择题1.关于52单片机的P0口,下列说法不正确的是。A、P0口作为输出口需要外接上拉电阻B、P0口作为输入口需要先写1C、P0口作为输出口不需要外接上拉电阻D、P0口可作为地址/数据总线使用答:C2.下列说法不正确的是。A.

P0口可作为地址总线低8位使用

B.

P0口可作为数据总线使用C.

P2口可作为地址总线高8位使用D.

P0~P3口的驱动能力是相同的答:D3.共阳数码管采用动态显示方式时,其公共端可接。A.地B.电源C.单片机I/O口D.悬空答:C4.共阳数码管采用动态显示方式时,其段码端可接。A.地B.电源C.单片机I/O口D.悬空答:C5.在LCD1602显示上显示数字0,不正确的是。A.write_data(0);B.write_data(‘0’);C.write_data(0x00+0x30);D.write_data(0x00+48);答:A三、简答题1.简述单片机I/O口的驱动能力。答:P0口作为通用I/O使用,每位可驱动8个LSTTL输入,当P0口的某位为高电平时,可提供400μA的拉电流;当P0口某位为低电平

(0.45V)时,可提供3.

2mA的灌电流,由于漏极开路,需要外接上拉电阻;而P1

~P3口内部有30kΩ左右的上拉电阻,P1

~P3口每一位的驱动能力,只有P0口的一半。如果高电平输出,则从P1、P2和P3口输出的拉电流仅为数百微安,如果低电平输出,能使灌电流从单片机的外部流入内部,则将大大增加流过的灌电流值。所以,AT89S52单片机任何一个端口要想获得较大的驱动能力,要采用低电平输出。2.LED数码管的静态显示方式与动态显示方式有何区别?各有什么优缺点?答:静态显示时,欲显示的数据是分开送到每一位LED上的。而动态显示则是数据是同时送到每一个LED上,再根据位选线来确定是哪一位LED被显示。静态显示亮度很高,但口线占用较多。动态显示口线占用较少,但是需要编程进行动态扫描,适合用在显示位数较多的场合。3.简要说明数码管动态显示方式时的扫描刷新时间的确定方法。答:由于数码管余辉和人眼的“视觉暂留”作用,只要控制好每个数码管显示时间,则可造成“多位同时亮”的假象,达到同时显示效果。因此,动态显示占用口线少,但有闪烁,扫描占用CPU大量的时间。只要扫描(刷新)率大于100Hz,即整体扫描时间小于10ms,就可以做到无闪烁。根据“整体扫描时间=单个数码管点亮时间*数码管个数”就可以计算单个数码管点亮时间。4.简要说明数码管动态显示方式为什么要加消隐语句?答:数码管动态显示时,有时会出现数码管不应该亮的段,似乎有微微的发亮。这种现象主要是数码管在切换时,输出位选和段选的瞬态造成的。在刚送完段码数据后,输出段码端口仍然保持着上次的段码数据,再执行下一位数码管的送位选数据指令后,原来保持在段码端口的段码数据将直接加在数码管上,接下来才是再次通过段码端口给送段码数据,虽然这个过程非常短暂,但是在数码管高速显示状态下,仍然可以看见数码管出现显示重影的现象。因此需要入消隐语句。四、仿真练习1.设计要求:以单片机为核心,设计一个彩灯控制器。在ProteusISIS中绘制出原理电路,并编写软件调试通过。基本要求:在单片机的P1接8个发光二极管,按照P1.0~P1.7以及P1.7~P1.0顺序依次流水点亮。答:1.硬件电路设计2.软件设计#include<reg52.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedcharuintcodetable1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};uintcodetable2[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};voiddelay(uinti) //延时函数{ uintx,y; for(x=110;x>0;x--) for(y=i;y>0;y--);}voida1() //P1.0-P1.7流水点亮{uintq; for(q=0;q<8;q++) { P1=table1[q]; delay(300); } }voida2() //P1.7-P1.0流水点亮{uintq; for(q=0;q<8;q++) { P1=table2[q]; delay(300); } }voidmain(){while(1){a1(); a2();}}扩展要求:在P0~P3口分别接8个LED,排成一定的形状(自定义),自行设计点亮效果。答:1.硬件电路设计软件设计#include<reg52.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedcharucharcodetable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};ucharcodetable1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};voiddelay(uintz) //延时函数{ uintx,y; for(x=110;x>0;x--) for(y=z;y>0;y--);}voidmain(void){ ucharq; while(1) { for(q=0;q<8;q++) { P0=0Xff; //P0全熄灭 P1=table[q];//P1流水点亮 delay(300); } for(q=0;q<8;q++) { P1=0xff; //P1全熄灭 P3=table[q];//P3流水点亮 delay(300); } for(q=0;q<8;q++) { P3=0xff; //P3全熄灭 P2=table1[q];//P2流水点亮 delay(300); } for(q=0;q<8;q++) { P2=0xff; //P2全熄灭 P0=table1[q];//P0流水点亮 delay(300); } }}2.设计要求:用单片机控制4位LED数码管动态显示。在ProteusISIS中绘制出原理电路,并编写软件调试通过。基本要求:显示“班级-学号”,例如:2班3号(2-03)。稳定显示。答:1.硬件电路设计2.软件设计#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintucharcodeseg_scan[]={0x08,0x04,0x02,0x01};//数码管位选码ucharcodeseg[]={0xa4,0xbf,0xc0,0xb0};//2-03段码表voiddelay(uintxms)//1ms延时函数{uinti,j;for(i=0;i<xms;i++)for(j=0;j<120;j++);}voidmain(){uchark;while(1){ P2=0x00;////清位选端for(k=0;k<4;k++) { P2=seg_scan[k];//给P2口低四位送位选信号 P0=seg[k];//送段码 delay(2);//延时 P0=0xff;//消隐 }}}3.仿真运行扩展要求:显示“班级-学号”[例如:2班3号(2-03)]的效果为依次点亮数码管,每次只看到一个数字。然后稳定显示。答:1.硬件电路设计2.软件设计#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintucharcodeseg_scan[]={0x08,0x04,0x02,0x01};//数码管位选码ucharcodeseg[]={0xa4,0xbf,0xc0,0xb0};//2-03段码表voiddelay(uintxms)//1ms延时函数{uinti,j;for(i=0;i<xms;i++)for(j=0;j<120;j++);}voidmain(){uchark,m=1000;while(1){ P2=0x00;////清位选端for(k=0;k<4;k++) { P2=seg_scan[k];//给P2口低四位送位选信号 P0=seg[k];//送段码 delay(m);//延时 P0=0xff;//消隐 if(k==3) { m=2; }}}}3.仿真运行3.设计要求:用单片机控制字符型液晶显示器LCD1602显示字符,在Proteus

ISIS中绘制出原理电路,并编写软件调试通过。基本要求:第一行显示“Helloworld”,第二行显示“学号+姓名(汉语拼音)”。答:1.硬件电路设计2.软件设计#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineoutP2sbitlcdrs=P3^0;//液晶的RS端接P3.0口sbitlcdrw=P3^1;//液晶的RW端接P3.1sbitlcden=P3^2;//液晶的EN使能端接P3.2口ucharnum=0;/********************延时函数,延时一毫秒************************/voiddelay(uintz){ uintx,y; for(x=112;x>0;x--) for(y=z;y>0;y--);}/**********************检查忙标志函数************************/voidcheck_busy(void){uchardt; do { dt=0xff; lcden=0; lcdrs=0; lcdrw=1; lcden=1; dt=out; }while(dt&0x80); lcden=0;}/**************************1602显示****************************/voidwrite_cmd(charcmd)//写指令函数{ check_busy(); lcden=0;//再把EN拉低 lcdrs=0; lcdrw=0;//先将RW拉低 out=cmd; lcden=1; delay(1); lcden=0; delay(1);}voidwrite_data(uchardat)//写数据函数{ check_busy(); lcden=0;//再把EN拉低 lcdrs=1; lcdrw=0;//先将RW拉低 out=dat; lcden=1; delay(1); lcden=0; delay(1);}voidwrite_str(uchar*str)//写字符串函数{ while(*str!='\0') { write_data(*str++); delay(5); }}/***************************初始化******************************/voidlcd_init()//初始化1602{ write_cmd(0x38);//显示模式设置 write_cmd(0x0c);//显示开关,光标没有闪烁 write_cmd(0x06);//显示光标移动设置 write_cmd(0x01);//清除屏幕 delay(1);}/************************主函数******************************/voidmain(){ lcd_init(); while(1) { write_cmd(0x80+0x03);//把光标移到第一行待显示区 write_str("HelloWorld"); write_cmd(0x80+0x40);//把光标移到第二行待显示区 write_str("123456zhangsan"); }}3.仿真运行扩展要求:要求上述信息分别从LCD1602右侧第1行、第2行滚动移入,然后从左侧滚动移出,反复循环显示。答:1.硬件电路设计2.软件设计#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineoutP2sbitlcdrs=P3^0;//液晶的RS端接P3.0口sbitlcdrw=P3^1;//液晶的RW端接P3.1sbitlcden=P3^2;//液晶的EN使能端接P3.2口ucharnum=0;/********************延时函数,延时一毫秒************************/voiddelay(uintz){ uintx,y; for(x=112;x>0;x--) for(y=z;y>0;y--);}/**********************检查忙标志函数************************/voidcheck_busy(void){uchardt; do { dt=0xff; lcden=0; lcdrs=0; lcdrw=1; lcden=1; dt=out; }while(dt&0x80); lcden=0;}/**************************1602显示****************************/voidwrite_cmd(charcmd)//写指令函数{ check_busy(); lcden=0;//再把EN拉低 lcdrs=0; lcdrw=0;//先将RW拉低 out=cmd; lcden=1; delay(1); lcden=0; delay(1);}voidwrite_data(uchardat)//写数据函数{ check_busy(); lcden=0;//再把EN拉低 lcdrs=1; lcdrw=0;//先将RW拉低 out=dat; lcden=1; delay(1); lcden=0; delay(1);}voidwrite_str(uchar*str)//写字符串函数{ while(*str!='\0') { write_data(*str++); delay(5); }}/***************************初始化******************************/voidlcd_init()//初始化1602{ write_cmd(0x38);//显示模式设置 write_cmd(0x0c);//显示开关,光标没有闪烁 write_cmd(0x06);//显示光标移动设置 write_cmd(0x01);//清除屏幕 delay(1);}/************************主函数******************************/voidmain(){ lcd_init(); while(1) { write_cmd(0x80+0x13);//把光标移到第一行待显示区 write_str("HelloWorld"); write_cmd(0x80+0x50);//把光标移到第二行待显示区 write_str("123456zhangsan"); for(num=0;num<16;num++) { write_cmd(0x18);//0x18整屏左移 0x1c整屏右移 delay(30); } }}3.仿真运行第4章单片机输入检测习题答案填空题非编码键盘分为和键盘。答:独立键盘,行列式(又称矩阵式)2.当按键数目少于8个时,应采用键盘。答:独立式3.独立按键识别原理是按键按下为电平,弹起为电平。答:低,高4.矩阵键盘由和组成,按键位于行、列的交叉点上。答:行线,列线5.要检测的物理量要通过调理电路转换为单片机能接收的信号,才能与单片机的I/O口连接。答:高低电平(数字量)二、仿真练习1.Proteus虚拟仿真设计任务:设计一个手动控制的彩灯控制器。在ProteusISIS中绘制出原理电路,并编写软件调试通过。在单片机的P1口接8个发光二极管,P2.0~P2.3接4个按键,记为SB1~SB4。(1)基本要求按下SB1:高4位灯亮,低4位灯灭;然后高4位灯灭低4位灯亮,交替闪烁。按下SB2:按照P1.0~P1.7顺序流水点亮。按下SB3:按照P1.7~P1.0顺序流水点亮。按下SB4:全灭。答:1.硬件电路设计2.软件设计【彩灯控制器参考程序】:#include<reg52.h>#defineucharunsignedchar //宏定义uchar代替unsignedchar#defineuintunsignedint //宏定义uint代替unsignedintsbitkey1=P2^0;//按键声明SB1sbitkey2=P2^1;//按键声明SB2sbitkey3=P2^2;//按键声明SB3sbitkey4=P2^3;//按键声明SB4uchari=0;ucharflag=0;//按键标志位ucharcodetab0[]={0xf0,0x0f};//高低四位交替ucharcodetab1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//P1.0~P1.7顺序点亮ucharcodetab2[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//P1.7~P1.0顺序点亮voiddelayms(uinti); //ms延时函数 voidkeyscan();//按键扫描函数voidledshow();//LED显示函数 voidmain() //主函数{ while(1){ keyscan();//按键扫描,获取flag的值 ledshow();//根据flag的值,按不同方式点亮LED}}voiddelayms(uinti) //ms延时函数{ uchart;while(i--){ for(t=0;t<120;t++); }}voidledshow()//LED显示函数{ if(flag==1)//高低四位交替闪烁 { for(i=0;i<2;i++) { P1=tab0[i];//将数组0写入P1口 delayms(200); if(flag!=1)break; } } if(flag==2)//P1.0~P1.7顺序点亮 { for(i=0;i<8;i++) { P1=tab1[i];//将数组1写入P1口 delayms(200); if(flag!=2)break; } } if(flag==3)//P1.7~P1.0顺序点亮 { for(i=0;i<8;i++) { P1=tab2[i];//将数组2写入P1口 delayms(200); if(flag!=3)break; } } if(flag==4)//全灭 { P1=0XFF; }}voidkeyscan()//按键扫描函数{ if(key1==0)//按键SB1 { delayms(2); if(key1==0) { flag=1; } while(!key1); } if(key2==0)//按键SB2 { delayms(2); if(key2==0) { flag=2; } while(!key2); } if(key3==0)//按键SB3 { delayms(2); if(key3==0) { flag=3; } while(!key3); } if(key4==0)//按键SB4 { delayms(2); if(key4==0) { flag=4; } while(!key4); }}3.仿真运行<1>K1按下,高低四位灯交替闪烁<2>K2按下,P1.0~P1.7顺序点亮<3>K3按下,P1.7~P1.0顺序点亮<4>K4按下,全灭(2)扩展要求按键功能:SB1,彩灯全亮按键;SB2,彩灯模式加按键;SB3,彩灯模式减按键;SB4,彩灯全关按键。具体实现下述功能。按下SB1,8个LED全部点亮。按下SB2,按下1次模式加1;自行设计每种模式的点亮方式(4种)按下SB3,按下1次模式减1;模式加1的4种倒序循环按下SB4,8个LED全部熄灭答:1.硬件电路设计2.软件设计【彩灯模式控制器参考程序】:#include<reg52.h>#defineucharunsignedchar //宏定义uchar#defineuintunsignedint //宏定义uintsbitkey1=P2^0;//按键声明SB1sbitkey2=P2^1;//按键声明SB2sbitkey3=P2^2;//按键声明SB3sbitkey4=P2^3;//按键声明SB4uchari=0;ucharflag=0;//按键标志位uchartt=0;//模式标志位ucharcodetab1[]={0xfd,0xf7,0xdf,0x7f};//偶数灯顺序点亮ucharcodetab2[]={0xfe,0xfb,0xef,0xbf};//奇数灯顺序点亮ucharcodetab3[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//P1.0~P1.7顺序点亮ucharcodetab4[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//P1.7~P1.0顺序点亮voiddelayms(uinti);//ms延时函数voidkeyscan();//按键扫描函数voidledshow(); //LED显示函数voidmain() //主函数{ while(1){ keyscan();//按键扫描,获取flag的值和tt的值 ledshow();//根据标志位,LED按不同方式点亮}}voiddelayms(uinti) //ms延时函数{ uchart;while(i--){ for(t=0;t<120;t++); }}voidledshow(){ if(flag==1)//按键K1功能:全亮 { P1=0x00; } if((flag==2)||(flag==3))//加载四种彩灯模式 { if(tt==1)//模式一:偶数灯顺序点亮 { for(i=0;i<4;i++) { P1=tab1[i]; delayms(200); if(tt!=1)break; } } if(tt==2)//模式二:奇数灯顺序点亮 { for(i=0;i<4;i++) { P1=tab2[i]; delayms(200); if(tt!=2)break; } }if(tt==3)//模式三:P1.0~P1.7顺序点亮 { for(i=0;i<8;i++) { P1=tab3[i]; delayms(200); if(tt!=3)break; } } if(tt==4)//模式四:P1.7~P1.0顺序点亮 { for(i=0;i<8;i++) { P1=tab4[i]; delayms(200); if(tt!=4)break; } } } if(flag==4)//按键K4功能:全灭 { P1=0XFF; }}voidkeyscan()//按键扫描函数{ if(key1==0)//SB1按下 { delayms(2); if(key1==0) { flag=1; } while(!key1); } if(key2==0)//SB2按下,模式加1 { delayms(2); if(key2==0) { if(tt==4) { tt=0; } flag=2; if(tt<4) { tt++;//模式加1 } } while(!key2); } if(key3==0)//SB3按下,模式减1 { delayms(2); if(key3==0) { if(tt==1) { tt=5; } flag=3; if(tt>1) { tt--;//模式减1 } } while(!key3); } if(key4==0)//SB4按下 { delayms(2); if(key4==0) { flag=4; } while(!key4); }}3.仿真运行<1>K1按下,全亮<2>模式一:偶数灯顺序点亮模式二:奇数灯顺序点亮模式三:P1.0~P1.7顺序点亮模式四:P1.7~P1.0顺序点亮按键K2按一次模式加一,按键K3按一次模式减一。<3>K4按下,全灭2.

Proteus

虚拟仿真设计任务:设计一个数码管数字显示器。在ProteusISIS中绘制出原理电路,并编写软件调试通过。基本要求:设计4*4键盘,建号为0~F,按下按键,在2位数码管上显示相应键号的十进制表示“0~15”。答:1.硬件电路设计2.软件设计【矩阵键盘参考程序】:#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintucharcodeseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳0-9段码ucharkey=16;//键值标志位voiddelay(uintxms);//延时函数voidkeyscan();//矩阵键盘扫描/********************主函数********************/voidmain(){ while(1){keyscan();//扫描键盘,获取key值if(key>=0&&key<=15){P0=seg[key/10];//key取整,显示十位P2=seg[key%10];//key取余,显示个位} }}voiddelay(uintxms)//延时函数{uinti,j;for(i=0;i<xms;i++)for(j=0;j<110;j++);}voidkeyscan(){uchartemp;P1=0xff;//先向P1写1 P1=0xfe;//选中按键第一行 temp=P1; //把P1给中间变量 temp=temp&0xf0;//低四位清零 while(temp!=0xf0) {delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp) { case0xee:key=0;break; case0xde:key=1;break; case0xbe:key=2;break; case0x7e:key=3;break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xfd;//选中按键第二行 temp=P1; //把P1给中间变量 temp=temp&0xf0;//低四位清零 while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case0xed:key=4;break; case0xdd:key=5;break; case0xbd:key=6;break; case0x7d:key=7;break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xfb;//选中按键第三行 temp=P1; //把P1给中间变量 temp=temp&0xf0;//低四位清零 while(temp!=0xf0){ delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case0xeb:key=8;break; case0xdb:key=9;break; case0xbb:key=10;break; case0x7b:key=11;break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } }} P1=0xf7;//选中按键第四行 temp=P1; //把P1给中间变量 temp=temp&0xf0;//低四位清零 while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case0xe7:key=12;break; case0xd7:key=13;break; case0xb7:key=14;break; case0x77:key=15;break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } }}3.仿真运行扩展要求:设计简易加法计算器,按下按键0~9,表示被加数,显示在数码管上,按下A表示加法,不显示,再按下按键0~9,表示加数,显示在数码管上(被加数清掉),按下B,表示确认,在数码管上显示和。答:1.硬件电路设计2.软件设计【加法计算器参考程序】:#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharsbitw0=P2^0;//数目管动态显示位选段sbitw1=P2^1;//数目管动态显示位选段unsignedcharcodetable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴段码0~9uchartemp,num,shi,ge,tt,ks,dy;voidkeyscan();//按键扫描函数voiddisplay();//加法及显示函数voiddelay(uintz)//ms延时{uintx,y;for(x=z;x>0;x--) for(y=110;y>0;y--);}voidmain(){ while(1){ keyscan();//按键扫描 display();//加法及显示}}voiddisplay()//加法及显示函数{if(dy==1)//B键按下,相加{num=ks+num;dy=0;}if(num==12)num=0;//C键按下,清除shi=num/10;ge=num%10;w0=0;P0=table[shi];//显示十位delay(5);w0=1; w1=0;P0=table[ge];//显示个位delay(5);w1=1;}voidkeyscan(){P1=0xfe;temp=P1;temp=temp&0xf0;while(temp!=0xf0){ delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case0xee:num=0;break; case0xde:num=1;break; case0xbe:num=2;break; case0x7e:num=3;break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } }} P1=0xfd; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case0xed:num=4;break; case0xdd:num=5;break; case0xbd:num=6;break; case0x7d:num=7;break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xfb; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case0xeb:num=8; break; case0xdb:num=9; break; case0xbb:ks=num;//A键 break; case0x7b:dy=1;//B键 break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xf7; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case0xe7:num=12;//C键 break; case0xd7:num=13; break; case0xb7:num=14; break; case0x77:num=15; break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } }} }3.仿真运行示例:计算5+9=143.

Proteus

虚拟仿真设计任务:设计一个学号显示器。在Proteus

ISIS中绘制出原理电路,并编写软件调试通过。基本要求:通过4*4键盘输入自己的学号,显示在LCD1602上。答:1.硬件电路设计2.软件设计【学号显示器参考程序】:#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineoutP2sbitlcdrs=P3^0;//液晶的RS端接P3.0口sbitlcdrw=P3^1;//液晶的RW端接P3.1sbitlcden=P3^2;//液晶的EN使能端接P3.2口ucharkey=16;//键值标志位ucharflag=0;//数字标志位ucharcodexs[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//显示字符数组voiddelay(uintxms);//延时函数voidkeyscan();//矩阵键盘扫描voiddelay(uintz);//1ms延时函数voidcheck_busy(void);//检查忙标志函数voidwrite_cmd(charcmd);//写命令函数voidwrite_data(uchardat);//写数据函数voidwrite_str(uchar*str);//写字符串函数voidlcd_init();//初始化1602/************************主函数******************************/voidmain(){ ucharn=0;//行标志位 lcd_init();write_cmd(0x80);while(1){ keyscan();//按键扫描,获取key的值if(key!=16) {if(n==16)write_cmd(0xc0);//换行 delay(500);//为了让它就显示一次! write_data(xs[key]);//显示 n++; key=16;//按键检测标志位复位 if(n==33)//设置为溢出清零 { lcd_init();write_cmd(0x80); n=0;} }}}/********************延时函数,延时一毫秒************************/voiddelay(uintz){ uintx,y; for(x=112;x>0;x--) for(y=z;y>0;y--);}/**********************检查忙标志函数************************/voidcheck_busy(void){uchardt; do { dt=0xff; lcden=0; lcdrs=0; lcdrw=1; lcden=1; dt=out; }while(dt&0x80); lcden=0;}/*************************写命令函数****************************/voidwrite_cmd(charcmd){ check_busy(); lcden=0;//再把EN拉低 lcdrs=0; lcdrw=0;//先将RW拉低 out=cmd; lcden=1; delay(1); lcden=0; delay(1);}/*************************写数据函数****************************/voidwrite_data(uchardat)//{ check_busy(); lcden=0;//再把EN拉低 lcdrs=1; lcdrw=0;//先将RW拉低 out=dat; lcden=1; delay(1); lcden=0; delay(1);}/************************写字符串函数**************************/voidwrite_str(uchar*str){while(*str!='\0')//字符串的一个字符不等于'0',说明没到字符串的最后一//个字符,执行while循环,若等于'0',则退出while循环 { write_data(*str++);//输出字符串,指针增1 delay(5); }}/***************************初始化******************************/voidlcd_init(){ write_cmd(0x38);//显示模式设置 write_cmd(0x0c);//显示开关,光标没有闪烁 write_cmd(0x06);//显示光标移动设置 write_cmd(0x01);//清除屏幕 delay(1);}voidkeyscan(){uchartemp;P1=0xff;//先向P1写1 P1=0xfe;//选中按键第一行 temp=P1; //把P1给中间变量 temp=temp&0xf0;//低四位清零 while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp) { case0xee:key=0;break; case0xde:key=1;break; case0xbe:key=2;break; case0x7e:key=3;break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xfd;//选中按键第二行 temp=P1; //把P1给中间变量 temp=temp&0xf0;//低四位清零 while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp) { case0xed:key=4;break; case0xdd:key=5;break; case0xbd:key=6;break; case0x7d:key=7;break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xfb;//选中按键第三行 temp=P1; //把P1给中间变量 temp=temp&0xf0;//低四位清零 while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp) { case0xeb:key=8;break; case0xdb:key=9;break; case0xbb:key=10;break; case0x7b:key=11;break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } }} P1=0xf7;//选中按键第四行 temp=P1; //把P1给中间变量 temp=temp&0xf0;//低四位清零 while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){ case0xe7:key=12;break; case0xd7:key=13;break; case0xb7:key=14;break; case0x77:key=15;break; } while(temp!=0xf0)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论