久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3549|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于單片機(jī)簡(jiǎn)易計(jì)算器課程設(shè)計(jì)說(shuō)明書(shū)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:435679 發(fā)表于 2018-11-29 13:51 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
題    目:基于單片機(jī)簡(jiǎn)易計(jì)算器的設(shè)計(jì)
院 (系):信息與通信學(xué)院
專    業(yè): 電子信息工程  

摘 要

簡(jiǎn)易計(jì)算器是一種非常廣泛日常工具,對(duì)現(xiàn)代社會(huì)越來(lái)越流行。它可以進(jìn)行一些簡(jiǎn)易的計(jì)算。本系統(tǒng)提供詳細(xì)的時(shí)、分、秒、年、月、日的時(shí)間信息,同時(shí)還可進(jìn)行簡(jiǎn)易的計(jì)算信息,還具有時(shí)間校準(zhǔn)等功能。該電路采用AT89S52單片機(jī)作為核心,功耗小,能在3V的低壓工作,電壓可選用3~5V電壓供電。本系統(tǒng)硬件部分由AT89S52單片機(jī)、LCD1602液晶屏、鍵盤、指示燈系統(tǒng)等部分構(gòu)成。軟件部分在keil環(huán)境下用C51語(yǔ)言編寫,包括時(shí)間設(shè)置、時(shí)間顯示、簡(jiǎn)易計(jì)算顯示等。

目錄

摘要1
引言 3
1  單片機(jī)及其應(yīng)用3
11單片機(jī)介紹3
12單片機(jī)的應(yīng)用4
13 AT89S52單片機(jī)4
2  液晶屏LCD1602原理及應(yīng)用 7
21液晶屏LCD1602介紹及工作原理 7
22 液晶屏LCD1602的功能及應(yīng)用7
3  設(shè)計(jì)思路、仿真及調(diào)試12  
31設(shè)計(jì)方法12
32硬件設(shè)計(jì) 12
321按鍵調(diào)整電路12
322復(fù)位電路13
323 液晶屏LCD1602顯示電路13
324 LED指示電路13
325 4*4鍵盤的設(shè)計(jì)14
326 簡(jiǎn)易計(jì)算器的總電路14
33軟件設(shè)計(jì) 15
34軟件仿真15
35硬件調(diào)試16
4  結(jié)束語(yǔ) 17
謝辭18
參考文獻(xiàn)19
附件20

引言
眾所周知單片機(jī)是一種集成在電路芯片,是采用超大規(guī)模集成電路技術(shù)把具有數(shù)據(jù)處理能力的中央處理器CPU隨機(jī)存儲(chǔ)器RAM、只讀存儲(chǔ)器ROM、多種I/O口和中斷系統(tǒng)、定時(shí)器/計(jì)時(shí)器等功能(可能還包括顯示驅(qū)動(dòng)電路、脈寬調(diào)制電路、模擬多路轉(zhuǎn)換器、A/D轉(zhuǎn)換器等電路)集成到一塊硅片上構(gòu)成的一個(gè)小而完善的計(jì)算機(jī)系統(tǒng)。本設(shè)計(jì)要制作的就是單片機(jī)于生活中最為常見(jiàn)的異種應(yīng)用——簡(jiǎn)易計(jì)算器。本簡(jiǎn)易計(jì)算器AT89S52單片機(jī)作為核心,可以顯示簡(jiǎn)易的計(jì)算和時(shí)間,時(shí)間可以人為設(shè)定;另外還可以顯示當(dāng)前的日歷,顯示格式為年(四位),月(兩位),日(兩位)。設(shè)置時(shí)間時(shí)的位切換、設(shè)定數(shù)值、啟動(dòng)定時(shí)器、切換日歷通過(guò)外部中斷來(lái)實(shí)現(xiàn)。簡(jiǎn)易計(jì)算器不僅可以進(jìn)行簡(jiǎn)易的計(jì)算還可以顯示時(shí)間。簡(jiǎn)易計(jì)算器顯示電路由LCD1602組成, 制作一個(gè)單片機(jī)計(jì)時(shí)裝置需要的材料需要有軟硬件的支持,硬件方面AT89C51單片機(jī),晶振,電源,液晶屏LCD1602。
  • 單片機(jī)及其應(yīng)用
單片機(jī)是一種集成在電路芯片,是采用超大規(guī)模集成電路技術(shù)把具有數(shù)據(jù)處理能力的中央處理器CPU隨機(jī)存儲(chǔ)器RAM、只讀存儲(chǔ)器ROM、多種I/O口和中斷系統(tǒng)、定時(shí)器/計(jì)時(shí)器等功能(可能還包括顯示驅(qū)動(dòng)電路、脈寬調(diào)制電路、模擬多路轉(zhuǎn)換器、A/D轉(zhuǎn)換器等電路)集成到一塊硅片上構(gòu)成的一個(gè)小而完善的計(jì)算機(jī)系統(tǒng)。
  

1.1 單片機(jī)介紹:
單片微型計(jì)算機(jī)簡(jiǎn)稱單片機(jī),是典型的嵌入式微控制器(Microcontroller Unit),常用英文字母的縮寫MCU表示單片機(jī),它最早是被用在工業(yè)控制領(lǐng)域。單片機(jī)由芯片內(nèi)僅有CPU的專用處理器發(fā)展而來(lái)。最早的設(shè)計(jì)理念是通過(guò)將大量外圍設(shè)備和CPU集成在一個(gè)芯片中,使計(jì)算機(jī)系統(tǒng)更小,更容易集成進(jìn)復(fù)雜的而對(duì)體積要求嚴(yán)格的控制設(shè)備當(dāng)中。INTEL的Z80是最早按照這種思想設(shè)計(jì)出的處理器,從此以后,單片機(jī)和專用處理器的發(fā)展便分道揚(yáng)鑣
單片機(jī)是靠程序運(yùn)行的,并且可以修改。通過(guò)不同的程序?qū)崿F(xiàn)不同的功能,尤其是特殊的獨(dú)特的一些功能,這是別的器件需要費(fèi)很大力氣才能做到的,有些則是花大力氣也很難做到的。一個(gè)不是很復(fù)雜的功能要是用美國(guó)50年代開(kāi)發(fā)的74系列,或者60年代的CD4000系列這些純硬件來(lái)搞定的話,電路一定是一塊大PCB板!但是如果要是用美國(guó)70年代成功投放市場(chǎng)的系列單片機(jī),結(jié)果就會(huì)有天壤之別!只因?yàn)閱纹瑱C(jī)的通過(guò)你編寫的程序可以實(shí)現(xiàn)高智能,高效率,以及高可靠性!
單片機(jī)的硬件特性:?jiǎn)纹瑱C(jī)集成度高。單片機(jī)包括CPU、4KB容量的ROM(8031 無(wú))、128 B容量的RAM、 2個(gè)16位定時(shí)/計(jì)數(shù)器、4個(gè)8位并行口、全雙工串口行口。系統(tǒng)結(jié)構(gòu)簡(jiǎn)單,使用方便,實(shí)現(xiàn)模塊化。

1.2 單片機(jī)的應(yīng)用
目前單片機(jī)滲透到我們生活的各個(gè)領(lǐng)域,幾乎很難找到哪個(gè)領(lǐng)域沒(méi)有單片機(jī)的蹤跡。導(dǎo)彈的導(dǎo)航裝置,飛機(jī)上各種儀表的控制,計(jì)算機(jī)的網(wǎng)絡(luò)通訊與數(shù)據(jù)傳輸,工業(yè)自動(dòng)化過(guò)程的實(shí)時(shí)控制和數(shù)據(jù)處理,廣泛使用的各種智能IC卡,民用豪華轎車的安全保障系統(tǒng),錄像機(jī)、攝像機(jī)、全自動(dòng)洗衣機(jī)的控制,以及程控玩具、電子寵物等等,這些都離不開(kāi)單片機(jī)。更不用說(shuō)自動(dòng)控制領(lǐng)域的機(jī)器人、智能儀表、醫(yī)療器械了。因此,單片機(jī)的學(xué)習(xí)、開(kāi)發(fā)與應(yīng)用將造就一批計(jì)算機(jī)應(yīng)用與智能化控制的科學(xué)家、工程師。單片機(jī)廣泛應(yīng)用于儀器儀表、家用電器、醫(yī)用設(shè)備、航空航天、專用設(shè)備的智能化管理及過(guò)程控制等領(lǐng)域,大致可分如下幾個(gè)范疇:
(1)在智能儀器儀表上的應(yīng)用
(2)在工業(yè)控制中的應(yīng)用
(3)在家用電器中的應(yīng)用
(4)在計(jì)算機(jī)網(wǎng)絡(luò)和通信領(lǐng)域中的應(yīng)用
(5)單片機(jī)在醫(yī)用設(shè)備領(lǐng)域中的應(yīng)用
(6)在各種大型電器中的模塊化應(yīng)用
(7)單片機(jī)在汽車設(shè)備領(lǐng)域中的應(yīng)用
    此外,單片機(jī)在工商,金融,科研、教育,國(guó)防航空航天等領(lǐng)域都有著十分廣泛的用途。

1.3  AT89S52單片機(jī)
              AT89S52是一種低功耗、高性能CMOS8位微控制器,具有8K 在系統(tǒng)可編程Flash 存儲(chǔ)器。使用Atmel 公司高密度非易失性存儲(chǔ)器技術(shù)制造,與工業(yè)80C51 產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲(chǔ)器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使AT89S52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。
              AT89S52具有以下標(biāo)準(zhǔn)功能: 8k字節(jié)Flash,256字節(jié)RAM,32 位I/O 口線,看門狗定時(shí)器,2 個(gè)數(shù)據(jù)指針,三個(gè)16 位定時(shí)器/計(jì)數(shù)器,一個(gè)6向量2級(jí)中斷結(jié)構(gòu),全雙工串行口,片內(nèi)晶振及時(shí)鐘電路。另外,AT89S52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式。空閑模式下,CPU停止工作,允許RAM、定時(shí)器/計(jì)數(shù)器、串口、中斷繼續(xù)工作。掉電保護(hù)方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機(jī)一切工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。
主要性能
              1、與MCS-51單片機(jī)產(chǎn)品兼容
              2 、8K字節(jié)在系統(tǒng)可編程Flash存儲(chǔ)器
              3 、1000次擦寫周期
              4 、全靜態(tài)操作:0Hz~33Hz
              5 、三級(jí)加密程序存儲(chǔ)器
              6 、32個(gè)可編程I/O口線
              7 、三個(gè)16位定時(shí)器/計(jì)數(shù)器
              8、八個(gè)中斷源
              9、全雙工UART串行通道
              10、 低功耗空閑和掉電模式
              l 1、掉電后中斷可喚醒
              l 2、看門狗定時(shí)器
              l3、 雙數(shù)據(jù)指針
              l4、 掉電標(biāo)識(shí)符
引腳結(jié)構(gòu)
P0 口:P0口是一個(gè)8位漏極開(kāi)路的雙向I/O口。作為輸出口,每位能驅(qū)動(dòng)8個(gè)TTL邏輯電平。對(duì)P0端口寫“1”時(shí),引腳用作高阻抗輸入。當(dāng)訪問(wèn)外部程序和數(shù)據(jù)存儲(chǔ)器時(shí),P0口也被作為低8位地址/數(shù)據(jù)復(fù)用。在這種模式下,P0具有內(nèi)部上拉電阻。在flash編程時(shí),P0口也用來(lái)接收指令字節(jié);在程序校驗(yàn)時(shí),輸出指令字節(jié)。程序校驗(yàn)時(shí),需要外部上拉電阻。
P1 口:P1 口是一個(gè)具有內(nèi)部上拉電阻的8 位雙向I/O 口,p1 輸出緩沖器能驅(qū)動(dòng)4 個(gè)TTL 邏輯電平。對(duì)P1 端口寫“1”時(shí),內(nèi)部上拉電阻把端口拉高,此時(shí)可以作為輸入口使用。作為輸入使用時(shí),被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)。此外,P1.0和P1.2分別作定時(shí)器/計(jì)數(shù)器2的外部計(jì)數(shù)輸入(P1.0/T2)和時(shí)器/計(jì)數(shù)器2的觸發(fā)輸入(P1.1/T2EX),具體如下表所示。在flash編程和校驗(yàn)時(shí),P1口接收低8位地址字節(jié)。
引腳號(hào)第二功能
P1.0 T2(定時(shí)器/計(jì)數(shù)器T2的外部計(jì)數(shù)輸入),時(shí)鐘輸出
P1.1 T2EX(定時(shí)器/計(jì)數(shù)器T2的捕捉/重載觸發(fā)信號(hào)和方向控制)
P1.5 MOSI(在系統(tǒng)編程用)
P1.6 MISO(在系統(tǒng)編程用)
P1.7 SCK(在系統(tǒng)編程用)
P2 口:P2 口是一個(gè)具有內(nèi)部上拉電阻的8 位雙向I/O 口,P2 輸出緩沖器能驅(qū)動(dòng)4 個(gè)TTL 邏輯電平。對(duì)P2 端口寫“1”時(shí),內(nèi)部上拉電阻把端口拉高,此時(shí)可以作為輸入口使用。作為輸入使用時(shí),被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)。在訪問(wèn)外部程序存儲(chǔ)器或用16位地址讀取外部數(shù)據(jù)存儲(chǔ)器(例如執(zhí)行MOVX @DPTR)時(shí),P2 口送出高八位地址。在這種應(yīng)用中,P2 口使用很強(qiáng)的內(nèi)部上拉發(fā)送1。在使用8位地址(如MOVX @RI)訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器時(shí),P2口輸出P2鎖存器的內(nèi)容。在flash編程和校驗(yàn)時(shí),P2口也接收高8位地址字節(jié)和一些控制信號(hào)。P3 口:P3 口是一個(gè)具有內(nèi)部上拉電阻的8 位雙向I/O 口,p2 輸出緩沖器能驅(qū)動(dòng)4 個(gè)TTL 邏輯電平。對(duì)P3 端口寫“1”時(shí),內(nèi)部上拉電阻把端口拉高,此時(shí)可以作為輸入口使用。作為輸入使用時(shí),被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)。
P3口亦作為AT89S52特殊功能(第二功能)使用,如下表所示。在flash編程和校驗(yàn)時(shí),P3口也接收一些控制信號(hào)。
引腳號(hào)第二功能
P3.0 RXD(串行輸入)
P3.1 TXD(串行輸出)
P3.2 INT0(外部中斷0)
P3.3 INT0(外部中斷0)
P3.4 T0(定時(shí)器0外部輸入)
P3.5 T1(定時(shí)器1外部輸入)
P3.6 WR(外部數(shù)據(jù)存儲(chǔ)器寫選通)
P3.7 RD(外部數(shù)據(jù)存儲(chǔ)器寫選通)
RST: 復(fù)位輸入。晶振工作時(shí),RST腳持續(xù)2 個(gè)機(jī)器周期高電平將使單片機(jī)復(fù)位。看門狗計(jì)時(shí)完成后,RST 腳輸出96 個(gè)晶振周期的高電平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能無(wú)效。DISRTO默認(rèn)狀態(tài)下,復(fù)位高電平有效。ALE/PROG:地址鎖存控制信號(hào)(ALE)是訪問(wèn)外部程序存儲(chǔ)器時(shí),鎖存低8 位地址的輸出脈沖。在flash編程時(shí),此引腳(PROG)也用作編程輸入脈沖。在一般情況下,ALE 以晶振六分之一的固定頻率輸出脈沖,可用來(lái)作為外部定時(shí)器或時(shí)鐘使用。然而,特別強(qiáng)調(diào),在每次訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器時(shí),ALE脈沖將會(huì)跳過(guò)。如果需要,通過(guò)將地址為8EH的SFR的第0位置“1”,ALE操作將無(wú)效。這一位置“1”,ALE 僅在執(zhí)行MOVX 或MOVC指令時(shí)有效。否則,ALE 將被微弱拉高。這個(gè)ALE 使能標(biāo)志位(地址為8EH的SFR的第0位)的設(shè)置對(duì)微控制器處于外部執(zhí)行模式下無(wú)效。PSEN:外部程序存儲(chǔ)器選通信號(hào)(PSEN)是外部程序存儲(chǔ)器選通信號(hào)。
當(dāng)AT89S52從外部程序存儲(chǔ)器執(zhí)行外部代碼時(shí),PSEN在每個(gè)機(jī)器周期被激活兩次,而在訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器時(shí),PSEN將不被激活。EA/VPP:訪問(wèn)外部程序存儲(chǔ)器控制信號(hào)。為使能從0000H 到FFFFH的外部程序存儲(chǔ)器讀取指令,EA必須接GND。為了執(zhí)行內(nèi)部程序指令,EA應(yīng)該接VCC。在flash編程期間,EA也接收12伏VPP電壓。XTAL1:振蕩器反相放大器和內(nèi)部時(shí)鐘發(fā)生電路的輸入端。XTAL2:振蕩器反相放大器的輸出端。
2  LCD1602的原理及其應(yīng)用
2.1 液晶屏LCD1602的介紹:

LCD1602已很普遍了,具體介紹我就不多說(shuō)了,市面上字符液晶絕大多數(shù)是基于HD44780液晶芯片的,控制原理是完全相同的,因此HD44780寫的控制程序可以很方便地應(yīng)用于市面上大部分的字符型液晶。字符型LCD通常有14條引腳線或16條引腳線的LCD,多出來(lái)的2條線是背光電源線VCC(15腳)和地線GND(16腳),其控制原理與14腳的LCD完全一樣。

2.2 液晶屏LCD1602的功能及應(yīng)用
   1602LCD采用標(biāo)準(zhǔn)的14腳(無(wú)背光)或16腳(帶背光)接口,各引腳接口說(shuō)明如表10-13所示:
編號(hào)
符號(hào)
引腳說(shuō)明
編號(hào)
符號(hào)
引腳說(shuō)明
1
VSS
電源地
9
D2
數(shù)據(jù)
2
VDD
電源正極
10
D3
數(shù)據(jù)
3
VL
液晶顯示偏壓
11
D4
數(shù)據(jù)
4
RS
數(shù)據(jù)/命令選擇
12
D5
數(shù)據(jù)
5
R/W
讀/寫選擇
13
D6
數(shù)據(jù)
6
E
使能信號(hào)
14
D7
數(shù)據(jù)
7
D0
數(shù)據(jù)
15
BLA
背光源正極
8
D1
數(shù)據(jù)
16
BLK
背光源負(fù)極
表10-13:引腳接口說(shuō)明表
第1腳:VSS為地電源。
第2腳:VDD接5V正電源。
第3腳:VL為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地時(shí)對(duì)比度最高,對(duì)比度過(guò)高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通過(guò)一個(gè)10K的電位器調(diào)整對(duì)比度。
第4腳:RS為寄存器選擇,高電平時(shí)選擇數(shù)據(jù)寄存器、低電平時(shí)選擇指令寄存器。
第5腳:R/W為讀寫信號(hào)線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫操作。當(dāng)RS和R/W共同為低電平時(shí)可以寫入指令或者顯示地址,當(dāng)RS為低電平R/W為高電平時(shí)可以讀忙信號(hào),當(dāng)RS為高電平R/W為低電平時(shí)可以寫入數(shù)據(jù)。
第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。
第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。
第15腳:背光源正極。
第16腳:背光源負(fù)極。
10.8.2.3 1602LCD的指令說(shuō)明及時(shí)序
1602液晶模塊內(nèi)部的控制器共有11條控制指令,如表10-14所示:
序號(hào)
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清顯示
0
0
0
0
0
0
0
0
0
1
2
光標(biāo)返回
0
0
0
0
0
0
0
0
1
*
3
置輸入模式
0
0
0
0
0
0
0
1
I/D
S
4
顯示開(kāi)/關(guān)控制
0
0
0
0
0
0
1
D
C
B
5
光標(biāo)或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符發(fā)生存貯器地址
0
0
0
1
字符發(fā)生存貯器地址
8
置數(shù)據(jù)存貯器地址
0
0
1
顯示數(shù)據(jù)存貯器地址
9
讀忙標(biāo)志或地址
0
1
BF
計(jì)數(shù)器地址
10
寫數(shù)到CGRAM或DDRAM)
1
0
要寫的數(shù)據(jù)內(nèi)容
11
從CGRAM或DDRAM讀數(shù)
1
1
讀出的數(shù)據(jù)內(nèi)容
表10-14:控制命令表
1602液晶模塊的讀寫操作、屏幕和光標(biāo)的操作都是通過(guò)指令編程來(lái)實(shí)現(xiàn)的。(說(shuō)明:1為高電平、0為低電平)
指令1:清顯示,指令碼01H,光標(biāo)復(fù)位到地址00H位置。
指令2:光標(biāo)復(fù)位,光標(biāo)返回到地址00H。
指令3:光標(biāo)和顯示模式設(shè)置 I/D:光標(biāo)移動(dòng)方向,高電平右移,低電平左移 S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無(wú)效。
指令4:顯示開(kāi)關(guān)控制。 D:控制整體顯示的開(kāi)與關(guān),高電平表示開(kāi)顯示,低電平表示關(guān)顯示 C:控制光標(biāo)的開(kāi)與關(guān),高電平表示有光標(biāo),低電平表示無(wú)光標(biāo) B:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍。
指令5:光標(biāo)或顯示移位 S/C:高電平時(shí)移動(dòng)顯示的文字,低電平時(shí)移動(dòng)光標(biāo)。
指令6:功能設(shè)置命令 DL:高電平時(shí)為4位總線,低電平時(shí)為8位總線 N:低電平時(shí)為單行顯示,高電平時(shí)雙行顯示 F: 低電平時(shí)顯示5x7的點(diǎn)陣字符,高電平時(shí)顯示5x10的點(diǎn)陣字符。
指令7:字符發(fā)生器RAM地址設(shè)置。
指令8:DDRAM地址設(shè)置。
指令9:讀忙信號(hào)和光標(biāo)地址 BF:為忙標(biāo)志位,高電平表示忙,此時(shí)模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。
指令10:寫數(shù)據(jù)。
指令11:讀數(shù)據(jù)。
與HD44780相兼容的芯片時(shí)序表如下:
讀狀態(tài)
輸入
RS=L,R/W=H,E=H
輸出
D0—D7=狀態(tài)字
寫指令
輸入
RS=L,R/W=L,D0—D7=指令碼,E=高脈沖
輸出
無(wú)
讀數(shù)據(jù)
輸入
RS=H,R/W=H,E=H
輸出
D0—D7=數(shù)據(jù)
寫數(shù)據(jù)
輸入
RS=H,R/W=L,D0—D7=數(shù)據(jù),E=高脈沖
輸出
無(wú)
表10-15:基本操作時(shí)序表
讀寫操作時(shí)序如圖10-55和10-56所示:
圖10-56 寫操作時(shí)序
10.8.2.4 1602LCD的RAM地址映射及標(biāo)準(zhǔn)字庫(kù)表
液晶顯示模塊是一個(gè)慢顯示器件,所以在執(zhí)行每條指令之前一定要確認(rèn)模塊的忙標(biāo)志為低電平,表示不忙,否則此指令失效。要顯示字符時(shí)要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,圖10-57是1602的內(nèi)部顯示地址。
圖10-57 1602LCD內(nèi)部顯示地址
例如第二行第一個(gè)字符的地址是40H,那么是否直接寫入40H就可以將光標(biāo)定位在第二行第一個(gè)字符的位置呢?這樣不行,因?yàn)閷懭腼@示地址時(shí)要求最高位D7恒定為高電平1所以實(shí)際寫入的數(shù)據(jù)應(yīng)該是01000000B(40H)+10000000B(80H)=11000000B(C0H)。
在對(duì)液晶模塊的初始化中要先設(shè)置其顯示模式,在液晶模塊顯示字符時(shí)光標(biāo)是自動(dòng)右移的,無(wú)需人工干預(yù)。每次輸入指令前都要判斷液晶模塊是否處于忙的狀態(tài)。
1602液晶模塊內(nèi)部的字符發(fā)生存儲(chǔ)器(CGROM)已經(jīng)存儲(chǔ)了160個(gè)不同的點(diǎn)陣字符圖形,如圖10-58所示,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號(hào)、和日文假名等,每一個(gè)字符都有一個(gè)固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時(shí)模塊把地址41H中的點(diǎn)陣字符圖形顯示出來(lái),我們就能看到字母“A”
圖10-58 字符代碼與圖形對(duì)應(yīng)圖
3  設(shè)計(jì)思路、仿真及調(diào)試
3.1 設(shè)計(jì)方法
本電路設(shè)計(jì)采用AT89S52單片機(jī)為核心,利用晶振產(chǎn)生頻率為1HZ的時(shí)鐘脈沖信號(hào),利用液晶屏LCD1602顯示計(jì)算及其時(shí)間信息,通過(guò)對(duì)AT89S52單片機(jī)的編程控制液晶屏LCD1602的顯示。顯示計(jì)算和簡(jiǎn)易計(jì)算的信息同在LCD1602,通過(guò)按鍵切換選擇。外部按鍵可及時(shí)設(shè)定或調(diào)整時(shí)間或計(jì)算的信息。
3.2 硬件設(shè)計(jì)
本系統(tǒng)以AT89S52單片機(jī)為核心,本系統(tǒng)選用12MHZ的晶振,,使得單片機(jī)有合理的運(yùn)行速度。起振電容30pF對(duì)振蕩器的頻率高低、振蕩器的穩(wěn)定性和起振的快速性影響較合適,復(fù)位電路為按鍵高電平復(fù)位。

3.2.1按鍵調(diào)整電路
                                                                               第 1 頁(yè) 共 34 頁(yè)                                       


桂林電子科技大課程設(shè)計(jì)(論文)專用紙                                         第 1 頁(yè) 共 34 頁(yè)
S0為調(diào)秒的按鍵,當(dāng)按下S0時(shí)秒加1,S1為調(diào)分的按鍵,當(dāng)按S1時(shí)分加1,S2按鍵為調(diào)時(shí),當(dāng)按下S2時(shí),時(shí)加1,S3按鍵為調(diào)日,當(dāng)按下S3時(shí)日加1,S4為調(diào)月,當(dāng)按下S4時(shí)月加1,S5為調(diào)年,當(dāng)按下S5時(shí)年加1;S6為時(shí)間顯示建,S7為計(jì)算顯示鍵。
3.2.2復(fù)位電路
3.2.3液晶屏LCD1602顯示
3.2.4 LED指示電路
當(dāng)單片機(jī)通電時(shí)LED亮
3.2.5 4*4鍵盤的設(shè)計(jì)
鍵盤功能如下:
3.2.6簡(jiǎn)易計(jì)算器的總電路
硬件設(shè)計(jì)中用Protel99se畫(huà)原理圖和PCB圖  如圖1所示原理圖:
圖1
3.3 軟件設(shè)計(jì)
   本電路軟件設(shè)計(jì)采用C語(yǔ)言編寫程序(具體程序在附件中給出)。程序設(shè)計(jì)主要包括簡(jiǎn)易計(jì)算的編程,按鍵編程,時(shí)間控制編程,液晶屏LCD1602的顯示編程。

3.4 軟件仿真
在硬件設(shè)計(jì)完成后,利用軟件對(duì)其進(jìn)行仿真,以盡可能的減少做板的次數(shù)。本次我采用Proteus軟件仿真。
如圖2所示,簡(jiǎn)易計(jì)算器的時(shí)間顯示
如圖3所示 簡(jiǎn)易計(jì)算器的計(jì)算顯示軟件仿真正常,可進(jìn)行硬件制作。
圖2
圖3
3.5 硬件調(diào)試
做好電路板,按鍵使用正確,時(shí)間顯示正常,計(jì)算功能也正常!如下圖:
4  結(jié)論
  在用單片機(jī)實(shí)現(xiàn)簡(jiǎn)易計(jì)算的設(shè)計(jì)中使用到了AT89s52、LCD1602及其4*4鍵盤的使用。在設(shè)計(jì)過(guò)程中我通過(guò)在網(wǎng)上和圖書(shū)館查閱資料,收集了關(guān)于單片機(jī)和液晶屏LCD1602顯示方面的資料,通過(guò)對(duì)這些資料的學(xué)習(xí),我了解了單片機(jī)的基本結(jié)構(gòu)和單片機(jī)在生活和生產(chǎn)中所發(fā)揮的作用;液晶屏LCD1602的原理和使用。本次課程設(shè)計(jì)完成的主要工作和任務(wù)如下:對(duì)設(shè)計(jì)方案的理論研究,單片機(jī)的合理選型,硬件電路的設(shè)計(jì),電路板的制作,元器件的焊接,軟件的編寫和調(diào)試以及課設(shè)論文的制作。通過(guò)設(shè)計(jì)簡(jiǎn)易計(jì)算器的過(guò)程中我掌握了單片機(jī)的基本原理及其各種應(yīng)用,對(duì)它的各種硬件接口與軟件設(shè)計(jì)方法有較深入的認(rèn)識(shí)。通過(guò)對(duì)電路原理圖、pcb圖的繪制,電路仿真、電路板的制作掌握了對(duì)proteus仿真軟件的使用。


附  件
硬件電路原理圖:

單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit rs=P0^0;
  5. sbit rw=P0^1;
  6. sbit e=P0^2;
  7. sbit k0=P1^0;
  8. sbit k1=P1^1;
  9. sbit k2=P1^2;
  10. sbit k3=P1^3;
  11. sbit k4=P1^4;
  12. sbit k5=P1^5;
  13. sbit k6=P1^6;
  14. sbit k7=P1^7;
  15. unsigned char code digit[ ]={"0123456789"};    //定義字符數(shù)組顯示數(shù)字
  16. unsigned char s,m,h,day,month,year,count;
  17. void write_dat(uchar dat);
  18. void write_com(uchar com);
  19. void keyscan();
  20. /**********************
  21. 功能說(shuō)明:
  22. 顯示編碼,加上0x30,
  23. 分別為'1','2','3','+',
  24. '4','5','6','-',等
  25. **********************/
  26. uchar code table1[]=
  27. {
  28. 1,2,3,0x2b-0x30,
  29. 4,5,6,0x2d-0x30,
  30. 7,8,9,0x2a-0x30,
  31. 0,0x3d-0x30,0x01-0x30,0x2f-0x30
  32. };

  33. uchar k=0,flag=0,num,fuhao,i;

  34. long a,b,c;


  35. void delay(uint z)
  36. {
  37.     uint x,y;
  38.     for(x=z;x>0;x--)
  39.         for(y=110;y>0;y--);
  40. }
  41. /*****************************************************
  42. 函數(shù)功能:指定字符顯示的實(shí)際地址
  43. 入口參數(shù):x
  44. ***************************************************/
  45. void WriteAddress(unsigned char x)
  46. {
  47.      write_com(x|0x80); //顯示位置的確定方法規(guī)定為"80H+地址碼x"
  48. }
  49. /******************************************************************************
  50. 函數(shù)功能:顯示小時(shí)                        
  51. ******************************************************************************/
  52. void DisplayHour()
  53. {
  54.    unsigned char i,j;
  55.               i=h/10;                //取整運(yùn)算,求得十位數(shù)字
  56.               j=h%10;                //取余運(yùn)算,求得各位數(shù)字
  57.    WriteAddress(0x45);     //寫顯示地址,將十位數(shù)字顯示在第2行第0列
  58.               write_dat(digit[i]);   //將十位數(shù)字的字符常量寫入LCD
  59.      write_dat(digit[j]);   //將個(gè)位數(shù)字的字符常量寫入LCD

  60. }
  61. /******************************************************************************
  62. 函數(shù)功能:顯示分鐘                        
  63. ******************************************************************************/
  64. void DisplayMinute()
  65. {
  66.   unsigned char i,j;
  67.    i=m/10;                 //取整運(yùn)算,求得十位數(shù)字
  68.               j=m%10;                //取余運(yùn)算,求得各位數(shù)字
  69.    WriteAddress(0x48);     //寫顯示地址,將十位數(shù)字顯示在第2行第3列
  70.               write_dat(digit[i]);   //將十位數(shù)字的字符常量寫入LCD
  71.               write_dat(digit[j]);   //將個(gè)位數(shù)字的字符常量寫入LCD

  72. }
  73. /******************************************************************************
  74. 函數(shù)功能:顯示秒                       
  75.   ******************************************************************************/
  76. void DisplaySecond()
  77. {
  78.    unsigned char i,j;
  79.                 i=s/10;                //取整運(yùn)算,求得十位數(shù)字
  80.               j=s%10;                //取余運(yùn)算,求得各位數(shù)字
  81.    WriteAddress(0x4b);     //寫顯示地址,將十位數(shù)字顯示在第2行第6列
  82.               write_dat(digit[i]);   //將十位數(shù)字的字符常量寫入LCD
  83.     write_dat(digit[j]);   //將個(gè)位數(shù)字的字符常量寫入LCD
  84. }


  85. /******************************************************************************
  86. 函數(shù)功能:顯示小時(shí)                        
  87. ******************************************************************************/
  88. void DisplayYear()
  89. {
  90.    unsigned char i,j;
  91.               i=year/10;                //取整運(yùn)算,求得十位數(shù)字
  92.               j=year%10;                //取余運(yùn)算,求得各位數(shù)字
  93.    WriteAddress(0x07);     //寫顯示地址,將十位數(shù)字顯示在第2行第0列
  94.               write_dat(digit[i]);   //將十位數(shù)字的字符常量寫入LCD
  95.      write_dat(digit[j]);   //將個(gè)位數(shù)字的字符常量寫入LCD

  96. }
  97. /******************************************************************************
  98. 函數(shù)功能:顯示分鐘                        
  99. ******************************************************************************/
  100. void DisplayMonth()
  101. {
  102.   unsigned char i,j;
  103.    i=month/10;                 //取整運(yùn)算,求得十位數(shù)字
  104.               j=month%10;                //取余運(yùn)算,求得各位數(shù)字
  105.    WriteAddress(0x0a);     //寫顯示地址,將十位數(shù)字顯示在第2行第3列
  106.               write_dat(digit[i]);   //將十位數(shù)字的字符常量寫入LCD
  107.               write_dat(digit[j]);   //將個(gè)位數(shù)字的字符常量寫入LCD

  108. }
  109. /******************************************************************************
  110. 函數(shù)功能:顯示秒                       
  111.   ******************************************************************************/
  112. void DisplayDay()
  113. {
  114.    unsigned char i,j;
  115.                 i=day/10;                //取整運(yùn)算,求得十位數(shù)字
  116.               j=day%10;                //取余運(yùn)算,求得各位數(shù)字
  117.    WriteAddress(0x0d);     //寫顯示地址,將十位數(shù)字顯示在第2行第6列
  118.               write_dat(digit[i]);   //將十位數(shù)字的字符常量寫入LCD
  119.     write_dat(digit[j]);   //將個(gè)位數(shù)字的字符常量寫入LCD
  120. }
  121. void keyscan2()
  122.               {if(k0==0)
  123.                  {delay(5);
  124.                   if(k0==0)
  125.                     {
  126.                               s++;
  127.                      if(s==60)
  128.                      s=0;
  129.                      }
  130.                   }
  131.                 if(k1==0)
  132.                   {delay(5);
  133.                    if(k1==0)
  134.                      {m++;
  135.                       if(m==60)
  136.                         m=0;
  137.                       }
  138.                    }
  139.                               if(k2==0)
  140.                   {delay(5);
  141.                    if(k2==0)
  142.                      {h++;
  143.                       if(h==60)
  144.                        h=0;
  145.                       }
  146.                    }

  147.                               if(k3==0)
  148.                   {delay(5);
  149.                    if(k3==0)
  150.                      {day++;
  151.                       if(day==30)
  152.                        day=0;
  153.                       }
  154.                    }
  155.                               if(k4==0)
  156.                   {delay(5);
  157.                    if(k4==0)
  158.                      {month++;
  159.                       if(month==13)
  160.                         month=0;
  161.                       }
  162.                    }
  163.         if(k5==0)
  164.                   {delay(5);
  165.                    if(k5==0)
  166.                      {year++;
  167.                       if(year==99)
  168.                          year=0;
  169.                       }
  170.                    }

  171.                 }
  172.             
  173. void keyscan()
  174. {
  175.     uchar temp;
  176.     P3=0xfe;
  177.     temp=P3;
  178.     temp=temp&0xf0;
  179.     while(temp!=0xf0)
  180.     {
  181.        delay(5);
  182.        temp=P3;
  183.        temp=temp&0xf0;
  184.        while(temp!=0xf0)
  185.        {
  186.            temp=P3;
  187.            switch(temp)
  188.            {
  189.               case 0xee:num=0;
  190.                 break;  
  191.               case 0xde:num=1;
  192.              break;
  193.               case 0xbe:num=2;
  194.              break;
  195.               case 0x7e:num=3;
  196.              break;
  197.             }  
  198.              while(temp!=0xf0)
  199.                 { temp=P3;
  200.                   temp=temp&0xf0;
  201.            }
  202.            }

  203. /*當(dāng)按下1,2,3,松手后執(zhí)行下面這段語(yǔ)句*/
  204.            if(num==0||num==1||num==2)
  205.            {

  206.                 if(flag==0)
  207.                    a=a*10+table1[num];//如果沒(méi)有按符號(hào)鍵,符號(hào)前的數(shù)值為a
  208.                 else if(flag==1)
  209.                    b=b*10+table1[num];  //如果按了符號(hào)鍵,符號(hào)后的數(shù)值為b

  210.                 if(k==1)    //如果之前按了'='號(hào),再按鍵時(shí)清屏,進(jìn)行下一次計(jì)算
  211.              {
  212.                  k=0;
  213.                     write_com(0x01);
  214.              }
  215.          }
  216.             else if(num==3)   //判斷按下'+'
  217.       {
  218.                  flag=1;
  219.                  fuhao=1;
  220.          }

  221.           i=table1[num];    //顯示按下的鍵
  222.           write_dat(0x30+i);

  223.        }
  224.     P3=0xfd;
  225.     temp=P3;
  226.     temp=temp&0xf0;
  227.     while(temp!=0xf0)
  228.     {
  229.        delay(5);
  230.        temp=P3;
  231.        temp=temp&0xf0;
  232.        while(temp!=0xf0)
  233.        {
  234.            temp=P3;
  235.            switch(temp)
  236.            {
  237.               case 0xed:num=4;
  238.                 break;  
  239.               case 0xdd:num=5;
  240.              break;
  241.               case 0xbd:num=6;
  242.              break;
  243.               case 0x7d:num=7;
  244.              break;
  245.             }  
  246.              while(temp!=0xf0)
  247.                 { temp=P3;
  248.                  temp=temp&0xf0;
  249.            }
  250.            }
  251.          if(num==4||num==5||num==6) //判斷是否按下'4','5','6'
  252.       {
  253.              if(k==1)
  254.              {
  255.                  k=0;
  256.                     write_com(0x01);
  257.              }
  258.              if(flag==0)
  259.                 a=a*10+table1[num];
  260.              else if(flag==1)
  261.                 b=b*10+table1[num];     
  262.       }
  263.          else if(num==7)
  264.       {
  265.              flag=1;
  266.              fuhao=2;  
  267.       }
  268.          i=table1[num];     //顯示按下的鍵
  269.          write_dat(0x30+i);   

  270.        }
  271.     P3=0xfb;
  272.     temp=P3;
  273.     temp=temp&0xf0;
  274.     while(temp!=0xf0)
  275.     {
  276.        delay(5);
  277.        temp=P3;
  278.        temp=temp&0xf0;
  279.        while(temp!=0xf0)
  280.        {
  281.            temp=P3;
  282.            switch(temp)   //
  283.            {
  284.               case 0xeb:num=8;
  285.                 break;  
  286.               case 0xdb:num=9;
  287.              break;
  288.               case 0xbb:num=10;
  289.              break;
  290.               case 0x7b:num=11;
  291.                 break;            
  292.             }  
  293.              while(temp!=0xf0)
  294.                 { temp=P3;
  295.                  temp=temp&0xf0;
  296.            }
  297.            }
  298.            if(num==8||num==9||num==10)  //判斷是否按下'7','8','9'
  299.            {
  300.                if(k==1)
  301.              {
  302.                  k=0;
  303.                     write_com(0x01);
  304.              }
  305.                if(flag==0)
  306.                   a=a*10+table1[num];
  307.                else if(flag==1)
  308.                   b=b*10+table1[num];

  309.            }
  310.            else if(num==11)      //判斷是否按下'*'
  311.            {
  312.                 flag=1;
  313.              fuhao=3;

  314.            }
  315.            i=table1[num];
  316.            write_dat(0x30+i);

  317.        }
  318.        P3=0xf7;
  319.     temp=P3;
  320.     temp=temp&0xf0;
  321.     while(temp!=0xf0)
  322.     {
  323.        delay(5);
  324.        temp=P3;
  325.        temp=temp&0xf0;
  326.        while(temp!=0xf0)
  327.        {
  328.            temp=P3;
  329.            switch(temp)
  330.            {
  331.               case 0xe7:num=12;    // 0鍵
  332.                 break;  
  333.               case 0xd7:num=13;     // '='
  334.              break;
  335.               case 0xb7:num=14;  //清零鍵
  336.              break;
  337.               case 0x77:num=15;  //'/'
  338.                 break;            
  339.             }  
  340.              while(temp!=0xf0)
  341.                 { temp=P3;
  342.                  temp=temp&0xf0;
  343.                }   
  344.            }
  345.           switch(num)
  346.           {
  347.              case 12:
  348.              {
  349.                   if(k==1)
  350.              {
  351.                  k=0;
  352.                     write_com(0x01);
  353.              }
  354.                  if(flag==0)
  355.                    a=a*10;
  356.                  else if(flag==1)
  357.                    b=b*10;

  358.                    write_dat(0x30);
  359.              }
  360.                    break;
  361.              case 13:          //按=鍵
  362.            {
  363.                   k=1;
  364.                  if(fuhao==1)    //如果符號(hào)鍵是+,執(zhí)行+運(yùn)算
  365.            {

  366.                      write_com(0x80+0x4f);
  367.                      write_com(0x04);
  368.                c=a+b;
  369.                      while(c!=0)   
  370.             {
  371.                         write_dat(0x30+c%10);
  372.                   c=c/10;


  373.            }
  374.                     write_dat(0x3d);
  375.                  fuhao=0;
  376.                     a=0;b=0;flag=0;
  377.            }
  378.                  if(fuhao==2)
  379.            {
  380.                     write_com(0x80+0x4f);
  381.                     write_com(0x04);
  382.                   if(a>=b)
  383.            {
  384.                    c=a-b;
  385.                       while(c!=0)
  386.              {
  387.                          write_dat(0x30+c%10);
  388.                    c=c/10;
  389.                       }            

  390.            }
  391.                     else if(a<b)
  392.            {
  393.                     c=b-a;
  394.                        while(c!=0)
  395.                  {
  396.                            write_dat(0x30+c%10);
  397.                      c=c/10;
  398.                  }
  399.                       write_dat(0x2d);
  400.            }

  401.                     write_dat(0x3d);
  402.                    a=0;b=0;flag=0;fuhao=0;

  403.            }
  404.                  if(fuhao==3)   //如果符號(hào)鍵是*
  405.            {
  406.                     write_com(0x80+0x4f);
  407.                     write_com(0x04);
  408.                     c=a*b;
  409.                  while(c!=0)
  410.            {
  411.                        write_dat(0x30+c%10);
  412.                     c=c/10;
  413.            }
  414.                     write_dat(0x3d);         
  415.                    a=0;b=0;flag=0;fuhao=0;

  416.            }
  417.                  if(fuhao==4)      //如果符號(hào)鍵是/
  418.            {
  419.                      i=0;
  420.                      write_com(0x80+0x4f);
  421.                      write_com(0x04);
  422.                     c=(long)(((float)a/b)*1000000);  //結(jié)果保留6位小數(shù)
  423.                  while(c!=0
  424. ……………………

  425. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
21ic下載_51單片機(jī)計(jì)算器、時(shí)鐘.doc (1.54 MB, 下載次數(shù): 16)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 密乳av| 国产精品一区二区三区四区五区 | 国产一区二区在线免费观看 | 久草中文网 | 精品三区 | 色999视频 | 亚洲视频 欧美视频 | 中文字幕综合 | 国产黄色网址在线观看 | 久久精品国产一区二区三区不卡 | 野狼在线社区2017入口 | 黄色骚片| 亚洲第一免费播放区 | 国产91在线视频 | 日韩在线国产精品 | 毛片a | 国内精品视频在线观看 | 九九热免费视频在线观看 | 福利视频一区二区 | 久久视频免费看 | 国产一区二区三区高清 | 日韩视频在线一区 | caoporon| 欧美日韩成人 | 国产第一页在线播放 | 黄色精品| 精品国产乱码久久久久久88av | av av在线 | 一区二区三区在线观看免费视频 | 久久久久一区二区三区四区 | 很很干很很日 | 亚洲国产一区二区三区在线观看 | 国产精品亚洲成在人线 | 91影视| 99久久免费观看 | 欧美日韩一二三区 | 日韩视频一区二区 | 久久久久国产一区二区三区四区 | 一区二区视频在线观看 | 中文成人在线 | xxxxxx国产|