用单片机语言设计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位全加器

四川理工大学课程设计任务书设计题目:采用门电路设计一个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位超前进位加法器实验报告

实验名称:十六位超前进位加法器一、实验目的设计、验证并优化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单片机简易计算器设计报告
本文将介绍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位超前加法器实验报告

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实验报告

⼗六位运算器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位超前进位加法器

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串行进位加法器串行进位加法器的每一位加和值都依赖于上一位进位信号,即进位信号是串行的经过加法器的每一位。

16位单片机 期末大作业实验报告

16位单片机 期末大作业实验报告

上海电力学院16位单片机实验报告实验名称:使用键盘中断、PWM及LED数码管的实验专业:姓名:班级:学号:一、实验目的使用使用键盘中断、PWM 及LED 数码管实现用键盘调整PWM 呼吸灯的渐变快慢,同时用LED 显示当前的速度级:1、PWM 占空比(如图1)。

2、16键键盘中断(如图2)。

图2键盘中断接线原理图3、8段LED 数码管(如图3)。

图3 LED 数码管结构图(a) 25%的占空比图1 PWM 占空比示意图时钟 PWM (b) 50%的占空比时钟PWM (c) 75%的占空比时钟PWM二、实验设备及其连接(一)、试验设备:1.PC机一台2.S12嵌入式开发系统一台3.导线九根4.小键盘一个5.4连排共阴极8段数码管一个(二)、设备连接:1.键盘采用手动接线,将键盘接入双排插孔下一排插孔;2.PTP0~3分别接键盘接线处的1~4;3.PTA0~3分别接5-8;4.8段数码管插到指定位置;5.小灯接PP7口。

三、实验内容1.在键盘中断主程序里添加PWM及LED的头文件(.h)及源文件(.c),并在键盘中断主程序main.c中添加PWM占空比小灯及LED显示程序:2.在中断程序isr.c中添加PWM占空比小灯及LED显示程序:3.运行程序并记录实验现象:四、程序展示1.添加头文件声明。

2.在main.c 中添加time 变量及LEDbuf[4]数组,其中time 用来改变PWM 渐变中的Delay 延时时间,LEDbuf 则用来显示每次按键改变的速度值:main.c 程序展示:#include "Includes.h" //包含总头文件//在此添加全局变量定义uint8 iii;uint8 period;uint8 duty;uint8 time=100;uint8 LEDbuf[4];//主函数void main(){//0.1 主程序使用的变量定uint32 mRuncount=0; //运行计数器//运行计数器//uint8 period,duty,time=10;//0.2 关总中断DisableInterrupt();//0.3 芯片初始化MCUInit(FBUS_32M);//0.4 模块初始化Light_Init(Light_Run_PORT,Light_Run,Light_OFF); //RUN指示灯初始化为暗SCIInit(0,FBUS_32M,9600); //串口0初始化KBInit(); //键盘初始化PWMInit(7); //初始化PWM通道1 LEDInit();//Light_Init(Light_Run_PORT,Light_Run,Light_OFF); //RUN指示灯初始化为暗//0.5 开放中断EnableSCIReInt0; //开放SCI0接收中断EnableKBint(); //开放键盘中断EnableInterrupt();DDRB=0xff;PORTB=0x00; //开放总中断period = 0xFF; //PWM周期duty=0x00;LEDbuf[0]='0'; //待显示数据0000LEDbuf[1]='0';LEDbuf[2]='0';LEDbuf[3]='0';// 主循环for(;;){ //int i,j,k;LEDShow(LEDbuf);// Light_Change(Light_Run_PORT,Light_Run); //指示灯的亮、暗状态切换//}//---------------------------------------------------------------------//2.通过占空比的变化来调节小灯的亮度for(duty=0;duty<0xff;duty++){PWMSetting(7,period, duty); //不断增加PWM的占空比LEDShow(LEDbuf);Delay(time);}//延时for(duty=0xff;duty>0;duty--){PWMSetting(7,period, duty); //不断增加PWM的占空比LEDShow(LEDbuf);Delay(time);}//延时}}3.在isr.c中添加对按键的判断,当按下按键时,缩短Delay延时使得小灯闪烁速度加快,同时改变LEDbuf数组的值使得LED显示当前的按键值(速度级)。

16位累加器设计报告

16位累加器设计报告

16位累加器设计报告引言累加器(Accumulator)是一种重要的数字电路,广泛应用于计算机的中央处理器(CPU)中。

累加器的主要功能是将多个数字数据进行相加,并将结果储存到一个寄存器中。

本报告将详细介绍一个基于16位累加器的设计方案。

设计目标本设计的目标是实现一个16位累加器,能够对输入的两个16位数字进行相加,并将结果保存在累加器中。

设计要求如下:1. 输入端包括两个16位的数据A 和B。

2. 输出端为一个16位的累加器结果。

3. 设计采用组合逻辑电路实现。

输入变化时,累加器能够立即给出结果。

设计思路根据设计目标,我们可以分析得出以下设计思路:1. 设计一个16位加法器。

2. 将输入的数据A 和B 输入到加法器中进行相加。

3. 将相加的结果输出到一个16位寄存器中,作为累加器的输出。

16位加法器的设计16位加法器是累加器的核心组件之一。

我们使用全加器来实现16位加法器。

一个全加器能够实现两个输入位和一个进位位的加法,并给出一个输出位和一个进位位。

我们将使用16个全加器来构建16位加法器。

每个全加器的输入为两个加数位和进位位,输出为加法结果和进位结果。

下图是一个全加器的逻辑电路图:plaintext_______AB Full SCi Adder_______Co其中,A 和B 分别是两个输入的加数位,Ci 是输入的进位位,S 是加法结果,Co 是进位结果。

根据全加器的逻辑电路图,我们可以设计一个16位的加法器,将输入的两个16位数字进行相加,并给出16位的输出结果。

累加器的设计基于16位加法器的设计,我们可以构建一个16位累加器。

累加器的设计如下:1. 输入端包括两个16位的数据A 和B。

2. 将输入的两个16位数据A 和B 输入到16位加法器中,进行相加。

3. 将加法器的输出结果输入到一个16位寄存器中,作为累加器的输出。

下图是16位累加器的逻辑电路图:plaintext___________________AB 16-bit Adder___________________Output总结本设计报告介绍了一个基于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位加法计算器实验报告概要

⽤单⽚机语⾔设计16位加法计算器实验报告概要湖北第⼆师范学院计算机学院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,接复位电路实物照⽚:硬件原理图原理说明:2,计算。

按下数字键,屏幕显⽰要运⾏的第⼀个数字,再按下符号键,然后再按下数字键,屏幕显⽰要运算的第⼆个数字,最后按下“=”号键,屏幕上显⽰出计算结果。

3,如果要再次计算,可以按下“ON/C”键清零,或者继续按下数字键,即可重新计算。

键盘使⽤说明如下:按键功能说明:Array“+”实现两个数的相加“-”实现两个数的相减“×”实现两个数的乘积“÷”实现两个数商的运算“ON/C”计算器显⽰的清零和接通电源程序控制流程图:软件设计:在程序设计⽅法上,模块化程序设计是单⽚机应⽤中最常⽤的程序设计⽅法。

单片机实训计算器报告

单片机实训计算器报告

一、引言随着科技的飞速发展,单片机技术作为嵌入式系统的重要组成部分,已经在各个领域得到了广泛的应用。

为了提高学生对单片机技术的理解和实践能力,我们开展了单片机实训课程。

本次实训报告以设计一个简易计算器为例,详细介绍单片机在计算器中的应用及其设计过程。

二、实训目的1. 熟悉单片机的基本原理和编程方法。

2. 掌握单片机外围设备的接口技术。

3. 培养学生的实际动手能力和创新意识。

三、实训内容1. 设计要求本次实训要求设计一个基于单片机的简易计算器,能够实现以下功能:(1)加、减、乘、除四则运算;(2)结果显示在LCD1602显示屏上;(3)具有简单的错误处理功能。

2. 系统组成本计算器系统主要由以下几部分组成:(1)AT89C51单片机:作为系统的核心控制器,负责控制整个计算器的运行;(2)LCD1602显示屏:用于显示输入的数字、运算符和计算结果;(3)矩阵键盘:用于输入数字和运算符;(4)按键:用于控制计算器的开关、清零和退出等功能。

3. 硬件设计(1)AT89C51单片机:选用AT89C51单片机作为核心控制器,具有丰富的I/O端口和片内资源,可以满足计算器的需求。

(2)LCD1602显示屏:通过单片机的PORTD端口与LCD1602显示屏相连,实现数据显示功能。

(3)矩阵键盘:采用4x4矩阵键盘,将行线连接到单片机的PB0-PB3端口,列线连接到PB4-PB7端口。

(4)按键:设置三个按键,分别用于控制计算器的开关、清零和退出功能。

4. 软件设计(1)初始化:首先对单片机的I/O端口、LCD1602显示屏和矩阵键盘进行初始化。

(2)键盘扫描:通过扫描矩阵键盘,获取用户输入的数字和运算符。

(3)运算逻辑处理:根据用户输入的数字和运算符,进行相应的运算。

(4)结果显示:将计算结果显示在LCD1602显示屏上。

(5)错误处理:当输入错误或发生溢出时,显示错误信息。

四、实训过程1. 硬件电路搭建:根据设计要求,将AT89C51单片机、LCD1602显示屏、矩阵键盘和按键连接到一起,搭建计算器的硬件电路。

单片机课程设计报告(简易计算器)

单片机课程设计报告(简易计算器)

单片机实训报告———简易计算器姓名***学号***专业***学校***指导教师 ***实训时间2014.06.23-2014.06.29目录中文摘要............................................................1 关键词.............................................................1 1 实训任务.........................................................1 1.1 主要功能设计................................................11.2 任务目的....................................................12 整体设计方案.....................................................1 2.1 方案论证....................................................12.2 系统框图....................................................23 控制软件设计....................................................2 3.1 程序时序总图...............................................2 3.2 液晶显示软件设计............................................3 3.3 键盘输入软件设计...........................................53.4 计算函数设置...............................................74 软件调试........................................................8 个人小结...........................................................8参考文献...........................................................9附录...............................................................9摘要:计算器是人们的日常生活中是最常见的电子产品之一,它应用极广、发展迅猛,并且不断出现着拥有更加强大功能的计算器。

基于51单片机的计算器课程设计实验报告

基于51单片机的计算器课程设计实验报告

项目一:简单计算器1。

实验题目:用51单片机实现简单的计算器功能2。

实验截图:1).实验运行前截图:2).实验运行后截图:3.实验代码:#include<reg52。

h〉#include〈intrins.h〉#include〈math.h>#include<defined。

H>#include〈LCD1602.h>unsigned char table1[16]; //1602第一行显示字符unsigned char table2[16]; //1602第二行显示字符unsig ned char code table_error[] = ”error”;/*键扫描函数*/unsigned char keyscan() //扫描键盘函数{unsigned char key_l,key_h,addres,num;P0=0x0f;key_l=P0;P0=0xf0;key_h=P0;addres=key_l | key_h;if(addres!=0xff){Delayms(1);if(addres!=0xff){P0=0x0f;key_l=P0;P0=0xf0;key_h=P0;addres=key_l | key_h;switch(addres){case 0xee:num='1’;break;case 0xde:num=’2';break;case 0xbe:num=’3’;break;case 0xed:num='4';break;case 0xdd:num='5’;break;case 0xbd:num=’6';break;case 0xeb:num=’7’;break;case 0xdb:num='8’;break;case 0xbb:num='9’;break;case 0xd7:num='0’;break;//按键0case 0xe7:num=’C';break;//按键*case 0xb7:num=’=';break;//按键#case 0x7e:num='/’;break;//按键Acase 0x7d:num=’*’;break;//按键Bcase 0x7b:num='—’;break;//按键Ccase 0x77:num='+';break;//按键D}while(addres!=0xff){P0=0x0f;key_l=P0;P0=0xf0;key_h=P0;addres=key_l | key_h;}return num;}}return 0;}void clear_lcd(void)//清屏{unsigned char j;for(j=0;j〈16;j++){table1[j]=’\0’;table2[j]='\0';}}void main(){unsigned char i=0,j;unsigned char key;unsigned char flag_operator = 0;//加减乘除标志位unsigned char flag_equ = 0;//等于标志位unsigned char flag_key = 0;//运算位标志bit flag_MaxValue = 0;bit flag_minus = 0;//负数long int value = 0; //最终运算结果unsigned long int value_H =0; //第一个数据unsigned long int value_L = 0;//第二个数据unsigned long int temp[]={1, 10, 100,1000,10000,100000,1000000,10000000,100000000};Initialize_LCD();while(1){key=keyscan();if(key != 0){if(key == ’C')//清除键C按下{clear_lcd();i=0;flag_operator = 0; flag_equ = 0; value = 0; value_H =0; value_L = 0; flag_key = 0; flag_minus=0;}else{for(j=0; j<i; j++){table1[15—i+j] = table1[15—i+j+1];}table1[15] = key;//table1[i] = key;i++;}if(key == '='){for(j=0; j〈16; j++)//确定运算符位置{if(table1[j] == ’=’){flag_equ = j;flag_key++;break;}if( table1[j]== ’+' || table1[j] == ’—' || table1[j] == ’*' ||table1[j] == '/'){flag_operator = j;flag_key++;}}for(j=16—i; j〈flag_operator; j++) //第一个数据处理{//value_H = value_H + (table1[j]-48) * ( pow(10 ,(flag_operator—j-1)));value_H = value_H + (table1[j]—48) * temp[flag_operator—j—1];}for(j=flag_operator+1; j〈15; j++) //第二个数据处理{//value_L = value_L + (table1[j]-48) * pow( 10 , (flag_equ—j—1));value_L = value_L + (table1[j]—48) * temp[flag_equ—j—1];}if(table1[flag_operator] == '+'){value = value_H + value_L;}else if(table1[flag_operator]== ’-'){value = value_H — value_L;}else if(table1[flag_operator] == '*'){value = value_H * value_L;}else if(table1[flag_operator]== ’/’){value = value_H / value_L;}if(value == 0)table2[15] = (value + 48);else if(value<0){value = abs(value);flag_minus = 1;}else if(value〉2000000000){flag_MaxValue = 1;//break;}j=15;while(value!=0){table2[j] = (value%10 + 48);value = value/10;j—-;}if(flag_minus) //负数{table2[j] = ’—’;}}if(flag_key 〉2 || table1[0] == '0' || flag_MaxValue==1 ){ShowString(5,1,table_error);while(keyscan() != 'C’);clear_lcd();i=0;flag_operator = 0; flag_equ = 0; value = 0; value_H =0; value_L = 0; flag_key = 0; flag_minus=0;}}ShowString(0,0,table1);ShowString(0,1,table2);}}。

单片机设计性实验-简易的16键计算器

单片机设计性实验-简易的16键计算器

成绩实验报告实验名称单片机设计性实验___实验班级姓名学号(后两位)指导教师实验日期单片机设计实验一、实验目的1、掌握单片机定时器、中断、键盘扫描、动态显示及数值计算的综合运用能力;2、掌握编程的运用能力;3、设计一只简易的16键计算器。

二、实验内容图5-1 简易16键计算器编程实现图5-1的简易16键4位十进制整数计算器的功能。

要求:1.设计4*4的键盘,其10个数字键0~9,其余6个为“+”“-”“*”“/”“=”和“C”2.设计4位LED接口电路或LCD显示电路3.实现2位数的简单运算三、系统硬件设计电路图四、设计框图和程序:程序源代码:DISPBUF EQU 30H ;主程序的入口地址 ORG 0000H;4个数码管显示"0000"字形数据 START:MOV DISPBUF,#0C0H MOV DISPBUF+1,#0C0H MOV DISPBUF+2,#0C0H MOV DISPBUF+3,#0C0H MOV 37H,#00H ;数值初始化 MOV 27H,#00H MOV 26H,#00H MOV 25H,#00H MOV 24H,#00H MOV 23H,#00H MOV R3,#00H MOV R5,#00H MOV R4,#00H ;调用键盘扫描子程序 LOOP: LCALL KEY MOV R6,27HCJNE R6,#00H,START ;清除键判断 MOV R6,26H;显示数据转换子程序选择 CJNE R6,#00H,FA;调用数码管显示数据转换子程序LCALL CONV ;调用数码管动态显示子程序 FA:LCALL DISPSCAN SJMP LOOPKEY:MOV P2,#0FH ;键盘扫描子程序 MOV A,P2 ANL A,#0FH CJNE A,#0FH,K10 RETK10:JB P2.0,K20 K11:MOV P2,#0EFH JB P2.0,K12 CJNE R5,#00H,L1 MOV R4,#00H INC R5 MOV R3,#1H L1:LJMP CEND K12: MOV P2,#0DFH JB P2.0,K13CJNE R5,#00H,L2 MOV R4,#00HINC R5MOV R3,#2HL2:LJMP CENDK13: MOV P2,#0BFH JB P2.0,K14CJNE R5,#00H,L3 MOV R4,#00HINC R5MOV R3,#3HL3:LJMP CENDK14: MOV P2,#7FH JB P2.0,KILCJNE R5,#00H,L4 MOV R4,#00HINC R5MOV R3,#4HKIL:LJMP KENDL4:LJMP CENDK20:JB P2.1,K30K21:MOV P2,#0EFH JB P2.1,K22LJMP DYUK22:MOV P2,#0DFH JB P2.1,K23MOV 25H,#3H LJMP OPRK23:MOV P2,#0BFH JB P2.1,K24MOV 25H,#6H LJMP OPRK24:MOV P2,#7FH JB P2.1,cctvMOV 25H,#9H LJMP OPRcctv:ljmp kendK30:JB P2.2,K40 K31: MOV P2,#0EFH JB P2.2,K32MOV 25H,#0HLJMP OPRK32:MOV P2,#0DFH JB P2.2,K33MOV 25H,#2HLJMP OPRK33:MOV P2,#0BFH JB P2.2,K34MOV 25H,#5HLJMP OPRK34:MOV P2,#7FHJB P2.2,KENDMOV 25H,#8HLJMP OPRK40:JB P2.3,KENDK41: MOV P2,#0EFH JB P2.3,K42INC 27HLJMP KENDK42:MOV P2,#0DFH JB P2.3,K43MOV 25H,#1HLJMP OPRK43:MOV P2,#0BFH JB P2.3,K44MOV 25H,#4HLJMP OPRK44:MOV P2,#7FHJB P2.3,KENDMOV 25H,#7HLJMP OPROPR: ;键值存储INC R4CJNE R5,#00H,CHANG CJNE R4,#2H,KBK ZHI:MOV A,20HMOV B,#0AHMUL ABMOV 20H,25HADD A,20HCJNE R5,#00H,CZHMOV 23H,ALJMP KENDCZH:MOV 24H,ALJMP KENDKEND:MOV P2,#0FH MOV A,P2ANL A,#0FHCJNE A,#0FH,KENDRETCHANG:CJNE R4,#2H,HONG AJMP ZHIHONG:JNC CENDINC R5MOV 20H,25HMOV 24H,25HLJMP CENDKBK:JNC CENDMOV 20H,25HMOV 23H,25HLJMP CENDDYU: ;结果计算MOV R5,#00HMOV R4,#00HMOV 25H,#00HCJNE R3,#1H,SMOV A,23HADD A,24HMOV 23H,ASJMP CENDS:CJNE R3,#2H,S1 CLR CMOV A,23HCJNE A,#00H,JIANFA MOV 23H,#0EH SJMP CEND JIANFA:SUBB A,24H MOV 23H,ASJMP CENDS1:CJNE R3,#3H,S2 MOV A,23HMOV B,24HMOV A,23HMUL ABMOV R6,BCJNE R6,#00H,CHENG MOV 23H,ASJMP CENDS2:CJNE R3,#4,CEND MOV A,24HCJNE A,#00H,ZY MOV A,#00HSJMP CENDZY:MOV A,23HMOV B,24HDIV ABMOV 23H,ACEND:MOV P2,#0FH MOV A,P2ANL A,#0FHCJNE A,#0FH,CEND RETCHENG:MOV R3,B MOV B,#64HDIV ABMOV 36H,AMOV A,BMOV B,#0AHDIV ABMOV 35H,AMOV 34H,BMOV DPTR,#TABLE XIAN:MOV A,34HADD A,#6HMOV B,#0AHDIV ABMOV 25H,AMOV 34H,BMOV A,BMOVC A,@A+DPTR MOV DISPBUF,A MOV A,35HADD A,#5HADD A,25HMOV B,#0AHDIV ABMOV 25H,AMOV 35H,BMOV A,BMOVC A,@A+DPTR MOV DISPBUF+1,A MOV A,36HADD A,#2HADD A,25HMOV B,#0AHDIV ABADD A,37HMOV 37H,AMOVC A,@A+DPTR MOV DISPBUF+3,A MOV 36H,BMOV A,BMOVC A,@A+DPTR MOV DISPBUF+2,A DJNZ R6,XIAN MOV 26H,#1H AJMP CENDCONV: ;数码管显示数据转换子程序CJNE R5,#02H,BEIMOV A,24HAJMP JINGBEI:MOV A,23HJING:MOV B,#64HDIV ABMOV DPTR,#TABLEMOVC A,@A+DPTRMOV DISPBUF+2,AMOV A,BMOV B,#0AHDIV ABMOVC A,@A+DPTRMOV DISPBUF+1,AMOV A,BMOVC A,@A+DPTRMOV DISPBUF,ARET;数码管动态显示子程序DISPSCAN:MOV R0,#DISPBUF MOV R2,#4HMOV A,#1HSC:PUSH ACCMOV A,@R0MOV P1,APOP ACCMOV P0,ALCALL DELAY1MOV P0,#00HRL AINC R0DJNZ R2,SCMOV P0,#1HRETDEL12:MOV R6,#1EHDEL2:MOV R7,#64H DEL1:DJNZ R7,DEL1 DJNZ R6,DEL2RETDELAY1:MOV R6,#70D2:MOV R7,#100 DJNZ R7,$ DJNZ R6,D2RET;------字符表------TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H DB 92H,82H,0F8H,80H,90HDB 88H,83H,0C6H,0A1H,86HDB 8EHEND五、实验总结。

16位加法器设计报告(1)

16位加法器设计报告(1)

Brent Kung树结构的16位加法器的设计仿真及优化1.利用Hspice软件设计具体电路结构Brent Kung树结构加法器设计简介Brent Kung树结构加法器是一种超前进位加法器,即进位提前被计算出来,送给加和电路,减小了进位顺序传递的延时,实现此加法器减小了设计的复杂度。

提高了设计的效率。

具体电路实现需要4个模块电路设计。

数据A和B通过缓冲器输入进来,然后经过进位生成和进位产生电路模块生成P和G信号。

P与G信号经过点操作模块生成相应的进位值,最后加和生成SUM。

电路结构采用动态逻辑结构,逻辑结构由NMOS下拉网络实现,构成PDN的过程和静态CMOS完全一样,晶体管的数目明显少于静态情况。

动态逻辑同时具有较快的开关速度。

动态逻辑同时在功耗方面有明显的优势。

Brent Kung树结构加法器电路设计进位生成和进位传播模块均采用动态逻辑进行设计,具体实现公式为Pi=ai+bi,Gi=ai&bi;具体电路实现如下:图1 进位传播和进位产生信号的动态实现图中的反相器为对称的,p生成电路的逻辑努力为2/3,g生成电路的逻辑努力为1。

点计算模块具体生成对应的进位传播和进位产生Gi j和Pi j;其对应的具体公式为:Gi j=Gi k+Pi k*Gk-1 j。

采用动态逻辑减小复杂度具体电路结构如下:图2点模块电路产生信号的动态实现求和电路利用多米诺实现求和即利用选择电路实现电路结构,在此电路中求和的两种条件计算为:Si0为ai与bi的同或,Si1为ai 与bi的异或,具体电路结构如下:图5动态逻辑实现和选择电路电路中利用两个时钟,由clk产生clkd是由下面的电路实现的,传输门总是导通,时钟路径的延时可以通过这些器件的尺寸来调整。

因为延时必须有一个严格的界限,即第二个门的所有输入必须在clkd的上升沿之前完成翻转,因此可能需要使clk进过多个以下的延时电路才能满足时序要求。

时钟延时利用反向器的缓冲器和传输门来实现。

实验二16位算术逻辑运算实验

实验二16位算术逻辑运算实验

实验三16位算术逻辑运算实验一、实验目的1、掌握16位运算器的数据传送通路组成原理。

2、进一步验证算术逻辑运算功能发生器74LS181的组合功能。

3、按要求和给出的数据完成几种指定的算术逻辑运算。

二、实验内容1、实验原理16位运算器数据通路如图2-1所示,其中运算器由四片74LS181以并/串形成16位字长的ALU构成。

低8位运算器的输出经过一个三态门74LS245(U33)到ALUO1插座,实验时用8芯排线和内部数据总线BUSD0~D7插座BUS1~6中的任一个相连,低8位数据总线通过LZD0~LZD7显示灯显示;高8位运算器的输出经过一个三态门74LS245(U33`)到ALUO1`插座,实验时用8芯排线和高8位数据总线BUSD8~D15插座KBUS1或KBUS2相连,高8位数据总线通过LZD8~LZD15显示灯显示;参与运算的四个数据输入端分别由四个锁存器74LS273(U29、U30、U29`、U30、)锁存,实验时四个锁存器的输入并联后用8芯排线连至外部数据总线EXD0~D7插座EXJ1~EXJ3中的任一个;参与运算的数据源来自于8位数据开并KD0~KD7,并经过一三态门74LS245(U51)直接连至外部数据总线EXD0~EXD7,输入的数据通过LD0~LD7显示。

2、实验接线本实验需用到6个主要模块:①低8位运算器模块;②数据输入并显示模块;③数据总线显示模块;④功能开关模块(借用微地址输入模块);⑤高8位运算器模;,⑥高8位(扩展)数据总线显示模块。

根据实验原理详细接线如下(接线①~⑤同实验一):①ALUBUS连EXJ3;②ALUO1连BUS1;③SJ2连UJ2;④跳线器J23上T4连SD;⑤LDDR1、LDDR2、ALUB、SWB四个跳线器拨至左侧(手动方式);⑥AR跳线器拨至左侧,同时开关AR拨至“1”电平;⑦ALUBUS`连EXJ2;⑧ALUO1`连KBUS1;⑨跳线器J19、J25拨至左侧(16位ALU状态);⑩高8位运算器区跳线器ZI2、CN0、CN4连上短路套。

16键计算器源程序及仿真实验报告

16键计算器源程序及仿真实验报告

单片机课程设计报告设计题目:简易计算器系统设计专业班级:电信07101班设计者:潘雄文(24)设计者:罗芬(31)设计者:袁雅丽(33)指导教师:王先春老师设计时间: 2009.12.7-2009.12.18简易计算器系统设计一、设计目的1、进一步熟悉和掌握简单计算器的内部结构及工作原理。

2、掌握计算器中单片机的接口技术相关外围芯片的外特性,控制方法。

3、通过课程设计,掌握以简单计算器系统核心的电路设计的基本方法和技术,了解相关电路参数的计算方法。

二、设计要求设计一个可以进行2位数四则运算的计算器,要求:1,用按键输入数和运算符号;2,用LED显示运算过程和结果(十进制数);3,可以表示出当前的运算类型;4,具有清零和复位功能;5,具有连续运算功能。

注:加和改的部分:1、具有开机和关机动画显示功能;2、当按下按键时,能发出声音;3、把用LED显示运算过程和结果改为用液晶显示三、设计方案本设计是一个实现加,减,乘,除的计算器,AT89C51的P3口用于键盘输入,接4*4矩阵键盘,P2口用于控制液晶显示,P0口用于数据输入,用一个排阻RP1作为P0口的上拉电阻它可以实现8位正负数的加、减、乘、除运算。

四、硬件电路设计电路原理图AT89C51简介:AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FlashProgrammable and Erasable Read Only Memory)的低电压,高性能CMOS 8位微处理器,俗称单片机。

AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。

单片机的可擦除只读存储器可以反复擦除100次。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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.为了环保,每组只需提交一份纸质版,但是每人须提交一份电子版!同组的每个成员必须独立完成该项目中的一部分。

相关文档
最新文档