版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課 程 設(shè) 計(jì) </b></p><p> 課 程 名 稱(chēng) 單片機(jī)原理及應(yīng)用B </p><p> 課 題 名 稱(chēng) IC卡讀寫(xiě)器設(shè)計(jì) </p><p> 院(系、部、中心) 通信工程學(xué)院
2、 </p><p> 專(zhuān) 業(yè) 通信工程 </p><p> 班 級(jí) </p><p> 姓 名 </p><p
3、> 學(xué) 號(hào) </p><p> 起 止 日 期 </p><p> 設(shè) 計(jì) 地 點(diǎn) 微機(jī)原理與單片機(jī)實(shí)驗(yàn)室 </p><p> 指 導(dǎo) 老 師
4、 </p><p><b> 單片機(jī)原理及應(yīng)用B</b></p><p><b> 摘 要</b></p><p> IC卡在現(xiàn)代生活中應(yīng)用非常廣泛,IC卡讀寫(xiě)器的設(shè)計(jì)方法有多種,其中,利用單片機(jī)外接芯片實(shí)現(xiàn)的IC卡讀寫(xiě)器具有編程靈活,便于IC卡讀寫(xiě)器功能的擴(kuò)充,運(yùn)算存儲(chǔ)方便等優(yōu)點(diǎn)。</p><
5、;p> 本文主要介紹用單片機(jī)外接24C16EEPROM的方法,利用鍵盤(pán)對(duì)24C16進(jìn)行模擬充值的方法。本設(shè)計(jì)由單片機(jī)P89V51RD2芯片、24C16EEPROM和LCD液晶顯示為核心,輔以必要的電路,構(gòu)成了一個(gè)IC卡讀寫(xiě)器,使用起來(lái)很方便 此IC卡讀寫(xiě)器嚴(yán)格按照要求設(shè)計(jì),最終達(dá)到預(yù)期的效果,并且添加了進(jìn)行掛失,修改密碼,低值報(bào)警,透支報(bào)警等相關(guān)功能。 </p><p> 關(guān)鍵詞 IC卡讀寫(xiě)器
6、/單片機(jī) /C51編程</p><p> The Principle and Application</p><p> of Single Chip Microcomputer</p><p><b> ABSTRACT</b></p><p> IC card is widely used in modern
7、life。There are a variety of IC card reader design methods, which use an external chip microcontroller IC card reader with programming flexibility, ease of expansion IC card reader function, operation and easy storage。<
8、;/p><p> This paper describes a method 24C16EEPROM external MCU, using the keyboard to simulate 24C16 recharge methods. Designed by the MCU chip P89V51RD2, 24C16EEPROM and LCD display as the core, supplemented
9、 by the necessary circuitry, constitute an IC card reader, easy to use。</p><p> This IC card reader in strict accordance with the requirements of the design, and ultimately achieve the desired effect, and a
10、dd report the loss, change passwords, low alarm, alarm and other related functions overdraft.</p><p> Keywords IC card reader /P89V51RD2 single-chip computer /C51 programming</p><p> 八、參考文獻(xiàn)…
11、…………………………………………………………………………………………………………………28</p><p><b> 一、課程設(shè)計(jì)目的</b></p><p> 本課程設(shè)計(jì)是在《單片機(jī)原理及應(yīng)用B》課程主要內(nèi)容學(xué)習(xí)之后,通過(guò)一個(gè)單片機(jī)應(yīng)用系統(tǒng)的設(shè)計(jì)和調(diào)試,訓(xùn)練學(xué)生綜合運(yùn)用本課程知識(shí),獨(dú)立解決工程實(shí)際問(wèn)題的能力;使學(xué)生加深對(duì)單片機(jī)結(jié)構(gòu)、工作原理的理解,提高學(xué)生綜合
12、應(yīng)用知識(shí)的能力、分析解決問(wèn)題的能力和單片機(jī)應(yīng)用系統(tǒng)的設(shè)計(jì)技能;同時(shí)培養(yǎng)學(xué)生查閱科技資料和撰寫(xiě)科技報(bào)告的能力。</p><p><b> 二、基本思路</b></p><p> 通過(guò)此次課程設(shè)計(jì)掌握I2C總線的基本特點(diǎn)和通信協(xié)議,掌握24xx系列EEPROM的基本特點(diǎn)及總線控制協(xié)議,掌握單片機(jī)IO端口模擬I2C時(shí)序控制程序的編寫(xiě)方法。</p><
13、p> 單片機(jī)通過(guò)P1.0和P1.1分別連接24C16的SDA和SCL,編寫(xiě)單片機(jī)通過(guò)IO端口模擬I2C時(shí)序控制24C16讀寫(xiě)的程序。通過(guò)鍵盤(pán)對(duì)24C16EEPROM進(jìn)行模擬充值,通過(guò)LED/LCD實(shí)時(shí)顯示卡內(nèi)實(shí)際金額。</p><p><b> 三、實(shí)驗(yàn)方案</b></p><p> 在進(jìn)行頭文件配置完之后,建立一個(gè)while(1),死循環(huán),在這個(gè)死循環(huán)中
14、不斷檢測(cè)鍵盤(pán)輸入,檢測(cè)到鍵盤(pán)輸入后,根據(jù)鍵盤(pán)的值,執(zhí)行相應(yīng)的子函數(shù)。并通過(guò)1602LCD顯示出來(lái)相應(yīng)的過(guò)程。</p><p> 四、實(shí)驗(yàn)開(kāi)發(fā)環(huán)境及元器件</p><p> 1 、開(kāi)發(fā)工具及開(kāi)發(fā)環(huán)境簡(jiǎn)介</p><p><b> 1.1 單片機(jī)</b></p><p> 單片微型計(jì)算機(jī)簡(jiǎn)稱(chēng)單片機(jī),是典型的嵌入式微控
15、制器(Microcontroller Unit),常用英文字母的縮寫(xiě)MCU表示單片機(jī),它最早是被用在工業(yè)控制領(lǐng)域。單片機(jī)由芯片內(nèi)僅有CPU的專(zhuān)用處理器發(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ī)和專(zhuān)用處理器的發(fā)展便分道揚(yáng)鑣。</p><p> 1.2
16、Proteus</p><p> Proteus軟件是Labcenter Electronics公司的一款電路設(shè)計(jì)與仿真軟件,它包括ISIS、ARES等軟件模塊,ARES模塊主要用來(lái)完成PCB的設(shè)計(jì),而ISIS模塊用來(lái)完成電路原理圖的布圖與仿真。Proteus的軟件仿真基于VSM技術(shù),它與其他軟件最大的不同也是最大的優(yōu)勢(shì)就在于它能仿真大量的單片機(jī)芯片,比如MCS-51系列、PIC系列等等,以及單片機(jī)外圍電路,比
17、如鍵盤(pán)、LED、LCD等等。通過(guò)Proteus軟件的使用我們能夠輕易地獲得一個(gè)功能齊全、實(shí)用方便的單片機(jī)實(shí)驗(yàn)室。</p><p><b> 1.3 KEIL</b></p><p> 單片機(jī)開(kāi)發(fā)中除必要的硬件外,同樣離不開(kāi)軟件,我們寫(xiě)的匯編語(yǔ)言源程序要變?yōu)镃PU可以執(zhí)行的機(jī)器碼有兩種方法,一種是手工匯編,另一種是機(jī)器匯編,目前已極少使用手工匯編的方法了。機(jī)器匯編是
18、通過(guò)匯編軟件將源程序變?yōu)闄C(jī)器碼,用于MCS-51單片機(jī)的匯編軟件有早期的A51,隨著單片機(jī)開(kāi)發(fā)技術(shù)的不斷發(fā)展,從普遍使用匯編語(yǔ)言到逐漸使用高級(jí)語(yǔ)言開(kāi)發(fā),單片機(jī)的開(kāi)發(fā)軟件也在不斷發(fā)展,Keil軟件是目前最流行開(kāi)發(fā)MCS-51系列單片機(jī)的軟件,這從近年來(lái)各仿真機(jī)廠商紛紛宣布全面支持Keil即可看出。Keil提供了包括C編譯器、宏匯編、連接器、庫(kù)管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開(kāi)發(fā)方案,通過(guò)一個(gè)集成開(kāi)發(fā)環(huán)境(uVision)將這些部
19、分組合在一起。運(yùn)行Keil軟件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空閑的硬盤(pán)空間、WIN98、NT、WIN2000、WINXP等操作系統(tǒng)。掌握這一軟件的使用對(duì)于使用51系列單片機(jī)的愛(ài)好者來(lái)說(shuō)是十分必要的,如果你使用C語(yǔ)言編程,那么Keil幾乎就是你的不二之選(目前在國(guó)內(nèi)你只能買(mǎi)到該軟件、而你買(mǎi)的仿真機(jī)也很可能只支持該軟件),即使不使用C語(yǔ)言而僅用</p><p> Keil C51
20、生成的目標(biāo)代碼效率非常之高,多數(shù)語(yǔ)句生成的匯編代碼很緊湊,容易理解。在開(kāi)發(fā)大型軟件時(shí)更能體現(xiàn)高級(jí)語(yǔ)言的優(yōu)勢(shì)</p><p> 2、P89V51RD2</p><p> P89V51RD2是Philips公司生產(chǎn)的一款80C51微控制器,包含64KB Flash和1024字節(jié)的數(shù)據(jù)RAM。P89V51RD2的典型特性是它的X2方式選項(xiàng)。利用該特性,設(shè)計(jì)者可使應(yīng)用程序以傳統(tǒng)的80C51時(shí)鐘
21、頻率(每個(gè)機(jī)器周期包含12個(gè)時(shí)鐘)或X2 方式(每個(gè)機(jī)器周期包含6個(gè)時(shí)鐘)的時(shí)鐘頻率運(yùn)行,選擇X2方式可在相同時(shí)鐘頻率下獲得2倍的吞吐量。從該特性獲益的另一種方法是將時(shí)鐘頻率減半來(lái)保持特性不變,這 樣可以極大地降低EMI。Flash程序存儲(chǔ)器支持并行和串行在系統(tǒng)編程(ISP),ISP允許在軟件控制下對(duì)成品中的器件進(jìn)行重復(fù)編程。應(yīng)用固件的 產(chǎn)生/更新能力實(shí)現(xiàn)了ISP的大范圍應(yīng)用。 5V的工作電壓,操作頻率為0~40MHz。</p&g
22、t;<p> 3、24C16EEPROM</p><p> EEPROM(帶電可擦寫(xiě)可編程只讀存儲(chǔ)器)是用戶(hù)可更改的只讀存儲(chǔ)器(ROM),其可通過(guò)高于普通電壓的作用來(lái)擦除和重編程(重寫(xiě))。不像EPROM芯片,EEPROM不需從計(jì)算機(jī)中取出即可修改。在一個(gè)EEPROM中,當(dāng)計(jì)算機(jī)在使用的時(shí)候可頻繁地反復(fù)編程,因此EEPROM的壽命是一個(gè)很重要的設(shè)計(jì)考慮參數(shù)。EEPROM是一種特殊形式的閃存,其應(yīng)用
23、通常是個(gè)人電腦中的電壓來(lái)擦寫(xiě)和重編程。</p><p> 4.、LCD1602</p><p><b> (1)簡(jiǎn)介</b></p><p> 1602液晶也叫1602字符型液晶它是一種專(zhuān)門(mén)用來(lái)顯示字母、數(shù)字、符號(hào)等的點(diǎn)陣型液晶模塊它有若干個(gè)5X7或者5X11等點(diǎn)陣字符位組成,每個(gè)點(diǎn)陣字符位都可以顯示一個(gè)字符。每位之間有一個(gè)點(diǎn)距的間隔每行
24、之間也有間隔起到了字符間距和行間距的作用,正因?yàn)槿绱怂运荒茱@示圖形。</p><p> 1602LCD是指顯示的內(nèi)容為16X2,即可以顯示兩行,每行16個(gè)字符液晶模塊(顯示字符和數(shù)字)。 </p><p><b> (2)管腳功能</b></p><p> 1602采用標(biāo)準(zhǔn)的16腳接口,其中: </p><p>
25、; 第1腳:VSS為電源地 </p><p> 第2腳:VDD接5V電源正極 </p><p> 第3腳:V0為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地電源時(shí)對(duì)比度最高(對(duì)比度過(guò)高時(shí)會(huì) 產(chǎn)生“鬼影”,使用時(shí)可以通過(guò)一個(gè)10K的電位器調(diào)整對(duì)比度)。 </p><p> 第4腳:RS為寄存器選擇,高電平1時(shí)選擇數(shù)據(jù)寄存器、低電平0時(shí)選擇指令寄存器。 &
26、lt;/p><p> 第5腳:RW為讀寫(xiě)信號(hào)線,高電平(1)時(shí)進(jìn)行讀操作,低電平(0)時(shí)進(jìn)行寫(xiě)操作。 </p><p> 第6腳:E(或EN)端為使能(enable)端。 </p><p> 第7~14腳:D0~D7為8位雙向數(shù)據(jù)端。 </p><p> 第15~16腳:空腳或背燈電源。15腳背光正極,16腳背光負(fù)極。</p>
27、<p> (3)16進(jìn)制ASCII碼表</p><p><b> 字符集</b></p><p> 1602液晶模塊內(nèi)部的字符發(fā)生存儲(chǔ)器(CGROM)已經(jīng)存儲(chǔ)了160個(gè)不同的點(diǎn)陣字符圖形,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫(xiě)、常用的符號(hào)、和日文假名等,每一個(gè)字符都有一個(gè)固定的代碼,比如大寫(xiě)的英文字母“A”的代碼是01000001B(41H),顯
28、示時(shí)模塊把地址41H中的點(diǎn)陣字符圖形顯示出來(lái),我們就能看到字母“A”。</p><p> 在單片機(jī)編程中還可以用字符型常量或變量賦值,如'A’。因?yàn)镃GROM儲(chǔ)存的字符代碼與我們PC中的字符代碼是基本一致的,因此我們?cè)谙駾DRAM寫(xiě)C51字符代碼程序時(shí)甚至可以直接用P1=‘A’這樣的方法。PC在編譯時(shí)就把'A'先轉(zhuǎn)換為41H代碼了。</p><p><b&g
29、t; (4)特性</b></p><p> 3.3V或5V工作電壓,對(duì)比度可調(diào)</p><p><b> 內(nèi)含復(fù)位電路</b></p><p> 提供各種控制命令,如:清屏、字符閃爍、光標(biāo)閃爍、顯示移位等多種功能</p><p> 有80字節(jié)顯示數(shù)據(jù)存儲(chǔ)器DDRAM</p><p
30、> 內(nèi)建有192個(gè)5X7點(diǎn)陣的字型的字符發(fā)生器CGROM</p><p> 8個(gè)可由用戶(hù)自定義的5X7的字符發(fā)生器CGRAM</p><p><b> 五、系統(tǒng)分析與設(shè)計(jì)</b></p><p><b> 1、系統(tǒng)框圖</b></p><p><b> 2、軟件設(shè)計(jì)<
31、/b></p><p><b> (1)軟件程序內(nèi)容</b></p><p> 本設(shè)計(jì)的軟件程序包括主程序、充值子程序、消費(fèi)子程序、掛失子程序、</p><p> 修改密碼程序和報(bào)警子程序等等。另外,還設(shè)計(jì)了LCD顯示子程序。</p><p> (2)軟件設(shè)計(jì)流程圖</p><p>
32、<b> 主程序框圖</b></p><p><b> 充值子程序</b></p><p><b> 消費(fèi)子程序</b></p><p><b> 掛失子程序</b></p><p><b> 解鎖子程序</b></p
33、><p><b> 修改密碼子程序</b></p><p><b> (3)程設(shè)計(jì)步驟</b></p><p> ?、龠M(jìn)行頭文件配置,設(shè)置相應(yīng)的端口名 </p><p> ?、?采用死循環(huán),通過(guò)查詢(xún)方式檢測(cè)是否有鍵按下</p><p> ?、鄹鶕?jù)鍵盤(pán)的值執(zhí)行相應(yīng)的子程序<
34、;/p><p> ?、茉趫?zhí)行過(guò)程中控制LCD顯示相應(yīng)的內(nèi)容</p><p> ?、菰谧映绦驁?zhí)行完后返回主程序</p><p> ?、拊谧映绦蛑羞M(jìn)行相應(yīng)的數(shù)值運(yùn)算 </p><p> ⑦掛失和修改密碼的子程序?qū)⒏淖兇鎯?chǔ)在存儲(chǔ)器中的密碼值,使之從主程序中跳出來(lái),待重新啟用成功購(gòu)在回到主循環(huán)中 </p><p><b&g
35、t; (4)電路連線圖</b></p><p> 六、具體程序設(shè)計(jì)及步驟</p><p><b> 1、頭文件:</b></p><p><b> at24co2.h</b></p><p> #ifndef __AT24C02__</p><p>
36、 #define __AT24C02__</p><p> #include "main.h"</p><p> #include<reg52.h></p><p> sbit SCL=P1^7;</p><p> sbit SDA=P1^6;</p><p> sbit b
37、uz=P3^7;</p><p> void start_at24c02();</p><p> void stop_at24c02();</p><p> bit wait_at24c02_ack();</p><p> void at24c02_ack(bit ck);</p><p> void wri
38、te_at24c02_byte(uchar dat);</p><p> uchar read_at24c02_byte();</p><p> bit read_at24c02(uchar add,uchar *buf);</p><p> bit write_at24c02(uchar add,uchar dat);</p><p>
39、; bit read_at24c02_buf(uchar add,uchar *buf,uchar length);</p><p> bit write_at24c02_buf(uchar add,uchar *buf,uchar length);</p><p><b> #endif</b></p><p><b> K
40、ey.h</b></p><p> #ifndef __KEY__</p><p> #define __KEY__</p><p> #include "main.h"</p><p> #include<reg52.h></p><p> #define CAN
41、CEL 15</p><p> #define ENTER 14</p><p> #define ADD 13</p><p> #define SUB 12</p><p> #define LOSS 11</p><p> #define DEL10</p><p>
42、; bit keytest(void);</p><p> uchar getkeynum(void);</p><p><b> #endif</b></p><p><b> Lcd1602.h</b></p><p> #ifndef __LCD1602__</p>&
43、lt;p> #define __LCD1602__</p><p> #include"main.h"</p><p> #define LINE10x80</p><p> #define LINE20xC0</p><p> sbit RW=P1^1;</p><p> s
44、bit RS=P1^0;</p><p> sbit BUSY=P0^7;</p><p> sbit EN=P1^2;</p><p> sbit LCMBLC=P1^3;</p><p> void wait_lcd1602();</p><p> void write_lcd1602_cmd(uchar
45、 cmd);</p><p> void write_lcd1602_dat(uchar dat);</p><p> void init_lcd1602();</p><p> void write_string(uchar add,uchar *buf);</p><p><b> #endif</b><
46、;/p><p><b> main.h</b></p><p> #ifndef __MAIN__</p><p> #define __MAIN__</p><p> #define uchar unsigned char</p><p> #define uint unsigned in
47、t</p><p> #define SECRET_ADD 0x03</p><p> #define LOW_ADD 0x00</p><p> #define HIGH_ADD 0x01</p><p> void delay(uint dtime);</p><p><b> #endi
48、f</b></p><p><b> proce.h</b></p><p> #ifndef __PROCE__</p><p> #define __PROCE__</p><p> #include <reg52.h></p><p> #include &
49、quot;at24c02.h"</p><p> #include "lcd1602.h"</p><p> #include "key.h"</p><p> #include "serve.h" </p><p> void display_sum(v
50、oid);</p><p> void sub_pro(void);</p><p> void add_pro(void);</p><p> bit lose_pro(void);</p><p> bit change_pro(void);</p><p><b> #endif</b&
51、gt;</p><p><b> Serve.h</b></p><p> #ifndef __SERVE__</p><p> #define __SERVE__</p><p> //sbit buz=P3^7; </p><p> bit add(void);</p>
52、;<p> bit sub(void);</p><p> bit lose(void);</p><p> bit unlose(void);</p><p> bit change_first(void);</p><p> bit change_second(void);</p><p>
53、<b> #endif</b></p><p><b> 2、各個(gè).C文件:</b></p><p><b> at24c02.c</b></p><p> #include<reg52.h></p><p> #include"at24c02.
54、h"</p><p> #include <intrins.h></p><p> void delay(uint dt)</p><p> {while(dt--);}</p><p> void start_at24c02()</p><p> {SCL=0;_nop_();<
55、/p><p> SDA=1;_nop_();</p><p> SCL=1;_nop_();</p><p> SDA=0;_nop_();</p><p><b> }</b></p><p> void stop_at24c02()</p><p> {SCL=
56、0;_nop_();</p><p> SDA=0;_nop_();</p><p> SCL=1;_nop_();</p><p> SDA=1;_nop_();</p><p><b> }</b></p><p> void at24c02_ack(bit ck)</p>
57、;<p><b> {</b></p><p><b> if (ck)</b></p><p> SDA = 0; //發(fā)送ack</p><p><b> else</b></p><p> SDA = 1; //不發(fā)送ack</p
58、><p><b> SCL = 1;</b></p><p> delay(100);</p><p><b> SCL = 0;</b></p><p> delay(100);</p><p><b> SDA = 1;</b></p&g
59、t;<p> delay(100);</p><p><b> }</b></p><p> bit wait_at24c02_ack()</p><p><b> {</b></p><p><b> SDA=1;</b></p><
60、;p> delay(100);</p><p><b> SCL=1;</b></p><p> delay(100);</p><p><b> if(SDA)</b></p><p><b> {</b></p><p><b&
61、gt; SCL=0;</b></p><p> stop_at24c02();</p><p> return 1; //沒(méi)收到ack</p><p><b> }</b></p><p><b> else</b></p><p><b&g
62、t; {</b></p><p><b> SCL=0;</b></p><p> return 0; //收到ack</p><p><b> }}</b></p><p> void write_at24c02_byte(uchar dat)</p>&l
63、t;p><b> {</b></p><p><b> uchar i;</b></p><p><b> SCL=0;</b></p><p> for(i=0;i<8;i++)</p><p><b> {</b></p&g
64、t;<p> if(0x80&dat)</p><p><b> SDA=1;</b></p><p><b> else</b></p><p><b> SDA=0;</b></p><p><b> dat<<=1;&
65、lt;/b></p><p><b> SCL=1;</b></p><p><b> SCL=0;</b></p><p><b> }</b></p><p><b> }</b></p><p> uchar
66、read_at24c02_byte()</p><p><b> {</b></p><p> uchar temp,i;</p><p><b> SCL=0;</b></p><p> for(i=0;i<8;i++)</p><p><b>
67、{</b></p><p><b> temp<<=1;</b></p><p><b> if(SDA)</b></p><p> temp=temp|0x01;</p><p><b> SCL=1;</b></p><p
68、><b> SCL=0;</b></p><p><b> }</b></p><p> return temp;</p><p><b> }</b></p><p> bit read_at24c02(uchar add,uchar *buf)</p
69、><p><b> {</b></p><p> start_at24c02();</p><p> write_at24c02_byte(0xA0);</p><p> if(wait_at24c02_ack())</p><p><b> return 1;</b>
70、;</p><p> write_at24c02_byte(add);</p><p> if(wait_at24c02_ack())</p><p><b> return 1;</b></p><p> start_at24c02();</p><p> write_at24c02_
71、byte(0xA1);</p><p> if(wait_at24c02_ack())</p><p><b> return 1;</b></p><p> *buf=read_at24c02_byte();</p><p> at24c02_ack(0);</p><p> stop
72、_at24c02();</p><p> delay(1000);</p><p><b> return 0;</b></p><p><b> }</b></p><p> bit write_at24c02(uchar add,uchar dat)</p><p&g
73、t;<b> {</b></p><p> start_at24c02();</p><p> write_at24c02_byte(0xA0);</p><p> if(wait_at24c02_ack())</p><p><b> return 1;</b></p>&
74、lt;p> write_at24c02_byte(add);</p><p> if(wait_at24c02_ack())</p><p><b> return 1;</b></p><p> write_at24c02_byte(dat);</p><p> if(wait_at24c02_ack(
75、))</p><p><b> return 1;</b></p><p> stop_at24c02();</p><p> delay(1000);</p><p><b> return 0;</b></p><p><b> }</b>
76、</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> Key.c</b></p><p> #include <intrins.h></p><p> #includ
77、e "key.h”</p><p> ucharkey_tab[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d, 0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};</p><p> bit keytest(void)</p><p> {uchar temp = 0;</p
78、><p><b> P2 =0x0f;</b></p><p> temp = P2&0x0f;</p><p> if(temp != 0x0f)</p><p><b> {</b></p><p><b> P2 =0x0f;</b>
79、</p><p> temp = P2&0x0f;</p><p> if(temp != 0x0f)</p><p> return 1;} </p><p><b> return 0;</b></p><p><b> }</b></p>
80、<p> uchar getkeynum(void)</p><p><b> {</b></p><p> uchar j = 0x01;</p><p> uchar i ,temp = 0;</p><p><b> i = 16;</b></p><
81、p> delay(2000);</p><p> if(keytest())</p><p> {for(i = 0; i < 4; i++)</p><p><b> {</b></p><p><b> P2 = ~j;</b></p><p>
82、temp = P2&0xf0;</p><p> if(temp == 0xf0)</p><p> j = j << 1;</p><p><b> else </b></p><p><b> break;</b></p><p><b&
83、gt; }</b></p><p> while((P2 & 0xf0) != 0xf0);</p><p> temp = temp | ((~j)&0x0f) ;</p><p> for(i = 0; i< 16 ; i++)</p><p> {if(temp == key_tab[i])&
84、lt;/p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> return i;}</p><p><b> lcd1602.c</b><
85、;/p><p> #include<reg52.h></p><p> #include"lcd1602.h"</p><p> void wait_lcd1602()</p><p><b> {do</b></p><p><b> {RS=0
86、;</b></p><p><b> RW=1;</b></p><p><b> EN=1;</b></p><p> }while(BUSY==1);</p><p><b> EN=0;</b></p><p><b&
87、gt; }</b></p><p> void lcd1602_clear()</p><p> {wait_lcd1602();</p><p><b> EN = 0;</b></p><p><b> RS = 0;</b></p><p><
88、;b> RW = 0;</b></p><p> P0 = 0x01;</p><p><b> EN = 1;</b></p><p><b> delay(1);</b></p><p><b> EN = 0;</b></p>&
89、lt;p><b> }</b></p><p> void write_lcd1602_cmd(uchar cmd)</p><p> {wait_lcd1602();</p><p><b> EN=0;</b></p><p><b> RS=0;</b>&
90、lt;/p><p><b> RW=0;</b></p><p><b> P0=cmd;</b></p><p><b> EN=1;</b></p><p> delay(100);</p><p><b> EN=0;</b&
91、gt;</p><p><b> }</b></p><p> void write_string(uchar add,uchar *buf)</p><p><b> {</b></p><p> write_lcd1602_cmd(add);</p><p>
92、while(*buf!='\0')</p><p> {write_lcd1602_dat(*buf);</p><p><b> buf ++;</b></p><p><b> }</b></p><p><b> }</b></p>
93、<p> void init_lcd1602()</p><p><b> {</b></p><p> write_lcd1602_cmd(0x38);</p><p> write_lcd1602_cmd(0x38);</p><p> write_lcd1602_cmd(0x38);</p
94、><p> write_lcd1602_cmd(0x0C);</p><p> write_lcd1602_cmd(0x06);</p><p> write_lcd1602_cmd(0x01);</p><p> LCMBLC = 0;</p><p><b> }</b></p&g
95、t;<p><b> main.c</b></p><p> #include <reg52.h></p><p> #include <stdio.h></p><p> #include <string.h> </p><p> #include "
96、;at24c02.h"</p><p> #include "lcd1602.h"</p><p> #include "key.h"</p><p> #include "serve.h"</p><p> #include "proce.h"
97、</p><p> uchar init(void)</p><p><b> {</b></p><p> uchar buf[4]="1234";</p><p> uchar d_buf[4]={0};</p><p> uchar i,add;</p&g
98、t;<p> init_lcd1602();</p><p> read_at24c02_buf(0xAA,d_buf,4);</p><p><b> add=0x40;</b></p><p><b> i=0;</b></p><p> if(strncmp(buf
99、,d_buf,4)!=0)</p><p> write_at24c02_buf(0xAA,"1234",4);</p><p> write_string(LINE2," welcom ");</p><p> delay(10000);</p><p><b> i=20;
100、</b></p><p> write_at24c02_buf(SECRET_ADD,"123456",6);</p><p> write_at24c02(0X00,0);</p><p> write_at24c02(0X01,0);</p><p><b> }</b>&l
101、t;/p><p> write_string(LINE1+9,"Bayern");</p><p><b> return i;</b></p><p><b> }</b></p><p> uchar rst(void)</p><p><b
102、> {</b></p><p> uchar buf[4]="1234";</p><p> uchar d_buf[4]={0};</p><p><b> uchar i;</b></p><p> init_lcd1602();</p><p&
103、gt; write_at24c02_buf(0xAA,"1234",4);</p><p> write_string(LINE2," reset MCU !! ");</p><p><b> i=20;</b></p><p> write_at24c02_buf(SECR
104、ET_ADD,"123456",6);</p><p> write_at24c02(0X00,0);</p><p> write_at24c02(0X01,0);</p><p> write_string(LINE1+9,"song");</p><p><b> return
105、i;</b></p><p><b> }</b></p><p> void main(void)</p><p><b> {</b></p><p> uchar keynum = 16;</p><p> uchar i=0;</p>
106、;<p> uchar lose_err = 0;</p><p> uchar flag=1;</p><p> i = init();</p><p> read_at24c02(0xff,&lose_err);</p><p> lcd1602_clear();</p><p>
107、<b> while(1)</b></p><p> { </p><p> display_sum();</p><p> if(keytest())</p><p><b> {</b></p><p> keynum = getkeynum(
108、);</p><p><b> }</b></p><p> if(keynum==CANCEL)</p><p><b> {</b></p><p> i = rst();</p><p> keynum=16;</p><p><
109、b> }</b></p><p><b> /*充值*/</b></p><p> if(keynum == ADD)</p><p><b> {</b></p><p> add_pro();</p><p><b> i=30;&
110、lt;/b></p><p> keynum=16;</p><p><b> }</b></p><p><b> /*sub*/</b></p><p> if(keynum == SUB)</p><p><b> {</b><
111、;/p><p> sub_pro();</p><p><b> i=30;</b></p><p> keynum=16;</p><p><b> }</b></p><p><b> /*掛失*/</b></p><p&g
112、t; if(keynum == LOSS)</p><p><b> {</b></p><p> lose_err=lose_pro();</p><p><b> i=30;</b></p><p> keynum=16;</p><p> }/**chan
113、ge secret**/</p><p> if(keynum == DEL)</p><p><b> {</b></p><p> change_pro();</p><p><b> i=30;</b></p><p> keynum=16;</p&g
114、t;<p><b> }</b></p><p> if(lose_err == 1)</p><p> {write_at24c02(0xff,1);</p><p> write_string(LINE1," ");</p><p><
115、;b> while(1)</b></p><p><b> {</b></p><p> write_string(LINE2,"locked!!!! ");</p><p> if(keytest())</p><p><b> {</b&g
116、t;</p><p> keynum = getkeynum();</p><p> if(keynum != 16)</p><p> lose_err=unlose();</p><p><b> else</b></p><p><b> continue;</b&
117、gt;</p><p> if(lose_err == 1)</p><p><b> {</b></p><p> lose_err = 0;</p><p> write_at24c02(0xff,0);</p><p> write_string(LINE2,"unspi
118、n success!");</p><p> i=30;</p><p><b> break;</b></p><p><b> }</b></p><p><b> else</b></p><p> {write
119、_string(LINE2,"unspin failed!");</p><p><b> i=30;</b></p><p> }</p><p><b> }</b></p><p> keynum = 16;</p&g
120、t;<p><b> }</b></p><p> write_string(LINE1," ");</p><p> write_string(LINE1+9,"Bayern");</p><p> keynum = 16;</p><p>
121、<b> }</b></p><p> if(i==0 && flag==1)</p><p> {flag = 0;</p><p> write_string(LINE2," 208110327 ");</p><p> write_string(LINE1+9
122、,"Bayern");</p><p><b> }</b></p><p><b> if(i>0)</b></p><p><b> {</b></p><p><b> flag = 1;</b></p>
123、<p><b> i--;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> proce.c</b></p><p> #include "proce.h&qu
124、ot;</p><p> void display_sum(void)</p><p> {uint sum = 0;</p><p> uchar low,high;</p><p> read_at24c02(LOW_ADD,&low);delay(300);</p><p> read_at24
125、c02(HIGH_ADD,&high);delay(300);</p><p> sum = (high)<<8 | low;</p><p> write_string(LINE1,"sum:");</p><p> if(sum<10)</p><p><b> {</
126、b></p><p> write_string(LINE2,"less money! ");</p><p><b> }</b></p><p> if(sum/100%10!=0)</p><p><b> {</b></p><
127、;p> write_lcd1602_cmd(LINE1+4);</p><p> write_lcd1602_dat(sum/100%10+'0');</p><p><b> }</b></p><p> if(sum/100%10!=0 || sum/10%10!=0)</p><p>
128、<b> {</b></p><p> write_lcd1602_cmd(LINE1+5);</p><p> write_lcd1602_dat(sum/10%10+'0');</p><p><b> }</b></p><p> write_lcd1602_cmd(
129、LINE1+6);</p><p> write_lcd1602_dat(sum%10+'0');</p><p> write_string(LINE1+9,"Bayern");</p><p> write_string(LINE2+13,"NUM");</p><p><
130、;b> }</b></p><p> void add_pro(void)</p><p> {bit flag;</p><p> write_string(LINE2," ");</p><p> flag=add();</p><p
131、><b> if(flag)</b></p><p><b> {</b></p><p> write_string(LINE2,"add success!^_^");</p><p><b> }</b></p><p><b>
132、 else</b></p><p><b> {</b></p><p> write_string(LINE2,"add failede!~_~");</p><p><b> }</b></p><p><b> }</b><
133、;/p><p> bit lose_pro(void)</p><p> {bit flag;</p><p> write_string(LINE2," ");</p><p> flag=lose();</p><p><b> if(fla
134、g)</b></p><p><b> {</b></p><p> write_string(LINE2," success!^_^");</p><p> write_string(LINE1," ");</p><p> write_s
135、tring(LINE1+9,"Bayern ");</p><p><b> return 1;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b&g
136、t;</p><p> write_string(LINE2," failede!again!");</p><p> write_string(LINE1," ");</p><p> write_string(LINE1+9,"Bayern ");</p>
137、<p><b> return 0;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> serve .c</b&g
138、t;</p><p> #include "serve.h"</p><p> #include "at24c02.h"</p><p> #include "key.h"</p><p> #include "lcd1602.h"</p>
139、<p> #include <string.h></p><p> bit add(void)</p><p><b> {</b></p><p> uchar key_buf = 16;</p><p> uchar pos = 0,dis_pos=0;</p><
140、p> uint money=0;</p><p> uchar low,high;</p><p> uint temp=0;</p><p> write_string(LINE1,"add: ");</p><p> read_at24c02(LOW_ADD,&low);//delay(1
141、000);</p><p> read_at24c02(HIGH_ADD,&high);//delay(1000);</p><p> money = (high<<8)|(low);</p><p><b> while(1)</b></p><p> {if(keytest())<
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 用pic單片機(jī)實(shí)現(xiàn)的ic卡讀寫(xiě)器設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)--基于單片機(jī)的智能ic卡讀寫(xiě)器設(shè)計(jì)
- 簡(jiǎn)易ic卡收費(fèi)器單片機(jī)課程設(shè)計(jì)
- 基于atm89c51單片機(jī)的ic卡讀寫(xiě)器的設(shè)計(jì)
- 基于51單片機(jī)的ic卡讀寫(xiě)控制器【開(kāi)題報(bào)告】
- 基于單片機(jī)的射頻卡讀寫(xiě)器的設(shè)計(jì)畢業(yè)論文
- 單片機(jī)課程設(shè)計(jì)報(bào)告
- 《單片機(jī)課程設(shè)計(jì)》報(bào)告
- 單片機(jī)課程設(shè)計(jì)報(bào)告
- 單片機(jī)課程設(shè)計(jì)報(bào)告
- 單片機(jī)課程設(shè)計(jì)報(bào)告
- 單片機(jī)課程設(shè)計(jì)報(bào)告
- 單片機(jī)課程設(shè)計(jì)報(bào)告---單片機(jī)秒表系統(tǒng)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告
- 單片機(jī)課程設(shè)計(jì)報(bào)告
- 單片機(jī)課程設(shè)計(jì)---單片機(jī)籃球計(jì)分器
- 單片機(jī)計(jì)價(jià)器課程設(shè)計(jì)報(bào)告
- 非接觸式IC卡讀寫(xiě)器的設(shè)計(jì).pdf
- 單片機(jī)計(jì)數(shù)器課程設(shè)計(jì)報(bào)告
- 單片機(jī)課程設(shè)計(jì)報(bào)告--投票統(tǒng)計(jì)器
評(píng)論
0/150
提交評(píng)論