当前位置:文档之家› AVR spi读取多字节程序

AVR spi读取多字节程序

AVR spi读取多字节程序
AVR spi读取多字节程序

使用的同步串行三线SPI接口,可以方便的连接采用SPI通信协议的外围或另一片AVR单片机,实现在短距离内的高速同步通信。ATmega128的SPI采用硬件方式实现面向字节的全双工3线同步通信,支持主机、从机和2种不同极性的SPI时序,通信速率有7种选择,主机方式的最高速率为1/2系统时钟,从机方式最高速率为1/4系统时钟。

ATmega128单片机内部的SPI接口也被用于程序存储器和数据E2PROM的编程下载和上传。但特别需要注意的是,此时SPI的MOSI和MISO接口不再对应PB2、PB3引脚,而是转换到PE0、PE1引脚上(PDI、PDO),其详见第二章中关于程序存储器的串行编程和校验部分的内容。

ATmega128的SPI为硬件接口和传输完成中断申请,所以使用SPI传输数据的有效方法是采用中断方式+数据缓存器的设计方法。在对SPI初始化时,应注意以下几点:

.正确选择和设置主机或从机,以及工作模式(极性),数据传输率;

.注意传送字节的顺序,是低位优先(LSB First)还是高位优先(MSB Frist);

.正确设置MOSI和MISO接口的输入输出方向,输入引脚使用上拉电阻,可以节省总线上的吊高电阻。

下面一段是SPI主机方式连续发送(接收)字节的例程:

#Define SIZE 100

Unsigned Char SPI_rx_buff[SIZE];

Unsigned Char SPI_tx_buff[SIZE];

Unsigned Char Rx_wr_index,Rx_rd_index,Rx_counter,Rx_buffer_overflow;

Unsigned Char Tx_wr_index,Tx_rd_index,Tx_counter;

#Pragma Interrupt_handler Spi_stc_isr:18

Void Spi_stc_isr(Void)

{

SPI_rx_buff[Rx_wr_index] = SPDR; //从ISP口读出收到的字节

If (++Rx_wr_index == SIZE) Rx_wr_index = 0; //放入接收缓冲区,并调整队列指针

If (++Rx_counter == SIZE)

Rx_counter = 0;

Rx_buffer_overflow = 1;

}

If (Tx_counter) //如果发送缓冲区中有待发的数据

{

--Tx_counter;

SPDR = SPI_tx_buff[Tx_rd_index]; //发送一个字节数据,并调整指针

If (++Tx_rd_index == SIZE) Tx_rd_index = 0;

}

}

Unsigned Char GetSPIchar(Void)

{

Unsigned Char Data;

While (Rx_counter == 0); //无接收数据,等待

Data = SPI_rx_buff[Rx_rd_index]; //从接收缓冲区取出一个SPI收到的数据If (++Rx_rd_index == SIZE) Rx_rd_index = 0; //调整指针

CLI();

--Rx_counter;

SEI();

Return Data;

}

Void PutSPIchar(Char C)

While (Tx_counter == SIZE);//发送缓冲区满,等待

CLI();

If (Tx_counter || ((SPSR & 0x80) == 0))//发送缓冲区已中有待发数据

{ //或SPI正在发送数据时

SPI_tx_buffer[Tx_wr_index] = C; //将数据放入发送缓冲区排队

If (++Tx_wr_index == SIZE) Tx_wr_index = 0; //调整指针

++Tx_counter;

}

Else

SPDR = C; //发送缓冲区中空且SPI口空闲,直接放入SPDR由SIP口发送

SEI();

}

Void Spi_init(Void)

{

Unsigned Chat Temp;

DDRB |= 0x080; //MISO=Input And MOSI,SCK,SS = Output

PORTB |= 0x80; //MISO上拉电阻有效

SPCR = 0xD5; //SPI允许,主机模式,MSB,允许SPI中断,极性方式01,1/16系统时钟速率

SPSR = 0x00;

Temp = SPSR;

Temp = SPDR; //清空SPI,和中断标志,使SPI空闲

Void Main(Void)

{

Unsigned Char I;

CLI(); //关中断

Spi_init(); //初始化SPI接口

SEI(); //开中断

While()

{

PutSPIchar(I); //发送一个字节

I++;

GetSPIchar(); //接收一个字节(第一个字节为空字节)

………

}

}

这个典型的SPI例程比较简单,主程序中首先对ATmega128的硬件SPI进行初始化。在初始化过程中,将PORTB的MOSI、SCLK和SS引脚作为输出,同时将MISO作为输入引脚,并打开上拉电阻。接着对SPI的寄存器进行初始化设置,并空读一次SPSR、SPDR寄存器(读SPSR后再对SPDR操作将自动清零SPI中断标志自动清零),使ISP空闲等待发送数据。

AVR的SPI由一个16位的循环移位寄存器构成,当数据从主机方移出时,从机的数据同时也被移入,因此SPI的发送和接收在一个中断服务中完成。在SPI中断服务程序中,先从SPDR中读一个接收的字节存入接收数据缓冲器中,再从发送数据缓冲器取出一个字节写入SPDR中,由ISP发送到从机。数据一旦写入SPDR,ISP硬件开始发送数据。下一次ISP 中断时,表示发送完成,并同时收到一个数据。类似本章介绍的USART接口的使用,程序中PutSPIchar()和GetSPIchar()为应用程序的底层接口函数(SPI驱动程序是SPI中断服务程序),同时也使用了两个数据缓冲器,分别构成循环队列。这种程序设计的思路,不但程序的结构性完整,同时也适当的解决了高速MCU和低速串口之间的矛盾,实现程序中任务的并行运行,提高了MCU的运行效率。

本例程是通过SPI批量输出、输入数据的示例,用户可以使用一片ATmega128,将其MOSI 和MISO两个引脚连接起来,构成一个ISP接口自发自收的系统,对程序进行演示验证。需要注意,实际接收到的字节为上一次中断时发出的数据,即第一个收到的字节是空字节。

读懂和了解程序的处理思想,读者可以根据需要对程序进行改动,适合实际系统的使用。如在实际应用中外接的从机是一片SPI接口的温度芯片,协议规程为:主机先要连续发送3个字节的命令,然后从机才返回一个字节的数据。那么用户程序可以先循环调用PutSPIchar()函数4次,将3个字节的命令和一个字节的空数据发送到从机,然后等待一段时间,或处理一些其它的操作后,再循环调用GetSPIchar()函数4次,从接收数据缓冲器中连续读取4个字节,放弃前3个空字节,第4个字节即为从机的返回数据了。

简易加减计算器小程序

[java語言與程序設計]简易加减计算器小程序 歸真我发表于:2011/8/1922:51:21标签(TAG): 简易加减计算器小程序 在上一篇《简易计算器面板小程序》中,我已对面板部分的程序作了详细的注释,并对程序的运行过程及结果作了完整的介绍,并且是上机调试过了得到的结果。但是,那只是面板,不能运算。要想让它具有运算的功能,还得在此基础上作一些修改,加进有关按钮动作响应部分的程序。为了便于理解,便于调试,便于学习,掌握其要点,我想应该遵循循序渐进的原则,所以,先从加减运算开始,看看这个功能是怎么实现的。请看下面的小程序。从程序中可以看出,它是利用内部类ButtonAct来处理按钮的动作响应的。从总体上讲是两个按钮“运算”和“重置”,但“运算”又区分为“加”和“减”。所以,用负责实现双分支的if语句来编程。 /**C2.java简易加减计算器小程序*/ import java.applet.*; import java.awt.*; import java.awt.event.*; public class C2extends Applet{ TextField t1,t2,t3; Button btn1,btn2; CheckboxGroup select; Checkbox a,s;//分别代表加、减 Label b; public void init(){ t1=new TextField(13); t2=new TextField(13); t3=new TextField(13); btn1=new Button("等于");

btn2=new Button("重置"); select=new CheckboxGroup(); a=new Checkbox("加",true,select); s=new Checkbox("减",false,select); b=new Label("简易加法/减法计算器"); add(b); add(t1); add(a); add(s); add(t2); add(btn1); add(t3); add(btn2); btn1.addActionListener(new ButtonAct());//注册给ButtonAct对象btn2.addActionListener(new ButtonAct());//注册给ButtonAct对象} class ButtonAct implements ActionListener{//内部类,按钮处理public void actionPerformed(ActionEvent e){ int op1,op2,op3; if(e.getSource()==btn1){//等于按钮 op1=Integer.parseInt(t1.getText()); op2=Integer.parseInt(t2.getText()); if(a.getState())//以下判断计算类型并实现相应的计算 op3=op1+op2; else op3=op1-op2; t3.setText(Integer.toString(op3)); } else{//重置按钮 t1.setText(""); t2.setText(""); t3.setText(""); a.setState(true); } } }//end of ButtonAct }//*~ 运行结果为:

实验一 两个多位十进制数相加的实验

实验一两个多位十进制数相加的实验 一、实验目的 1、学习数据传送和算术运算指令的用法。 2、熟悉在PC机上建立、汇编、链接、调试和运行汇编语言程序的过程。 二、实验内容 将两个多位十进制数相加,要求被加数和加数均以ASCII码形式各自顺序存放在以DATA1、DATA2为首的5个内存单元中(低位在前),结果送回DATA1处。 三、程序框图 四、程序清单

DATA SEGMENT ;定义数据段 DATA1 DB 33H,39H,31H,37H,34H;被加数 DATA1END EQU $-1 DATA2 DB 34H,35H,30H,38H,32H;加数 DATA2END EQU $-1 SUM DB 5 DUP(?) ;定义5个空字节 DATA ENDS STACK SEGMENT ;定义堆栈段 STA DB 20 DUP(?) ;取从STA开始的20个字节为堆栈段 TOP EQU LENGTH STA ;将堆栈段长度存放在TOP中 STACK ENDS ;堆栈段定义结束 CODE SEGMENT ;定义程序代码段 ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA ;表明程序代码段与段地址之间的关系START: MOV AX,DATA MOV DS,AX ;将段地址送入段地址寄存器 MOV AX,STACK MOV SS,AX ;将当前堆栈段首地址送入SS MOV SP,AX ;将堆栈段首地址送入堆栈指针寄存器 MOV SI,OFFSET DATA1END ;将DATA1的偏移地址送入SI MOV DI,OFFSET DATA2END ;将DATA2的偏移地址送入DI CALL ADDA ;调用子程序ADDA MOV AX,4C00H INT 21H ;中断调用 ADDA PROC NEAR ;子程序段 MOV DX,SI ;DX=0004H MOV BP,DI ;BP=0009H MOV BX,05H ;程序调用次数 AD1: SUB BYTE PTR[SI],30H ;将被加数的ASCII码转换成十六进制数 SUB BYTE PTR[DI],30H ;将加数的ASCII码转换成十六进制数 DEC SI ;SI中的内容自减1 DEC DI ;DI中的内容自减1 DEC BX ;程序调用次数自减1 JNZ AD1 ;条件转移 MOV SI,DX ;回到初始位置 MOV DI,BP MOV CX,05H ;循环次数控制 CLC ;清除CF位 AD2: MOV AL,[SI] MOV BL,[DI] ADC AL,BL ;从低位开始进行带进/借位的加法运算 AAA ;转换成非压缩BCD码,低位存于AL,高位存于AH MOV [SI],AL ;将AL中的内容存入SI所在地址

速算,简易计算器c语言代码,可实现加减乘除

#include"stdio.h" #include"math.h" #include"stdlib.h" struct optrstyle { int top; char stack[20]; } struct opndstyle { int top; int stack[20]; } void main() { char ch; while(1) { printf("-----------------------------------------\n"); printf("|-----------欢迎来到速算24--------------|\n"); printf("|----------是否开始游戏?????------------|\n"); printf("|--------- 开始游戏请按'Y'-------------|\n"); printf("|--------- 退出游戏请按其他键-------------|\n"); printf("-----------------------------------------\n"); scanf("%c",&ch); if(ch=='Y' or ch=='y') { } else break; } } int EvaluateExpression() { // 算术表达式求值的算符优先算法。设OPTR 和OPND 分别为运算符栈和运算数栈,OP 为运算符集合。 InitStack(OPTR); Push(OPTR,'#'); InitStack(OPND); c = getchar(); while(c!='#' || GetTop(OPTR)!='#') { if(!In(c,OP))

android简单计算器课程设计

摘要 Android是当今最重要的手机开发平台之一,它是建立在Java基础之上的,能够迅速建立手机软件的解决方案。Android的功能十分强大,成为当今软件行业的一股新兴力量。Android基于Linux平台,由操作系统、中间件、用户界面和应用软件组成,具有以下5个特点:开放性、应用程序无界限、应用程序是在平等条件下创建的,应用程序可以轻松的嵌入网络、应用程序可以并行运行。而简单计算器又是手机上必备的小程序,所以此次创新实践很有意义。并且具有很强的使用性。 关键字:Android Java基础计算器

目录 第1章开发工具与环境 (1) 1.1 Android平台 (1) 1.2 Java开发环境 (1) 1.3 Eclipse (1) 1.4 Android程序基础—Android应用程序的构成 (2) 第2章系统分析与设计 (4) 2.1系统的可行性分析 (4) 2.2 系统的需求分析 (4) 2.3 系统的优势 (4) 2.4 系统的流程图 (5) 第3章系统详细设计 (6) 3.1 动作Activity (6) 3.2 布局文件XML (6) 3.3 Activity的详细设计 (7) 3.2 布局文件XML的详细设计 (21) 3.2 系统的运行结果 (24) 结论 (25) 参考文献 (26)

第1章开发工具与环境 1.1 Android平台 1.谷歌与开放手机联盟合作开发了Android, 这个联盟由包括中国移动、摩托罗拉、高通、宏达和T-Mobile在内的30多家技术和无线应用的领军企业组成。 2.Android是一个真正意义上的开放性移动设备综合平台。通过与运营商、设备制造商、开发商和其他有关各方结成深层次的合作伙伴关系,来建立标准化、开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统,这样应用之间的通用性和互联性将在最大程度上得到保持。 3.所有的Android应用之间是完全平等的。 4.所有的应用都运行在一个核心的引擎上面,这个核心引擎其实就是一个虚拟机,它提供了一系列用于应用和硬件资源间进行通讯的API。撇开这个核心引擎,Android的所有其他的东西都是“应用”。 5.Android打破了应用之间的界限,比如开发人员可以把Web上的数据与本地的联系人,日历,位置信息结合起来,为用户创造全新的用户体验。 1.2 Java开发环境 Java技术包含了一个编程语言及一个平台。Java编程语言具有很多特性,如面向对象、跨平台、分布式、多线程、解释性等等。Java编程语言起源于Sun公司的一个叫“Green”的项目,目的是开发嵌入式家用电器的分布式系统,使电气更加智能化。1996年1月发布了JDK1.1版本,一门新语言自此走向世界。之后,1998年12月发布了1.2版本,2002年2月发布1.4版本,2004年10月发布1.5版本(5.0),2006年12月发布1.6(6.0)版本,这是目前的最新版本。Java1.2版本是一个重要的版本,基于该版本,Sun将Java技术分为J2SE、J2ME、J2EE,其中J2SE为创建和运行Java程序提供了最基本的环境,J2ME与J2EE 建立在J2SE的基础上,J2ME为嵌入式应用(如运行在手机里的Java程序)提供开发与运行环境,J2EE为分布式的企业应用提供开发与运行环境。 1.3 Eclipse

微机实验 两个多位十进制数相加的实验

实验2 两个多位十进制数相加的实验 一、实验目的 1. 学习数据传送和算术运算指令的用法。 2. 熟悉在PC机上建立、汇编、连接、调试和运行8088汇编语言程序的过程。 二、实验内容 将两个多位十进制数相加,要求被加数均以ASCII码形式各自顺序存放在以DA TA1和DA TA2为首的5个内存单元中(低位在前),结果送回DATA1处。附加题要求将加法过程显示与屏幕。 同学可以自己设计程序也可对代码段进行填空以及问答来完成程序。(附加题范例在第二页) ;该程序完成54321+54321=108642的多位十进制加法运算,和存放与DAT3 DATA SEGMENT DAT1 DB'12345';问一个多位十进制数各位是以何种顺序存放于内存的。 DAT2 DB'12345';个位存放于高地址或者为低地址。 DAT3 DB 6 DUP(0) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX LEA BX,DAT1 LEA SI,DAT2 LEA DI,DAT3 MOV CX,5 CLC ;为什么要加入这条指令 L1: MOV AL[BX] ADC AL,[SI] ;BYTE PTR[BX]+[SI]+CF→AL 例‘1’+‘1’+0= 62H→AL __________;填空________________; AL=02H PUSHF;为什么要加入pushf popf这两条指令 OR AL,30H;为什么要加入这条指令 POPF MOV [DI],AL __________;填空________ __________;填空________ __________ ;填空________ LOOP L1 JNC L2 MOV [DI],31H INC DI hlt CODE ENDS END START 三、程序框图(见下页)

多字节加减法汇编程序

16位10进制正整数加减法汇编程序代码说明: 将代码复制到Masm for Windows 集成实验环境 2012.5软件当中保存后点击运行如图: 出现如下窗口: 在屏幕上输入被加数(被减数)按‘+’结束,然后再输入加数(减数)按‘=’结束,最后窗口会显示运算结果。例如要计算123456+123456789,步骤如下:

显然运算结果是正确的。进行减法运算:123456-123456789,结果如下:

(注:由于n=16所以本程序最多只能进行16位数以内的正整数加减运算,如需进行任意位数的运算只需对n进行更改即可,这是本程序的最大优点。但是本程序只能完成正整数的加减运算,对负数和小数的运算就无能为力了,另外也无法进行连加与连减的运算。因此程序还有待进一步的改进。) 汇编程序代码: DATAS SEGMENT n EQU 16 ;n表示和的最大位数 m EQU 8 ;因为和是ASCII码要转换成BCA码所以m=n/2 k EQU 9*m+6 ; BUF0 DB 1 DUP (30H); BUF1 DB n DUP(0) ;被加数(ASCII),n=8 DB 1 DUP (30H) BUF2 DB n DUP(0) ;加数(ASCII) BUF3 DB m DUP(0) ;被加数(BCD) BUF4 DB m DUP(0) ;加数(BCD) FHA DB 4 DUP(?) ;用于保存‘+’、‘-’、数据长度 SBC DB m DUP(?) ;BCD码形式的和 SAS DB n DUP(?) ;ASCII码形式的和 BUF5 DB 30H,n DUP(0),30H,n DUP(0),n DUP(0),4 DUP(?),m DUP(?),n DUP(?) DATAS ENDS STACKS SEGMENT DB 100 DUP(?) ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS INPT1 PROC ;输入被加数到BUF1按‘+’结束 LEA SI,BUF1 MOV CX,0 ;CX用来统计输入数的字长

多位十进制数加法器实验-2014

实验三多位十进制数加法器设计 1、实验目的 (1)继续熟练掌握在PC机上建立、汇编、链接、调试和运行8088汇编语言程序的过程; (2)学习数据传送和算术运算指令的用法; (3)掌握子程序设计方法; (4)掌握宏汇编设计方法; (5)掌握键盘输出的DOS功能调用方法。 2、实验内容 (1)将两个多位十进制数相加。要求被加数、加数均以ASCII码形式各自按高位高地址的规律分别顺序存放在以DATAl和DATA2为首的5个内存单元中(低位在前),结果送回结果变量DATA3处,并屏幕显示结果。 (2)在以上程序基础上,设计一个多位十进制数加法器,键盘输入十进制加数和被加数,将输入和输出结果以竖式形式显示在屏幕。 3、提示: (1)算法说明:以42136与12547相加为例,首先将两个数中的每一位都以ASCII码存入相应的内存单元,然后将每一位数都减去30H,并将被加数DATA1和加数DATA2相对应位相加(BCD码加法及其十进制调整,要考虑低位向高位的进位),存入相应的结果DATA3存储单元中,最后将该单元中的每一位数转换成相应的ASCII码,调用DOS系统功能调用的显示字符指令,显示两数相加的结果。 (2)部分程序代码: DATA SEGMENT ;数据段 …;补充必要的代码,定义被加数、加数和结果变量 DATA ENDS STACK SEGMENT STACK ;堆栈段 STA DB 64 DUP(0) SP_TOP DB 0 STACK ENDS CODE SEGMENT ; 代码段 …;补充必要的代码 ;显示回车换行功能用宏定义CRLF实现,放在代码段最前面 CRLF MACRO MOV DL,0DH ;回车(0DH为回车的ASCII 码) MOV AH,02H ; 送DOS 的中断调用功能号 INT 21H ; DOS 的中断调用

简易加减法计算器

电子技术课程设计 题目:简易加减法计算器 一、设计课题:简易加减法计算器 二、设计任务和要求: 1、用于两位以下十进制数的加减运算。 2、以合适方式显示输入数据及计算结果。 三、原理电路设计 1、方案的比较 对于简单加减计算器可有三种不同的方案 ①用数/模转换,与模拟电路中的加减计算器进行简单的加减计 算。先用74LS147二-十进制优先编码器转化为二进制进行输A,然后数模转化模拟信号,进行加减计算后,转化为数字信号输 出。 此方案思路较明确,但经过二次数模相互转换,精确率较低; 具体输出时的负数效应,与单输入的二进制转化为十进制时电 路较复杂,无成块的集成电路,致使误差率较大。 ②可用数字电路中4位超前进位加法器74LS283与方案一输入相 同;后用三态输出CMOS门电路进行选择输入,进行加法运算

后输出,输出时,注意负数的问题与在输出中2进制与10进制关系的问题。还有寄存器的问题。 此方案思路明确,比较精确,此中的2进制与10进制问题需复杂门电路解决无现成集成元件,存在太多的散元件。减法运算需要反码进行运算,况且在其触发过程中需要考虑同步问题。 ③可运用数字电路中的单时钟同步十进制加/减计数器74LS190 进行加减计算。方案以上升沿进行输入,触发加减计算。本方案输入方式不同于一般输入方式,需要有所改进。但思路明了,不十分复杂,对于负数运算较复杂,可集成程度较高。 终上所述,最好是相互结合,以③为本。 2、单元电路设计

3、元件的选择

对于计数器来说需要选同时可以进行加减计数的计数器进行 加减,因此选用单时钟十进制加/减计数器74LS190. 其电路图及功能表如下: 中间由于1/0的输出不能够持久的进行保持,因此可用RS触 发器进行保持。对于加/减,等于触发需要74LS194进行触发 保持 4、整体电路(见附图) 5、工作原理 主要运用十进制加/减计数器74LS190加/减计数功能与74LS194的触发 功能。 六、设计总结 我们以为,在这学期的实验中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找大量资料,请教别人,以及不懈的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。而且,这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。 因为由于时间的紧缺和许多课业的繁忙,并没有做到最好,但是,最起码我们没有放弃,它是我们的骄傲!相信以后我们会以更加积极地态度对待我们的学习、对待我们的生活。我们的激情永远还会结束,

两个多位十进制数相加的实验

学生实验报告 (2010 —学年第学期)课程名称:微型计算机原理与接口技术开课实验室:2011年月日年级、专业、班学号姓名成绩实验项目名称两个多位十进制数相加的实验指导教 师 教 师 评语教师签名: 年月日 注:报告内容按实验须知中几点要求进行。 一、实验目的 1、学习数据传送和算术运算指令的用法。 2、熟悉在PC机上建立、汇编、链接、调试和运行8088汇编语言程序的过程。 3、学会PC机得安装 4、认识编程过程 二、实验原理及基本技术路线图或实验内容(方框原理图或程序流程图) 将两个多位十进制数相加。要求被加数均以ASCII码形式各自顺序存放在以DATA1和DATA2为首的5个内存单元中(低位在前),结果送回DATA1处。

程序框图 三、所用软件

四、实验步骤 整个程序分为4个部分:显示加数、转换、相加、输出结果。 五、源码程序编制及分析注释 CRLF MACRO ;宏定义指令(回车执行程序) MOV DL,0DH ;回车 MOV AH,02H ;2号调用,显示回车 INT 21H MOV DL,0AH ;换行 MOV AH,02H ;2号调用换行 INT 21H ENDM ;宏指令定义结束 DATA SEGMENT ;数据段定义 DATA1 DB 33H,39H,31H,37H,34H ;第一个数据(作为加数)47193 DATA2 DB 36H,35H,30H,38H,32H ;第二个数据(作为被加数)28056 DATA ENDS ;数据段定义结束 STACK SEGMENT ;堆栈段定义 STA DB 20 DUP(?) ;定义从STA开始20个单元作为堆栈使用TOP EQU LENGTH STA ;TOP等于堆栈单元数

简易计算器课程设计

基于单片机的计算器的设计 摘要:本设计是一个实现加减乘除的计算器,它的硬件主要由四部分构成,一个8051单片机芯片,两个八段共阴极数码管,一个4*4键盘,它可以实现一位数的加减乘除运算。 显示部分:采用LED动态显示。 按键部分:采用4*4键盘。采用软件识别键值,并执行相应的操作。 关键词:LED接口;键盘接口;8255A;汇编语言 一、概述 1.1设计要求及任务: (1)设计4*4的键盘,其中10个数字键0~9,其余六个键“+”、“—”、“*”、“/”、“=”、和“C”键; (2)设计两位LED接口电路; (3)实现1位数的简单运算 1.2设计原理 (1)LED显示器接口技术 LED动态显示接口技术 (2)键盘显示技术 逐行(逐列扫描法) 二、系统总体方案和硬件设计 2.1计算器总体思想 显示部分:采用LED动态显示。 按键部分:采用4*4键盘。采用软件识别键值,并执行相应的操作。 执行过程:开机显示零,等待键入数值,当键入数字,经通过数码管显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在数码管上输出运算结果。 图1 系统设计框图

2.2硬件的选择与连接 图二硬件连接总图 2.2.1硬件选择 (1)由于本设计比较简单,因此选用内部含有4KBE2PROM的89C51单片机作为系统的核心。 (2)扩展输入/输出端口 在扩展输入/输出端口时,要求输入口能够缓冲,,输出口能够锁存。常用小规模集成电路芯片74LS244或74LS245等扩展输入端口,用74LS273、74LS373、 74LS377扩展输出端口。这种扩展方法的特点是电路简单,但功能单一、灵活性差。因而常采用中规模的可编程并行接口芯片8255A扩展输入/输出端口。 (3)锁存电路采用74LS373 2.2.2接口设计 (1)单片机与8255A的接口设计 8255A中的数据总线缓冲器为三态双向数据缓冲存储器,用于将8255A的数据线 D0~D7和单片机的数据总线(P0口)连接,实现单片机和接口间的数据传送。 读写控制部件的接口设计 1、/CS为片选信号,接成低电平表示8255A 被选中。/CS与P2.7相连,用P2口的最高位控制8255A是否工作。即将P2.7控制为低电平。 2、RESET-复位信号,高电平有效,接在单片机的RST端。 3、/RD和/WR为读写控制信号,低电平有效。分别将两个端口接单片机的/RD和/WR 4、A1和A0-端口选择信号,分别与单片机的低两位地址线P1.1和P1.0相连。用于选择不同端口。采用74LS373三态锁存器,用于分离P0口第八位地址线,将它的Q0和Q1口接至8255A的地址输入端A0和A1。

多字节十进制加法程序设计

单片机实验报告 班级:11050641X 姓名:张超 学号:19 指导教师:赵英亮

实验一多字节十进制加法程序设计1.实验目的 1.熟悉仿真器的软件使用环境及单片机汇编语言编程; 2.掌握多字节十进制加法的程序设计及实现方法。 2.实验设备 CPU挂箱、8031CPU模块、Keil C51软件 3.实验内容 编写多字节十进制加法程序( P49 ),实现下式运算: 4574+6728=11302 要求:被加数在片内RAM区20H、21H单元; 加数在片内RAM区30H、31H单元; 结果在片内RAM区20H(最高位进位)、 21H(高位)、22H(低位)单元。 4.实验程序 ORG 0000H LJMP MAIN ORG 0030H MAIN:MOV A,20H ADD A,30H DA A MOV 22H,A MOV A,21H ADDC A,31H DA A MOV 21H,A CLR A MOV R3,00H ADDC A,R3 MOV 20H,A END 5.实验步骤

开机启动Keil C51软件进入μVision2 集成开发环境,确认89C51处于软件仿真状态。 完成程序的设计、编辑、编译、连接。 进入DEBUG方式,打开存储器Memory 1窗口,在窗口Address栏键入D:20H;点击鼠标右键,选择最后一项Modify Memory ,输入被加数;在窗口Address栏键入D:30H;点击鼠标右键,选择最后一项Modify Memory ,输入加数。 调试和运行程序并记录存储器Memory 1窗口实验结果。 6.实验结果 得出了正确的结果 7.实验图片

单片机 简易加法计数器

《单片机原理及应用》课程课程设计 题目简易计算器的设计 院(系)信息工程学院 专业班级 11级计算机应用技术1班 学生姓名 XXXXX 学号 XXXXXXXX 设计地点计算机应用实验室 指导教师 XXXX 起止时间:2013年6月3日至2013 年6 月14 日

摘要 随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。 本题目是实现两位数的加减运算的简易计算器,实现键盘输入,由七段LED 数码管输出;程序都是根据教材内和网络中的程序参考编写而成,在功能上还并不十分完善,限制也较多。本设计重在设计构思,使得我们用专业知识、专业技能分析和解决问题,通过设计使得我们对所学知识彻底巩固。 课程设计目的和意义: 通过这次课程设计,进一步掌握单片机理论知识,知道AT89S52单片机的原理、编程和各种功能的应用,了解简易计算器的工作原理,初步掌握计算器的硬软件设计、编写、调试和仿真,充分提高动手能力和排除故障的能力。同时通过毕业设计加深了我们对单片机的认识和兴趣,发挥了我们的创新能力。 在本次课程设计中,充分调动了组员的积极性,彼此之间通过相互合作,共同努力,一起出色地完成了任务! 设计任务:能够实现0~9这10个1位数的加减运算,用10个按键模拟0~9数字键,用两个按键实现加减运算,运算结果用5个数码管显示出来。如:5+3=8。关键词 : 单片机;数码管;矩阵键盘

目录 1.设计方案 (4) 1.1设计思路 (4) 1.2整体设计 (4) 2.电路设计原理 (6) 2.1键盘接口电路 (6) 2.2数码管显示原理及译码电路 (7) 2.3运算模块(单片机控制) (7) 3.功能程序仿真调试 (10) 3.1编程调试环境 (10) 3.2测试结果截图 (11) 4.程序设计 (12) 4.1软件程序设计 (12) 4.2源程序 (14) 5.总结 (18) 6.参考文献 (19)

VB6.0的小程序计算器

的小程序计算器 对于刚入门学习VB6 的朋友来说肯定会做些小程序吧,这里就是给大家演示个简单的计算器程序,仅供参考啦。 界面上加减乘除四个按钮分别是cmdAdd cmdPlus、cmdMultiple、cmdDevide,小数点按钮是cmdDot,负号按钮是cmdMinuse,数字0?9为了偷懒,用了控件数组cmdNumber(O)~ cmdNumber(9),上面txtShow 是显示数字和结果用的,txtOperate 是显示中间步骤的。 思路大致是这样, 点加减乘除这类操作符的时候, 把当前txtShow 的值保存在模块变量mstrParam1 里,同时把操作符保存到mstrOperate 里,按等于号时把先把当前txtShow 的值保存在模块变量mstrParam2 里,然后对mstrParam1 和mstrParam2 进行运算,当然要记得设法把String 转换成数值进行运算。 转换的过程要注意,这里是用的Variant 数据类型, vParam1 和vParam2 都是Variant 类型,保存的是mstrParam1 和mstrParam2 的数值。之所以不用integer 、long 、double 这些标准类型,是因为这些类型都有大小限制,做出来用着不方便,VB最大的整型long才 到47 ,这意味着计算器的计算结果只能限制在9位到10位。而Variant类型可以支持非常 大的数,具体多大不清楚,但起码几十位是能够支持的。另外,最后算完的结果也要做格式化,因为如果数值非常大的话,VB会自动转成科学计数法,所以要用Format函数进行调整。 如果需要源代码的话在我百度空间里留言。Explicit Private Const mstrFORMATDEFAULT As String = "#.##" Private mstrParam1 As String, mstrParam2 As String Private mstrOperate As String Private Sub cmdAdd_Click() mstrParam1 = Trim mstrOperate = "+" ___ nil = & mstrParam1 & vbCrLf = & mstrOperate & vbCrLf End Sub Private Sub cmdPlus_Click() mstrParam1 = Trim mstrOperate = "-" ____ Illi

实验七 无符号多字节加减法

实验七无符号多字节加/减法 一、实验目的 1、掌握多字节加减运算的设计方法; 2、进一步熟悉调试程序的方法。 二、实验仪器 1、DVCC-598JH单片开发机一台; 2、WD-5型直流稳压源一台。 三、实验预习 1、认真阅读实验指导书有关内容,明确实验目的、内容和操作步骤; 2、对实验中的程序和指令进行手工汇编; 3、复习实验中相关指令的功能。 四、实验内容 程序一:多字节无符号数加法 已知被加数首地址由R0指出,加数首地址由R1指出,字节数由R2指出,数据的存放方式以低位字节在前,高位字节在后。 参考程序: ORG 4000H CLR C LOOP:MOV A,@R0 ADDC A,@R1 MOV @R0,A INC R0 INC R1 DJNZ R2,LOOP JNC NEXT MOV @R0,#01H SJMP $ NEXT:MOV @R0,#00H

SJMP $ END 程序二:多字节无符号减法 在片内RAM40H~42H单元存入3字节的被减数(低位在前),在50H~52H 单元存入3字节的减数(低位在前),求这两个数的差,并将结果存入片外RAM 5000H为起始地址的单元中(低位在前)。 参考程序: ORG 2000H MOV R0,#40H MOV R1,#50H MOV DPTR,#5000H MOV R7,#03H CLR C LOOP:MOV A,@R0 SUBB A,@R1 MOVX @DPTR,A INC R0 INC R1 INC DPTR DJNZ R7,LOOP SJMP $ END 五、实验步骤 1、认真阅读实验参考程序并分析程序运行后的理论结果; 2、输入程序并检查输入是否正确; 3、根据已知条件输入程序执行前的原始数据; 4、执行程序,检查并记录结果 六、练习 1、如何将程序一改成多字节的十进制加法程序。

简易计算器课程设计

科研训练论文 题目:基于单片机的计算器的设计 目录 一、概述 (3) 1.1设计要求及任务: (3) 1.2设计原理: (3) 二、系统总体方案及硬件设计 (3) 2.1计算器总体思想 (3) 2.2硬件的选择与连接 (4) 2.2.1硬件选择 (4) 2.2.2接口设计 (5) 三、软件设计 (7)

3.2系统流程总图 (8) 3.3显示程序设计 (8) 3.4键盘识别程序设计 (9) 3.4.1原理与分析 (9) 3.4.2流程图 (10) 四、设计体会与总结 (11) 五、参考文献 (11) 附录 基于单片机的计算器的设计 摘要:本设计是一个实现加减乘除的计算器,它的硬件主要由四部分构成,一个8051单片机芯片,两个八段共阴极数码管,一个4*4键盘,它可以实现一位数的加减乘除运算。 显示部分:采用LED动态显示。 按键部分:采用4*4键盘。采用软件识别键值,并执行相应的操作。 关键词:LED接口;键盘接口;8255A;汇编语言

一、概述 1.1设计要求及任务: (1)设计4*4的键盘,其中10个数字键0~9,其余六个键“+”、“—”、“*”、“/”、“=”、和“C”键; (2)设计两位LED接口电路; (3)实现1位数的简单运算 1.2设计原理: (1)LED显示器接口技术 LED动态显示接口技术 (2)键盘显示技术 逐行(逐列扫描法) 二、系统总体方案及硬件设计 2.1计算器总体思想 显示部分:采用LED动态显示。 按键部分:采用4*4键盘。采用软件识别键值,并执行相应的操作。 执行过程:开机显示零,等待键入数值,当键入数字,经通过数码管显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在数码管上输出运算结果。

两个多位十进制数相加

两个多位十进制数相加 一、实验目的 L掌握数据传送和算术运算指令及基本伪指令的用法: 2.熟悉在微机上建立、汇编、链接、调试和运行80X86汇编语言程序的过程. 二、实验内容 将两个不带符号的多位十进进制数相加.要求加数和被加数均以ASCII码形式分别顺序存放在以DATAl和DA TA2为首的5个内存单元中(低位在前),结果送回以DATAl为首的内存单元中. 三、程序框图 N

四、程序清单 CRLF MACRO MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH MOV AH,02H INT 21H ENDM DATA SEGMENT DATA1 DB 33H,39H,31H,37H,34H DATA2 DB 36H,35H,30H,38H,32H DATA ENDS STACK SEGMENT PARA STACK 'STACK' STA DB 20 DUP(?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV ES,AX MOV AX,TOP MOV SP,AX MOV SI,OFFSET DATA2 MOV BX,05 CALL DISPL CRLF MOV SI,OFFSET DATA1 MOV BX,05 CALL DISPL CRLF MOV DI,OFFSET DATA2 CALL ADDA MOV SI,OFFSET DATA1 MOV BX,05 CALL DISPL CRLF MOV AX,4C00H INT 21H DISPL PROC NEAR DSL: MOV AH,02H

简易加减计算器设计(数电)

电子技术课程设计电气与信息工程学院建筑电气与智能化专业题目:简易加减计算器设计 姓名:徐雪娇 学号:094412110 指导教师:祁林

简易加减计算器设计 一、设计目的 1、在前导验证性认知实验基础上,进行更高层次的命题设计实验. 2、在教师指导下独立查阅资料、设计、特定功能的电子电路。 3、培养利用数字电路知识,解决电子线路中常见实际问题的能力. 4、积累电子制作经验,巩固基础、培养技能、追求创新、走向实用。 5、培养严肃认真的工作作风和严谨的科学态度。 二、设计要求 1、用于两位一下十进制的加减运算。 2、以合适方式显示输入数据及计算结果。 三、总体设计 第一步置入两个四位二进制数。例如(1001)2,(0011)2和(0101)2,(1000)2,同时在两个七段译码显示器上显示出对应的十进制数9,3和5,8。 第二步通过开关选择加(减)运算方式; 第三步若选择加运算方式所置数送入加法运算电路进行运算;同理若选 择减运算方式,则所置数送入减法运算电路运算; 第四步前面所得结果通过另外两个七段译码器显示。即: 方案一 通过开关J1-J8接不同的高低电平来控制输入端所置的两个一位十进制数, 译码显示器U10和U13分别显示所置入的两个数。数A直接置入四位超前进位 加法器74LS283的A4-A1端,74LS283的B4-B1端接四个2输入异或门。四个 2输入异或门的一输入端同时接到开关S1上,另一输入端分别接开关J5-J8,通过开关J5-J8控制数B的输入。当开关S1接低电平时,B与0异或的结果为B, 通过加法器74LS283完成两个数A和B的相加。当开关J1接高电平时,B与1 异或的结果为B非,置入的数B在74LS283的输入端为B的反码,且74LS283 的进位信号C0为1,其完成S=A+B(反码)+1,实际上其计算的结果为S=A-B 完成减法运算。由于译码显示器只能显示0-9,所以当A+B>9时不能显示,我们 在此用另一片芯片74LS283完成二进制码与8421BCD码的转换,即S>9(1001) 时加上6(0110)2,产生的进位信号送入译码器U12来显示结果的十位,U11 2 显示结果的个位。由于减法运算时两个一位十进制数相减不会大于10,所以不 会出现上述情况,用一片芯片U11即可显示结果。 方案二 由两异或门两与门和一或门组成全加器,可实现一位二进制加逻辑运算,四 位二进制数并行相加的逻辑运算可采用四个全加器串行进位的方式来实现,将低 位的进位输出信号接到高位的进位输入端,四个全加器依次串行连接,并将最低

汇编 多字节加法

;************************************************** ******************** ; input beijianshu: TempRam1, TempRam2 TempRam3 ; jiashu: TempRam4,TempRam5,TempRam6 ; output: ; TempRam1, TempRam2 TempRam3 ;************************************************** ******************** _Sub3_3: clr c mov A,TempRam3 s ubb A,TempRam6 m ov TempRam3,A mov A,TempRam2 subb A,TempRam5 mov TempRam2,A m ov A,TempRam1 subb A,TempRam4 mov TempRam1,A ret ;************************************************** ********************

; input TempRam2, TempRam3 TempRam4, TempRam5, TempRam6 ; TempRam11,TempRam12,TempRam13 ; output: ; yushu: TempRam1, TempRam2, TempRam3 ; shan: TempRam4, TempRam5, TempRam6 ; Need: buffer0,buffer1,buffer2,buffer3 ;************************************************** ******************** _Div6_3: m ov TempRam1,#00H m ov Buffer3,#24 J mp _Div6_3Loop _Div4_2: m ov TempRam1,#00H m ov TempRam2,#00H m ov TempRam11,#00H m ov Buffer3,#24 _Div6_3Loop: c lr C mov A,TempRam6 rlc A

简易计算器(加减乘除幂e)

此计算机包含+,-,/,*,!,sin,tan,cos,^,e。 #include #include #include #include #define max 100 #define MaxOp 100 struct //设定运算符优先级 { char ch; //运算符 int pri; //优先级 } lpri[]={{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6},{'^', 7},{'e',7},{'!',7},{'s',7},{'t',7},{'c',7}}, rpri[]={{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1},{'^', 6},{'e',6},{'!',6},{'s',6},{'t',6},{'c',6}}; int leftpri(char op) //求左运算符op的优先级 { int i; for(i=0;i

相关主题
文本预览
相关文档 最新文档