51系列单片机程序的设计说明
- 格式:ppt
- 大小:2.09 MB
- 文档页数:88
一、填空题1、指令格式是由操作码和操作数所组成,也可能仅由操作码组成。
2、若用传送指令访问MCS-51的程序存储器,它的操作码助记符应为 MOVC 。
3、若用传送指令访问MCS-51的片内数据存储器,它的操作码助记符应为 MOV 。
4、若访问MCS-51的片外数据存储器,它的操作码助记符应为 MOVX 。
5、累加器(A)=80H,执行完指令ADD A,#83H后,进位位C= 1 。
6、执行ANL A,#0FH指令后,累加器A的高4位= 0000 。
7、JZ rel的操作码地址为1000H,rel=20H,它的转移目的地址为 1022H 。
8、JBC 00H,rel 操作码的地址为2000H,rel=70H,它的转移目的地址为 2073H 。
9、累加器(A)=7EH,(20H)= #04H,MCS-51执行完ADD A,20H指令后PSW.0= 0 。
10、MOV PSW,#10H是将MCS-51的工作寄存器置为第 2 组。
11、指令LCALL 37B0H,首地址在2000H,所完成的操作是 2003H 入栈,37B0H →PC。
12、MOVX A,@DPTR源操作数寻址方式为寄存器间接寻址。
13、ORL A,#0F0H是将A的高4位置1,而低4位保持不变。
14、SJMP rel的指令操作码地址为0050H,rel=65H,那么它的转移目标地址为00B7H 。
15、设DPTR=2000H,(A)=80H,则MOVC A,@A+DPTR的操作数的实际地址为 2080H 。
16、MOV C,20H源寻址方式为位寻址。
17、在直接寻址方式中,只能使用 8 位二进制数作为直接地址,因此其寻址对象只限于片内RAM 。
18、在寄存器间接寻址方式中,其“间接”体现在指令中寄存器的内容不是操作数,而是操作数的地址。
19、在变址寻址方式中,以 A 作变址寄存器,以 PC 或 DPTR 作基址寄存器。
20、假定累加器A中的内容为30H,执行指令1000H:MOVC A,@A+PC后,把程序存储器 1031H 单元的内容送入累加器A中。
51单片机:LED灯亮灯灭程序设计1.功能说明:控制单片机P1端口输出,使P1.0位所接的LED点亮,其他7只灯熄灭。
程序:01: MOV A , #11111110B ; 存入欲显示灯的位置数据02: MOV P1,A ; 点亮第一只灯03: JMP $ ; 保持当前的输出状态04: END ; 程序结束2.功能说明:单片机P1端口接8只LED,点亮第1、3、4、6、7、8只灯。
程序:01:START: MOV A , #00010010B ; 存入欲显示灯的位置数据02:MOV P1,A ; 点亮灯03:JMP START ; 重新设定显示值04:END ; 程序结束3.功能说明:单片机P1端口接8只LED,每次点亮一只,向左移动点亮,重复循环。
程序:01:START: MOV R0, #8 ;设左移8次02:MOV A, #11111110B ;存入开始点亮灯位置03:LOOP: MOV P1, A ;传送到P1并输出04:RL A ;左移一位05:DJNZ R0, LOOP ;判断移动次数06:JMP START ;重新设定显示值07:END ;程序结束4.功能说明:单片机P1端口接8只LED,每次点亮一只,向右移动点亮,重复循环。
程序:01:START: MOV R0, #8 ;设右移8次02:MOV A, #01111111B ;存入开始点亮灯位置03: LOOP: MOV P1, A ;传送到P1并输出04: ACALL DELAY ;调延时子程序05: RR A ;右移一位06: DJNZ R0, LOOP ;判断移动次数07: JMP START ;重新设定显示值08: DELAY: MOV R5,#50 ;09:DLY1: MOV R6,#100 ;10: DLY2: MOV R7,#100 ;11: DJNZ R7,$ ;12: DJNZ R6,DLY2 ;13: DJNZ R5,DLY1 ;14: RET ;子程序返回15:END ;程序结束5.功能说明:单片机P1端口接8只LED,每次点亮一只,先把右边的第一只点亮,0.5秒后点亮右数的第二只灯,第一只熄灭,再过0.5秒点亮右数的第三只灯,第二只熄灭,…亮灯按此顺序由右向左移动。
十字路口交通灯控制系统的设计1.设计思路近年来,随着科技的飞速发展,电子器件也随之广泛应用,其中单片机也不断深入人民的生活当中。
本模拟交通灯系统利用单片机AT89C51作为核心元件,实现了通过信号灯对路面状况的智能控制。
从一定程度上解决了交通路口堵塞、车辆停车等待时间不合理、急车强通等问题。
系统具有结构简单、可靠性高、成本低、实时性好、安装维护方便等优点,有广泛的应用前景。
本模拟系统由单片机硬/软件系统,两位8段数码管和LED灯显示系统。
和复位电路控制电路等组成,较好的模拟了交通路面的控制。
1.1 电源提供方案采用单片机控制模块提供电源。
1.2显示界面方案采用数码管显示。
这种方案只显示有限的符号和数码字符,简单,方便。
1.3 输入方案:直接在I/O口线上接上按键开关。
由于该系统对于交通灯及数码管的控制,只用单片机本身的I/O 口就可实现,且本身的计数器及RAM已经够用,故选择该方案。
2 单片机交通控制系统总体设计2.1单片机交通控制系统的通行方案设计设在十字路口,分为东西向和南北向,在任一时刻只有一个方向通行,另一方向禁行,持续一定时间,经过短暂的过渡时间,将通行禁行方向对换。
一共可以有四个状态。
通过具体的路口交通灯状态的分析我们可以把这四个状态归纳如下:(1)东西方向红灯灭,同时绿灯亮,南北方向黄灯灭,同时红灯亮,倒计时80秒。
此状态下,东西向禁止通行,南北向允许通行。
(2)东西方向绿灯灭,同时黄灯亮,南北方向红灯亮,倒计时3秒。
此状态下,除了已经正在通行中的其他所以车辆都需等待状态转换。
(3)南北方向红灯灭,同时绿灯亮,东西方向黄灯灭,同时红灯亮,倒计时60秒。
此状态下,东西向允许通行,南北向禁止通行。
(4)南北方向绿灯灭,同时黄灯亮,东西方向红灯亮,倒计时3秒。
此状态下,除了已经正在通行中的其他所以车辆都需等待状态转换。
用图表表示灯状态和行止状态的关系如下:表1交通状态及红绿灯状态灯禁止通行,转绿灯允许通行,之后黄灯亮警告行止状态将变换。
烟台大学51单片机课程设计说明书课题:八路抢答器学生姓名:王志林学号:2院系:机电汽车工程学院指导老师:姜风国同组成员:张凤礼、张体栋、程事业、范光科2013 年 06 月 05 日目录1 设计任务 (2)2 系统总体方案 (2)3 硬件设计 (3)3.1 控制系统所需硬件 (3)3.2 硬件原理介绍 (4)4 软件设计 (6)4.1 软件总体设计 (6)4.2 程序流程图 (7)5 软件仿真...................................................................................... (9)5.1 Keil软件 (9)5.2在Proteus软件 (9)6小结 (10)附1:源程序代码 (11)附2:参考文献 (18)1 .设计任务本设计要求学生结合现有的实际条件,以51单片机为控制核心,设计一个8路智能抢答器。
要求实现以下功能:1) 有一主持人和8个参赛队员2) 当主持人按下抢答按键,参赛队员在10秒内可以抢答,并且抢答器开始倒计时。
剩余5秒时,如果仍无人抢答,则系统每1s报警一次。
如超出10秒则不能抢答;如抢答成功,则显示抢答队号。
3) 抢答成功则需在60秒内回答完成,如超出时间则抢答无效,显示无效指示。
如果60秒完成回答,则抢答成功,显示有效。
剩余5秒时,如果仍无人回答,则系统每1s报警一次。
4) 当主持人按下复位键时,系统回到初始状态。
5) 倒计时期间,如果主持人想终止倒计时,可以按下“停止”按键,系统会自动进入准备状态。
主要硬件设备:AT89C51单片机,8输入3态缓冲器/线驱动器74LS244,六反相驱动器7404,共阳极LED数码管等,12MHZ晶振,74LS04反相器,手动开关,按键若干,报警喇叭。
2.系统总体方案2.1整体方案设计该智能抢答器以AT89C51单片机为控制核心,控制精度较高,操作误差主要来自晶振自身所造成的误差。
单片机C语言程序设计:INT0 中断计数来源:21ic作者:关键字:INT0单片机C语言程序设计/* 名称:INT0 中断计数说明:每次按下计数键时触发INT0 中断,中断程序累加计数,计数值显示在 3 只数码管上,按下清零键时数码管清零*/#include<reg51.h>#define uchar unsigned char#define uint unsigned int//0~9 的段码uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f ,0x6f,0x00};//计数值分解后各个待显示的数位uchar DSY_Buffer[]={0,0,0};uchar Count=0;sbit Clear_Key=P3^6;//数码管上显示计数值void Show_Count_ON_DSY(){DSY_Buffer[2]=Count/100; //获取3 个数DSY_Buffer[1]=Count%100/10;DSY_Buffer[0]=Count%10;if(DSY_Buffer[2]==0) //高位为0 时不显示{DSY_Buffer[2]=0x0a;if(DSY_Buffer[1]==0) //高位为0,若第二位为0 同样不显示DSY_Buffer[1]=0x0a;}P0=DSY_CODE[DSY_Buffer[0]];P1=DSY_CODE[DSY_Buffer[1]];P2=DSY_CODE[DSY_Buffer[2]];}//主程序void main(){P0=0x00;P1=0x00;P2=0x00;IE=0x81; //允许INT0 中断IT0=1; //下降沿触发while(1){if(Clear_Key==0) Count=0; //清0Show_Count_ON_DSY();}}//INT0 中断函数void EX_INT0() interrupt 0{Count++; 计数值递增}单片机C语言程序设计:INT0 及 INT1 中断计数来源:21ic作者:关键字:INT0INT1单片机C语言/* 名称:INT0 及INT1 中断计数说明:每次按下第 1 个计数键时,第 1 组计数值累加并显示在右边3 只数码管上,每次按下第 2 个计数键时,第2 组计数值累加并显示在左边3 只数码管上,后两个按键分别清零。
计算机硬件技术基础(MCS-51单片机原理及应用)综合实验报告书学院:能环学院班级:热能073设计人:王治博学号: 070662同组人:李超学号:070650一、题目:全自动洗衣机二、目的与要求:1.目的:1.进一步加深对MCS-51单片机内部结构和程序设计方法的理解。
2.提高综合运用MCS-51单片机的软硬件进行程序设计的能力。
2.基本要求:(1)要求使用面向对象和结构化程序设计的编程思路。
(2)学校的刷卡式全自动洗衣机给同学们的生活带来了很大便利,现利用MCS—51单片机,通过延时、定时、中断等操作实现全自动洗衣机工作过程的模拟控制。
3.设计说明:运用了中断,延时等来模拟全自动洗衣机工作的全过程,用指示的点亮,熄灭来表示洗衣机的正转反转及开盖,刷卡,注水,脱水等全部过程。
三、设计方法和基本原理:1.问题描述:分析全自动洗衣机的工作过程:接通电源后,打开洗衣机盖子放入衣物和洗衣粉,盖上盖子。
通过刷卡启动注水,利用外部中断0模拟注水达标志位,停止注水并开始洗衣。
洗衣过程为:正转10秒(利用延时实现),间歇4秒,然后反转10秒,间歇4秒,再正转(这里认为已洗静),然后开始排水,同样利用延时模拟排水达标志位,排水结束,如此循环往复3次(注水—洗涤—排水过程),认为洗衣过程结束。
然后开始脱水操作,利用定时器,定时时间到,打开洗衣机盖子取出衣物,等待下一次刷卡,即下一次洗衣任务。
试验中用各指示灯的亮灭来表示洗衣过各环节的相应状态。
2.涉及到的硬件:LED指示灯3.流程图四、程序清单:ORG 8000HLJMP MAINORG 8003HLJMP INTT0ORG 800BHLJMP TOS0MAIN: CLR P1.7 ;电源指示灯亮WAIT:JB P3.1,W AIT ;等待刷卡MOV SP,#5FHSETB EA ;允许cup中断SETB EX0 ; 允许外部中断SETB IT0 ;令外部中断为边沿触发SETB ET0 ;开启T/C0中断SETB PX0 ;令T/C0中断优先MOV TMOD,#01H ;置T/C0为方式1,定时MOV TH0,#4CH ;送定时初值MOV TL0,#00HMOV R2,#00HMOV R1,#03H ;重复3次YY:CLR P1.1 ; 注水灯亮,开始注水SETB PSW.5FF:JNB F0,FF0 ;等待注水达标SJMP FFFF0:CLR P1.3 ;开始正转MOV 40H,#0AHFF1:LCALL DELAYDJNZ 40H,FF1SETB P1.3CLR P1.2 ;间歇MOV 41H,#04HFF2:LCALL DELAYDJNZ 41H,FF2SETB P1.2CLR P1.4 ;开始反转MOV 42H,#0AHFF3:LCALL DELAYDJNZ 42H,FF3SETB P1.4CLR P1.6 ;排水灯亮,开始排水MOV 43H,#03HFF4:LCALL DELAYDJNZ 43H,FF4SETB P1.6 ;排水结束DJNZ R1,YY ; 检验是否继续洗衣FF5:CLR P1.5 ;开始脱水SETB TR0 ;启动T/C0 HERE:SJMP HERETOS0:MOV TMOD,#01HMOV TH0,#4CHMOV TL0,#00HINC R2CJNE R2,#200,NEXTMOV R2,#00HCLR TR0SETB P1.5LJMP MAINNEXT:RETIINTT0:CLR F0SETB P1.1RETIDELAY:MOV R5,#92 ;延时子程序DELY:MOV R7,#35DEL1:MOV R6,#120DEL2:DJNZ R6,DEL2DJNZ R7,DEL1DJNZ R5,DEL YRETEND五.程序调试:(1)将所编写的程序在WIN51文件下进行编译,看是否有错误出现,根据编译提示进行修改,进行编译,如果还不能达到要求的结果,继续进行修改,直到所编写的程序0个错误0个警告。
第一章单片机系统板说明一、概述单片机实验开发系统是一种多功能、高配置、高品质的MCS-51单片机教学与开发设备。
适用于大学本科单片机教学、课程设计和毕业设计以及电子设计比赛。
该系统采用模块化设计思想,减小了系统面积,同时增加了可靠性,使得单片机实验开发系统能满足从简单的数字电路实验到复杂的数字系统设计实验,并能一直延伸到综合电子设计等创新性实验项目。
该系统采用集成稳压电源供电,使电源系统的稳定性大大提高,同时又具备完备的保护措施。
为适应市场上多种单片机器件的应用,该系统采用“单片机板+外围扩展板”结构,通过更换不同外围扩展板,可实验不同的单片机功能,适应了各院校不同的教学需求。
二、单片机板简介本实验系统因为自带了MCS-51单片机系统,因此没有配置其他单片机板,但可以根据教学需要随时配置。
以单片机板为母板,并且有I/O接口引出,可以很方便的完成所有实验。
因此构成单片机实验系统。
1、主要技术参数(1)MSC-51单片机板板上配有ATMEL公司的STC89C51芯片。
STC89C51资源:32个I/O口;封装DIP40。
STC89C51开发软件:KEIL C51。
2、MSC-51单片机结构(1)单片机板中央放置一块可插拔的DIP封装的STC89C51芯片。
(2)单片机板左上侧有一个串口,用于下载程序。
(3)单片机板的四周是所有I/O引脚的插孔,旁边标有I/0引脚的脚引。
(4)单片机板与各个模块配合使用时,可形成—个完整的实验系统。
三、母板简介主要技术参数(1)实验系统电源实验系统内置了集成稳压电源,使整个电源具有短路保护、过流保护功能,提高了实验的稳定性。
主板的右上角为电源总开关,当把220V交流电源线插入主板后,打开电源开关,主板得电工作。
为适用多种需要,配置了+5V,+12V,—5V电压供主板和外设需要,通过右上角的插针排和插孔输出到外设。
此外,还设有螺旋保险插孔保护实验箱。
(2)RS232接口RS232接口通过MAX232芯片实现与计算机的串行通讯,通过接口引出信号。
51单片机原理及应用51单片机是一种常见的微控制器,以其高性能和广泛应用而受到广大工程师的青睐。
本文将介绍51单片机的原理和应用。
51单片机的原理可以从其硬件结构和工作流程两方面来讲解。
首先是硬件结构。
51单片机包括中央处理器(CPU),存储器(包括存储器管理单元、内部RAM和ROM),输入/输出端口(I/O口),定时器/计数器,串行通信接口等。
CPU是整个系统的核心,负责指令的执行和数据的处理。
存储器用于存储程序和数据,其中ROM存储程序代码,RAM用于暂存数据。
I/O口用于与外部设备进行信息交互。
定时器/计数器用于产生精确的时间延迟和计数操作。
串行通信接口用于与其他设备进行数据传输。
其次是工作流程。
51单片机的工作流程一般包括初始化、输入/输出控制和运算处理三个阶段。
初始化阶段主要是对各个模块的配置和初始化,例如设置时钟频率、串口波特率等。
输入/输出控制阶段通过读取输入设备(如按键、传感器等)的状态,控制外部设备(如LED灯、马达等)的状态。
运算处理阶段通过执行指令,对数据进行处理和计算。
至于应用方面,51单片机具有广泛的应用领域。
主要应用包括控制系统、嵌入式系统、通信系统、工业自动化等。
在控制系统中,51单片机可以用于控制家电、机器人、机械设备等。
在嵌入式系统中,51单片机可以应用于智能家居、智能交通、智能仪表等。
在通信系统中,51单片机可以用于电话、网络和无线通信设备等。
在工业自动化中,51单片机可以用于工厂生产线控制、仪器仪表控制等。
总结起来,51单片机的原理和应用都是非常重要的。
通过了解其硬件结构和工作流程,可以更好地理解其工作原理。
而了解其应用领域,则可以为工程师在实际项目中的选择和设计提供参考。
什么是堆栈?MCS-51单片机的堆栈怎样设置的?答:程序设计时,往往需要一个后进先出的RAM区,以保存CPU的现场。
这种后进先出的缓冲区,就称为堆栈。
MCS-51单片的堆栈原则上设在内部RAM的任意区域内。
但是,一般设在31H~7FH的范围之间,栈顶的位置由栈指针SP指出。
51单片机堆栈操作指令举例说明时间:2009-03-02 18:46来源:未知作者:牛牛点击:149次这4类指令的作用是把直接寻址单元的内容传送到堆栈指针SP所指的单元中,以及把SP 所指单元的内容送到直接寻址单元中。
这类指令只有两条,下述的第一条常称为入栈操作指令,第二条称为出栈操作指令。
需要指出的是,单片机开机复位后,(SP)默认为07H,但一般都需要重新赋值,设置新的SP首址。
入栈的第一个数据必须存放于SP+1所指存储单元,故实际的堆栈底为SP+1所指的存储单元。
堆栈操作指令有两条: PUSH direct POP direct 第一条指令称之为推入,就是将direct中的内容送入堆栈中,第二条指令称之为弹出,就是将堆栈中的内容送回到direct中。
推入指令的执行过程是,首先将SP中的值加1,然后把SP 中的值当作地址,将direct中的值送进以堆栈操作指令有两条:PUSH directPOP direct第一条指令称之为推入,就是将direct中的内容送入堆栈中,第二条指令称之为弹出,就是将堆栈中的内容送回到direct中。
推入指令的执行过程是,首先将SP中的值加1,然后把SP中的值当作地址,将direct中的值送进以SP中的值为地址的RAM单元中。
例:MOV SP,#5FHMOV A,#100MOV B,#20PUSH ACCPUSH B则执行第一条PUSH ACC指令是这样的:将SP中的值加1,即变为60H,然后将A中的值送到60H单元中,因此执行完本条指令后,内存60H单元的值就是100,同样,执行PUSH B时,是将SP+1,即变为61H,然后将B中的值送入到61H单元中,即执行完本条指令后,61H单元中的值变为20。
使用说明书一、简介1.Embeded51Embeded51开发板采用国内常用的 51核心、管脚兼容的STC单片机,单板上即可实现烧写、调试、开发。
同时我们加入了一些基本入门模块比如:数码管显示、LED、掉电存储器、继电器等,目的是启发初学者,带领大家走入嵌入式开发殿堂!当然此板的功能绝对不局限于此。
本着开放的原则,我们开放了所有的 IO口和关键信号管脚,板上原有占用资源可以通过短路帽插拔轻松释放,大家可以发挥自己的想象和动手能力,在我们的基础平台上扩充自己的模块,打造属于自己的开发平台。
如果您能够在Embeded51平台上有所得,我们将会感到无比的欣慰与自豪!另外,我们也欢迎大家对现有平台提出改进建议。
2.试验内容板载资源试验● I/O口输入输出● LED实验●按键实验●单片机内部定时器操作●中断实验●串口通讯●继电器实验●掉电存储器实验●数码管动态扫描显示通过板载的开放 I/O口,您还可以自己扩展:RTC、温度传感器、LCD、蓝牙通讯、超声波、红外、电机驱动等等,只要你想一切皆有可能!二、板卡说明1. 板卡框架及功能说明⑴继电器模块⑵ USB-RS232转换(下载、串口通讯)⑶掉电存储器⑷按键⑸四位数码管显示(共阴数码管)⑹板载资源选择⑺单片机(51核心、管脚兼容、功能兼容)⑻端口开放区⑼端口开放区⑽板卡供电(USB、电源适配器可选)⑾电源开关⑿ LED2. 接口说明1.1供电板卡提供 USB供电和电源适配器 2种方式,电源输入 DC5V,USB接口既提供了电源同时也作为通讯口。
电源开关负责电源通断,电源指示灯指示板卡是否在有电状态。
1.2扩展口经典 51核心单片机提供四组 32个 I/O口,板卡上将这四组 32个端口全部开放出来,为您提供稳定、方便的单片机开发基础系统,您可以插上想象的翅膀扩展您想要的任何模块。
1.3继电器接口接口采用 5.08工业插头,提供弱电控制强电的功能。
1.4跳线区板载基本功能模块可以通过短路帽选择是否连通,基础实验时可以选择连通,方便验证试验结果,以后可以拔去短路帽自己扩展想要的功能模块。
51单片机最小系统原理图51单片机是一种常用的微控制器,它具有体积小、功耗低、性能稳定等特点,因此在嵌入式系统中得到了广泛的应用。
而要搭建一个完整的嵌入式系统,首先需要设计并搭建一个最小系统,本文将介绍51单片机最小系统的原理图设计。
首先,我们需要明确51单片机最小系统的组成部分。
一个完整的最小系统包括51单片机、晶振、复位电路、电源电路、下载电路等几个基本部分。
其中,晶振是单片机工作的时钟信号源,复位电路用于单片机的复位控制,电源电路提供单片机所需的电源,下载电路用于单片机的程序下载。
其次,我们需要根据这几个基本部分设计出相应的原理图。
首先是晶振电路,一般使用的是12MHz的晶振,其原理图是将晶振的两端分别连接到单片机的晶振输入引脚和晶振输出引脚。
接下来是复位电路,复位电路一般由一个电阻和一个电容组成,其原理是通过电容的充放电来实现单片机的复位控制。
然后是电源电路,电源电路一般包括稳压电路和滤波电路,其原理是通过稳压电路将输入的电压稳定在单片机所需的工作电压范围内,并通过滤波电路去除电源中的杂波。
最后是下载电路,下载电路一般由一个串口电平转换芯片和一个串口接口组成,其原理是通过串口电平转换芯片将电脑串口的TTL电平转换成单片机所需的电平,并通过串口接口与单片机相连接。
最后,我们需要将这几个部分的原理图进行整合,设计出完整的51单片机最小系统原理图。
在设计原理图时,需要注意各个部分之间的连接关系,以及引脚的连接方式。
同时,还需要考虑到原理图的布局和美观性,尽量使得原理图清晰易懂,方便后续的调试和维护工作。
总的来说,设计51单片机最小系统原理图是搭建一个完整嵌入式系统的第一步,它直接关系到后续系统的稳定性和可靠性。
因此,在设计原理图时需要认真对待,确保各个部分的连接正确,电路设计合理,从而为后续的系统开发奠定良好的基础。
希望本文的介绍能够对大家有所帮助,谢谢阅读。
51接PS2键盘2008-09-20 16:02在这个周末,终于有时间做做试验了。
昨晚用AVR和MC9S12DG128驱动1602成功,今天突然想到PS2键盘的驱动,当时觉得PS2键盘与MCU接口很神秘,做了之后才觉得其实不然哈。
再传张键盘的扫描码的波形。
(协议规定:数据低位在前,采用奇校验数据格式(PS->MCU):1起始位为0,8数据位,1奇校验位,1停止位为1)'A'键(0x1C)的make code:代码:PS_2_KB.H//************write by zhouyong********* //************qq:510559254************** //************2008-9-20*****************#ifndef _PS_2_KB_H#define _PS_2_KB_H#include <AT89X51.H>#define KB_CLK P3_3#define KB_DATA P3_4uchar Get_Key(void);uchar Key_Scan(void);uchar Key_Scan(void){uchar i,key_temp;KB_CLK=1; //输入KB_DATA=1;key_temp=0;while(KB_CLK); //第一次为0for(i=0;i<8;i++){key_temp>>=1;while(!KB_CLK); //下沿,第一位while(KB_CLK);_nop_();if(KB_DATA){key_temp|=0x80; //低位在前}}while(!KB_CLK); //校验位while(KB_CLK);while(!KB_CLK); //停止位while(KB_CLK);while(!KB_CLK);return key_temp;}//由于make_code和第二个break_code一样,就取break_code第二个作为键码uchar Get_Key(void){uchar Key_Code;Key_Code=Key_Scan(); //make_codeKey_Code=Key_Scan(); //break_code 1Key_Code=Key_Scan(); //break_code 2switch(Key_Code){case 0x1c: return 'A';break;case 0x32: return 'B';break;case 0x21: return 'C';break;case 0x23: return 'D';break;case 0x24: return 'E';break;case 0x2b: return 'F';break;case 0x34: return 'G';break;case 0x33: return 'H';break;case 0x43: return 'I';break;case 0x3b: return 'J';break;case 0x42: return 'K';break;case 0x4b: return 'L';break;case 0x3a: return 'M';break;case 0x31: return 'N';break;case 0x44: return 'O';break;case 0x4d: return 'P';break;case 0x15: return 'Q';break;case 0x2d: return 'R';break;case 0x1b: return 'S';break;case 0x2c: return 'T';break;case 0x3c: return 'U';break;case 0x2a: return 'V';break;case 0x1d: return 'W';break;case 0x22: return 'X';break;case 0x35: return 'Y';break;case 0x1a: return 'Z';break;case 0x45: return '0';break;case 0x16: return '1';break;case 0x1e: return '2';break;case 0x26: return '3';break;case 0x25: return '4';break;case 0x2e: return '5';break;case 0x36: return '6';break;case 0x3d: return '7';break;case 0x3e: return '8';break;case 0x46: return '9';break;default: return 0xff; break;}}#endifLCD1602.H://************write by zhouyong*********//************qq:510559254**************//************2008-9-14*****************#ifndef _LCD1602_#define _LCD1602_#include <AT89X51.H>#include <string.h>#include <intrins.h>//--------------------------------------------------------------------#define E_1602 P3_7 //on falling edge enable data or command #define RW_1602 P3_6 //read or write control#define RS_1602 P3_5 //cmd or data register select#define DATA_1602 P2 //data port#define DATA 1 //select DATA register#define CMD 0 //select CMD register#define READ 1#define WRITE 0//--------------------------------------------------------------- void Delay_us(uchar t);void Delay_ms(uchar t);void Init_1602(void);void Write_Char_1602(uchar Data,bit CMD_DATA,bit Check);void Check_Busy_1602(void);void Write_String_1602(uchar *P);void Set_R_C(uchar R,uchar C);//void Clear_LCD_1602(void);//---------------------------------------------------------------- /*void Clear_LCD_1602(void){Write_Char_1602(0x01,CMD,1);//clear screen}*/void Delay_us_1602(uchar t){while(--t);}void Delay_ms_1602(uchar t){while(t--){Delay_us_1602(225);Delay_us_1602(227);}}void Init_1602(void){Delay_ms_1602(15);Write_Char_1602(0x38,CMD,0); //don't check busyDelay_ms_1602(5);Write_Char_1602(0x38,CMD,0);Delay_ms_1602(5);Write_Char_1602(0x38,CMD,0);Write_Char_1602(0x38,CMD,1);//8 wire,2 line display,5x10 charWrite_Char_1602(0x08,CMD,1);//close display,no cursor,don't blink Write_Char_1602(0x01,CMD,1);//clear screenWrite_Char_1602(0x06,CMD,1);//the cursor move from left to right,the text don't moveWrite_Char_1602(0x0c,CMD,1);//open display}void Write_Char_1602(uchar Data,bit CMD_DATA,bit Check){if(Check)Check_Busy_1602();RS_1602=CMD_DATA;RW_1602=WRITE;DATA_1602=Data;E_1602=1;_nop_();E_1602=0;}void Write_String_1602(uchar *P) //only can write from start to end {uchar i,len;len=strlen(P);Set_R_C(0,0);if(len>16){for(i=0;i<16;i++){Write_Char_1602(P[i],DATA,1);}Set_R_C(1,0);for(i=16;i<len;i++){Write_Char_1602(P[i],DATA,1);}}else{for(i=0;i<len;i++){Write_Char_1602(P[i],DATA,1);}}}void Set_R_C(uchar R,uchar C) //set row and column R=0/1;C=0~F {R&=0x01;C&=0x0f;if(R)Write_Char_1602(0x80+0x40+C,CMD,1);elseWrite_Char_1602(0x80+C,CMD,1);}void Check_Busy_1602(void){DATA_1602=0xff; //set as input portRS_1602=CMD;RW_1602=READ;E_1602=1;while(DATA_1602 & 0x80){E_1602=0; //这两句protues仿真必须加E_1602=1; //}E_1602=0;}#endifmain.c:#include <AT89X51.H>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#include "PS_2_KB.h"#include "LCD1602.h"void main(void){ucharBuffer[]="";uchar Key_Code,Key_Count,i;Init_1602();Set_R_C(0,0);for(;;){Key_Code=Get_Key();if(Key_Code!=0xff) // 为0xff时视为无效键{Buffer[Key_Count]=Key_Code;Write_String_1602(Buffer);Key_Code=0;Key_Count++; //第n次按键,显示在第n位if(Key_Count==32){for(i=0;i<32;i++){Buffer[i]=' ';}Key_Count=0;}P1=~P1; //P1口接有LED,用于指示按键 }}}。
基于51单片机的简易计算器设计设计一个基于51单片机的简易计算器,主要功能包括加减乘除四则运算和百分数计算。
下面是设计的详细步骤:1.硬件设计:-使用51单片机作为主控芯片。
-连接16x2的LCD显示屏,用于显示输入和计算结果。
-连接16个按键开关,用于输入运算符和数字。
-连接4个LED灯,用于指示四则运算的选择。
2.软件设计:-初始化LCD显示屏,并显示欢迎信息。
-监听按键输入,在接收到输入后,根据输入的按键值判断操作类型。
-如果按键值对应数字键,保存输入的数字,并在LCD上显示当前输入的数字。
-如果按键值对应四则运算符(+、-、*、/),保存当前输入的数字,并保存运算符。
-如果按键值对应等号(=),根据保存的数字和运算符进行相应的运算,计算结果保存并显示在LCD上。
-如果按键值对应清零(C),将所有保存的数据清空,并显示初始状态。
-如果按键值对应百分号(%),将当前数字除以100并显示在LCD上。
3.主要函数说明:- void init_lcd(:初始化LCD显示屏。
- void display_lcd(char* str):将指定字符串显示在LCD上。
- void clear_lcd(:清空LCD显示屏。
- char get_key(:获取按键输入的值。
- void calculate(:根据保存的数字和运算符进行计算。
- void add_digit(char digit):将输入的数字添加到当前数字中。
- void set_operator(char op):保存运算符。
- void clear_data(:清空所有保存的数据。
4.主要流程:-初始化LCD显示屏并显示欢迎信息。
-在循环中监听按键输入,并根据输入的按键值进行相应的操作。
-根据不同的按键值,调用不同的函数进行处理。
-最后计算结果显示在LCD上。
以上是基于51单片机的简易计算器设计的详细步骤和主要函数说明。
你可以根据这个设计框架进行具体的代码实现。