APP下载

基于STC89C52单片机多功能计算器设计与仿真

2018-09-21郭占苗吴沛

微型电脑应用 2018年9期
关键词:计算器液晶按键

郭占苗, 吴沛

(西安航空职业技术学院,1.电子工程学院,2.学生处,西安 710089)

0 引言

多功能计算器作为一种快速通用的计算工具为日常计算提供了方便,同时又可以兼有时钟显示和温度显示功能。该计算器以STC89C52单片机为核心进行计算器模拟系统的设计,输入采用4×4矩阵键盘,可以进行加、减、乘、除数字运算,并在LCD1602上显示操作过程,不计算时,显示当前时间和温度,通过按键切换模式时,可进行时间的调整。

1 原理的设计

该多功能计算器主要包括键盘输入模块、单片机主控芯片、显示模块、时钟模块和温度控制模块等5部分组成,键盘部分主要用于计算器运算时输入数字,切换计算器或时间显示,以及时间显示时进行时间调整的功能;单片机主要完成数据处理功能,包括确定按键,完成运算,以及输出数据;显示器部分主要完成单片机输出的显示;时钟模块完成当前时间的精准显示,温度传感器对实时温度进行检测[1]。主要原理框图,如图1所示。

图1 多功能计算器原理框图

2 软件的设计

2.1 主函数的设计

主函数里主要设计编写LCD1602液晶温度显示,按键切换和时间调整程序。

LCD1602温度显示函数“void LcdDisplayTemp(int temp)”设计时,给温度显示数组元素初值赋值为“0”,数组定义为“unsigned char datas[]={0,0,0,0,0};”。温度在液晶上显示精确到小数点后两位,定义为浮点型,“float tp;”,用“if…else…”语句进行二选一判断,当温度为负数时,即零下温度时,在液晶RAM第二行“0XC0+9”地址上显示“-”号,通过补码方式获取负温度值;当温度值为正数时,即零上温度时,则在液晶RAM地址“0XC0+9”上显示“+”号,因为DS18B20温度传感器的分辨率是0.0625,通过语句“temp=tp*0.0625*100+0.5;” 将其扩大一百倍,进行四舍五入,获取相应温度值[2]。通过语句“datas[1] = temp % 10000 / 1000;//整数十位,datas[2] = temp % 1000 / 100; //整数个位,datas[3] = temp % 100 / 10; //小数十位,datas[4] = temp % 10; //小数个位”将温度的整数和小数部分的个位和十位分离出来,并利用LCD1602写数据函数将分离数据从液晶RAM地址“0XC0+10”开始显示,中间位置显示小数点“.”,最后显示温度符号“C”。

在main( )函数里,对按键进行判断和扫描,开机屏幕显示时间、日期和温度,按“NC”键,根据电路图,先选中第三行,给P1赋值“0XDF”,通过判断P1是否等于“0XD7”来判断是否按下“NC”键。如果按下“NC”键,则调用清屏指令“LcdWriteCom(0x01);”将屏幕清零,系统切换进入计算模式。

进行时间调整时,先给P1口赋值“0XBF”,然后判断P1是否等于“0XB7”,如果等于则表示按下“=”键,系统暂停计时,再判断是否按下“/”键,即给P1赋值“0X7F”后,判断是否等于“0X77”,按下“/”键则依次切换选中调整“分、时、日、月、周、年”,再判断P1是否等于“0X7E”,即“+”号键,是则执行“加1”操作[3],否则如果P1为“0X7D”则执行“减1”操作,然后将数据转换成BCD码调用液晶显示时间程序将DS1302调整时间的结果显示在液屏上。液晶显示时间函数主要实现第一行显示年月日和星期的功能,其中,显示星期用“switch”语句实现,第二行显示时间的功能,显示时间和日期时,先输入显示地址命令,再将数据显示在液晶上,例如显示小时,调用数组元素“LcdWriteData('0'+TIME[2]/16);//取高四位的LcdWriteData('0'+(TIME[2]&0x0f));//取低四位的值”进行显示,再次按下“=”键则恢复计时功能。

2.2 矩阵按键的设计

由于计算器输入数字和切换模式需要很多按键,若用独立按键会占用大量I/O口资源,所以采用矩阵按键来实现,用P1口读取控制的按键输入,其中高四位接矩阵按键的四行,低四位接矩阵按键的四列。矩阵按键程序编写,主要包括按键驱动函数、按键消抖和按键扫描函数,最后在液晶上输出显示按键操作后的结果。在按键扫描函数里,令第一列为低电平,然后再清P1口低四位,判断高四位的哪一位是“0”进而确定哪一行按下,通过给P1口一次赋值“0XFE”,“0XFD”,“0XFB”,“0XF7”依次设置四列为低电平。依据硬件电路设计,通过“switch(key)”语句,分别与“case 0xe0”、“case 0xd0”、“case 0xb0”和“case 0x70”相比较,确认第一列的三行数字是否为“1”、“2”、“3”,如果语句“if(num==0||num==1||num==2)”为真则输入数据,否则如果“if(num==3)”为真则,执行语句{flag=1;fuhao=1;},读取符号,并且通过“LcdWriteData(0x30+dat1[num]);”语句在液晶上以字符格式显示出来[4]。

同理,类似于第一列按键判断,消抖后确认按键是否有动作,最终确定按键状态,即按下还是弹起,依次读取第二、三、四列数据。注意,当给P0口赋值0XF7时,执行第四列时按下“0”键显示字符“0”,按下“NC”键时,LCD1602清屏。按下“/”键进行除法运算,按下“=”键进行获取运算结果,并将数据依次左移显示。

2.3 DS1302时钟显示

DS1302时钟程序主要包括单片机向时钟芯片写地址和数据模块、单片机读取地址和数据模块以及初始化模块。

初始化模块主要是利用数组设置时间初值,禁止写保护,主要代码如下:“if((i & 0x80) != 0)//判断是否写保护{DS1302SingleWrite(7, 0x00);//给寄存器地址写入“0X00”,撤销写保护允许写入数据for(i=0; i<7; i++)//设置默认初始时间{Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);}}”。

写操作主要是从单片机向DS1302写入数据和命令。依据DS1302单字节写操作时序,将8位地址命令和数据传送到DS1302通信总线上[5]。主要通过“for (n=0; n<8; n++){DSIO = addr & 0x01; addr >>= 1;SCLK = 1; _nop_();SCLK = 0;_nop_();}”语句实现8位地址命令传送,在数据上升沿时,DS1302读取数据。同理,可以编写8位数据传送程序,注意,数据位是低位在前,逐位移出,先输出该位数据,然后拉高时钟再拉低时钟,完成一位的操作,最后确保释放IO引脚[6]。

读操作包括读寄存器地址和读数据,读地址时,先使能片选信号,然后发送读寄存器指令,最后再释放总线,返回值即为读到的字节,通过“for(n=0; n<8; n++)//读取8位数据{dat1 = DSIO;//从最低位开始接收;dat = (dat>>1) |(dat1<<7);SCLK = 1;_nop_();SCLK = 0;//DS1302下降沿时,放置数据_nop_();}” 实现由DS1302通信总线上读取一个字节功能。

2.4 DS18B20温度显示程序的设计

DS18B20温度显示主要包括获取存在脉冲模块、写字节操作模块、读字节操作模块、启动转换模块和读取转换温度值模块。

获取存在脉冲程序编写是依据DS18B20的“1-wire”总线检测脉冲存在时序,先拉低总线500 μs(480 μs-960 μs),然后拉高总线延时60μs,进行获取存在脉冲,注意由于DS18B20时序时间短,所以在操作前先关中断,等待存在脉冲结束后再重新使能中断。

写字节模块是低位在先,依次移出8位,每写入一位数据之前先把总线拉低1 μs,然后从最低位开始写入一个数据,延时60 μs后,拉高DS18B20通信引脚,释放总线。

读字节操作模块也是低位在先,依次采集8位,先将总线拉低1 μs,然后释放总线,延时6 μs等待数据稳定,从最低位开始读取数据,主要通过“bit=DSPORT; byte=(byte>>1)|(bit<<7);”语句来实现该功能,读取完一位等待48 μs再接着读取下一个数据。

启动转换模块实现启动一次DS18B20温度转换功能,首先要获取DS18B20的存在脉冲,然后执行跳过ROM和温度转换命令,语句为,“Ds18b20WriteByte(0xcc); Ds18b20WriteByte(0x44);”最后“return”返回检测是否转换成功。

读取转换温度值模块进行读取DS18B20转换温度值,通过返回值检测是否读取成功操作,主要调用获取存在脉冲函数,执行跳过ROM、启动温度转换读取温度命令,然后读取温度值,读取温度值时先读低字节,再读高字节,最后将两个字节合并成16位数,返回温度值。在读取温度转换函数“int Ds18b20ReadTemp( )”中,由“{tml=Ds18b20ReadByte();tmh=Ds18b20ReadByte();temp=tmh; temp<<=8; temp|=tml; return temp; }”(“temp”为16位数据,定义为“int”型)语句实现读取温度值并将数据返回的功能。

2.5 LCD1602液晶显示程序的设计

液晶显示设计主要包括写指令、写数据和液晶初始化设计。

写指令时先声明LCD1602的8位数据引脚、使能端和读写引脚,将“RS”设置为低电平,“R/W”设置为低电平,再将指令码送给LCD1602的“D0-D7”,利用函数等待数据稳定后,将原来是低电平的使能端拉高保持一段时间再拉低,确保高脉冲。由于用到延时,写入速度较慢所以可以不进行忙位检测。同理,将“RS”设置为高电平[7],把数据“dat” 送给LCD1602的“D0-D7”可实现单片机向LCD1602写一个字节数据的功能。

LCD1602的初始化,通过写入指令实现开显示、开显示不显示光标、写一个指针加1整屏不移动、清屏和设置数据指针起点功能。分别写入指令码“0X38”、“0X0C”、“0X06”、“0X01”和“0X80”。

3 Proteus仿真与实物制作

将调试好的程序下载到Proteus仿真图中,如图2所示。

图2 多功能计算器仿真图

单片机的P2口的高三位分别连接液晶的数据/命令选择端“RS”、读/写选择端“RW”和使能信号“E”,P0口8位依次和液晶的8位数据位相接[8],为了调整合适的对比度,液晶的3脚接10K的电位器;矩阵按键与P1口的8位相接,可进行按键操作判断;P3.4、P3.5和P3.6分别连接DS1302的双向通信引脚I/O、使能引脚/RST和时钟信号引脚SCLK,进行实时时钟显示;P3.7连接温度传感器DS18B20的“1-Wire”总线,将检测到的温度转换成数字信号显示在液晶上[9]。根据绘制的Proteus仿真原理图进行实物电路的制作调试,电源采用USB接口,使用方便,为了确保断电数据不丢失,用纽扣电池作为备用电池保证DS1302的正常工作,如图3所示。

图3 多功能计算器实物图

4 总结

该多功能计算器由STC89C52单片机作为主控芯片实现计算与温度和日期显示功能,可进行长整型范围内的7位数字的四则运算,通过按键输入数据,进行模式切换和时间调整设置,采用LCD1602液晶显示信息,比数码管显示更加稳定,没有闪烁,显示内容丰富[10],通过软硬件检测与调试验证该产品是一款可行性强、较为实用的多功能计算器。

猜你喜欢

计算器液晶按键
不可压液晶方程组的Serrin解
基于有限状态机的按键检测程序设计
《液晶与显示》征稿简则
[计算器不是万能的]
按键消抖在单片机和FPGA实验教学中的应用
一种多方向导光按键结构设计
一个损坏的计算器
计算器游戏
计算器
液晶与显示2015年第30卷第1期 目录