文档介绍:基于51单片机实验报告(计算器),七段数码管,时钟(DS1302)温度传感器(18B20)等实现一个能做简单四则运算,并具有时钟显示,温度显示附加功能的计算器。 ,PC机。四则运算利用4*4矩阵键盘实现从0—9和运算符号的输入,并将操作过程和结果显示在LCD1602上。时钟显示和温度显示,可以利用DS1302产生年份,月份,日期,星期,时,分,秒的数据,并将数据送往LCD1602显示,同样可以利用单片机开发板上面集成的DS18B20温度传感器来测试周围环境的温度,将获取的温度通过在LCD1602来显示。系统设计框图 ,判断运算符号实现乘除优先级计算,LCD1602显示。键盘扫描常用的有行扫描法,线反转法,此处我们用行扫描法,可以更明了读取键值。unsignedchartemp; key=null; //第一行按键 P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10);//延时软件去抖动 temp=P3; temp=temp&0xf0; if(temp!=0xf0)//确认有键按下{ temp=P3; switch(temp) { case0xee: key='D'; //读键值 break; case0xde: key=0; break; case0xbe: key='='; break; case0x7e: key='/'; break; } flag++; } }读完按键值之后我们需要读取运算的数字与运算符号,通过判断键值为数字则通过nun=nun*10+key,计算出数字,判断键值为运算符号则读出数字和键值。 flag=0; addr++; while(flag==0) { scan(); } if(flag>0)//如果有数据从键盘输入 {//则关闭数码管的显示 latch=0; } if(key>=0&&key<=9) //如果有数字输入则连续读取数字{ display_lcd(key); num=num*10+key; key=null; read(); } elseif(key=='+'||key=='-'||key=='/'||key=='*'||key=='=') { display_lcd(key); //碰到运算符则同时读取数字和运算符 sym=key; key=null; } else { display_lcd(key); } }uintread_num() //读取数字{uinttemp=num; num=0; returntemp;}ucharread_sym()//读取运算符{ uchartemp=sym; sym=null; returntemp;}读取完键值之后,对运算符进行判断如果第二位运算符为乘除则在读取一次数字和运算符,并将第二个操作数与第三个操作数相计算并赋给第二个操作数,将第三个运算符赋给第二个运算符,并调用开始计算两个操作符的函数继续判断第二个操作符,直到第二个运算符为“=”为止,即可实现四则运算的优先级运算。if(sym2=='=') //简单运算如果第二个运算符为“=”{ switch(sym1) { case'+': result=num1+num2; delay(500); display_result(result); //直接计算并在LCD上显示 break; case'-': result=num1-num2; delay(500); display_result(result);如果第二个操作符不是“=”,则需先先计算一步,并将计算结果,和读取的第三个键值赋给第二组的数字和运算符,继续循环判断。 read(); temp=sym2; if(sym1=='*') //第一个操作符为乘除则先计算前两个数字{ calculate(num1*num2,temp,read_num(),read_sym()); } elseif(sym1=='/') { calculate(num1/num2,temp,read_num(),read_sym()); } elseif(sym2=='*') //第二个操作符为乘除先计算后面两个数字{ calculate(num1,sym1,num2*read_num(),read_sym()); } elseif(sym2=='/') { calculate(num1,sym1,num2/read_num(),read_sym());........................LCD显示