导航:首页 > 操作系统 > 基于单片机的多功能计算器的设计

基于单片机的多功能计算器的设计

发布时间:2022-07-18 15:24:05

❶ 用单片机设计简易计算器

给你些子程序,自己看着凑吧。呵呵。有了这些,写出来应该不难了。

;@@@@@@@@@双字节整数运算@@@@@@@@@@@@@@@@@@
;***********双字节无符号加法**************
;入口:R6(H),R7,R4(H),R5,出口:和R6(H),R7(L)
UADD: MOV A,R7
ADD A,R5
MOV R7,A
MOV A,R6
ADDC A,R4
MOV R6,A
RET
;***********双字节无符号减法**************
;入口:被减数R6(H),R7(L),减数R4(H),R5(L),出口:差R6(H),R7(L)
CLR C
MOV A,R7
SUBB A,R5
MOV R7,A
MOV A,R6
SUBB A,R4
MOV R6,A
RET
;***********双字节无符号乘法**************
;入口:R6(H),R7(L),R4(H),R5(L),出口:积R6(H),R7(L)
UMUL: MOV A,R7
MOV B,R5
MUL AB
MOV R0,B
XCH A,R7
MOV B,R4
MUL AB
ADD A,R0
XCH A,R6
MOV B,R5
MUL AB
ADD A,R6
MOV R6,A
RET

;***********双字节无符号除法*****************
;入口:R6(H),R7(L),R4(H),R5(L),出口:商R6(H),R7(L),余R4(H),R5(L)
;影响:R2,R3,
;堆栈需求:1
UDIV: CLR C
CLR A
MOV R2,A
MOV R3,A
MOV B,#10H
MOVBIT: MOV A,R7;R6、R7中数据左移一位到R2、R3中,C到R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
CLR C ;R2R3-R4R5
MOV A,R3
SUBB A,R5
PUSH Acc
MOV A,R2
SUBB A,R4
JBC Cy,MOVBIT0;不够减,清C继续左移
MOV R2,A;够减,存回余数并置位C
POP Acc
MOV R3,A
SETB C
SJMP MOVBIT1
MOVBIT0: POP Acc
MOVBIT1: DJNZ B,MOVBIT
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R2
MOV R4,A
MOV A,R3
MOV R5,A
RET

(7) 标号: DIVD 功能:双字节二进制无符号数除法

入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。
影响资源:PSW、A、B、R1~R7 堆栈需求: 2字节
DIVD: CLR C ;比较被除数和除数
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV ;溢出
RET
DVD1: MOV B,#10H ;计算双字节商
DVD2: CLR C ;部分商和余数同时左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C ;保存溢出位
CLR C
SUBB A,R7 ;计算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0 ;结果判断
JC DVD3
MOV R2,A ;够减,存放新的余数
MOV A,R1
MOV R3,A
INC R5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;计算完十六位商(R4R5)
MOV A,R4 ;将商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV ;设立成功标志
RET

❷ 基于51单片机的简易计算器设计,急

//功能 0 1 2 3 4 5 6 7 8 9 + - × ÷ = 清零 表3-1 3.2 计算器的软件设计

#include<reg51.h> //头文件

#define uint unsigned int //

#define uchar unsigned char

sbit lcden=P2^3; //定义引脚

sbit rs=P2^4;

sbit rw=P2^0;

sbit busy=P0^7;

char i,j,temp,num,num_1;

long a,b,c; //a,第一个数 b,第二个数 c,得数

float a_c,b_c;

uchar flag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号

uchar code table[]={ 7,8,9,0, 4,5,6,0, 1,2,3,0, 0,0,0,0};

uchar code table1[]={

7,8,9,0x2f-0x30,

4,5,6,0x2a-0x30,

1,2,3,0x2d-0x30,

0x01-0x30,0,0x3d-0x30,0x2b-0x30};

void delay(uchar z) // 延迟函数

{

uchar y;

for(z;z>0;z--)

for(y=0;y<110;y++);

} void check() // 判断忙或空闲

{

do{

P0=0xFF;

rs=0; //指令

rw=1; //读

lcden=0; //禁止读写

delay(1); //等待,液晶显示器处理数据

lcden=1; //允许读写

}while(busy==1); //判断是否为空闲,1为忙,0为空闲

}

void write_com(uchar com) // 写指令函数

{

P0=com; //com指令付给P0口

rs=0;

rw=0;

lcden=0;

check();

lcden=1;

}

void write_date(uchar date) // 写数据函数

{

P0=date;

rs=1;

rw=0;

lcden=0;

check();

lcden=1;

}

void init() //初始化

{

num=-1;

lcden=1; //使能信号为高电平

write_com(0x38); //8位,2行

write_com(0x0c); //显示开,光标关,不闪烁*/

write_com(0x06); //增量方式不移位 显竟獗暌贫 柚?

write_com(0x80); //检测忙信号

write_com(0x01); //显示开,光标关,不闪烁

num_1=0;

i=0;

j=0;

a=0; //第一个参与运算的数

b=0; //第二个参与运算的数

c=0;

flag=0; //flag表示是否有符号键按下,

fuhao=0; // fuhao表征按下的是哪个符号

}

void keyscan() // 键盘扫描程序

{

P3=0xfe;

if(P3!=0xfe)

{

delay(20); //延迟20ms

if(P3!=0xfe)

{

temp=P3&0xf0;

switch(temp)

{

case 0xe0:num=0;

break;

case 0xd0:num=1;

break;

case 0xb0:num=2;

break;

case 0x70:num=3;

break;

}

}

while(P3!=0xfe);

if(num==0||num==1||num==2)//如果按下的是'7','8'或'9

{

if(j!=0)

{

write_com(0x01);

j=0;

}

if(flag==0)//没有按过符号键

{

a=a*10+table[num];

}

else//如果按过符号键

{

b=b*10+table[num];

}

}

else//如果按下的是'/'

{

flag=1;

fuhao=4;//4表示除号已按

}

i=table1[num];

write_date(0x30+i);

}

P3=0xfd;

if(P3!=0xfd)

{

delay(5);

if(P3!=0xfd)

{

temp=P3&0xf0;

switch(temp)

{

case 0xe0:num=4;

break;

case 0xd0:num=5;

break;

case 0xb0:num=6;

break;

case 0x70:num=7;

break;

}

}

while(P3!=0xfd);

if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6'

{

if(j!=0)

{

write_com(0x01);

j=0;

}

if(flag==0)//没有按过符号键

{

a=a*10+table[num];

}

else//如果按过符号键

{

b=b*10+table[num];

}

}

else//如果按下的是'/'

{

flag=1;

fuhao=3;//3表示乘号已按

}

i=table1[num];

write_date(0x30+i);

}

P3=0xfb; if(P3!=0xfb)

{

delay(5);

if(P3!=0xfb)

{

temp=P3&0xf0;

switch(temp)

{

case 0xe0:num=8;

break;

case 0xd0:num=9;

break;

case 0xb0:num=10;

break;

case 0x70:num=11;

break;

}

}

while(P3!=0xfb);

if(num==8||num==9||num==10)//如果按下的是'1','2'或'3'

{

if(j!=0)

{

write_com(0x01);

j=0;

}

if(flag==0)//没有按过符号键

{

a=a*10+table[num];

}

else//如果按过符号键

{

b=b*10+table[num];

}

}

else if(num==11)//如果按下的是'-'

{

flag=1;

fuhao=2;//2表示减号已按

}

i=table1[num];

write_date(0x30+i);

}

P3=0xf7;

if(P3!=0xf7)

{

delay(5);

if(P3!=0xf7)

{

temp=P3&0xf0;

switch(temp)

{

case 0xe0:num=12;

break;

case 0xd0:num=13;

break;

case 0xb0:num=14;

break;

case 0x70:num=15;

break;

}

}

while(P3!=0xf7);

switch(num)

{

case 12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是"清零"

break;

case 13:{ //按下的是"0"

if(flag==0) //没有按过符号键

{

a=a*10;

write_date(0x30);

P1=0;

}

else if(flag==1)//如果按过符号键

{

b=b*10;

write_date(0x30);

}

}

break;

case 14:{j=1;

if(fuhao==1){write_com(0x80+0x4f);//按下等于键,光标前进至第二行最后一个显示处

write_com(0x04); //设置从后住前写数据,每写完一个数据,光标后退一格

c=a+b;

while(c!=0)

{

write_date(0x30+c%10);

c=c/10;

}

write_date(0x3d); //再写"="

a=0;b=0;flag=0;fuhao=0;

}

else if(fuhao==2){write_com(0x80+0x4f); //光标前进至第二行最后一个显示处

write_com(0x04); //设置从后住前写数据,每写完一个数据,光标后退一格

//(这个照理说顺序不对,可显示和上段一样)

if(a-b>0)

c=a-b;

else

c=b-a;

while(c!=0)

{

write_date(0x30+c%10);

c=c/10;

}

if(a-b<0)

write_date(0x2d);

write_date(0x3d); //再写"="

a=0;b=0;flag=0;fuhao=0;

}

else if(fuhao==3){write_com(0x80+0x4f);

write_com(0x04);

c=a*b;

while(c!=0)

{

write_date(0x30+c%10);

c=c/10;

}

write_date(0x3d);

a=0;b=0;flag=0;fuhao=0;

}

else if(fuhao==4){write_com(0x80+0x4f);

write_com(0x04);

i=0;

c=(long)(((float)a/b)*1000);

while(c!=0)

{

write_date(0x30+c%10);

c=c/10;

i++;

if(i==3)

write_date(0x2e);

}

if(a/b<=0)

write_date(0x30);

write_date(0x3d);

a=0;b=0;flag=0;fuhao=0;

}

}

break;

case 15:{write_date(0x30+table1[num]);flag=1;fuhao=1;}

break;

}

}

}


main()

{

init();

while(1)

{

keyscan();

}

}

❸ 单片机,设计一个计算器,能够自定义按键键值,并能通过串口调试助手将执行结果显示到计算机上。

你的这个题目范围太大了。限于篇幅无法在细节上一一讲明白。

主要的思路如下:

  1. 硬件设计:单片机需要能够检测键是否按下,就需要搭建电路。通常情况下按键有两种方式:一种是直接将键通过电阻电容连接到单片机IO引脚上,这种方式适用于按键数量不太多或单片机引脚数量足够多的情况。另外一种是将键纵横排列成按键网络,通过扫描的方法检测按下的是哪个键,这种适用于键数量较多,或IO引脚不足的情况,比如你的图上有4X4=16键,直接连接的方法需要16个IO口,网络的话,只需要4+4=8个IO口即可完成。具体哪种根据需要来,具体电路网上搜索。

    另外就是通讯电路,这个网上有好多RS232的,不再细说

  2. 算法设计

    由于是键盘,除了检测到哪个键按下外,还应该包含一定的消除抖动的能力,防止按下一个键却触发好多次同样的按下此键的情况。

    另外需要在单片机内存中建立“键-键值”的对应关系表,因为你要求能够自定义键值。

  3. 通讯

    你没有提到通讯是实时发送还是按下一个键,比如回车键后才发送。

    由于键盘的速度比较低,为了简单,可以采用检测到一个键按下后就发送一个键的代码。

    根据你所采用的单片机的不同,所用的对通讯的初始化、发送等代码也有所不同。具体不再细说。


❹ 基于51单片机的简易计算器制作

您好,这样的:
纵观单片机的发展过程,可以预示单片机的发展趋势,;1)低功耗CMOS化;MCS-51系列的8051推出时的功耗达630m;2)微型单片化;现在常规的单片机普遍都是将中央处理器(CPU)、;此外,现在的产品普遍要求体积

照程序设计的各部分实现的功能不同,将整个软件系统分成了三个块,并对每一个功能块所采用的元器件进行了详细介绍。此外还编写了主要功能模块的基本程序,详尽阐述了各模块的工作过程。还有总流程图,源代码,硬器件铺线图。

❺ 基于单片机的多功能计算器设计文献综述

hh

❻ 一、设计题目 基于单片机的简易计算器设计 二、设计任务 1、用单片机设计一简易计算器。 2、采用4*4键盘,

1. 4X4键盘输入,点阵字符型液晶显示。
2. 由于所采用的浮点程序库的限制(MCU平台只找到这个……),浮点运算采用3字节二进制补码表示,有效数字6位。对于输入输出,采用3字节BCD码浮点数格式,有效数字只有4位,因此最终有效数字只有4位。
3. 可进行连续输入,例如:1.23+4.56*8.23/234.8 ,但是运算结果为从左到右,这也是8位简易计算器的方式。
4. 可进行错误判断,溢出、除零等错误将显示一个字符 E 。
5. 由于键盘只有16个按键,安排如下:
+---------------+
| 7 | 8 | 9 | + |
| 4 | 5 | 6 | - |
| 1 | 2 | 3 | * |
| 0 | . | = | / |
+---------------+
6. 按键的缺少导致取消了一些特殊函数,即开根号,三角函数(sin, cos, tan, ctg)的实现,由于这些函数在浮点程序库中均已提供,如果硬件允许,在原来的框架上添加这些附加功能是很容易的(可以看作和+, -, *, /等价的按键操作,调用不同的子程序进行运算即可)
7. 按两次 = 等于清灵。因为按键实在太少,才采用了这个做法。
8. 相应举例:
按键 结果 说明
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
123+= 123 按下等号而没有第二个操作数,保留第一个操作数
并认为此次运算结束(等号的功能)

123+321/111 4.0 等价于(123+321) / 111

2.3+5.4=/0.1+ 77 等号后直接按 / ,则将前面的运算结果作为第一个
操作数
1/0= E 错误显示

源码去这里:

❼ 基于单片机的多功能计算器

不会吧,这么有趣,我前几天做的课程设计就是这个啊!
刚刚花了一个星期做完了这个计算器,硬件,程序,论文都已经完成了。
我里面没用到74LS244或74LS240、与非门等器件,就是用到了51单片机和数码管来实现的
因为51里面的IO口多,没必要用这些东西,如果要用也可以,哈哈。
如果你急要,我发你吧!

❽ 基于MSP430单片机的简易计算器设计

这是我以前的,你可以看看:
第六页 开始:仿真+程序
http://wenku..com/view/2447d32d915f804d2b16c18e.html

阅读全文

与基于单片机的多功能计算器的设计相关的资料

热点内容
好兴动app还款怎么登录不上去了 浏览:665
郑州云服务器托管 浏览:722
服务器地址跟踪 浏览:980
免费google云服务器 浏览:516
摘译和编译的英文 浏览:359
热泵压缩机选型 浏览:121
op手机微信加密如何解除 浏览:386
如何在王牌战争找到高爆率服务器 浏览:13
江浙小学语文辅导课用什么APP 浏览:99
新梦幻大陆服务器地址 浏览:241
网吧服务器怎么更换壁纸 浏览:530
linux命令方法 浏览:332
linux下载freetype 浏览:123
程序员入驻平台 浏览:327
程序员大战外挂 浏览:745
html实例教程pdf 浏览:157
linux命令开放所有权限 浏览:575
30岁能学会编程 浏览:737
小火箭的服务器是什么 浏览:967
cad查信息命令 浏览:402