如何用51单片机做计算器?

1,硬件仿真图

硬件部分比较简单。当按下键盘键时,该行和列中的端口为低电平。因此,只要扫描行和列端口为低,就可以确定按了哪个键。

2、主程序流程图

程序的主要思想是:将按键抽象成字符,然后对字符进行处理。操作数被转换成字符串,运算符以字符形式存储。然后调用compute()函数进行计算并返回结果。具体的程序和注意事项,以及流程图。

3.Altium Designer绘制的PCB图。

4、程序源代码

# include & ltreg 51 . h & gt;# include & ltintrins.h & gt

# include & ltctype.h & gt

# include & ltstdlib.h & gt

#定义uchar无符号字符

#定义uint无符号整数

uchar operand1[9],operand 2[9];

uchar算子;?

无效延迟(uint);

uchar keyscan();

void disp(void);

void buf(uint值);

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

uchar码表[] = {0xc0,0xf9,0xa4,0xb0,0x99,

0x92,0x82,0xf8,0x80,0x90,0x ff };?

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

无效延迟(单位z)

{

uint x,y;

for(x = z;x & gt0;x -)

for(y = 110;y & gt0;y-);

}

uchar键扫描()

{

乌查尔·斯基;?

p 1 = 0x Fe;

while((p 1 & amp;0xf0)!= 0xf0)

{

延迟(3);?

while((p 1 & amp;0xf0)!= 0xf0)

{

开关(P1)

{

case 0x ee:skey = ' 7 ';打破;

case 0x de:skey = ' 8 ';打破;

case 0x be:skey = ' 9 ';打破;

案例0x7e:skey = '/';打破;?

默认:?skey = ' #

}

while((p 1 & amp;0xf0)!= 0xf0)?

}

}

p 1 = 0x FD;

while((p 1 & amp;0xf0)!= 0xf0)

{

延迟(3);

while((p 1 & amp;0xf0)!= 0xf0)

{

开关(P1)

{

case 0x ed:skey = ' 4 ';打破;

case 0x DD:skey = ' 5 ';打破;

case 0x BD:skey = ' 6 ';打破;

案例0x7d:skey = ' * ';打破;

默认:?skey = ' #

}

while((p 1 & amp;0xf0)!= 0xf0)

}

}

p 1 = 0x FB;

while((p 1 & amp;0xf0)!= 0xf0)

{

延迟(3);

while((p 1 & amp;0xf0)!= 0xf0)

{

开关(P1)

{

case 0xeb:skey = ' 1 ';打破;

case 0x db:skey = ' 2 ';打破;

case 0x bb:skey = ' 3 ';打破;

案例0x7b:skey = '-';打破;

默认值:skey = ' #

}

while((p 1 & amp;0xf0)!= 0xf0)

}

}

p 1 = 0xf 7;

while((p 1 & amp;0xf0)!= 0xf0)

{

延迟(3);

while((p 1 & amp;0xf0)!= 0xf0)

{

开关(P1)

{

案例0xe 7:skey = ' $ ';打破;

case 0xd 7:skey = ' 0 ';打破;

案例0xb 7:skey = ' = ';打破;

案例0x 77:skey = '+';打破;

默认:?skey = ' #

}

while((p 1 & amp;0xf0)!= 0xf0)

}

}

返回skey

}

void main()

{

uint值1,值2,值;

uchar ckey,cut1 = 0,cut 2 = 0;

uchar算子;

uchar i,bool = 0;

初始化:

buf(0);

disp();

值= 0;

cut 1 = cut 2 = 0;

bool = 0;

for(I = 0;我& lt9;i++)

{

operand 1[I]= ' \ 0 ';

operand 2[I]= ' \ 0 ';

}

while(1)

{

ckey = key scan();?

如果(ckey!= '#')

{?

if(isdigit(ckey))?

{

开关(布尔型)

{

案例0:

operand 1[cut 1]= ckey;

operand 1[cut 1+1]= ' \ 0 ';

value 1 = atoi(operand 1);?

cut 1++;

buf(value 1);

disp();

打破;

案例1:

operand 2[cut 2]= ckey;

operand 2[cut 2+1]= ' \ 0 ';

value 2 = atoi(operand 2);

cut 2++;

buf(value 2);

disp();

打破;

默认:break

}

}

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

{

bool = 1;

operator = ckey

buf(0);

dbuf[7]= 10;

disp();

}

else if(ckey == '= ')

{

value = compute(value1,value2,运算符);

buf(值);

disp();

而(1)?

{

ckey = key scan();

if(ckey == '$ ')?

转到init

其他

{

buf(值);

disp();

}

}

}

else if(ckey == '$ ')?

{ goto init}

}

disp();

}

}

uint计算(uint va1,uint va2,uchar optor)

{

uint值;

开关(optor)

{

case '+':value = va 1+va2;打破;

case '-':value = va 1-va2;打破;

case ' * ':value = va 1 * va2;打破;

case '/':value = va 1/va2;打破;

默认:?打破;

}

返回值;

}

void buf(单位值)

{

乌恰尔一世;

if(val == 0)

{

dbuf[7]= 0;

I = 6;

}

其他

for(I = 7;val & gt0;我-)

{

dbuf[I]= val % 10;

val/= 10;

}

for(;我& gt0;我-)

dbuf[I]= 10;

}

无效显示(无效)

{

n .乌查尔bsel

bsel = 0x 01;

for(n = 0;n & lt8;n++)

{?

P2 = bsel;

P0 = table[dbuf[n]];

bsel=_crol_(bsel,1);

延迟(3);

P0 = 0xff

}

}

扩展数据:

PROTEUS是单片机课堂教学的高级助手。

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

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

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

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

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

在单片机课程设计和全国大学生电子设计竞赛中,我们使用Proteus?开发环境培养学生,在没有硬件投入的情况下,学生普遍反映学习单片机比单纯学习书本知识更容易接受,更容易提高。

实践证明,利用Proteus进行系统仿真开发成功后,可以大大提高单片机系统的设计效率。因此,Proteus具有很高的推广利用价值。

百度百科-protues