信息與電氣工程學(xué)院
單片機(jī)應(yīng)用系統(tǒng)(三級項(xiàng)目)
設(shè)計(jì)說明書
(2014/2015學(xué)年第二學(xué)期)
題
目
:
開機(jī)次數(shù)記憶器設(shè)計(jì)及實(shí)現(xiàn)
專業(yè)班級
:
電子信息工程班
學(xué)生學(xué)號
:
學(xué)生姓名
:
指導(dǎo)教師
:
設(shè)計(jì)周數(shù)
:
2周設(shè)計(jì)成績
:
2015年X月X日
1、項(xiàng)目設(shè)計(jì)
1.1
設(shè)計(jì)要求
(1)以單片機(jī)AT89C52為核心,使用24C02串行EEPROM進(jìn)行存儲開機(jī)次數(shù);
(2)用LCD1602顯示存儲的開機(jī)次數(shù);
(3)單片機(jī)復(fù)位一次,從24C02中讀取數(shù)據(jù),然后加1;
(4)在此基礎(chǔ)上可以拓展對一組密碼數(shù)據(jù)存儲對比后,才能進(jìn)入正常界面。
1.2
設(shè)計(jì)目的(1)培養(yǎng)學(xué)生正確的設(shè)計(jì)思想,理論聯(lián)系實(shí)際的工作作風(fēng),嚴(yán)肅認(rèn)真、實(shí)事求是的科學(xué)態(tài)度和勇于探索的創(chuàng)新精神。
(2)鍛煉學(xué)生自學(xué)軟件的能力及分析問題、解決問題的能力。
(3)通過課程設(shè)計(jì),使學(xué)生在理論計(jì)算、結(jié)構(gòu)設(shè)計(jì)、工程繪圖、查閱設(shè)計(jì)資料、標(biāo)準(zhǔn)與規(guī)范的運(yùn)用和計(jì)算機(jī)應(yīng)用方面的能力得到訓(xùn)練和提高。
(4)鞏固、深化和擴(kuò)展學(xué)生的單片機(jī)理論知識。
(5)培養(yǎng)學(xué)生的團(tuán)隊(duì)合作能力。
2、項(xiàng)目設(shè)計(jì)正文
2.1方案設(shè)計(jì)
2.1.1設(shè)計(jì)思路
此次項(xiàng)目設(shè)計(jì)的目的是實(shí)現(xiàn)單片機(jī)開機(jī)次數(shù)的記憶及顯示功能,即其復(fù)位斷電關(guān)機(jī)都能準(zhǔn)確的將開機(jī)次數(shù)顯示在LCD1602顯示屏上。根據(jù)對項(xiàng)目設(shè)計(jì)要求和實(shí)際應(yīng)用的分析,選用以單片機(jī)AT89C52為核心,使用24C02串行EEPROM進(jìn)行存儲開機(jī)次數(shù)的方法,使C52單片機(jī)的P2.0口和P2.1口分別控制24C02的數(shù)據(jù)線SDA和時鐘信號線SCK來完成數(shù)據(jù)的讀寫功能,然后用LCD1602顯示屏將24C02中存儲的數(shù)據(jù)顯示出來。
具體設(shè)計(jì)實(shí)現(xiàn)的邏輯流程圖如圖1所示:
圖1
邏輯實(shí)現(xiàn)流程圖
2.1.2主要元器件
(1)
處理器AT89C52,引腳圖如圖2所示:
圖2
AT89C52單片機(jī)引腳圖
AT89C52是一個低電壓,高性能CMOS
8位單片機(jī),片內(nèi)含8k
bytes的可反復(fù)擦寫的Flash只讀程序存儲器和256
bytes的隨機(jī)存取數(shù)據(jù)存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器和Flash存儲單元,AT89C52單片機(jī)在電子行業(yè)中有著廣泛的應(yīng)用。
AT89C52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內(nèi)含2個外中斷口,3個16位可編程定時計(jì)數(shù)器,2個全雙工串行通信口,2
個讀寫口線,AT89C52可以按照常規(guī)方法進(jìn)行編程,也可以在線編程。其將通用的微處理器和Flash存儲器結(jié)合在一起,特別是可反復(fù)擦寫的Flash存儲器可有效地降低開發(fā)成本。
(2)
外部存儲器24C02
串行E2PROM是基于I2C-BUS的存儲器件,遵循二線制協(xié)議,由于其具有接口方便,體積小,數(shù)據(jù)掉電不丟失等特點(diǎn),在儀器儀表及工業(yè)自動化控制中得到大量的應(yīng)用。具有以下幾大特點(diǎn):
1.寬范圍的工作電壓1.8v~5.5v
2.低電壓技術(shù):
1mA典型工作電流
1uA典型待機(jī)電流
3.儲存器組織結(jié)構(gòu)
4.2線串行接口,完全兼容I2C總線
5.施密特觸發(fā)輸入噪聲抑制
6.硬件數(shù)據(jù)寫保護(hù)
7.內(nèi)部與周期(最大5ms)
8.自動遞增地址
9.可按照字節(jié)寫
10.esd保護(hù)大于2.5kV
11.高可靠性:擦寫壽命:100萬次
數(shù)據(jù)保持時間:100年
12.無鉛工藝,符合RoHS標(biāo)準(zhǔn)
2.2單元電路設(shè)計(jì)
2.2.1處理器AT89C52引腳的選擇
本次項(xiàng)目設(shè)計(jì)選擇的引腳分別為P0口、P2口、RES端口。
P0
口是一組8
位漏極開路型雙向I/O
口,也即地址/數(shù)據(jù)總線復(fù)用口。作為輸出口用時,每位能吸收電流的方式驅(qū)動8
個TTL邏輯門電路,對端口P0
寫“1”時,可作為高阻抗輸入端用。在訪問外部數(shù)據(jù)存儲器或程序存儲器時,這組口線分時轉(zhuǎn)換地址(低8
位)和數(shù)據(jù)總線復(fù)用,在訪問期間激活內(nèi)部上拉電阻。在Flash編程時,P0
口接收指令字節(jié),而在程序校驗(yàn)時,輸出指令字節(jié),校驗(yàn)時,要求外接上拉電阻。
P2口
是一個帶有內(nèi)部上拉電阻的8
位雙向I/O
口,P2的輸出緩沖級可驅(qū)動(吸收或輸出電流)4
個TTL
邏輯門電路。對端口P2
寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時可作輸入口,作輸入口使用時,因?yàn)閮?nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。訪問外部程序存儲器或16
位地數(shù)據(jù)存儲器(例如執(zhí)行MOVX
@DPTR
指令)時,P2
口送出高8
位地址數(shù)據(jù)。在訪問8
位地址的外部數(shù)據(jù)存儲器(如執(zhí)行MOVX@RI
指令)時,P2
口輸出P2鎖存器的內(nèi)容。Flash編程或校驗(yàn)時,P2亦接收高位地址和一些控制信號。P2.0口和P2.1口分別控制24C02的數(shù)據(jù)線SDA和時鐘信號線SCK來完成數(shù)據(jù)的讀寫功能。
RST為復(fù)位輸入。當(dāng)振蕩器工作時,RST引腳出現(xiàn)兩個機(jī)器周期以上高電平將使單片機(jī)復(fù)位。
單片機(jī)引腳圖連接選擇如圖3所示:
圖3
單片機(jī)的引腳連接圖
2.2.2
RC復(fù)位電路
復(fù)位電路圖如圖4所示:
圖4
復(fù)位電路圖
系統(tǒng)復(fù)位的工作過程是在加電時,復(fù)位電路通過電容加給RST端一個短暫的高電平信號,此高電平信號隨著VCC對電容的充電過程而逐漸回落,即RST端的高電平持續(xù)時間取決于電容的充電時間。為了保證系統(tǒng)能夠可靠地復(fù)位,RST端的高電平信號必須維持足夠長的時間。在圖4的復(fù)位電路中,當(dāng)VCC掉電時,必然會使RST端電壓迅速下降到0V以下,但是,由于內(nèi)部電路的限制作用,這個負(fù)電壓將不會對器件產(chǎn)生損害。另外,在復(fù)位期間,端口引腳處于隨機(jī)狀態(tài),復(fù)位后,系統(tǒng)將端口置為全“1”態(tài)。如果系統(tǒng)在上電時得不到有效的復(fù)位,則程序計(jì)數(shù)器PC將得不到一個合適的初值,CPU可能會從一個未被定義的位置開始執(zhí)行程序。
2.2.3
LCD1602顯示屏的連接
LCD1602各引腳的功能如下:
第1腳:VSS為電源地
第2腳:VDD接5V電源正極
第4腳:RS為寄存器選擇,高電平1時選擇數(shù)據(jù)寄存器、低電平0時選擇指令寄存器。
第5腳:RW為讀寫信號線,高電平(1)時進(jìn)行讀操作,低電平(0)時進(jìn)行寫操作。
第6腳:E(或EN)端為使能(enable)端。
第7~14腳:D0~D7為8位雙向數(shù)據(jù)端。
單片機(jī)的P2.5,P2.6,P2.7分別接LCD1602的RS、RW、E端口,如圖5所示:
圖5
LCD1602顯示屏的連接
2.2.4
24C02的連接
C52單片機(jī)的P2.0口和P2.1口分別控制24C02的數(shù)據(jù)線SDA和時鐘信號線SCK來完成數(shù)據(jù)的讀寫功能,具體電路圖如圖6所示:
圖6
24C02的連接
2.2.5
整體電路
系統(tǒng)整體仿真電路和實(shí)物操作電路如圖7和圖8所示:
圖7
整體仿真電路圖
圖8
仿真實(shí)物圖
2.3系統(tǒng)實(shí)現(xiàn)程序
#include
#include
sbit
SDA
=
P2^0;
//AT24C01串行數(shù)據(jù)
5腳
sbit
SCL
=
P2^1;
//AT24C01串行時鐘
6腳
int
time=0;
int
time2=0;
typedef
unsigned
char
uint8;
/*
defined
for
unsigned
8-bits
integer
variable
無符號8位整型變量
*/
typedef
signed
char
int8;
/*
defined
for
signed
8-bits
integer
variable
有符號8位整型變量
*/
typedef
unsigned
char
BYTE;
typedef
unsigned
int
WORD;
typedef
bit
BOOL
;
sbit
rs
=
P2^6;
sbit
rw
=
P2^5;
sbit
ep
=
P2^7;
BYTE
code
dis1[]
=
{“TIME“};
BYTE
dis2[10]={“0123456789“};
BYTE
dis3[10]={“0123456789“};
delay(BYTE
ms)
{
//
延時子程序
BYTE
i;
while(ms--)
{
for(i
=
0;
i<
250;
i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
BOOL
lcd_bz()
{
//
測試LCD忙碌狀態(tài)
BOOL
result;
rs
=
0;
rw
=
1;
ep
=
1;
_nop_();
_nop_();
_nop_();
_nop_();
result
=
(BOOL)(P0
&
0x80);
ep
=
0;
return
result;
}
lcd_wcmd(BYTE
cmd)
{
//
寫入指令數(shù)據(jù)到LCD
while(lcd_bz());
rs
=
0;
rw
=
0;
ep
=
0;
_nop_();
_nop_();
P0
=
cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep
=
1;
_nop_();
_nop_();
_nop_();
_nop_();
ep
=
0;
}
lcd_pos(BYTE
pos)
{
//設(shè)定顯示位置
lcd_wcmd(pos
|
0x80);
}
lcd_wdat(BYTE
dat)
{
//寫入字符顯示數(shù)據(jù)到LCD
while(lcd_bz());
rs
=
1;
rw
=
0;
ep
=
0;
P0
=
dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep
=
1;
_nop_();
_nop_();
_nop_();
_nop_();
ep
=
0;
}
lcd_init()
{
//LCD初始化設(shè)定
lcd_wcmd(0x38);
delay(1);
lcd_wcmd(0x0c);
delay(1);
lcd_wcmd(0x06);
delay(1);
lcd_wcmd(0x01);
//清除LCD的顯示內(nèi)容
delay(1);
}
////2402程序2
void
AT2401_Delay()
{;;}
void
busy()
{
BYTE
temp;
temp=0x00;
rs=0;
rw=1;
ep=1;
while((temp&0x80)==0x80)
{
ep=0;
_nop_();
ep=1;
_nop_();
}
}
void
AT2401_Start()//啟動信號
{
SDA=1;
AT2401_Delay();
SCL=1;
AT2401_Delay();
SDA=0;
AT2401_Delay();
}
void
AT2401_Stop()//停止信號
{
SDA=0;
AT2401_Delay();
SCL=1;
AT2401_Delay();
SDA=1;
AT2401_Delay();
}
void
AT2401_Respons()//響應(yīng)
{
uint8
i;
SCL=1;
AT2401_Delay();
while((SDA==1)&&(i<250))
i++;
SCL=0;
AT2401_Delay();
}
void
AT2401_Init()//初始化函數(shù)
{
SDA=1;
AT2401_Delay();
SCL=1;
AT2401_Delay();
}
void
AT2401_WByte(uint8
date)//寫一個字節(jié)
{
uint8
i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
AT2401_Delay();
SDA=CY;
AT2401_Delay();
SCL=1;
AT2401_Delay();
}
SCL=0;
AT2401_Delay();
SDA=1;
AT2401_Delay();
}
uint8
AT2401_RByte()//讀一個字節(jié)
{
uint8
i,k;
SCL=0;
AT2401_Delay();
SDA=1;
AT2401_Delay();
for(i=0;i<8;i++)
{
SCL=1;
AT2401_Delay();
k=(k<<1)|SDA;
SCL=0;
AT2401_Delay();
}
return
k;
}
void
AT2401_WAddr(uint8
address,uint8
date)//指定地址寫一個數(shù)據(jù)
{
AT2401_Start();
AT2401_WByte(0xa0);
AT2401_Respons();
AT2401_WByte(address);
AT2401_Respons();
AT2401_WByte(date);
AT2401_Respons();
AT2401_Stop();
}
uint8
AT2401_RAddr(uint8
address)//指定地址讀取一個字節(jié)
{
uint8
date;
AT2401_Start();
AT2401_WByte(0xa0);
AT2401_Respons();
AT2401_WByte(address);
AT2401_Respons();
AT2401_Start();
AT2401_WByte(0xa1);
AT2401_Respons();
date=AT2401_RByte();
AT2401_Stop();
return
date;
}
void
wr_com(BYTE
com)
{
ep=0;
rs=0;
rw=0;
P0=com;
_nop_();
ep=1;
_nop_();
ep=0;
}
void
wr_data(BYTE
date)
{
busy();
ep=0;
rs=1;
rw=0;
P0=date;
_nop_();
ep=1;
_nop_();
ep=0;
}
///////////////////////////////////////
///////////////////////////////////////
main()
{
BYTE
i;
lcd_init();
//
初始化LCD
AT2401_Init();
time
=
AT2401_RAddr(0x01);
time2
=
AT2401_RAddr(0x02);
if(time>=9)
{
AT2401_WAddr(0x01,0);
time2+=1;
}
time+=1;
if(time2>9&&time>=9)
{
time=0;
time2=0
;
}
AT2401_WAddr(0x01,time);
AT2401_WAddr(0x02,time2);
lcd_pos(4);
//
設(shè)置顯示位置為第一行的第5個字符
i
=
0;
while(dis1[i]
!=
'\0')
{
//
顯示字符“TIME“
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(0x49);
//
設(shè)置顯示位置為第二行第一位字符
dis2[time];
lcd_wdat(dis2[time]);
//
顯示字符
delay(1);
lcd_pos(0x48);
//
設(shè)置顯示位置為第二行第二位字符
dis2[time2];
lcd_wdat(dis3[time2]);
//
顯示字符
while(1);
}
3、項(xiàng)目設(shè)計(jì)總結(jié)
通過此次課程設(shè)計(jì),使我更加扎實(shí)的掌握了有關(guān)單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)方面的知識,在設(shè)計(jì)過程中雖然遇到了一些問題,但經(jīng)過一次又一次的思考,一遍又一遍的檢查終于找出了原因所在,也暴露出了前期我在這方面的知識欠缺和經(jīng)驗(yàn)不足。實(shí)踐出真知,通過親自動手制作,使我們掌握的知識不再是紙上談兵。
課程設(shè)計(jì)誠然是一門專業(yè)課,給我很多專業(yè)知識以及專業(yè)技能上的提升,同時又是一門講道課,一門辯思課,給了我許多道,給了我很多思,給了我莫大的空間。同時,設(shè)計(jì)讓我感觸很深。使我對抽象的理論有了具體的認(rèn)識。通過這次課程設(shè)計(jì),我掌握了AT89C52、24C02和LCD1602的基本知識和連接測試,也通過查資料熟悉了外部存儲24C02的工作原理。了解了C語言程序在單片機(jī)系統(tǒng)設(shè)計(jì)中的應(yīng)用,掌握了系統(tǒng)電路的調(diào)試方法。
在此次的課程設(shè)計(jì)過程中,也對團(tuán)隊(duì)精神的進(jìn)行了考察,我們小組三個人分工合作,查資料、電路設(shè)計(jì)、程序設(shè)計(jì)、硬件實(shí)物仿真都做得有條不紊,我們配合越來越默契,有問題一起解決,在成功后一起體會喜悅。果然是團(tuán)結(jié)就是力量,只有互相之間默契融洽的配合才能換來最終完美的結(jié)果。我認(rèn)為,此次課設(shè)不僅培養(yǎng)了我們獨(dú)立思考、團(tuán)隊(duì)協(xié)作、動手操作的能力,在各種其它能力上也都有了提高。更重要的是,我們學(xué)會了很多自主學(xué)習(xí)的方法。而這是日后最實(shí)用的,真的是受益匪淺。要面對社會的挑戰(zhàn),只有不斷的學(xué)習(xí)、實(shí)踐,再學(xué)習(xí)、再實(shí)踐。這對于我們的將來也有很大的幫助。
4、參考文獻(xiàn)
[1]
張毅剛,彭喜元,董繼成.單片機(jī)原理及應(yīng)用.北京:高等教育出版社,2003.[2]
史良.LCD12864顯示模塊與微處理器的接口設(shè)計(jì)
[J].礦業(yè)安全與環(huán)保,1999.項(xiàng)目設(shè)計(jì)
評
語
項(xiàng)目設(shè)計(jì)
成績
指導(dǎo)教師
(簽字)
****年**月**日