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