导航:首页 > 软件知识 > 单片机做计算器需要什么程序

单片机做计算器需要什么程序

发布时间:2023-01-07 21:45:20

❶ 怎么用51单片机做简易计算器

先制作出数字显示电路,还有相应数字按键电路,需要几位数就用几个数码管,然后根据计算逻辑编写出相应C程序

❷ 单片机做计算器的程序

1、直接调用库函数。

❸ 大神,求51单片机做简易计算器的那个c语言程序

以下是我编的简易计算器程序,基本成功
//4*4键盘检测程序,按下键后相应的代码显示在液晶屏上
//显示5位后,第6次显示操作符号
//再显示下一个数
// 键值与功能对应表
//键值 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
//功能 0 1 2 3 4 5 6 7 8 9 + - × ÷ = 清零
#include<reg52.h>
sbit beep=P2^3;
sbit lcden=P3^4;
sbit rs=P3^5;
sbit rw=P3^6;

#define uint unsigned int
#define ulint unsigned long int
#define uchar unsigned char
#define lcddata P0

ulint bb,dd,ee,ff;
uchar d,flag1;
uchar fd1,fd2;
uchar b1=16,b2=16,b3=16,b4=16,b5=16;
uchar d1=16,d2=16,d3=16,d4=16,d5=16;
uchar f1=16,f2=16,f3=16,f4=16,f5=16,f6=16,f7=16,f8=16,f9=16,f10=16;
uchar key,keyval,c,temp;

void Delay1ms(uint i) //1ms延时程序
{
uint j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}

void write_com(uchar com)
{
lcddata=com;
rs=0;
rw = 0;
lcden=0;
Delay1ms(10);
lcden=1;
Delay1ms(10);
lcden=0;
}
void write_date(uchar date)
{
lcddata=date;
rs=1;
rw=0;
lcden=0;
Delay1ms(10);
lcden=1;
Delay1ms(10);
lcden=0;
}

void init2()
{
rw=0;
write_com(0x38);
Delay1ms(10);
write_com(0x0f);
Delay1ms(10);
write_com(0x06);
Delay1ms(10);
write_com(0x01);
Delay1ms(10);
}

void display1(uchar A1,uchar A2,uchar A3,uchar A4,uchar A5) //第1个数显示程序
{
init2();
write_com(0x80);//第1行,第1字
Delay1ms(10);
write_date(0x30+A1);
Delay1ms(10);
write_date(0x30+A2);
Delay1ms(10);
write_date(0x30+A3);
Delay1ms(10);
write_date(0x30+A4);
Delay1ms(10);
write_date(0x30+A5);
Delay1ms(10);
}
void display2(uchar A1,uchar A2,uchar A3,uchar A4,uchar A5) //第2个数显示程序
{
write_com(0x88);//第1行,第1字
Delay1ms(10);
write_date(0x30+A1);
Delay1ms(10);
write_date(0x30+A2);
Delay1ms(10);
write_date(0x30+A3);
Delay1ms(10);
write_date(0x30+A4);
Delay1ms(10);
write_date(0x30+A5);
Delay1ms(10);
}

void display3(uchar a) //操作符号显示程序
{
write_com(0x86);//第1行,第1字
Delay1ms(10);
switch(a)
{
case 10:
write_date('+');
Delay1ms(10);
case 11:
write_date('-');
Delay1ms(10);
case 12:
write_date('x');
Delay1ms(10);
case 13:
write_date('/');
Delay1ms(10);
}
}

void display4(uchar A1,uchar A2,uchar A3,uchar A4,uchar A5,uchar A6,uchar A7,uchar A8,uchar A9,uchar A10,uchar A11,uchar A12) //结果显示程序
{
write_com(0x80+0x40);//第2行,第1字
Delay1ms(10);
if (flag1==0)
{
write_date('-');
}
else write_date('+');
Delay1ms(10);
write_date(0x30+A1);
Delay1ms(10);
write_date(0x30+A2);
Delay1ms(10);
write_date(0x30+A3);
Delay1ms(10);
write_date(0x30+A4);
Delay1ms(10);
write_date(0x30+A5);
Delay1ms(10);
write_date(0x30+A6);
Delay1ms(10);
write_date(0x30+A7);
Delay1ms(10);
write_date(0x30+A8);
Delay1ms(10);
write_date(0x30+A9);
Delay1ms(10);
write_date(0x30+A10);
Delay1ms(10);
write_date('.');
Delay1ms(10);
write_date(0x30+A11);
Delay1ms(10);
write_date(0x30+A12);
Delay1ms(10);
}

uchar keyscan()
{
key=16;
P3=0xef;//P3.7输出1个低电平
temp=P3; //读取
temp=temp&0x0f;//屏蔽高4位
if(temp!=0x0f)
{
Delay1ms(10);
if(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
break;

case 0xed:
key=4;
break;

case 0xeb:
key=8;
break;

case 0xe7:
key=12;
break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
beep=0;
}
beep=1;

}
}

P3=0xdf;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
Delay1ms(10);
if(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0xde:
key=1;
break;

case 0xdd:
key=5;
break;

case 0xdb:
key=9;
break;

case 0xd7:
key=13;
break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
beep=0;
}
beep=1;

}
}

P3=0xbf;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
Delay1ms(10);
if(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0xbe:
key=2;
break;

case 0xbd:
key=6;
break;

case 0xbb:
key=10;
break;

case 0xb7:
key=14;
break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
beep=0;
}
beep=1;

}
}

P3=0x7f;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
Delay1ms(10);
if(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0x7e:
key=3;
break;

case 0x7d:
key=7;
break;

case 0x7b:
key=11;
break;

case 0x77:
key=15;
break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
beep=0;
}
beep=1;

}
}
return(key);
}

void main()
{ while(1)
{
c=1;
while(c<6)//输入第1个5 位数
{
keyval=keyscan();
if(keyval<10)
{
switch(c)
{
case 1:b1=keyval; break;
case 2:b2=keyval; break;
case 3:b3=keyval; break;
case 4:b4=keyval; break;
case 5:b5=keyval; break;
}
c++;
}
display1(b1,b2,b3,b4,b5);
}

while(c==6) //输入计算符号
{
keyval=keyscan();
if((keyval>=10)&&(keyval<14)) //可去一层括号,因逻辑运算优先级较低
{
d=keyval;
}
c=1;
display3(d);

}
while(c<6) //输入第2个5 位数
{
keyval=keyscan();
if(keyval<10)
{
switch(c)
{
case 1:d1=keyval; break;
case 2:d2=keyval; break;
case 3:d3=keyval; break;
case 4:d4=keyval; break;// 除
case 5:d5=keyval; break;
}
c++;
}
display2(d1,d2,d3,d4,d5);
}

bb= b1*10000+b2*1000+b3*100+b4*10+b5;
dd=d1*10000+d1*1000+d3*100+d4*10+d5;
while(keyval!=14) //等待按下"="
{
keyval=keyscan();
}
Delay1ms(10);
switch(d)
{
case 10:ee=bb+dd; break;//+
case 11:
flag1=1;
if(bb>=dd)
{
ee=bb-dd; //-
flag1=0;
}
else ee=dd-bb;
break;

case 12:ee=bb*dd; break;//*可能会溢出
case 13:ee=bb/dd; //除法小数部分会丢失,保留2位
ff=bb%dd;
fd1=ff*10/dd;
fd2=ff*100/dd%10;
break;
}
f10=ee/1000000000%10;
f9=ee/100000000%10;
f8=ee/10000000%10;
f7=ee/1000000%10;
f6=ee/100000%10;
f5=ee/10000%10;
f4=ee/1000%10;
f3=ee/100%10;
f2=ee/10%10;
f1=ee%10;
display4(f10,f9,f8,f7,f6,f4,f4,f3,f2,f1,fd1,fd2);

while(keyval!=15)
{
keyval=keyscan();
}
b1=0;b2=0;b3=0;b4=0;b5=0;
d1=0;d2=0;d3=0;d4=0;d5=0;
bb=0;dd=0;ee=0;
init2();
}
}

❹ 用STC89C52单片机制作计算器的程序,有人做过吗(=´口`=)求程序,下面是要求

这个网络一下吧,可以搜索到很多结果的。

❺ 用单片机怎么做计算器

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/1114.0等价于(123+321) / 111
2.3+5.4=/0.1+77等号后直接按 / ,则将前面的运算结果作为第一个
操作数
1/0=E错误显示

9. 不足 使用3字节的浮点数表示,不可避免的带来了数表示的不精确,加上有效数字比较少,因此计算结果很容易产生误差,尤其是进行连续多次运算后,结果和精度较高的科学计算器的误差会很快达到0.01以上,当然这个差距和所测试的用例也有关系,4位有效数字导致了数字123456只能表示为123400,最后两位有效数字被摒弃了。 同时,虽然纯整数可以进行较为高精度的运算,实现也较为容易,但是考虑到要和浮点数混合在一起处理,如果在算法上分别考虑整数和浮点数,整个程序框架代码将会膨胀不少,因此将其简化为统一作为浮点数对待。

我这里有一个类似的程序;简单的计算器演示程序 硬件连接:矩阵键盘接p1口1602液晶控制p2.0-2.2 液晶数据p0 *;0-99之间的加、减、乘、除运算 *; 0a键+ 0b键- 0c键* 0#键/ 0#键清除 00键 等于 *;矩阵键盘定义: *;P1.0-P1.3为列线,P1.4-P1.7为行线 *;出口:A、R3存键值 * RELAY EQU P1.3 BEEP EQU P3.7;------------------------------- RS EQU P2.0 RW EQU P2.1 EN EQU P2.2 X EQU 3fH ;LCD 地址变量;------------------------------- TEMP1 EQU 30H ;临时暂存器 TEMP2 EQU 31H TEMP3 EQU 32H TEMP4 EQU 33H RES_H EQU 24H ;输入被加(减、乘、除)数 RES_L EQU 25H ;输入加(减、乘、除)数 OUT_H EQU 26H ;运算结果高位 OUT_L EQU 27H ;运算结果低位;------------------------------- ORG 0000H JMP MAIN;-------------------------------MAIN: MOV SP,#60H CLR EN CALL SET_LCD MOV 20H,#00H CALL BEEP_BL ;起延时作用 MOV R1,#00H MOV TEMP1,#00H MOV TEMP2,#00H MOV TEMP3,#00H MOV RES_L,#00H MOV RES_H,#00H MOV OUT_H,#00H MOV OUT_L,#00HLOOP: CALL KEY_IN ;送被(加、减、乘、除)数 JNB 20H.0,LOOP ;键标记 CALL BEEP_BL INC R1 CJNE R1,#01H,LOOP_1 MOV TEMP2,A ;高位 MOV X,#2 CALL CONV0LOOP_1: CJNE R1,#02H,LOOP SUBB A,#0AH ;判是否是功能键? JNC LOOP_2 ;是,转LOOP_2 MOV TEMP1,TEMP2 MOV A,TEMP1 MOV X,#1 CALL CONV0 MOV A,R3 ;恢复有效键值 MOV TEMP2,A ;低位 MOV X,#2 CALL CONV0 MOV A,TEMP1 ANL A,#0FH SWAP A ORL A,TEMP2 MOV RES_H,A JMP LOOP0LOOP_2: MOV RES_H,TEMP2 AJMP LOOP0ALOOP0: CALL KEY_IN JNB 20H.0,LOOP0 CALL BEEP_BLLOOP0A: MOV A,R3 ;重装键值 CJNE A,#0AH,LOOP1 ;加运算 CALL CONV1 SETB 20H.1 ;加运算标记 AJMP LOOP5LOOP1: CJNE A,#0BH,LOOP2 ;减运算 CALL CONV2 SETB 20H.2 ;减运算标记 AJMP LOOP5LOOP2: CJNE A,#0CH,LOOP3 ;乘运算 CALL CONV3 SETB 20H.3 ;乘运算标记 AJMP LOOP5LOOP3: CJNE A,#0DH,LOOP4 ;除运算 CALL CONV4 SETB 20H.4 ;除运算标记 AJMP LOOP5LOOP4: CJNE A,#0FH,LOOP4A AJMP MAIN LOOP4A: AJMP LOOP0LOOP5: MOV R1,#00H MOV TEMP1,#00H MOV TEMP2,#00H CLR 20H.0 ;送(加、减、乘、除)数LOOP5A: CALL KEY_IN JNB 20H.0,LOOP5A CALL BEEP_BL CJNE A,#0FH,LOOP5B AJMP MAINLOOP5B: INC R1 CJNE R1,#01H,LOOP5C MOV TEMP2,A MOV X,#6 CALL CONV0LOOP5C: CJNE R1,#02H,LOOP5A SUBB A,#0AH ;判是否是功能键? JNC LOOP5D ;是,转LOOP5C MOV TEMP1,TEMP2 MOV A,TEMP1 MOV X,#6 CALL CONV0 MOV A,R3 MOV TEMP2,A MOV X,#7 CALL CONV0 MOV A,TEMP1 ANL A,#0FH SWAP A ORL A,TEMP2 MOV RES_L,A JMP LOOP6LOOP5D: MOV RES_L,TEMP2 JMP LOOP6ALOOP6: CALL KEY_INLOOP6A: MOV A,R3 ;重装键值 CJNE A,#0FH,LOOP6B AJMP MAINLOOP6B: CJNE A,#0EH,LOOP6 ;显示(=) CALL CONV5 CALL BEEP_BL ;显示运算结果 JNB 20H.1,LOOP6C CALL SUADDLOOP6C: JNB 20H.2,LOOP6D CALL SUSUBLOOP6D: JNB 20H.3,LOOP6E CALL SUMULLOOP6E: JNB 20H.4,LOOP7 CALL SUDIVLOOP7: CALL KEY_IN CJNE A,#0FH,LOOP7 ;复位(清零) AJMP MAIN;------------------------;加法运算子程序;入口:R0-被加数,R1-加数;出口:R4(高)、R2(低)为和值;------------------------SUADD: MOV R1,RES_L MOV R0,RES_H MOV A,R0 ADD A,R1 DA A MOV R2,A CLR A ADDC A,#00H MOV R4,A MOV OUT_H,R4 MOV OUT_L,R2 CALL T_CONV RET;------------------------;减法运算子程序;入口:R0-被减数,R1-减数;出口:R2-差值;------------------------SUSUB: MOV R1,RES_L MOV R0,RES_H CLR C MOV A,#9AH SUBB A,R1 ;减数十进制求补 ADD A,R0 DA A MOV R2,A ;差值送R2 JC POSI ;C=1,表示差值为正 NEGA: MOV A,#9AH ;差值为负,求补后得差值的绝对值 SUBB A,R2 MOV R2,A SETB 20H.5 ;显示负号标记 POSI: MOV OUT_H,#00H MOV OUT_L,R2 CALL T_CONV RET;-------------------------;乘法运算子程序; 单字节BCD码乘法子程序;入口: R0(被乘数)、R1(乘数);出口: R3(高)、R2(低),积为双字节,BCD码形式的积;从乘数高位开始进行BCD码移位乘法;-------------------------SUMUL: MOV R1,RES_L MOV R0,RES_HBCDMUL: CLR A ;积单元清零 MOV R2,A MOV R3,A MOV A,R1 JZ RETURN ANL A,#0F0H ;取乘数高位 JZ LBCD ;乘数高位是否为0? SWAP A MOV R4,A ACALL DDBCDM SWAP A ;BCD码左移一位 MOV R3,A MOV A,R2 SWAP A MOV R2,A ANL A,#0FH ORL A,R3 MOV R3,A MOV A,R2 ANL A,#0F0H MOV R2,A LBCD: MOV A,R1 ;取乘数低位 ANL A,#0FH JZ RETURN ;乘数低位是否为0? MOV R4,A ACALL DDBCDMRETURN: MOV OUT_H,R3 MOV OUT_L,R2 CALL T_CONV RETDDBCDM: ;一位BCD码乘法 MOV A,R2 ADD A,R0 DA A MOV R2,A MOV A,R3 ADDC A,#00H DA A MOV R3,A DJNZ R4,DDBCDM RET;------------------------------------------------;除法运算子程序;单字节BCD码除法;入口:R0(被除数)、R1(非零除数);出口:R2(商)、R3(余数);《MCS-51系列单片机实用子程序集锦》Page 73;-----------------------------------------------SUDIV: MOV R1,RES_L MOV R0,RES_HBCDDIV: MOV R2,#00H ;商单元清零 MOV A,R1 ;除数求补 CPL A ADD A,#9BH MOV R1,A MOV A,R0 ;被除数高位移入 ANL A,#0F0H ;部分余单元 SWAP A LP0: MOV R3,A ;做除法 ADD A,R1 DA A JNC LP1 ;部分余数>=除数? INC R2 ;商加1 SJMP LP0 LP1: MOV A,R3 ; SWAP A MOV R3,A MOV A,R2 ;商左移一位 SWAP A MOV R2,A MOV A,R0 ;移位 ANL A,#0FH ORL A,R3 LP2: MOV R3,A ;做除法 ADD A,R1 DA A JNC LP3 INC R2 ;商加1 SJMP LP2 LP3: MOV A,R3 ;四舍五人 ADD A,R3 DA A JC LP4 ADD A,R1 DA A JNC RETURN1 LP4: MOV A,R2 ADDC A,#00H DA A MOV R2,A RETURN1: MOV OUT_H,#00H MOV OUT_L,R2 CALL T_CONV RET;-----------------------------------------------------; LCD 初始化设置;-----------------------------------------------------SET_LCD: CLR EN CALL INIT_LCD ;初始化 LCD CALL DELAY1 MOV DPTR,#INFO1 ;指针指到显示信息1 MOV A,#1 ;显示在第一行 CALL LCD_SHOW MOV DPTR,#INFO2 ;指针指到显示信息2 MOV A,#2 ;显示在第二行 CALL LCD_SHOW RET;-----------------------------------------------------INFO1: DB " CALCULATOR ",0 ;LCD 第一行显示信息INFO2: DB " ",0 ;LCD 第二行显示信息;----------------------------------------------------INIT_LCD: ;8位I/O控制 LCD 接口初始化 MOV A,#38H ;双列显示,字形5*7点阵 CALL WCOM CALL DELAY1 MOV A,#38H ;双列显示,字形5*7点阵 CALL WCOM CALL DELAY1 MOV A,#38H ;双列显示,字形5*7点阵 CALL WCOM CALL DELAY1 MOV A,#0CH ;开显示,关光标, CALL WCOM CALL DELAY1 MOV A,#01H ;清除 LCD 显示屏 CALL WCOM CALL DELAY1 RET;----------------------------------------------------LCD_SHOW: ;在LCD的第一行或第二行显示信息字符
CJNE A,#1,LINE2 ;判断是否为第一行 LINE1: MOV A,#80H ;设置 LCD 的第一行地址 CALL WCOM ;写入命令 CALL CLR_LINE ;清除该行字符数据 MOV A,#80H ;设置 LCD 的第一行地址 CALL WCOM ;写入命令 JMP FILL LINE2: MOV A,#0C0H ;设置 LCD 的第二行地址 CALL WCOM ;写入命令 CALL CLR_LINE ;清除该行字符数据 MOV A,#0C0H ;设置 LCD 的第二行地址 CALL WCOM FILL: CLR A ;填入字符 MOVC A,@A+DPTR ;由信息区取出字符 CJNE A,#0,LC1 ;判断是否为结束码 RET LC1: CALL WDATA ;写入数据 INC DPTR ;指针加1 JMP FILL ;继续填入字符 RET ;---------------------------------------------------CLR_LINE: ;清除该行 LCD 的字符 MOV R0,#24 CL1: MOV A,#' ' CALL WDATA DJNZ R0,CL1 RET;-----------------------------------------------------; 写指令、数据使能子程序;-----------------------------------------------------WCOM: ;写指令使能 MOV P0,A CLR RS ;RS=L,RW=L,D0-D7=指令码,E=高脉冲 CLR RW SETB EN CALL DELAY0 CLR EN RETWDATA: ;写数据使能 MOV P0,A SETB RS ;RS=H,RW=L,D0-D7=数据,E=高脉冲 CLR RW SETB EN CALL DELAY0 CLR EN RET
DELAY0: MOV R7,#250 ;延时500微秒 DJNZ R7,$ RET;---------------------------------------------------;在 LCD 第二行显示字符;A=ASC DATA, B=LINE X POS;---------------------------------------------------LCDP2: ;在LCD的第二行显示字符 PUSH ACC ; MOV A,B ;设置显示地址 ADD A,#0C0H ;设置LCD的第二行地址 CALL WCOM ;写入命令 POP ACC ;由堆栈取出A CALL WDATA ;写入数据 RET;-----------------------------------------------------;矩阵键盘键值读取子程序;-----------------------------------------------------KEY_IN: MOV P1,#0F0H ;置列线为0,行线为1 MOV A,P1 ANL A,#0F0H MOV B,A MOV P1,#0FH ;置列线为1,行线为0 MOV A,P1 ANL A,#0FH ORL A,B ;高四位与低四位重新组合 CJNE A,#0FFH,KEY_IN1 ;0FFH为末按键 CLR 20H.0 RETKEY_IN1: MOV B,A MOV DPTR,#KEYTABLE MOV R3,#0FFHKEY_IN2: INC R3 MOV A,R3 MOVC A,@A+DPTR CJNE A,B,KEY_IN3 MOV A,R3 ;找到,取顺序码 MOV R5,#08H ;延时 CALL DELAY SETB 20H.0 RETKEY_IN3: CJNE A,#0FFH,KEY_IN2 ;末完,继续查 RET ;0FFH为结束码;------------------------;在指定位置显示符合子程序;------------------------CONV0: add A,#30h MOV B,X CALL LCDP2 retCONV1: MOV X,#4 MOV A,#2BH ;+ MOV B,X CALL LCDP2 RET
CONV2: MOV X,#4 MOV A,#2DH ;- MOV B,X CALL LCDP2 RETCONV3: MOV X,#4 MOV A,#2AH ;* MOV B,X CALL LCDP2 RETCONV4: MOV X,#4 MOV A,#2FH ;/ MOV B,X CALL LCDP2 RETCONV5: MOV X,#09H MOV A,#3DH ;= MOV B,X CALL LCDP2 RET;--------------------------;;--------------------------CONV: MOV A,R3 ANL A,#0FH ;取出低四位二进制数 PUSH ACC ;压入堆栈 CLR C ;C=0 SUBB A,#0AH ;减10 POP ACC ;弹出堆栈 JC ASCII0 ;该数小于10,转ASCII0 JMP ASCII1 ASCII0: ADD A,#30H ;小于10的数加上30H MOV B,X CALL LCDP2ASCII1: RET
;-------------------------------------------------------T_CONV:
MOV A,OUT_H ;取高位数 mov x,#11 cjne a,#00h,t_conv1 ;判高位数是否为0? setb 20h.6 ;为0,20h.6置1 jmp t_conv3 ;转取低位数 ;高位数不为0,则t_conv1: anl a,#0f0h ;判高位数的高四位是否为0? cjne a,#00h,t_conv2 ;不为0,2位数都显示 setb 20h.6 ;为0,20h.6置1,只显示低四位t_conv2: mov a,out_h CALL SHOW_DIG2 inc x clr 20h.6 ;清显示标记位
t_conv3: mov a,out_l ;取低位数 jnb 20h.6,t_conv5 ;高位数有显示,则不判低位数。 anl a,#0f0h ;高位数无显示,则判低位数。 cjne a,#00h,t_conv4 ;判低位数的高四位是否为0? setb 20h.6 ;为0,20h.6置1,只显示低四位 MOV A,OUT_L JMP T_CONV5T_conv4: CLR 20H.6 ;低位数不为0,2位数都显示 mov a,out_l
t_conv5: call show_dig2 clr 20h.6 ;清显示标记位 RET;----------------------------;在 LCD 的第二行显示数字与符号;----------------------------SHOW_DIG2: JNB 20H.5,DIG2 ;符号标记 MOV TEMP3,A MOV A,#2DH ;显示负号 MOV B,X CALL LCDP2 MOV A,TEMP3 INC X DIG2: MOV B,#16 ;设置被除数 DIV AB ;结果A存商数,B存余数 jnb 20h.6,dig3 ;显示位标记 mov a,#20h jmp dig4dig3: ADD A,#30H ;A为十位数,转换为字符dig4: PUSH B ;B放入堆栈暂存 MOV B,X ;设置 LCD 显示的位置 CALL LCDP2 ;由 LCD 显示出来 POP B ; MOV A,B ;B为个位数 ADD A,#30H ;转换为字符 INC X ;LCD 显示位置加1 MOV B,X ;设置 LCD 显示的位置 CALL LCDP2 ;由 LCD 显示出来 RET;--------------------------------------------------------;蜂鸣器响一声子程序;--------------------------------------------------------BEEP_BL: MOV R6,#100 BL1: CALL DEX1 CPL BEEP DJNZ R6,BL1 MOV R5,#50 CALL DELAY RET DEX1: MOV R7,#180 DEX2: NOP DJNZ R7,DEX2 RETDELAY: ;延时R5×10MS MOV R6,#50 D1: MOV R7,#100 DJNZ R7,$ DJNZ R6,D1 DJNZ R5,DELAY RET;-----------------------------------------------------DELAY1: ;延时5MS MOV R6,#25 D2: MOV R7,#100 DJNZ R7,$ DJNZ R6,D2 RET;-----------------------------------------------------KEYTABLE: DB 0eeH ,077H,0B7H,0D7H,07bh,0bbh,0dbh ,07dh,0bdh,0ddh,0e7h,0ebh,0edh, 07eh,0beh,0deh,0ffH;----------------------------------------------------- END

❻ 怎样用51单片机做计算器啊

1、首先第一步就是要进行查找元器件并放入到原理图中,如下图所示。



(6)单片机做计算器需要什么程序扩展阅读


电脑仿真:

单片机有了开发系统,随着单片机的发展开发系统也在不断发展。 keil是一种先进的单片机集成开发系统。

它代表着汇编语言单片机开发系统的最新发展,首创多项便利技术,将开发的编程/仿真/调试/写入/加密等所有过程一气呵成,中间不须任何编译或汇编。

功能特性:

1、可以仿真63K程序空间,接近64K 的16位地址空间;

2、可以仿真64Kxdata 空间,全部64K 的16位地址空间;

3、可以真实仿真全部32 条IO脚;

4,完全兼容keilC51 UV2 调试环境,可以通过UV2 环境进行单步,断点, 全速等操作;

5、可以使用C51语言或者ASM汇编语言进行调试 ;

6、可以非常方便地进行所有变量观察,包括鼠标取值观察,即鼠标放在某 变量上就会立即显示出它此的值;

7、可选 使用用户晶振,支持0-40MHZ晶振频率;

8、片上带有768字节的xdata,您可以在仿真时选 使用他们,进行xdata 的仿真;

9、可以仿真双DPTR 指针;

10、可以仿真去除ALE 信号输出. ;

11、自适应300-38400bps 的所有波特率通讯;

12、体积非常细小,非常方便插入到用户板中.插入时紧贴用户板,没有连接电缆,这样可以有效地减少运行中的干扰,避免仿真时出现莫名其妙的故障;

13、仿真插针采用优质镀金插针,可以有效地防止日久生锈,选择优质园脚IC插座,保护仿真插针,同时不会损坏目标板上的插座. ;

14,仿真时监控和用户代码分离,不可能产生不能仿真的软故障;

15、RS-232接口不计成本采用MAX202集成电路,串行通讯稳定可靠,绝非一般三极管的简易电路可比。

功能限制:

仿真器占用单片机串口及定时器2,与Keil C(PC)通讯,故不支持串口及定时器2 的仿真功能。全速运行时单片机串口及定时器2 可供用户使用。

使用方法:

1、将仿真器插入需仿真的用户板的CPU插座中,仿真器由用户板供电;

2、将仿真器的串行电缆和PC机接好,打开用户板电源;

3、通过Keil C 的IDE 开发仿真环境UV2 下载用户程序进行仿真、调试。

❼ 怎样用51单片机做计算器啊

1、硬件仿真图

4、程序源代码

#include <reg51.h>#include <intrins.h>

#include <ctype.h>

#include <stdlib.h>

#define uchar unsigned char

#define uint unsigned int

uchar operand1[9], operand2[9];

uchar operator;

void delay(uint);

uchar keyscan();

void disp(void);

void buf(uint value);

uint compute(uint va1,uint va2,uchar optor);

uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,

0x92,0x82,0xf8,0x80,0x90,0xff};

uchar dbuf[8] = {10,10,10,10,10,10,10,10};

void delay(uint z)

{

uint x,y;

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

for(y=110;y>0;y--);

}

uchar keyscan()

{

uchar skey;

P1 = 0xfe;

while((P1 & 0xf0) != 0xf0)

{

delay(3);

while((P1 & 0xf0) != 0xf0)

{

switch(P1)

{

case 0xee: skey = '7'; break;

case 0xde: skey = '8'; break;

case 0xbe: skey = '9'; break;

case 0x7e: skey = '/'; break;

default: skey = '#';

}

while((P1 & 0xf0) != 0xf0)

;

}

}

P1 = 0xfd;

while((P1 & 0xf0) != 0xf0)

{

delay(3);

while((P1 & 0xf0) != 0xf0)

{

switch(P1)

{

case 0xed: skey = '4'; break;

case 0xdd: skey = '5'; break;

case 0xbd: skey = '6'; break;

case 0x7d: skey = '*'; break;

default: skey = '#';

}

while((P1 & 0xf0) != 0xf0)

;

}

}

P1 = 0xfb;

while((P1 & 0xf0) != 0xf0)

{

delay(3);

while((P1 & 0xf0) != 0xf0)

{

switch(P1)

{

case 0xeb: skey = '1'; break;

case 0xdb: skey = '2'; break;

case 0xbb: skey = '3'; break;

case 0x7b: skey = '-'; break;

default: skey = '#';

}

while((P1 & 0xf0) != 0xf0)

;

}

}

P1 = 0xf7;

while((P1 & 0xf0) != 0xf0)

{

delay(3);

while((P1 & 0xf0) != 0xf0)

{

switch(P1)

{

case 0xe7: skey = '$'; break;

case 0xd7: skey = '0'; break;

case 0xb7: skey = '='; break;

case 0x77: skey = '+'; break;

default: skey = '#';

}

while((P1 & 0xf0) != 0xf0)

;

}

}

return skey;

}

void main()

{

uint value1, value2, value;

uchar ckey, cut1 = 0, cut2 = 0;

uchar operator;

uchar i, bool = 0;

init:

buf(0);

disp();

value = 0;

cut1 = cut2 = 0;

bool = 0;

for(i = 0;i < 9;i++)

{

operand1[i] = '';

operand2[i] = '';

}

while(1)

{

ckey = keyscan();

if(ckey != '#')

{

if(isdigit(ckey))

{

switch(bool)

{

case 0:

operand1[cut1] = ckey;

operand1[cut1+1] = '';

value1 = atoi(operand1);

cut1++;

buf(value1);

disp();

break;

case 1:

operand2[cut2] = ckey;

operand2[cut2+1] = '';

value2 = atoi(operand2);

cut2++;

buf(value2);

disp();

break;

default: break;

}

}

else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/')

{

bool = 1;

operator = ckey;

buf(0);

dbuf[7] = 10;

disp();

}

else if(ckey == '=')

{

value = compute(value1,value2,operator);

buf(value);

disp();

while(1)

{

ckey = keyscan();

if(ckey == '$')

goto init;

else

{

buf(value);

disp();

}

}

}

else if(ckey == '$')

{ goto init;}

}

disp();

}

}

uint compute(uint va1,uint va2,uchar optor)

{

uint value;

switch(optor)

{

case '+' : value = va1+va2; break;

case '-' : value = va1-va2; break;

case '*' : value = va1*va2; break;

case '/' : value = va1/va2; break;

default : break;

}

return value;

}

void buf(uint val)

{

uchar i;

if(val == 0)

{

dbuf[7] = 0;

i = 6;

}

else

for(i = 7; val > 0; i--)

{

dbuf[i] = val % 10;

val /= 10;

}

for( ; i > 0; i--)

dbuf[i] = 10;

}

void disp(void)

{

uchar bsel, n;

bsel=0x01;

for(n=0;n<8;n++)

{

P2=bsel;

P0=table[dbuf[n]];

bsel=_crol_(bsel,1);

delay(3);

P0=0xff;

}

}

(7)单片机做计算器需要什么程序扩展阅读:

PROTEUS 是单片机课堂教学的先进助手

PROTEUS不仅可将许多单片机实例功能形象化,也可将许多单片机实例运行过程形象化。前者可在相当程度上得到实物演示实验的效果,后者则是实物演示实验难以达到的效果。

它的元器件、连接线路等却和传统的单片机实验硬件高度对应。这在相当程度上替代了传统的单片机实验教学的功能,例:元器件选择、电路连接、电路检测、电路修改、软件调试、运行结果等。

课程设计、毕业设计是学生走向就业的重要实践环节。由于PROTEUS提供了实验室无法相比的大量的元器件库,提供了修改电路设计的灵活性、提供了实验室在数量、质量上难以相比的虚拟仪器、仪表,因而也提供了培养学生实践精神、创造精神的平台

随着科技的发展,“计算机仿真技术”已成为许多设计部门重要的前期设计手段。它具有设计灵活,结果、过程的统一的特点。可使设计时间大为缩短、耗资大为减少,也可降低工程制造的风险。相信在单片机开发应用中PROTEUS也能茯得愈来愈广泛的应用。

使用Proteus 软件进行单片机系统仿真设计,是虚拟仿真技术和计算机多媒体技术相结合的综合运用,有利于培养学生的电路设计能力及仿真软件的操作能力;

在单片机课程设计和全国大学生电子设计竞赛中,我们使用 Proteus开发环境对学生进行培训,在不需要硬件投入的条件下,学生普遍反映,对单片机的学习比单纯学习书本知识更容易接受,更容易提高。

实践证明,在使用 Proteus 进行系统仿真开发成功之后再进行实际制作,能极大提高单片机系统设计效率。因此,Proteus 有较高的推广利用价值。

❽ 单片机简易计算器设计的程序

展开全部
首先会按键扫描,再会数码管或液晶屏显示,基本上可以了
程序
流程:
扫描按键(最多5次,最大65536,简易计算器吗)获得一个数,再扫描按键获得加减乘除符号
扫描按键获得另一个数
扫描按键获得“=”,显示计算结果
由于程序比较长,且与硬件有关,因此只贴出主程序:
void
main()
{
while(1)
{
c=1;
while(c<6)//输入第1个5
位数
{
keyval=keyscan();
if(keyval<10)
{
switch(c)
{
case
1:b1=keyval;
break;
case
2:b2=keyval;
break;
case
3:b3=keyval;
break;
case
4:b4=keyval;
break;
case
5:b5=keyval;
break;
}
c++;
}
display1(b1,b2,b3,b4,b5);
}
while(c==6)
//输入计算符号
{
keyval=keyscan();
if((keyval>=10)&&(keyval<14))
//10-13代表加减乘除
4种符号
{
d=keyval;
}
c=1;
display3(d);
}
while(c<6)
//输入第2个5
位数
{
keyval=keyscan();
if(keyval<10)
{
switch(c)
{
case
1:d1=keyval;
break;
case
2:d2=keyval;
break;
case
3:d3=keyval;
break;
case
4:d4=keyval;
break;//

case
5:d5=keyval;
break;
}
c++;
}
display2(d1,d2,d3,d4,d5);
}
bb=
b1*10000+b2*1000+b3*100+b4*10+b5;//5个按键数值合成一个数
dd=d1*10000+d1*1000+d3*100+d4*10+d5;
//另外5个按键数值也合成一个数
while(keyval!=14)
//等待按下"="
{
keyval=keyscan();
}
Delay1ms(10);
switch(d)
{
case
10:ee=bb+dd;
break;//+
case
11:
flag1=1;//结果是负数的标志,先假定是负数
if(bb>=dd)
{
ee=bb-dd;
//结果不是负数
flag1=0;
}
else
ee=dd-bb;
//减数和被减数交换
break;
case
12:ee=bb*dd;
break;//*可能会溢出
case
13:ee=bb/dd;
//除法小数部分会丢失,保留2位
ff=bb%dd;
fd1=ff*10/dd;
fd2=ff*100/dd%10;
break;
}
f10=ee/1000000000%10;
f9=ee/100000000%10;
f8=ee/10000000%10;
f7=ee/1000000%10;
f6=ee/100000%10;
f5=ee/10000%10;
f4=ee/1000%10;
f3=ee/100%10;
f2=ee/10%10;
f1=ee%10;
display4(f10,f9,f8,f7,f6,f4,f4,f3,f2,f1,fd1,fd2);
while(keyval!=15)
{
keyval=keyscan();
}
b1=0;b2=0;b3=0;b4=0;b5=0;
d1=0;d2=0;d3=0;d4=0;d5=0;
bb=0;dd=0;ee=0;
init2();
}
}

阅读全文

与单片机做计算器需要什么程序相关的资料

热点内容
兴义春茶市场在哪里 浏览:845
烟台城西农贸市场什么时候拆迁 浏览:169
绍兴财务代理公司是干什么的 浏览:920
微信怎么推销自己的产品句子 浏览:310
为什么很少从俄罗斯进口水产品 浏览:446
代理模式最好的有哪些 浏览:708
保定最大的茶市场在哪里 浏览:313
如何看网上求职人员信息 浏览:971
星际战甲火星市集如何交易 浏览:771
苹果官方赠送编织数据线哪里领 浏览:661
网易大神号如何转移数据 浏览:143
小程序圆了多少小企业的梦 浏览:856
什么是合约网格交易 浏览:607
罗马仕省级代理多少钱 浏览:393
信息共享目录有哪些内容 浏览:882
市场上白金60分钻戒多少钱 浏览:349
贸易公司代理需要多少服务费 浏览:3
选择什么程序添加到文件 浏览:25
燕窝面膜怎么做代理 浏览:403
lod信息采集是什么意思 浏览:162