• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

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

      2018-09-21 10:15:42郭占苗吳沛
      微型電腦應(yīng)用 2018年9期
      關(guān)鍵詞:計(jì)算器液晶按鍵

      郭占苗, 吳沛

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

      0 引言

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

      1 原理的設(shè)計(jì)

      該多功能計(jì)算器主要包括鍵盤(pán)輸入模塊、單片機(jī)主控芯片、顯示模塊、時(shí)鐘模塊和溫度控制模塊等5部分組成,鍵盤(pán)部分主要用于計(jì)算器運(yùn)算時(shí)輸入數(shù)字,切換計(jì)算器或時(shí)間顯示,以及時(shí)間顯示時(shí)進(jìn)行時(shí)間調(diào)整的功能;單片機(jī)主要完成數(shù)據(jù)處理功能,包括確定按鍵,完成運(yùn)算,以及輸出數(shù)據(jù);顯示器部分主要完成單片機(jī)輸出的顯示;時(shí)鐘模塊完成當(dāng)前時(shí)間的精準(zhǔn)顯示,溫度傳感器對(duì)實(shí)時(shí)溫度進(jìn)行檢測(cè)[1]。主要原理框圖,如圖1所示。

      圖1 多功能計(jì)算器原理框圖

      2 軟件的設(shè)計(jì)

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

      主函數(shù)里主要設(shè)計(jì)編寫(xiě)LCD1602液晶溫度顯示,按鍵切換和時(shí)間調(diào)整程序。

      LCD1602溫度顯示函數(shù)“void LcdDisplayTemp(int temp)”設(shè)計(jì)時(shí),給溫度顯示數(shù)組元素初值賦值為“0”,數(shù)組定義為“unsigned char datas[]={0,0,0,0,0};”。溫度在液晶上顯示精確到小數(shù)點(diǎn)后兩位,定義為浮點(diǎn)型,“float tp;”,用“if…else…”語(yǔ)句進(jìn)行二選一判斷,當(dāng)溫度為負(fù)數(shù)時(shí),即零下溫度時(shí),在液晶RAM第二行“0XC0+9”地址上顯示“-”號(hào),通過(guò)補(bǔ)碼方式獲取負(fù)溫度值;當(dāng)溫度值為正數(shù)時(shí),即零上溫度時(shí),則在液晶RAM地址“0XC0+9”上顯示“+”號(hào),因?yàn)镈S18B20溫度傳感器的分辨率是0.0625,通過(guò)語(yǔ)句“temp=tp*0.0625*100+0.5;” 將其擴(kuò)大一百倍,進(jìn)行四舍五入,獲取相應(yīng)溫度值[2]。通過(guò)語(yǔ)句“datas[1] = temp % 10000 / 1000;//整數(shù)十位,datas[2] = temp % 1000 / 100; //整數(shù)個(gè)位,datas[3] = temp % 100 / 10; //小數(shù)十位,datas[4] = temp % 10; //小數(shù)個(gè)位”將溫度的整數(shù)和小數(shù)部分的個(gè)位和十位分離出來(lái),并利用LCD1602寫(xiě)數(shù)據(jù)函數(shù)將分離數(shù)據(jù)從液晶RAM地址“0XC0+10”開(kāi)始顯示,中間位置顯示小數(shù)點(diǎn)“.”,最后顯示溫度符號(hào)“C”。

      在main( )函數(shù)里,對(duì)按鍵進(jìn)行判斷和掃描,開(kāi)機(jī)屏幕顯示時(shí)間、日期和溫度,按“NC”鍵,根據(jù)電路圖,先選中第三行,給P1賦值“0XDF”,通過(guò)判斷P1是否等于“0XD7”來(lái)判斷是否按下“NC”鍵。如果按下“NC”鍵,則調(diào)用清屏指令“LcdWriteCom(0x01);”將屏幕清零,系統(tǒng)切換進(jìn)入計(jì)算模式。

      進(jìn)行時(shí)間調(diào)整時(shí),先給P1口賦值“0XBF”,然后判斷P1是否等于“0XB7”,如果等于則表示按下“=”鍵,系統(tǒng)暫停計(jì)時(shí),再判斷是否按下“/”鍵,即給P1賦值“0X7F”后,判斷是否等于“0X77”,按下“/”鍵則依次切換選中調(diào)整“分、時(shí)、日、月、周、年”,再判斷P1是否等于“0X7E”,即“+”號(hào)鍵,是則執(zhí)行“加1”操作[3],否則如果P1為“0X7D”則執(zhí)行“減1”操作,然后將數(shù)據(jù)轉(zhuǎn)換成BCD碼調(diào)用液晶顯示時(shí)間程序?qū)S1302調(diào)整時(shí)間的結(jié)果顯示在液屏上。液晶顯示時(shí)間函數(shù)主要實(shí)現(xiàn)第一行顯示年月日和星期的功能,其中,顯示星期用“switch”語(yǔ)句實(shí)現(xiàn),第二行顯示時(shí)間的功能,顯示時(shí)間和日期時(shí),先輸入顯示地址命令,再將數(shù)據(jù)顯示在液晶上,例如顯示小時(shí),調(diào)用數(shù)組元素“LcdWriteData('0'+TIME[2]/16);//取高四位的LcdWriteData('0'+(TIME[2]&0x0f));//取低四位的值”進(jìn)行顯示,再次按下“=”鍵則恢復(fù)計(jì)時(shí)功能。

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

      由于計(jì)算器輸入數(shù)字和切換模式需要很多按鍵,若用獨(dú)立按鍵會(huì)占用大量I/O口資源,所以采用矩陣按鍵來(lái)實(shí)現(xiàn),用P1口讀取控制的按鍵輸入,其中高四位接矩陣按鍵的四行,低四位接矩陣按鍵的四列。矩陣按鍵程序編寫(xiě),主要包括按鍵驅(qū)動(dòng)函數(shù)、按鍵消抖和按鍵掃描函數(shù),最后在液晶上輸出顯示按鍵操作后的結(jié)果。在按鍵掃描函數(shù)里,令第一列為低電平,然后再清P1口低四位,判斷高四位的哪一位是“0”進(jìn)而確定哪一行按下,通過(guò)給P1口一次賦值“0XFE”,“0XFD”,“0XFB”,“0XF7”依次設(shè)置四列為低電平。依據(jù)硬件電路設(shè)計(jì),通過(guò)“switch(key)”語(yǔ)句,分別與“case 0xe0”、“case 0xd0”、“case 0xb0”和“case 0x70”相比較,確認(rèn)第一列的三行數(shù)字是否為“1”、“2”、“3”,如果語(yǔ)句“if(num==0||num==1||num==2)”為真則輸入數(shù)據(jù),否則如果“if(num==3)”為真則,執(zhí)行語(yǔ)句{flag=1;fuhao=1;},讀取符號(hào),并且通過(guò)“LcdWriteData(0x30+dat1[num]);”語(yǔ)句在液晶上以字符格式顯示出來(lái)[4]。

      同理,類(lèi)似于第一列按鍵判斷,消抖后確認(rèn)按鍵是否有動(dòng)作,最終確定按鍵狀態(tài),即按下還是彈起,依次讀取第二、三、四列數(shù)據(jù)。注意,當(dāng)給P0口賦值0XF7時(shí),執(zhí)行第四列時(shí)按下“0”鍵顯示字符“0”,按下“NC”鍵時(shí),LCD1602清屏。按下“/”鍵進(jìn)行除法運(yùn)算,按下“=”鍵進(jìn)行獲取運(yùn)算結(jié)果,并將數(shù)據(jù)依次左移顯示。

      2.3 DS1302時(shí)鐘顯示

      DS1302時(shí)鐘程序主要包括單片機(jī)向時(shí)鐘芯片寫(xiě)地址和數(shù)據(jù)模塊、單片機(jī)讀取地址和數(shù)據(jù)模塊以及初始化模塊。

      初始化模塊主要是利用數(shù)組設(shè)置時(shí)間初值,禁止寫(xiě)保護(hù),主要代碼如下:“if((i & 0x80) != 0)//判斷是否寫(xiě)保護(hù){DS1302SingleWrite(7, 0x00);//給寄存器地址寫(xiě)入“0X00”,撤銷(xiāo)寫(xiě)保護(hù)允許寫(xiě)入數(shù)據(jù)for(i=0; i<7; i++)//設(shè)置默認(rèn)初始時(shí)間{Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);}}”。

      寫(xiě)操作主要是從單片機(jī)向DS1302寫(xiě)入數(shù)據(jù)和命令。依據(jù)DS1302單字節(jié)寫(xiě)操作時(shí)序,將8位地址命令和數(shù)據(jù)傳送到DS1302通信總線上[5]。主要通過(guò)“for (n=0; n<8; n++){DSIO = addr & 0x01; addr >>= 1;SCLK = 1; _nop_();SCLK = 0;_nop_();}”語(yǔ)句實(shí)現(xiàn)8位地址命令傳送,在數(shù)據(jù)上升沿時(shí),DS1302讀取數(shù)據(jù)。同理,可以編寫(xiě)8位數(shù)據(jù)傳送程序,注意,數(shù)據(jù)位是低位在前,逐位移出,先輸出該位數(shù)據(jù),然后拉高時(shí)鐘再拉低時(shí)鐘,完成一位的操作,最后確保釋放IO引腳[6]。

      讀操作包括讀寄存器地址和讀數(shù)據(jù),讀地址時(shí),先使能片選信號(hào),然后發(fā)送讀寄存器指令,最后再釋放總線,返回值即為讀到的字節(jié),通過(guò)“for(n=0; n<8; n++)//讀取8位數(shù)據(jù){dat1 = DSIO;//從最低位開(kāi)始接收;dat = (dat>>1) |(dat1<<7);SCLK = 1;_nop_();SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)_nop_();}” 實(shí)現(xiàn)由DS1302通信總線上讀取一個(gè)字節(jié)功能。

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

      DS18B20溫度顯示主要包括獲取存在脈沖模塊、寫(xiě)字節(jié)操作模塊、讀字節(jié)操作模塊、啟動(dòng)轉(zhuǎn)換模塊和讀取轉(zhuǎn)換溫度值模塊。

      獲取存在脈沖程序編寫(xiě)是依據(jù)DS18B20的“1-wire”總線檢測(cè)脈沖存在時(shí)序,先拉低總線500 μs(480 μs-960 μs),然后拉高總線延時(shí)60μs,進(jìn)行獲取存在脈沖,注意由于DS18B20時(shí)序時(shí)間短,所以在操作前先關(guān)中斷,等待存在脈沖結(jié)束后再重新使能中斷。

      寫(xiě)字節(jié)模塊是低位在先,依次移出8位,每寫(xiě)入一位數(shù)據(jù)之前先把總線拉低1 μs,然后從最低位開(kāi)始寫(xiě)入一個(gè)數(shù)據(jù),延時(shí)60 μs后,拉高DS18B20通信引腳,釋放總線。

      讀字節(jié)操作模塊也是低位在先,依次采集8位,先將總線拉低1 μs,然后釋放總線,延時(shí)6 μs等待數(shù)據(jù)穩(wěn)定,從最低位開(kāi)始讀取數(shù)據(jù),主要通過(guò)“bit=DSPORT; byte=(byte>>1)|(bit<<7);”語(yǔ)句來(lái)實(shí)現(xiàn)該功能,讀取完一位等待48 μs再接著讀取下一個(gè)數(shù)據(jù)。

      啟動(dòng)轉(zhuǎn)換模塊實(shí)現(xiàn)啟動(dòng)一次DS18B20溫度轉(zhuǎn)換功能,首先要獲取DS18B20的存在脈沖,然后執(zhí)行跳過(guò)ROM和溫度轉(zhuǎn)換命令,語(yǔ)句為,“Ds18b20WriteByte(0xcc); Ds18b20WriteByte(0x44);”最后“return”返回檢測(cè)是否轉(zhuǎn)換成功。

      讀取轉(zhuǎn)換溫度值模塊進(jìn)行讀取DS18B20轉(zhuǎn)換溫度值,通過(guò)返回值檢測(cè)是否讀取成功操作,主要調(diào)用獲取存在脈沖函數(shù),執(zhí)行跳過(guò)ROM、啟動(dòng)溫度轉(zhuǎn)換讀取溫度命令,然后讀取溫度值,讀取溫度值時(shí)先讀低字節(jié),再讀高字節(jié),最后將兩個(gè)字節(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”型)語(yǔ)句實(shí)現(xiàn)讀取溫度值并將數(shù)據(jù)返回的功能。

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

      液晶顯示設(shè)計(jì)主要包括寫(xiě)指令、寫(xiě)數(shù)據(jù)和液晶初始化設(shè)計(jì)。

      寫(xiě)指令時(shí)先聲明LCD1602的8位數(shù)據(jù)引腳、使能端和讀寫(xiě)引腳,將“RS”設(shè)置為低電平,“R/W”設(shè)置為低電平,再將指令碼送給LCD1602的“D0-D7”,利用函數(shù)等待數(shù)據(jù)穩(wěn)定后,將原來(lái)是低電平的使能端拉高保持一段時(shí)間再拉低,確保高脈沖。由于用到延時(shí),寫(xiě)入速度較慢所以可以不進(jìn)行忙位檢測(cè)。同理,將“RS”設(shè)置為高電平[7],把數(shù)據(jù)“dat” 送給LCD1602的“D0-D7”可實(shí)現(xiàn)單片機(jī)向LCD1602寫(xiě)一個(gè)字節(jié)數(shù)據(jù)的功能。

      LCD1602的初始化,通過(guò)寫(xiě)入指令實(shí)現(xiàn)開(kāi)顯示、開(kāi)顯示不顯示光標(biāo)、寫(xiě)一個(gè)指針加1整屏不移動(dòng)、清屏和設(shè)置數(shù)據(jù)指針起點(diǎn)功能。分別寫(xiě)入指令碼“0X38”、“0X0C”、“0X06”、“0X01”和“0X80”。

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

      將調(diào)試好的程序下載到Proteus仿真圖中,如圖2所示。

      圖2 多功能計(jì)算器仿真圖

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

      圖3 多功能計(jì)算器實(shí)物圖

      4 總結(jié)

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

      猜你喜歡
      計(jì)算器液晶按鍵
      不可壓液晶方程組的Serrin解
      基于有限狀態(tài)機(jī)的按鍵檢測(cè)程序設(shè)計(jì)
      電子制作(2021年3期)2021-06-16 03:14:26
      《液晶與顯示》征稿簡(jiǎn)則
      液晶與顯示(2020年8期)2020-08-08 07:01:46
      [計(jì)算器不是萬(wàn)能的]
      一種多方向?qū)Ч獍存I結(jié)構(gòu)設(shè)計(jì)
      電子制作(2016年1期)2016-11-07 08:43:05
      一個(gè)損壞的計(jì)算器
      一個(gè)損壞的計(jì)算器
      計(jì)算器游戲
      液晶與顯示2015年第30卷第1期 目錄
      液晶與顯示(2015年1期)2015-02-28 21:15:54
      液晶與顯示2014年第29卷第2期 目錄
      液晶與顯示(2014年2期)2014-02-28 21:11:05
      陆丰市| 根河市| 泗洪县| 黄平县| 腾冲县| 五莲县| 固原市| 精河县| 武陟县| 梁平县| 贵定县| 阿坝| 都昌县| 保靖县| 浮梁县| 望奎县| 南华县| 赞皇县| 晴隆县| 德阳市| 昌图县| 隆尧县| 玛纳斯县| 和顺县| 凉山| 琼结县| 夏津县| 延庆县| 宜良县| 涡阳县| 隆德县| 眉山市| 辉南县| 民权县| 加查县| 安多县| 夏津县| 黄大仙区| 中阳县| 左云县| 杨浦区|