基于AT89C51制作简易计算器

它实现的功能有:四则运算,结果要有显示两位数点,进制转换,有蜂鸣,复位,键盘消抖,能优化计算器等,后期指导我搞出设计实物及提出需要的元件,主要程序介绍,主要电路分解介绍,PPT作品介绍
有的可以发在我的974675609里或直接与我联系,有仿真电路图,谢谢单片机发烧友

以下是我编的简易计算器程序,基本成功
//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();
}
}追问

有仿真图吗,主要程序介绍

温馨提示:内容为网友见解,仅供参考
无其他回答

利用AT89C51单片机、8位共阳极蓝色数码管和计算器键盘构成一个计算器...
主要注意乘除法,单片机没有乘除法指令,而且直接用乘除会占用大量的存储空间,4K的ROM估计不能完成你的任务,建议使用移位来代替乘除。

电子信息工程毕业论文
877.基于EDA的计算器的设计878.基于EDA技术的数字电子钟设计879.基于EDA技术的智力竞赛抢答器的设计880.基于FPGA的18路智力竞赛电子抢答器设计881.基于USB接口的数据采集系统设计与实现882.基于单片机的简易智能小车的设计883.基于单片机的脉象信号采集系统设计884.一种斩控式交流电子调压器设计885.通信用开关电源的设计...

求大专机电专业毕业论文的题目,谢谢
15. 基于无线传输技术的室温控制系统设计——温度控制器硬件设计 16. 温度箱模拟控制系统 17. 基于无线传输技术的室温控制系统设计——温度控制器软件设计 18. 基于微控制器的电容器储能放电系统设计 19. 基于机器视觉的构件表面缺陷特征提取 20. 基于单片机的语音提示测温系统的研究 21. 基于单片机的步进电机的控制 ...

六位数码管时钟
25.基于Matlab的PWM波形仿真与分析 26.集成功率放大电路的设计 27.波形发生器、频率计和数字电压表设计 28.水位遥测自控系统 毕业论文 29.宽带视频放大电路的设计 毕业设计 30.简易数字存储示波器设计毕业论文 31.球赛计时计分器 毕业设计论文 32.IIR数字滤波器的设计毕业论文 33.PC机与单片机串行通信毕业...

关于D类放大器的毕业论文
520. 基于PDIUSBD12和K9F2808简易USB闪存设计 521. 开关电源设计 522. 基于AT89C51的宽范围高精度的电机转速测量系统 523. 基于AT89C51的路灯控制系统设计 524. 点阵式汉字电子显示屏的设计与制作 525. 全数字控制SPWM单相变频器 526. 小功率UPS系统设计 527. 正弦信号发生器电路设计 528. 基于Matlab的多频率...

请问如何将C或汇编源程序或烧到自己制作的PCB板上 谢谢···_百度知...
1.点击图标 运行直至安装完成。2.点击图标 运行KEIL,然后选择菜单“project”点击“new……”点击“ ”建立新的工程。填写好工程文件名选择保存路径后按“保存”,此时弹出一个窗口如下图所示 点击Atmel左边的+号展开CPU的型号,选择“AT89C51”按“确定”再生成一个对话框如下图,再按“是”即可。...

求一份单片机答辩的题目和答案 我不是计算机专业的 简单点就行...
(4)单片机编音乐程序 (5)用89C51做直流稳压电源 (6)王款主流CMMB调谐器的特性比较 (7)红外遥控器控制的风扇温控器 (8)用单片机89S52制作计算器 (9)用单片机89C51制作程控交换机 (10)数据采集和记录系统单片机AT89C51 (11)简单的制作AT89SXX的单片机教程板 (12)热敏电阻温度计:液晶版 (14)热敏电阻温度计 (...

毕业论文资料收集(采纳追加1000分)
·单片机步进电机转速控制器的设计·由AT89C51控制的太阳能热水器·防盗与恒温系统的设计与制作·AT89S52单片机实验系统的开发与应用·基于单片机控制的数字气压计的设计与实现·智能压力传感器系统设计·智能定时器·基于单片机的智能火灾报警系统·基于单片机的电子式转速里程表的设计·公交车汉字显示系统·单片机数字电压表的...

相似回答