如何用51单片机做计算器?
硬件部分比较简单。当按下键盘键时,该行和列中的端口为低电平。因此,只要扫描行和列端口为低,就可以确定按了哪个键。
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