1.设计任务
利用AT89C51单片机为核心控制元件,设计一个四位加法计算器,设计的系统实用性强、操作简单,实现了智能化、数字化。
1)、通过4*4矩阵键盘输入数字及运算符;
2)、可以进行4位十进制数以内的加法运算。如果计算结果超出四位数,则全部显示“E ”LED灯亮起;
3)、可以进行加减所有运算;
4)、添加其他功能。
2. 设计要求
2.1系统方案论证
根据设计任务,分析设计系统的组成,给出实现设计任务的几种方案,分析比较几种设计方案的优略,本着尽量以软件代替硬件,同时力求电路简单,工作可靠的原则,确定总体设计方案。
2.2系统硬件电路设计
根据系统设计方案进行软、硬件的分配,软、硬件设计分别进行。硬件设计包括单片机最小系统和扩展接口及配置,硬件结构在设计时要选择合适的元器件,硬件电路要简洁、工作可靠,需用Proteus绘制整个系统的电路仿真原理图。
2.3软件设计
根据该系统要求的功能进行软件设计,简述软件的功能,并根据每个模块的功能绘制软件流程图,根据流程图编写程序并汇编调试通过;列出软件清单,软件清单要求加以注释。
2.4 软硬件系统仿真
将编译后的程序软件加载到Proteus软件仿真的单片机ROM中,运行系统,实现软件程序对单片机系统的硬件电路的控制,并调试仿真结果,直至与设计任务相符。
#include <reg51.h>
typedef unsigned char uint8;
typedef unsigned int uint16;sbit rw=P2^5;
sbit rs=P2^6;
sbit e=P2^7;
sbit led=P2^0;
sbit beep=P2^1;
unsigned char key,num,ei,eii,p;unsigned char dat1[]={1,2,3,0x2b-0x30, 4,5,6,0x2d-0x30, 7,8,9,0x2a-0x30,0,0x01-0x30,0x3d-0x30,0x2b-0x30 };//保存显示的数据
unsigned char dat2[]="9999 revo rewsna";
unsigned char dat3[]="Hi welcome into";
unsigned char dat4[]="counter by yumo";
void delay(unsigned int i);
void lcdwrc(unsigned char c);//写入命令
void lcdwrd(unsigned char dat);//写入数据
void lcdinit();//LCD初始化show();
void keyscan();
void do_beep();
void do_led(int x);
void main()
{led=0;lcdinit();show();//个性化界面while(1){ keyscan(); }
} void delay(unsigned int i)
{while(i--);
}
void lcdwrc(unsigned char c)//写入命令
{delay(1000);rs=0;//选择发送命令rw=0;//选择写入e=0;//使能P0=c;//放入命令e=1;//写时序delay(1000);//保持时间e=0;
}
void lcdwrd(unsigned char dat)//写入数据
{delay(1000);rs=1;//选择输入数据rw=0;//选择写入e=0;P0=dat;//写入数据e=1;//写入时序delay(1000);e=0;rs=0;
}void lcdinit()//LCD初始化
{delay(1500);lcdwrc(0x38);delay(500);lcdwrc(0x38);delay(500);lcdwrc(0x38);delay(500);lcdwrc(0x38);lcdwrc(0x08);lcdwrc(0x01);lcdwrc(0x06);lcdwrc(0x0c);key=0;num=0;flag=0;fuhao=0;a=0;b=0;c=0;d=0;}show()
{for(eii=0;eii<15;eii++){lcdwrd(dat3[eii]);} lcdwrc(0xc0);//写命令函数使其到第二行第一个字符for(p=0;p<15;p++){lcdwrd(dat4[p]);} return 1;
}
void keyscan()
{P1=0xfe; //令第一行为0,然后判断是哪一列按下if(P1!=0xfe){delay(1000);if(P1!=0xfe){key=P1&0xf0;switch(key){case 0xe0: num=0;break; //1case 0xd0: num=1;break; //2case 0xb0: num=2;break; //3case 0x70: num=3;break; //加}}while(P1!=0xfe);if(num==0||num==1||num==2) //确认第一行的数1,2,3{if(flag==0) //没有按下符号键{a=a*10+dat1[num];do_led(a);}else{delay(1000);b=b*10+dat1[num];do_led(b);} }if(num==3){flag=1;fuhao=1;//加号+ 运行}lcdwrd(0x30+dat1[num]);}P1=0xfd; //令第二行为0,判断是哪一列按下if(P1!=0xfd){delay(1000);if(P1!=0xfd){key=P1&0xf0;switch(key){case 0xe0: num=4;break; //4case 0xd0: num=5;break; //5case 0xb0: num=6;break; //6case 0x70: num=7;break; //违规} }while(P1!=0xfd);if(num==4||num==5||num==6){if(flag==0) //没有按下符号键{a=a*10+dat1[num];do_led(a); }else{b=b*10+dat1[num];do_led(b);} }if(num==7){flag=1;do_beep();}lcdwrd(0x30+dat1[num]);}P1=0xfb; //令第三行为0,判断哪一列按下if(P1!=0xfb){delay(1000);if(P1!=0xfb){key=P1&0xf0;switch(key){case 0xe0: num=8;break; //7case 0xd0: num=9;break; //8case 0xb0: num=10;break; //9case 0x70: num=11;break; //违规} }while(P1!=0xfb);if(num==8||num==9||num==10){if(flag==0) //没有按下符号键{a=a*10+dat1[num];do_led(a); }else{ b=b*10+dat1[num];do_led(b);} }else if(num==11){flag=1;do_beep();}lcdwrd(0x30+dat1[num]);}P1=0xf7; //令第四行为0,判断哪一列按下if(P1!=0xf7){delay(1000);if(P1!=0xf7){key=P1&0xf0;switch(key){case 0xe0: num=12;break; //0case 0xd0: num=13;break; //清除rstcase 0xb0: num=14;break; //等号=case 0x70: num=15;break; //违规} }while(P1!=0xf7);switch(num){case 12: if(flag==0) //没有按下符号键{ a=a*10+dat1[num];do_led(a);lcdwrd(0x30); }else{b=b*10+dat1[num];do_led(b);lcdwrd(0x30);}break; case 13: lcdwrc(0x01); //清屏指令 a=0;b=0;c=0;flag=0;fuhao=0;break;case 15:flag=1;do_beep();break; case 14: //如果是等于号if(fuhao==1)//加{lcdwrc(0x4f+0x80);lcdwrc(0x04);//设置光标左移,屏幕不移动c=a+b;if(c==0){lcdwrc(0x4f+0x80);lcdwrc(0x04);lcdwrd(0x30);}while((c!=0)&&(c<=9999)) //一位一位显示{lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置c=c/10;//取前面的结果数据 } if(c>9999){for(ei=0;ei<=16;ei++){lcdwrd(dat2[ei]); } } lcdwrd(0x3d); //显示等于号=a=0;b=0;c=0;flag=0;fuhao=0;//全部清除为0} break;}}
}
void do_beep()
{beep = 0; //蜂鸣器报警delay(100000);beep = 1;
}
void do_led(int x)
{if(x>9999){led=1;}
}
完整代码点开链接私信获取。
【iBot机器人工作室的个人空间-哔哩哔哩】 https://b23.tv/ryUWVKa