用单片机语言设计16位加法计算器实验报告概要
十六进制加减计数器实验报告

本科生实验报告十六进制加减计数器电路实验专业名称:课程名称:数据逻辑与EDA指导教师:学生学号:学生姓名:二○一九年十一月1、实验目的1.1了解时序逻辑电路的基本功能1.2掌握时序逻辑电路的设计方法1.3熟悉时序逻辑电路的工作过程2、实验原理2.1定义:在逻辑电路中,任何时刻的稳定输出不仅取决于该时刻的输入,且与过去的输入相关。
2.2类型:边沿触发器、电平触发器、加法计数器、减法计数器、可逆计数器、序列检测器、采样控制器等。
3、实验设备:3.1 PC机3.2 教学实验箱3.3 通信线4、实验内容:4.1任务:设计一个两位16进制加减可逆的计数器,具有内部脉冲和手动计数功能,结果在7段数码管上显示。
4.2接线:(1)用插线连接插孔24,32,25到实验台的1HZ,10HZ和100HZ上,作为CLK1HZ,CLK10HZ,CLK100kHZ,三个频率的输入端;(2)用插线将实验台上的6个数码管的七段码a-h连接到插孔40,41,42,43,44,45,47,48上,作为七段码输出端;(3)七段数码管的位码S(0)-S(5)接到实验台的插孔51,52,53,55,57,58上,作为七段码位码输出端;(4)实验台上的开关K0接到插孔26上,作为en的输入开关。
en=1时手动,en=0时为自动;(5)手动脉冲按键din接单脉冲,然后接在28脚上输入;(6)复位键rst接K1开关连接在27脚输入;(7)加减控制键rev接K2开关连接在31脚输入4.3硬件描述语言源代码:module cnt(clk100khz,clk1hz,clk10hz,rst,en,din,scan,dout,rev);input rst;//复位键input rev;//加减控制器input en;//手动或自动计数开关input din;//手动计数脉冲input clk100khz,clk1hz,clk10hz;//分别为数码管刷新,自动计数,手动计数频率output[7:0]dout;//数码管七段码output[5:0]scan;//数码管位码reg[7:0]dout;reg[5:0]scan;reg f1,f2,c;//数码管个位和十位敏感信号;c为手动计数参数reg[2:0]cnt;//数码管扫描参数reg[3:0]dat;//数码管位码扫描参数reg[3:0]data1,data2;//个位和十位计数参数always@(posedge clk10hz) //设置自动计数和手动计数begin if(!din) c<=1; //din为1时,c=0;din为0时,c=1。
16位全加器

四川理工大学课程设计任务书设计题目:采用门电路设计一个16位的全加器电路院系:计算机学院专业:计算机科学与技术班级:2008级6班指导教师:朱文忠学生姓名:赵******************目录:一引言 (1)1.1 设计背景 (1)1.2 设计分工 (1)二设计目的 (2)2.1 设计目的 (2)2.2 设计内容 (2)三设计过程 (2)3.1 硬件方案 (2)3.1.1 一位全加器的原理及设计 (2)3.1.2 四位全加器的原理及设计 (4)3.1.3 十六位全加器的原理及设计 (7)3.2 软件方案 (9)3.3 可行性论证 (13)3.4 结论 (15)四参考文献 (16)引言1. 设计背景随着计算机科学技术的发展,人们获得信息的途径更加多样,获取信息的速度更加快捷。
硬件的发展允许程序员编出很多精彩的使用软件,也使得计算机更加普及。
中央处理器CP U的好坏是影响和制约计算机速度和性能的关键因素。
而加法器是组成C PU的的重要部件,一般运算速度的快慢就取决与每秒执行加法的次数,加法器是算术逻辑单元中的基本逻辑器件。
例如:为了节省资源,减法器和硬件乘法器都可由加法器来构成。
但宽位加法器的设计是很耗费资源的,因此在实际的设计和相关系统的开发中需要注意资源的利用率和进位速度等两方面的问题。
多位加法器的构成有两种方式:并行进位和串行进位方式。
并行进位加法器设有并行进位产生逻辑,运算速度快;串行进位方式是将全加器级联构成多位加法器。
并行进位的并行加法器又可以分为组内并行、组间串行的进位链和组内并行、组间并行的进位链。
通常,并行加法器比串行级联加法器占用更多的资源,并且随着位数的增加,相同位数的并行加法器比串行加法器的资源占用差距也会越来越大。
它们的目的就是要进位信号的产生尽可能的快,因此产生了二重进位链或更高重进位链,显然进位速度的提高是以硬件设计的复杂化为代价来实现的。
2. 设计分工赵**(081010*****):硬件方案、排版吴**(081010*****):可行性论证、结论王**(081010*****):软件方案、找资料设计目的1.设计目的(1)掌握1位全加器的形成;(2)掌握4位片SN74LS181的原理;(3)用4片SN74LS181以并/串形成16位字长的ALU;(4)形成16位运算器数据通路结构;(5)将设计结果下载到实验板上,进行验证。
16位超前进位加法器实验报告

实验名称:十六位超前进位加法器一、实验目的设计、验证并优化16位超前进位加法器的逻辑功能。
二、实验原理1、1位全加器原理全加器的求和输出信号和进位信号,定义为输入变量A、B、C的两种组合布尔函数:求和输出信号 = A ⊕ B ⊕ C进位信号 = AB + AC + BC实现这两个函数的门级电路如下图。
并不是单独实现这两个函数,而是用进位信号来产生求和输出信号。
这样可以减少电路的复杂度,因此节省了芯片面积。
上述全加器电路可以用作一般的n位二进制加法器的基本组合模块,它允许两个n 位的二进制数作为输入,在输出端产生二进制和。
最简单的n位加法器可由全加器串联构成,这里每级加法器实现两位加法运算,产生相应求和位,再将进位输出传到下一级。
这样串联的加法器结构称为并行加法器,但其整体速度明显受限于进位链中进位信号的延迟。
因此,为了能够减少从最低有效位到最高有效位的最坏情况进位传播延时,最终选择的电路是十六位超前加法器。
2、超前进位加法器原理超前进位加法器的结构如下图。
超前进位加法器的每一位由一个改进型全加器产生一个进位信号gi和一个进位传播信号pi,其中全加器的输入为Ai和Bi,产生的等式为:改进的全加器的进位输出可由一个进位信号和一个进位传输信号计算得出,因此进位信号可改写为:式中可以看出,当gi = 1(Ai = Bi = 1)时,产生进位;当pi = 1(Ai =1或Bi = 1)时,传输进位输入,这两种情况都使得进位输出是1。
近似可以得到i+2和i+3级的进位输出如下:下图为一个四位超前进位加法器的结构图。
信号经过pi和gi产生一级时延,经过计算C产生一级时延,则A,B输入一旦产生,首先经过两级时延算出第1轮进位值C’不过这个值是不正确的。
C’再次送入加法器,进行第2轮2级时延的计算,算出第2轮进位值C,这一次是正确的进位值。
这里的4个4位超前进位加法器仍是串行的,所以一次计算经过4级加法器,一级加法器有2级时延,因此1次计算一共经过8级时延,相比串行加法器里的16级时延,速度提高很多。
51单片机简易计算器设计报告

51单片机简易计算器设计报告
本文将介绍51单片机简易计算器的设计报告。
该计算器通过
16位的LCD显示屏实现了基本计算功能,包括加、减、乘、除、取反、开方等。
1. 硬件设计
该计算器的核心部件是STC89C52单片机。
STC89C52是一种
高性能、低功耗的8位单片机,拥有8KB的Flash程序存储器和128字节的内部RAM,可提供多种功能和通讯接口。
通过
I/O口与LCD模块通讯,实现输出功能。
该计算器使用16位的LCD显示屏,显示范围为-99.99~99.99,共有6个数字位。
显示屏使用了ST7920控制器,可通过串行、并行等多种方式控制。
2. 软件设计
该计算器的软件设计主要包括三部分:键盘扫描,计算功能和LCD显示。
键盘扫描:该计算器采用4x5矩阵键盘,通过程序对键盘进行扫描,实现对不同按键的检测。
计算功能:该计算器可以实现基本的四则运算、取反、开方等功能。
对于四则运算,通过栈来实现计算,将运算符压入栈中,然后将操作数从栈中取出进行计算。
LCD显示:该计算器使用16位的LCD显示屏,通过程序控制数据和命令的传输,将计算结果显示在LCD屏幕上。
3. 总结
通过对51单片机简易计算器的设计报告,可以看出该计算器实现了基本的计算功能,通过硬件设计和软件设计相结合,将计算器的功能实现得十分完整。
该计算器的设计初步掌握了51单片机的应用,有助于后续项目的开展。
16位超前加法器实验报告

16位超前加法器设计实验一、实验分析:四位超前进位加法器HDL程序:module add4_head ( a, b, ci, s, pp, gg);input[3:0] a;input[3:0] b;input ci;output[3:0] s;output pp;output gg;wire[3:0] p;wire[3:0] g;wire[2:0] c;assign p[0] = a[0] ^ b[0];assign p[1] = a[1] ^ b[1];assign p[2] = a[2] ^ b[2];assign p[3] = a[3] ^ b[3];assign g[0] = a[0] & b[0];assign g[1] = a[1] & b[1];assign g[2] = a[2] & b[2];assign g[3] = a[3] & b[3];assign c[0] = (p[0] & ci) | g[0];assign c[1] = (p[1] & c[0]) | g[1];assign c[2] = (p[2] & c[1]) | g[2];assign pp = p[3] & p[2] & p[1] & p[0];assign gg = g[3] | (p[3] & (g[2] | p[2] & (g[1] | p[1] & g[0])));assign s[0] = p[0] ^ ci;assign s[1] = p[1] ^ c[0];assign s[2] = p[2] ^ c[1];assign s[3] = p[3] ^ c[2];endmodulep表示进位否决信号(pass),如果p为0就否决调前一级的进位输入。
否决的意思就是即使前一级有进位,本级也不会向后一级产生进位输出。
十六位运算器ALU实验报告

⼗六位运算器ALU实验报告学⽣实验报告实验名称⽤Verilog HDL语句实现16位运算器的功能实验⽇期2013年10⽉19学号2012551212姓名李超班级12计算机科学与技术⼀班⼀、实验⽬的与要求1、了解运算器的组成结构;2、掌握算术逻辑运算器的⼯作原理;3、掌握简单运算器的数据传送通道4、掌握⽤Verilog HDL实现16位简单运算器的设计⼆、实验原理74LS181的逻辑功能表图中,S0到S3是四个控制端,⽤于选择进⾏何种运算。
M ⽤于控制ALU进⾏算术运算还是逻辑运算。
当M=0时,M对进位信号没有任何影响,Fi值与操作数Ai,Bi以及地位向本位进位Cn+1有关,所以M=0时进⾏算术运算。
操作数⽤补码表⽰,“加”只算术加,运算时考虑进位;“+”指逻辑加,不考虑进位;减法运算时,减法取反码运算后⽤加法器实现,结果输出为A减B减1在最末位产⽣⼀个强迫进位(加1),以得到A减B的结果。
当M=1时,封锁了各位的进位输出Cn+i=0,因此各位的运算结果Fi仅与操作数Ai,Bi有关,此时进⾏逻辑运算。
三、实验内容与步骤1.根据书85⾯的逻辑功能表编写Verilog HDL语句,编译,仿真等步骤。
实验代码SN74181:module sn74181(A,B,S,Cn,M,F,C);parameter bit_width=4;output [bit_width-1:0]F;output C;input [bit_width-1:0]A,B,S;input Cn,M;reg C;reg Y=0;reg [bit_width-1:0]F;reg t;initial C=0;always@(S)begincase(S)4'b0000:beginif(M) {t,F}=~{1'b0,A};elsebeginif(Cn) {t,F}={1'b0,A};else {t,F}={1'b0,A}|1;endend4'b0001:beginif(M) {t,F}=~({1'b0,A}|{1'b0,B});endend4'b0010:beginif(M) {t,F}=~{1'b0,A}&{1'b0,B};elsebeginif(Cn) {t,F}={1'b0,A}|({1'b0,~B});else {t,F}=({1'b0,A}|({1'b0,~B}))+1;endend4'b0011:beginif(M) {t,F}=0;elsebeginif(Cn) {t,F}={t,F}-1;else {t,F}=0;endend4'b0100 :beginif(M) {t,F}=~({1'b0,A}&{1'b0,B});elsebeginif(Cn) {t,F}={1'b0,A}+({1'b0,A}&({1'b0,~B}));else {t,F}={1'b0,A}+({1'b0,A}&({1'b0,~B}))+1;endend4'b0101 :beginif(M) {t,F}={1'b0,~B};elsebeginif (Cn) {t,F}=({1'b0,A}&({1'b0,~B}))+({1'b0,A}|{1'b0,B}); else{t,F}=({1'b0,A}&({1'b0,~B}))+({1'b0,A}|{1'b0,B})+1; endend4'b0110 :beginif(M) {t,F}={1'b0,A}^{1'b0,B};elsebeginif(Cn) {t,F}={1'b0,A}-{1'b0,B}-1;else {t,F}={1'b0,A}-{1'b0,B};endend4'b0111 :beginelse {t,F}={1'b0,A}&({1'b0,~B});endend4'b1000 :beginif(M) {t,F}={1'b0,~A}|{1'b0,B};elsebeginif(Cn) {t,F}={1'b0,A}+({1'b0,A}&{1'b0,B});else {t,F}={1'b0,A}+({1'b0,A}&{1'b0,B})+1;end4'b1001 :beginif(M) {t,F}={1'b0,~(A^B)};elsebeginif(Cn) {t,F}={1'b0,A}+{1'b0,B}+1;else {t,F}={1'b0,A}+{1'b0,B};endend4'b1010 :beginif(M) {t,F}={1'b0,B};elsebeginif(Cn){t,F}=({1'b0,A}&{1'b0,B})+({1'b0,A}|({1'b0,~B})); else{t,F}=({1'b0,A}&{1'b0,B})+({1'b0,A}|({1'b0,~B}))+1; end4'b1011 :beginif(M) {t,F}={1'b0,A}&{1'b0,B};elsebeginif(Cn) {t,F}={1'b0,A}&{1'b0,B}-1;else {t,F}={1'b0,A}&{1'b0,B};endend4'b1100 :beginif(M) {t,F}=1;elsebeginif(Cn) {t,F}={1'b0,A}+{1'b0,A};else {t,F}={1'b0,A}+{1'b0,A}+1;endend4'b1101:beginelse {t,F}={1'b0,A}+({1'b0,A}|{1'b0,B})+1; endend4'b1110 :beginif(M) {t,F}={1'b0,A}|{1'b0,B};elsebeginif(Cn) {t,F}={1'b0,A}+({1'b0,A}|({1'b0,~B})); else {t,F}={1'b0,A}+({1'b0,A}|({1'b0,~B}))+1; endend4'b1111 :beginif(M) {t,F}={1'b0,A};elsebeginif(Cn) {t,F}={1'b0,A}-1;else {t,F}={1'b0,A};endendendcaseC=t;endEndmoduleSHIFT:module shift(A,choose,result); parameter bit_width=16;input [bit_width-1:0]A;input[1:0] choose;output [bit_width-1:0] result;reg [bit_width-1:0]result;always@(A or choose)begincase(choose)2'b01:beginresult=A<<1;end2'b10:beginresult={A[0],A[15:1]};end2'b11:beginresult=$signed(A)>>>1;endendcaseendEndmoduleinput [width-1:0] r;input [1:0]x;output [width-1:0] result; output overflow,z,c,p,n;reg [width-1:0] a,b;reg [3:0]s;reg [1:0]sh;reg cn,m,ov;wire co1,co2,co3;wire [width-1:0]co,re1,re2; always@ (x or r)begincase(x)2'b11: begina=r;end2'b10: beginb=r;end2'b00: begins=r[3:0];sh=r[5:4];m=r[8];cn=r[12]; endendcaseendsn74181 u_sn74181_1(.A(a[3:0]),.B(b[3:0]),.S(s),.M(m),.Cn(cn),.C(co1),.F(re1[3:0]));sn74181 u_sn74181_2 (.A(a[7:4]),.B(b[7:4]),.S(s),.M(m),.Cn(co1),.C(co2),.F(re1[7:4]));sn74181 u_sn74181_3 (.A(a[11:8]),.B(b[11:8]),.S(s),.M(m),.Cn(co2),.C(co3),.F(re1[11:8]).B(b[15:12]),.S(s),.M(m),.Cn(co3),.C(overflow),.F(re1[15:12]));shift u_shift(.A(a),.choose(sh),.result(re2[15:0]));assign result=(sh?re2:re1);assign z=~|result;assign n=result[15];Endmodule仿真波形图按照模式⼀电路图结构图设置对应的引脚参数。
单片机实践简易计算器实验报告

单片机实践简易计算器实验报告本次实验的目的是通过单片机实现一个简易计算器,实现加减乘除四则运算。
在实验过程中,我们使用了STC89C52单片机,通过编写程序实现计算器的功能。
实验步骤:1. 确定硬件电路连接我们需要确定硬件电路连接。
本次实验使用的是STC89C52单片机,需要将其与LCD1602液晶屏、4x4矩阵键盘、蜂鸣器等硬件连接。
具体连接方式如下:STC89C52单片机:P0口:连接LCD1602液晶屏的数据线D0-D7P1口:连接LCD1602液晶屏的控制线RS、RW、EP2口:连接4x4矩阵键盘的行线R1-R4P3口:连接4x4矩阵键盘的列线C1-C4P4口:连接蜂鸣器2. 编写程序接下来,我们需要编写程序实现计算器的功能。
程序主要分为以下几个部分:(1)LCD1602液晶屏初始化(2)4x4矩阵键盘扫描(3)计算器功能实现(4)LCD1602液晶屏显示结果3. 调试程序编写完程序后,我们需要进行调试。
在调试过程中,我们需要注意以下几点:(1)检查硬件连接是否正确(2)检查程序是否有语法错误(3)检查程序是否能够正常运行4. 实验结果经过调试,我们成功实现了一个简易计算器。
在使用过程中,用户可以通过4x4矩阵键盘输入数字和运算符,计算器会自动进行计算,并在LCD1602液晶屏上显示结果。
同时,计算器还具有清零、退格等功能,方便用户进行操作。
总结:通过本次实验,我们学习了单片机的基本原理和编程方法,掌握了如何使用单片机实现一个简易计算器。
同时,我们还学习了如何进行硬件电路连接和程序调试,提高了我们的实践能力和动手能力。
16位超前进位加法器

《VLSI》课程设计报告班级:电子09—1班学号: 0906040107 姓名:李翔一指导教师:张振宇16位超前进位加法器设计目录摘要 (1)1需求分析1.1加法器的发展..................................................................... 错误!未定义书签。
1.2几种串行加法器性能比较 (3)1.2.1串行进位加法器 (3)1.2.1超前进位加法器 (3)2主要内容 (4)2.1设计原理 (7)2.2设计思路 (4)3 设计思想 (5)4 实现方法 (6)4.1顶层方案图的设计与实现 (6).4.1.1顶层方案的整体设计 (6)4.1.2元器件选择和引脚锁定 (7)4.2功能模块的设计与实现 (8)4.2.1设计描述 (8)4.2.2创建RTL代码并得到电路图....................................................... .94.3功能仿真 (11)4.4编程与下载 (12)4.5硬件仿真结果 (12)5小结 (13)参考文献 (13)附录 (14)摘要:加法运算是最重要最基本的运算,所有的其他基本算术运算乘除等都最终可以用加法运算来表示在不同的场合对加法器的要求不同,要的要求速度快有的要求面积小超前进位加法器相比于串行进位加法器是一种快速加法运算器,根据用户的要求追求速度与面积的平衡。
关键词:超前进位加法器串行进位加法器速度面积1需求分析1.1 加法器的发展加法运算是最基本的运算,所有其他基本算术运算都是以加法运算为基础。
但因为加法运算存在进位问题,使得某一位计算结果的得出和所有低于他的位相关,因此,为了减少进位传输所耗的时间提高计算速度人们设计了多种类型的加法器。
如跳跃进位加法器,进位选择加法器,超前进位加法器等他们都是利用各位之间的状态来预先产生高位进位信号从而减少进位从低位到高位的传递时间1.2 几种加法器的性能比较1.2.1串行进位加法器串行进位加法器的每一位加和值都依赖于上一位进位信号,即进位信号是串行的经过加法器的每一位。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
湖北第二师范学院计算机学院09计应单片机课程设计实验报告课程设计名称:电子计算器课程设计单位:10计应(1)班课设小组成员:徐凡(1060310039)凡平(1060310058)彭浩(1060310045)桂银(1060310010)潘光卉(1060300033)完成时间:2012年04月02日至2012年04月 24 日单片机课程设计实验报告课程设计题目:简易计算器作品功能描述:当通过输入键盘数字时,能够在显示器上显示输出的数值,并且通过想实现的简单运算功能,实现计算器的加、减、乘、除和清零,并将结果显示出来。
小组成员工作分工:徐凡:程序主框架的构造和主要功能函数的设计。
凡平:原理图的设计和硬件的焊接。
彭浩:基本功能函数的设计(“+,-,*,/”)。
桂银:程序流程图的设计和键盘扫描程序的实现。
潘光卉:编写文档和功能测试。
硬件电路设计:本设计中我们用的是AT89C52芯片,LCD1602 (PROTEUS中为LM016L)就是那个液晶屏,因为可以显示2行16个字符,故叫做LCD1602.11.0592M或12M晶振(CRYSTAL),两者均可,但要涉及到串口需选用12MKEYPAD-SMALLCALC就是那个4X4键盘电容20~30PF(CAP),接最小电路电容10PF主要接复位电路RESPACK-8排阻,为20K的,一个引脚接正极,另8个引脚接I/O口接RES电阻10K,接复位电路实物照片:硬件原理图原理说明:1,上电后,屏幕初始化;2,计算。
按下数字键,屏幕显示要运行的第一个数字,再按下符号键,然后再按下数字键,屏幕显示要运算的第二个数字,最后按下“=”号键,屏幕上显示出计算结果。
3,如果要再次计算,可以按下“ON/C”键清零,或者继续按下数字键,即可重新计算。
键盘使用说明如下:按键功能说明:Array“+”实现两个数的相加“-”实现两个数的相减“×”实现两个数的乘积“÷”实现两个数商的运算“ON/C”计算器显示的清零和接通电源程序控制流程图:软件设计:在程序设计方法上,模块化程序设计是单片机应用中最常用的程序设计方法。
设计的中心思想是把一个复杂应用程序按整体功能划分成若干个相对独立的程序模块,各模块可以单独设计、编写、调试、然后组合起来,这种方法便于设计和调式,容易实现多个程序共存,但是各个模块之间的连接有一定得难度。
根据需要我们可以采用自上而下的程序设计方法,此方法先从主程序开始设计,然后再编制各从属程序和子程序,层层细化逐步求精,最终完成一个复杂程序的设计,这种方法比较符合人们的日常思维,缺点是一级的程序错误会对整个程序产生影响。
程序调试中出现的问题及解决的办法:1.算器无法实现连加现象。
例如:顺序输入1+2=之后会显示结果为3,计然后继续输入+1,结果并不为4。
错误原因我们认为是在获得结果3之后没有将数据3放入操作数缓存,所以我们在等号运算执行后的代码下面将计算机结果放入操作数缓存的代码,以此来实现计算器连加的功能。
2.编程前要加流程图,这样会使思路清晰。
3.程序的结构要设计的合理,避免上下乱调用的现象,这样会使程序更加清晰化。
4.编程过程中要注意加注释或分割线,否则,在程序过长时容易变得很乱,不便于查找或更改。
5.计算器没有实现小数操作,因为数字存储我们用int来存放,进行相除功能的时候,也是用int计算,计算结果是整除的.没有小数位.6.收获,体会与建议在此次课程设计中,通过团队的合作和网上找的资料,主要掌握了数码管显示的编程,数据在内部运算的编程方法。
调试也是此次的重点,这其中最重要的就是软件的台式了,也是我们此次问题出现最多的地方,这要求我们队每个模块在整个程序中的作用了如子掌。
通过此次课程设计,我们发现我们对程序的掌握还不够,尤其是单片机汇编语言掌握的不牢固。
这次课程设计使我懂得实践的重要性,只有理论知识还远远不够,只有把所学的理论知识与实践相结合才算是掌握了所学的只是。
此次设计的单片机十分简易,只实现了基本的加减乘除,所以这次我们设计的计算器是并不实用的,但是通过本次课程设计,是我们了解到了如何使用单片机来进行计算器的设计,学会了如何对LCD灯进行控制,也学会了如何使用键盘来获得输入的数据,同时提高了我们的编程能力。
在设计计算器的过程中我们遇到了很多问题,解决了这些问题之后,提高了我们自己动手解决问题得能力。
这次单片机设计中使我们对单片机有了更深的了解。
单片机编程需要对电路的认真分析,然后画出流程图,善于查阅相关资料才能编出好的程序。
这次单片机应用系统的设计中遇到很大的困难,主要原因是平时的只是掌握的不够,通过查阅很多资料和类似的论文,才做成的。
由于时间仓促,经验少,只是局限,设计有一定得不足,但是通过此次设计自己的能力提高了不少,我会认真总结设计中的经验教训,为以后更多的设计做好铺垫。
参考文献:[1]/view/145cd13a580216fc700afddb.html?from=rec&pos=4&weig ht=14&lastweight=14&count=5 [2] ZigBee技术/view/3085090.htm#include"reg51.h"#include"lcd1602.h"#include"button.h"char str1[6]={0};char str2[6]={0};char op = 0;char result[6]={0};int num1=0;int num2=0;int nresult=0;char nIndex=0;char xpos=0;bit bover=0;//是º?否¤?计?算?玩ª?bit bop=0;//只?能¨¹输º?一°?次ä?操¨´作Á¡Â符¤?bit berror=0;//出?现?了¢?错䨪误¨®bit bnum2=0;//记?录?第̨²二t个?数ºy字Á?记?录?没?有®D..bit bnum1=0;//记?录?按ã¡ä下?第̨²一°?个?数ºy字Á?没?有®Dvoid main(){char key =0;char flag=0;int i=0;LCD_initial();while(1){key = _GetKey();delay(100);if(key!=-1){if(key<=9&&key>=0)//数ºy字Á?键¨¹{if(berror==0){if(bover==1)//计?算?完ª¨º后¨®第̨²二t次ä?输º?入¨?数ºy字Á?{bover=0;bnum1=0;bnum2=0;LCD_cls();flag=0;nIndex=0;xpos=0;bop=0;for(i=0;i<6;i++){str1[i]=0;str2[i]=0;result[i]=0;}}if(flag==0) //第̨²一°?个?数ºy字Á?记?录?{if(nIndex>=5)//输º?入¨?的Ì?数ºy字Á?过y长¡èberror=1; //记?录?有®D错䨪误¨®LCD_printc(xpos++,1,key+48);LCD_prints(10,2,"Error!");}else if(nIndex < 5){if(!(nIndex==0&&key==0))//第̨²一°?个?数ºy字Á?不?会¨¢是º?0{str1[nIndex++]=key+48;bnum1=1;LCD_printc(xpos++,1,key+48);}}}else if(flag==1)//第̨²二t个?数ºy字Á?记?录?{if(nIndex>=5)//输º?入¨?的Ì?数ºy字Á?过y长¡è{berror=1; //记?录?有®D错䨪误¨®LCD_printc(xpos++,1,key+48);LCD_prints(10,2,"Error!");}else if(nIndex < 5){if(!(nIndex==0&&key==0))//第̨²一°?个?数ºy字Á?不?会¨¢是º?0{str2[nIndex++]=key+48;bnum2=1;//记?录?第̨²二t个?数ºy字Á?已°?按ã¡ä下?...LCD_printc(xpos++,1,key+48);}}}}}else if(key<=13&&key>=10)//操¨´作Á¡Â符¤?{if(berror==0&&bnum1) //没?有®D错䨪误¨®出?现?,按ã¡ä下?了¢?第̨²一°?个?数ºy if(bop==0){op=key;flag=1;nIndex=0;if(key==10)// '/'LCD_printc(xpos++,1,'/');}else if(key==11)// '*'{LCD_printc(xpos++,1,'*');}else if(key==12)// '-'{LCD_printc(xpos++,1,'-');}else if(key==13)// '+'{LCD_printc(xpos++,1,'+');}bop = 1;}}else if(key==14)// "="{if(berror==0&&bnum2==1)//没?有®D错䨪误¨®出?现?,按ã¡ä下?了¢?第̨²二t个?数ºy{bover=1;//已°?计?算?完ª¨ºbnum2=0;//恢?愎1已°?前¡ã的Ì?LCD_printc(xpos,0,'=');if(13==op) //加¨®法¤¡§{num1 = _atoi(str1);num2 = _atoi(str2);nresult=num1+num2;if(nresult<num1||nresult<num2){berror=1;LCD_prints(10,2,"Error!");}else if(nresult<=32767&&nresult>0){_itoa(nresult,result);LCD_prints(0,2,result);}else{berror=1;LCD_prints(10,2,"Error!");}}else if(12==op) //减?法¤¡§{num1 = _atoi(str1);num2 = _atoi(str2);nresult=num1-num2;_itoa(nresult,result);LCD_prints(0,2,result);}else if(11==op) //乘?法¤¡§{num1 = _atoi(str1);num2 = _atoi(str2);nresult=num1*num2;if(nresult<num1||nresult<num2){berror=1;LCD_prints(10,2,"Error!");}else if(nresult>0&&nresult<=32767){_itoa(nresult,result);LCD_prints(0,2,result);}else{berror=1;LCD_prints(10,2,"Error!");}}else if(10==op) //除y法¤¡§{num1 = _atoi(str1);num2 = _atoi(str2);nresult=num1/num2;_itoa(nresult,result);LCD_prints(0,2,result);}}}else if(key==15)//ON/C键¨¹{for(i=0;i<6;i++){str1[i]=0;str2[i]=0;result[i]=0;}bnum1=0;bnum2=0;num1=0;num2=0;op=0;xpos=0;nIndex=0;flag=0;bop=0;berror=0;//LCD_cls();LCD_printc(0,1,'0');}}delay(10);}}/*****************************************1602LCD显?示º?头ª¡¤文?件t--------- 三¨y维?电Ì?子Á¨®工¡è作Á¡Â室º¨°-----------芯?片?:êoAT89S52晶¡ì振?:êo11.0593M描¨¨述º?:êo作Á¡Â者?:êo陈?磊¤¨²日¨?期¨²:êo2010/06/05******************************************/#include"lcd1602.h"#include"reg51.h"/********************************************LCD数ºy据Y、¡é控?制?口¨²定¡§义°?********************************************/#define LCD_DATA P0 //LCD的Ì?数ºy据Y口¨²sbit LCD_BUSY=LCD_DATA^7; //LCD忙|信?号?位?sbit LCD_RW=P2^1; //LCD读¨¢写¡ä控?制? sbit LCD_RS=P2^0; //LCD寄?存ä?器¡Â选?择?sbit LCD_EN=P2^2; //LCD使º1能¨¹信?号?/********************************************检¨¬测aLCD状Á¡ä态¬?,ê?看¡ä它¨¹是º?不?是º?还1在¨²忙|呢? ********************************************/void LCD_check_busy(void){ while(1){ LCD_EN=0;LCD_RS=0;LCD_RW=1;LCD_DATA=0xff;LCD_EN=1;if(!LCD_BUSY)break;}LCD_EN=0;}/********************************************LCD清?屏¨¢********************************************/void LCD_cls(void){ LCD_check_busy();LCD_RS=0;LCD_RW=0;LCD_DATA=1;LCD_EN=1;LCD_EN=0;}/**************//写¡ä指?令¢?到Ì?LCD***************/void LCD_write_instruction(unsigned char LCD_instruction){ LCD_check_busy();LCD_RS=0;LCD_RW=0;LCD_DATA=LCD_instruction;LCD_EN=1;LCD_EN=0;}/***********************//输º?出?一°?个?字Á?节¨²数ºy据Y到Ì?LCD************************/void LCD_write_data(unsigned char LCD_data){ LCD_check_busy();LCD_RS=1;LCD_RW=0;LCD_DATA=LCD_data;LCD_EN=1;LCD_EN=0;}/********************//LCD光a标À¨º定¡§位?到Ì?x处ä|*********************/void LCD_set_position(unsigned char x){ LCD_write_instruction(0x80+x);}/*void LCD_go_home(void) //LCD光a标À¨º归¨¦位? {LCD_write_instruction(LCD_GO_HOME);}*//*******************//输º?出?一°?个?字Á?符¤?到Ì?LCD**********************/void LCD_printc(unsigned char x,unsigned char y,unsigned char lcd_data){if(x<=16){if(y==2)x+=64;LCD_set_position(x);LCD_write_data(lcd_data);}}/***********************//输º?出?一°?个?字Á?符¤?串ä?到Ì?LCD************************/void LCD_prints(unsigned char x,unsigned y,unsigned char *lcd_string){ unsigned char i=0;if(x<16){if(y==2)x+=64;LCD_set_position(x);while(lcd_string[i]!='\0'){ LCD_write_data(lcd_string[i]);i++;}}}/********************//初?始º?化¡¥LCD**********************/void LCD_initial(void){ LCD_write_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);LCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF);LCD_write_instruction(LCD_DISPLAY_DOUBLE_LINE);LCD_cls();}//******************END**********************#include "button.h"void delay(char i) //延时函数{int j=0;for(;i>0;i--)for(j=0;j<125;j++);}char _GetKey(){int key=-1;int i=500;P3=0xf0;if((P3 & 0xf0)!=0xf0){P3=0xfe;i=500;while(i--);if((P3 & 0xfe)==0xee){key = 7;}if((P3 & 0xfe)==0xde) {key = 8;}if((P3 & 0xfe)==0xbe) {key = 9;}if((P3 & 0xfe)==0x7e) {key = 10;}P3=0xfd;i=500;while(i--);if((P3 & 0xfd)==0xed) {key = 4;}if((P3 & 0xfd)==0xdd) {key = 5;}if((P3 & 0xfd)==0xbd){key = 6;}if((P3 & 0xfd)==0x7d) {key = 11;}P3=0xfb;i=500;while(i--);if((P3 & 0xfb)==0xeb) {key = 1;}if((P3 & 0xfb)==0xdb) {key = 2;}if((P3 & 0xfb)==0xbb) {key = 3;}if((P3 & 0xfb)==0x7b) {key = 12;}P3=0xf7;i=500;while(i--);if((P3 & 0xf7)==0xe7) {key = 15;}if((P3 & 0xf7)==0xd7){key = 0;}if((P3 & 0xf7)==0xb7){key = 14;}if((P3 & 0xf7)==0x77){key = 13;}}return key;}int _atoi(char str[]) //把字符串转换成数字{int result=0;int nlen=0;int i;if(str[0]=='0'){return 0;}for(i=0;i<6;i++){if(str[i]==0){nlen = i;break;}}for(i=0;i<nlen;i++){result = 10*result + str[i]-48;}return result; }提示:1.为了环保,每组只需提交一份纸质版,但是每人须提交一份电子版!同组的每个成员必须独立完成该项目中的一部分。