999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于STC89C52單片機(jī)多功能計算器設(shè)計與仿真

2018-09-21 10:15:42郭占苗吳沛
微型電腦應(yīng)用 2018年9期
關(guān)鍵詞:單片機(jī)

郭占苗, 吳沛

(西安航空職業(yè)技術(shù)學(xué)院,1.電子工程學(xué)院,2.學(xué)生處,西安 710089)

0 引言

多功能計算器作為一種快速通用的計算工具為日常計算提供了方便,同時又可以兼有時鐘顯示和溫度顯示功能。該計算器以STC89C52單片機(jī)為核心進(jìn)行計算器模擬系統(tǒng)的設(shè)計,輸入采用4×4矩陣鍵盤,可以進(jìn)行加、減、乘、除數(shù)字運(yùn)算,并在LCD1602上顯示操作過程,不計算時,顯示當(dāng)前時間和溫度,通過按鍵切換模式時,可進(jìn)行時間的調(diào)整。

1 原理的設(shè)計

該多功能計算器主要包括鍵盤輸入模塊、單片機(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 多功能計算器原理框圖

2 軟件的設(shè)計

2.1 主函數(shù)的設(shè)計

主函數(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ù)計時功能。

2.2 矩陣按鍵的設(shè)計

由于計算器輸入數(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ù)依次左移顯示。

2.3 DS1302時鐘顯示

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é)功能。

2.4 DS18B20溫度顯示程序的設(shè)計

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ù)返回的功能。

2.5 LCD1602液晶顯示程序的設(shè)計

液晶顯示設(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”。

3 Proteus仿真與實(shí)物制作

將調(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í)物圖

4 總結(jié)

該多功能計算器由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í)用的多功能計算器。

猜你喜歡
單片機(jī)
基于單片機(jī)的SPWM控制逆變器的設(shè)計與實(shí)現(xiàn)
電子制作(2019年13期)2020-01-14 03:15:28
基于單片機(jī)的層次漸變暖燈的研究
電子制作(2019年15期)2019-08-27 01:12:10
基于單片機(jī)的多功能智能插排
電子制作(2019年11期)2019-07-04 00:34:48
基于單片機(jī)的便捷式LCF測量儀
電子制作(2019年9期)2019-05-30 09:42:02
小議PLC與單片機(jī)之間的串行通信及應(yīng)用
電子制作(2018年12期)2018-08-01 00:48:04
MSP430單片機(jī)在仿真中要注意的幾點(diǎn)問題
電子制作(2017年9期)2017-04-17 03:00:53
基于單片機(jī)的平衡控制系統(tǒng)設(shè)計
電子制作(2017年19期)2017-02-02 07:08:27
基于單片機(jī)的三維LED點(diǎn)陣設(shè)計
電子制作(2016年21期)2016-05-17 03:52:51
Microchip推出兩個全新PIC單片機(jī)系列
基于Proteus的單片機(jī)控制系統(tǒng)的仿真設(shè)計
主站蜘蛛池模板: 亚洲国产欧美国产综合久久| 久久精品丝袜| 国产亚洲一区二区三区在线| 波多野结衣一区二区三区四区视频 | 欧美一级在线播放| 久久黄色小视频| 亚洲欧美一区二区三区麻豆| 色综合成人| 久久99国产视频| 久草热视频在线| 国产成人无码播放| 免费国产高清精品一区在线| 99热国产这里只有精品无卡顿"| 亚洲资源站av无码网址| 黄色三级毛片网站| 欧美色伊人| 亚洲午夜天堂| 亚洲午夜国产精品无卡| 亚洲永久色| 亚洲日韩AV无码一区二区三区人 | 国产内射一区亚洲| av午夜福利一片免费看| 国产美女免费| 国产在线视频欧美亚综合| 亚洲an第二区国产精品| 日韩福利视频导航| 日本一区高清| 波多野结衣一二三| 日本三级欧美三级| 欧美精品一区二区三区中文字幕| 人妻少妇久久久久久97人妻| 国产精品亚洲综合久久小说| 中文字幕啪啪| 国产h视频免费观看| 永久免费无码日韩视频| 国产无码网站在线观看| 动漫精品啪啪一区二区三区| 国产亚洲精品va在线| 久操中文在线| 久草视频中文| 国产91视频观看| 日本五区在线不卡精品| 自慰高潮喷白浆在线观看| 亚洲国产日韩视频观看| 色综合天天娱乐综合网| 综合久久五月天| 国产成人av大片在线播放| 亚洲嫩模喷白浆| 国产毛片片精品天天看视频| 日韩成人午夜| 午夜电影在线观看国产1区| 亚洲欧美国产五月天综合| 99热这里都是国产精品| 美女无遮挡免费视频网站| 97se亚洲综合在线| 特级毛片8级毛片免费观看| 欧美在线视频不卡| 国产免费怡红院视频| 成人在线欧美| 91精品国产无线乱码在线| 本亚洲精品网站| 蜜桃臀无码内射一区二区三区 | 热久久国产| 成人中文在线| 3D动漫精品啪啪一区二区下载| 欧美成在线视频| 国产欧美高清| 久青草网站| 四虎永久免费网站| 99视频精品在线观看| 中文字幕在线观| 免费精品一区二区h| 日韩天堂在线观看| 欧美不卡二区| 萌白酱国产一区二区| 免费a级毛片视频| 国产另类视频| 国产女人18毛片水真多1| av午夜福利一片免费看| 青青草国产精品久久久久| 欧美成人精品一级在线观看| 国产亚洲一区二区三区在线|