郭占苗, 吳沛
(西安航空職業(yè)技術(shù)學(xué)院,1.電子工程學(xué)院,2.學(xué)生處,西安 710089)
多功能計算器作為一種快速通用的計算工具為日常計算提供了方便,同時又可以兼有時鐘顯示和溫度顯示功能。該計算器以STC89C52單片機(jī)為核心進(jìn)行計算器模擬系統(tǒng)的設(shè)計,輸入采用4×4矩陣鍵盤,可以進(jìn)行加、減、乘、除數(shù)字運(yùn)算,并在LCD1602上顯示操作過程,不計算時,顯示當(dāng)前時間和溫度,通過按鍵切換模式時,可進(jìn)行時間的調(diào)整。
該多功能計算器主要包括鍵盤輸入模塊、單片機(jī)主控芯片、顯示模塊、時鐘模塊和溫度控制模塊等5部分組成,鍵盤部分主要用于計算器運(yùn)算時輸入數(shù)字,切換計算器或時間顯示,以及時間顯示時進(jìn)行時間調(diào)整的功能;單片機(jī)主要完成數(shù)據(jù)處理功能,包括確定按鍵,完成運(yùn)算,以及輸出數(shù)據(jù);顯示器部分主要完成單片機(jī)輸出的顯示;時鐘模塊完成當(dāng)前時間的精準(zhǔn)顯示,溫度傳感器對實(shí)時溫度進(jìn)行檢測[1]。主要原理框圖,如圖1所示。

圖1 多功能計算器原理框圖
主函數(shù)里主要設(shè)計編寫LCD1602液晶溫度顯示,按鍵切換和時間調(diào)整程序。
LCD1602溫度顯示函數(shù)“void LcdDisplayTemp(int temp)”設(shè)計時,給溫度顯示數(shù)組元素初值賦值為“0”,數(shù)組定義為“unsigned char datas[]={0,0,0,0,0};”。溫度在液晶上顯示精確到小數(shù)點(diǎn)后兩位,定義為浮點(diǎn)型,“float tp;”,用“if…else…”語句進(jìn)行二選一判斷,當(dāng)溫度為負(fù)數(shù)時,即零下溫度時,在液晶RAM第二行“0XC0+9”地址上顯示“-”號,通過補(bǔ)碼方式獲取負(fù)溫度值;當(dāng)溫度值為正數(shù)時,即零上溫度時,則在液晶RAM地址“0XC0+9”上顯示“+”號,因?yàn)镈S18B20溫度傳感器的分辨率是0.0625,通過語句“temp=tp*0.0625*100+0.5;” 將其擴(kuò)大一百倍,進(jìn)行四舍五入,獲取相應(yīng)溫度值[2]。通過語句“datas[1] = temp % 10000 / 1000;//整數(shù)十位,datas[2] = temp % 1000 / 100; //整數(shù)個位,datas[3] = temp % 100 / 10; //小數(shù)十位,datas[4] = temp % 10; //小數(shù)個位”將溫度的整數(shù)和小數(shù)部分的個位和十位分離出來,并利用LCD1602寫數(shù)據(jù)函數(shù)將分離數(shù)據(jù)從液晶RAM地址“0XC0+10”開始顯示,中間位置顯示小數(shù)點(diǎn)“.”,最后顯示溫度符號“C”。
在main( )函數(shù)里,對按鍵進(jìn)行判斷和掃描,開機(jī)屏幕顯示時間、日期和溫度,按“NC”鍵,根據(jù)電路圖,先選中第三行,給P1賦值“0XDF”,通過判斷P1是否等于“0XD7”來判斷是否按下“NC”鍵。如果按下“NC”鍵,則調(diào)用清屏指令“LcdWriteCom(0x01);”將屏幕清零,系統(tǒng)切換進(jìn)入計算模式。
進(jìn)行時間調(diào)整時,先給P1口賦值“0XBF”,然后判斷P1是否等于“0XB7”,如果等于則表示按下“=”鍵,系統(tǒng)暫停計時,再判斷是否按下“/”鍵,即給P1賦值“0X7F”后,判斷是否等于“0X77”,按下“/”鍵則依次切換選中調(diào)整“分、時、日、月、周、年”,再判斷P1是否等于“0X7E”,即“+”號鍵,是則執(zhí)行“加1”操作[3],否則如果P1為“0X7D”則執(zhí)行“減1”操作,然后將數(shù)據(jù)轉(zhuǎn)換成BCD碼調(diào)用液晶顯示時間程序?qū)S1302調(diào)整時間的結(jié)果顯示在液屏上。液晶顯示時間函數(shù)主要實(shí)現(xiàn)第一行顯示年月日和星期的功能,其中,顯示星期用“switch”語句實(shí)現(xiàn),第二行顯示時間的功能,顯示時間和日期時,先輸入顯示地址命令,再將數(shù)據(jù)顯示在液晶上,例如顯示小時,調(diào)用數(shù)組元素“LcdWriteData('0'+TIME[2]/16);//取高四位的LcdWriteData('0'+(TIME[2]&0x0f));//取低四位的值”進(jìn)行顯示,再次按下“=”鍵則恢復(fù)計時功能。
由于計算器輸入數(shù)字和切換模式需要很多按鍵,若用獨(dú)立按鍵會占用大量I/O口資源,所以采用矩陣按鍵來實(shí)現(xiàn),用P1口讀取控制的按鍵輸入,其中高四位接矩陣按鍵的四行,低四位接矩陣按鍵的四列。矩陣按鍵程序編寫,主要包括按鍵驅(qū)動函數(shù)、按鍵消抖和按鍵掃描函數(shù),最后在液晶上輸出顯示按鍵操作后的結(jié)果。在按鍵掃描函數(shù)里,令第一列為低電平,然后再清P1口低四位,判斷高四位的哪一位是“0”進(jìn)而確定哪一行按下,通過給P1口一次賦值“0XFE”,“0XFD”,“0XFB”,“0XF7”依次設(shè)置四列為低電平。依據(jù)硬件電路設(shè)計,通過“switch(key)”語句,分別與“case 0xe0”、“case 0xd0”、“case 0xb0”和“case 0x70”相比較,確認(rèn)第一列的三行數(shù)字是否為“1”、“2”、“3”,如果語句“if(num==0||num==1||num==2)”為真則輸入數(shù)據(jù),否則如果“if(num==3)”為真則,執(zhí)行語句{flag=1;fuhao=1;},讀取符號,并且通過“LcdWriteData(0x30+dat1[num]);”語句在液晶上以字符格式顯示出來[4]。
同理,類似于第一列按鍵判斷,消抖后確認(rèn)按鍵是否有動作,最終確定按鍵狀態(tài),即按下還是彈起,依次讀取第二、三、四列數(shù)據(jù)。注意,當(dāng)給P0口賦值0XF7時,執(zhí)行第四列時按下“0”鍵顯示字符“0”,按下“NC”鍵時,LCD1602清屏。按下“/”鍵進(jìn)行除法運(yùn)算,按下“=”鍵進(jìn)行獲取運(yùn)算結(jié)果,并將數(shù)據(jù)依次左移顯示。
DS1302時鐘程序主要包括單片機(jī)向時鐘芯片寫地址和數(shù)據(jù)模塊、單片機(jī)讀取地址和數(shù)據(jù)模塊以及初始化模塊。
初始化模塊主要是利用數(shù)組設(shè)置時間初值,禁止寫保護(hù),主要代碼如下:“if((i & 0x80) != 0)//判斷是否寫保護(hù){DS1302SingleWrite(7, 0x00);//給寄存器地址寫入“0X00”,撤銷寫保護(hù)允許寫入數(shù)據(jù)for(i=0; i<7; i++)//設(shè)置默認(rèn)初始時間{Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);}}”。
寫操作主要是從單片機(jī)向DS1302寫入數(shù)據(jù)和命令。依據(jù)DS1302單字節(jié)寫操作時序,將8位地址命令和數(shù)據(jù)傳送到DS1302通信總線上[5]。主要通過“for (n=0; n<8; n++){DSIO = addr & 0x01; addr >>= 1;SCLK = 1; _nop_();SCLK = 0;_nop_();}”語句實(shí)現(xiàn)8位地址命令傳送,在數(shù)據(jù)上升沿時,DS1302讀取數(shù)據(jù)。同理,可以編寫8位數(shù)據(jù)傳送程序,注意,數(shù)據(jù)位是低位在前,逐位移出,先輸出該位數(shù)據(jù),然后拉高時鐘再拉低時鐘,完成一位的操作,最后確保釋放IO引腳[6]。
讀操作包括讀寄存器地址和讀數(shù)據(jù),讀地址時,先使能片選信號,然后發(fā)送讀寄存器指令,最后再釋放總線,返回值即為讀到的字節(jié),通過“for(n=0; n<8; n++)//讀取8位數(shù)據(jù){dat1 = DSIO;//從最低位開始接收;dat = (dat>>1) |(dat1<<7);SCLK = 1;_nop_();SCLK = 0;//DS1302下降沿時,放置數(shù)據(jù)_nop_();}” 實(shí)現(xiàn)由DS1302通信總線上讀取一個字節(jié)功能。
DS18B20溫度顯示主要包括獲取存在脈沖模塊、寫字節(jié)操作模塊、讀字節(jié)操作模塊、啟動轉(zhuǎn)換模塊和讀取轉(zhuǎn)換溫度值模塊。
獲取存在脈沖程序編寫是依據(jù)DS18B20的“1-wire”總線檢測脈沖存在時序,先拉低總線500 μs(480 μs-960 μs),然后拉高總線延時60μs,進(jìn)行獲取存在脈沖,注意由于DS18B20時序時間短,所以在操作前先關(guān)中斷,等待存在脈沖結(jié)束后再重新使能中斷。
寫字節(jié)模塊是低位在先,依次移出8位,每寫入一位數(shù)據(jù)之前先把總線拉低1 μs,然后從最低位開始寫入一個數(shù)據(jù),延時60 μs后,拉高DS18B20通信引腳,釋放總線。
讀字節(jié)操作模塊也是低位在先,依次采集8位,先將總線拉低1 μs,然后釋放總線,延時6 μs等待數(shù)據(jù)穩(wěn)定,從最低位開始讀取數(shù)據(jù),主要通過“bit=DSPORT; byte=(byte>>1)|(bit<<7);”語句來實(shí)現(xiàn)該功能,讀取完一位等待48 μs再接著讀取下一個數(shù)據(jù)。
啟動轉(zhuǎn)換模塊實(shí)現(xiàn)啟動一次DS18B20溫度轉(zhuǎn)換功能,首先要獲取DS18B20的存在脈沖,然后執(zhí)行跳過ROM和溫度轉(zhuǎn)換命令,語句為,“Ds18b20WriteByte(0xcc); Ds18b20WriteByte(0x44);”最后“return”返回檢測是否轉(zhuǎn)換成功。
讀取轉(zhuǎn)換溫度值模塊進(jìn)行讀取DS18B20轉(zhuǎn)換溫度值,通過返回值檢測是否讀取成功操作,主要調(diào)用獲取存在脈沖函數(shù),執(zhí)行跳過ROM、啟動溫度轉(zhuǎn)換讀取溫度命令,然后讀取溫度值,讀取溫度值時先讀低字節(jié),再讀高字節(jié),最后將兩個字節(jié)合并成16位數(shù),返回溫度值。在讀取溫度轉(zhuǎn)換函數(shù)“int Ds18b20ReadTemp( )”中,由“{tml=Ds18b20ReadByte();tmh=Ds18b20ReadByte();temp=tmh; temp<<=8; temp|=tml; return temp; }”(“temp”為16位數(shù)據(jù),定義為“int”型)語句實(shí)現(xiàn)讀取溫度值并將數(shù)據(jù)返回的功能。
液晶顯示設(shè)計主要包括寫指令、寫數(shù)據(jù)和液晶初始化設(shè)計。
寫指令時先聲明LCD1602的8位數(shù)據(jù)引腳、使能端和讀寫引腳,將“RS”設(shè)置為低電平,“R/W”設(shè)置為低電平,再將指令碼送給LCD1602的“D0-D7”,利用函數(shù)等待數(shù)據(jù)穩(wěn)定后,將原來是低電平的使能端拉高保持一段時間再拉低,確保高脈沖。由于用到延時,寫入速度較慢所以可以不進(jìn)行忙位檢測。同理,將“RS”設(shè)置為高電平[7],把數(shù)據(jù)“dat” 送給LCD1602的“D0-D7”可實(shí)現(xiàn)單片機(jī)向LCD1602寫一個字節(jié)數(shù)據(jù)的功能。
LCD1602的初始化,通過寫入指令實(shí)現(xiàn)開顯示、開顯示不顯示光標(biāo)、寫一個指針加1整屏不移動、清屏和設(shè)置數(shù)據(jù)指針起點(diǎn)功能。分別寫入指令碼“0X38”、“0X0C”、“0X06”、“0X01”和“0X80”。
將調(diào)試好的程序下載到Proteus仿真圖中,如圖2所示。

圖2 多功能計算器仿真圖
單片機(jī)的P2口的高三位分別連接液晶的數(shù)據(jù)/命令選擇端“RS”、讀/寫選擇端“RW”和使能信號“E”,P0口8位依次和液晶的8位數(shù)據(jù)位相接[8],為了調(diào)整合適的對比度,液晶的3腳接10K的電位器;矩陣按鍵與P1口的8位相接,可進(jìn)行按鍵操作判斷;P3.4、P3.5和P3.6分別連接DS1302的雙向通信引腳I/O、使能引腳/RST和時鐘信號引腳SCLK,進(jìn)行實(shí)時時鐘顯示;P3.7連接溫度傳感器DS18B20的“1-Wire”總線,將檢測到的溫度轉(zhuǎn)換成數(shù)字信號顯示在液晶上[9]。根據(jù)繪制的Proteus仿真原理圖進(jìn)行實(shí)物電路的制作調(diào)試,電源采用USB接口,使用方便,為了確保斷電數(shù)據(jù)不丟失,用紐扣電池作為備用電池保證DS1302的正常工作,如圖3所示。

圖3 多功能計算器實(shí)物圖
該多功能計算器由STC89C52單片機(jī)作為主控芯片實(shí)現(xiàn)計算與溫度和日期顯示功能,可進(jìn)行長整型范圍內(nèi)的7位數(shù)字的四則運(yùn)算,通過按鍵輸入數(shù)據(jù),進(jìn)行模式切換和時間調(diào)整設(shè)置,采用LCD1602液晶顯示信息,比數(shù)碼管顯示更加穩(wěn)定,沒有閃爍,顯示內(nèi)容豐富[10],通過軟硬件檢測與調(diào)試驗(yàn)證該產(chǎn)品是一款可行性強(qiáng)、較為實(shí)用的多功能計算器。