第一篇:單片機(jī)萬年歷實訓(xùn)報告
單片機(jī)萬年歷實訓(xùn)報告
系
部:電氣自動化系
班
級:13電信2班
姓
名:周祝福
指導(dǎo)老師:黃麗英、侯聰玲
實訓(xùn)時間:2015年1月19日~23日
用AT89C51與LCD1602設(shè)計 的可調(diào)式電子日歷時鐘
一、總體設(shè)計
1.1、設(shè)計目的
為鞏固所學(xué)的單片機(jī)知識,把所學(xué)理論運(yùn)用到實踐中,用LCD1602與AT89C51 設(shè)計可調(diào)式電子日歷時鐘。
1.2、設(shè)計要求
(1)顯示:年、月、日、時、分、秒和星期;
(2)設(shè)置年、月、日、時、分、秒和星期的初始狀態(tài);
(3)能夠用4個按鍵調(diào)整日歷時鐘的年、月、日、時、分、秒和星期 ;
完成可調(diào)式電子日歷時鐘的硬件和軟件的設(shè)計,包括單片機(jī)的相關(guān)內(nèi)容;日歷時鐘模塊的設(shè)計,液晶顯示模塊的設(shè)計,按鍵模塊的設(shè)計??刂瞥绦虻木帉懙取?/p>
1.3、系統(tǒng)基本方案選擇和論證
1.3.1、單片機(jī)芯片的選擇方案
方案一:
采用89C51芯片作為硬件核心,采用Flash ROM,內(nèi)部具有4KB ROM 存儲空間,能于3V的超低壓工作,而且與MCS-51系列單片機(jī)完全兼容。方案二:
采用STC12C5A60S2系列單片機(jī)是宏晶科技生產(chǎn)的單時鐘/機(jī)器周期(1T)的單片機(jī),是高速/低功耗/超強(qiáng)抗干擾的新一代8051單片機(jī),指令代碼完全兼容傳統(tǒng)8051,但速度快8-12倍。內(nèi)部集成MAX810專用復(fù)位電路,2路PWM,8路高速10位A/D轉(zhuǎn)換(250K/S),針對電機(jī)控制,強(qiáng)干擾場合。但造價較高。1.3.2、顯示模塊選擇方案和論證:
方案一:
采用點陣式數(shù)碼管顯示,點陣式數(shù)碼管是由八行八列的發(fā)光二極管組成,對于顯示文字比較適合,如采用顯示數(shù)字顯得太浪費(fèi),且價格也相對較高。所以不用此種作為顯示。方案二:
采用LED數(shù)碼管動態(tài)掃描,雖然LED數(shù)碼管價格適中,但要顯示多個數(shù)字所需要的個數(shù)偏多,功耗較大,顯示出來的只是拼音,而不是漢字。所以也不用此種作為顯示。方案三:
采用LCD液晶顯示屏,液晶顯示屏的顯示功能強(qiáng)大,可顯示大量字符,且視覺效果較好,外形美觀。LCD1602可實現(xiàn)顯示2行十六個字符。1.3.4、電路設(shè)計最終方案決定
綜上各方案所述,對此次作品的方案選定:采用80C51作為主控制系統(tǒng); LCD1602液晶帶漢字庫顯示屏作為顯示部分。
二、硬件設(shè)計
2.1、電路設(shè)計模塊圖如圖
AT89C51 塊按鍵控制模LCD162
2.3、用proteus仿真軟件仿真并抓圖。
三、軟件設(shè)計
3.1、畫出各個函數(shù)流程圖。
3.1.1、LCD1602液晶顯示控制流程圖如圖
入口 對1602初始化寫入顯示設(shè)置命令 延時一段時間 檢查忙標(biāo)志 BF= 7>? 設(shè)置字符顯示位置 延時一段時間 向1602中寫入數(shù)據(jù) LCD顯示內(nèi)容 返回主程序
是 3.1.2、調(diào)時函數(shù)控制流程如圖
開始 控制鍵有效,調(diào)整年 控制鍵有效,調(diào)整月 等待按鍵程序 等待按鍵程序 加有效 減有效 加有效 減有效 年加 1 年減 1 月加 1 月減 1 控制鍵有效,調(diào)整日 控制鍵有效,調(diào)整星期 等待按鍵程序 等待按鍵程序 加有效 減有效 加有效 減有效 日加 1 日減 1 星期加 1 星期減 1 控制鍵有效,調(diào)整時 等待按鍵程序 加有效 時加 1 減有效 時減 1 控制鍵有效,調(diào)整分 等待按鍵程序 加有效 分加 1 減有效 分減 1 按鍵有效跳出調(diào)時程序,進(jìn)入主循環(huán)
實訓(xùn)心得:通過為期一周的單片機(jī)實訓(xùn),是我們對這門課有了許多新的了解,彌補(bǔ)了在課堂上學(xué)習(xí)的不足。相信這對我們以后的學(xué)習(xí)和工作都會有很大的幫助。我們一定要在最短的時間里對這些不足加以改正!在試訓(xùn)中有苦有甜,當(dāng)我們?yōu)橐粋€很難攻破的程序找出路時,心情煩躁,感覺自己很不可理喻,當(dāng)程序一點一點編好后,自己從心底感覺到一點小小的安慰,看著自己的成果。感覺很欣慰??偠灾?單片機(jī)課程設(shè)計對于我們有很大的幫助,我們從中受益匪淺。
程序代碼。
#include
uchar a,count,S1num,xqnum;uchar yue,ri,shi,fen,miao;uint nian;
sbit lcdrs=P2^5;sbit lcdrw=P2^4;sbit lcden=P2^3;
sbit S1=P3^0;
//定義鍵--進(jìn)入設(shè)置 sbit S2=P3^1;
//定義鍵--增大 sbit S3=P3^2;
//定義鍵--減小 sbit S4=P3^3;
//定義鍵--退出設(shè)置
uchar code table0[]=“2015-01-11 SUN”;uchar code table1[]=“00:00:00”;uchar code xingqi[][3]={“MON”,“TUE”,“WED”,“THU”,“FRI”,“SAT”,“SUN”};
void delay(uint z){ uint x,y;for(x=z;x>0;x--)
for(y=110;y>0;y--);}
/************************************************** 1602液晶顯示器模塊
*************************************************/ void write_com(uchar com)
//液晶寫指令 { lcdrw=0;lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}
void write_data(uchar dat)
//液晶寫數(shù)據(jù) { lcdrw=0;lcdrs=1;P0=dat;delay(5);lcden=1;delay(5);lcden=0;}
/******************************************** 年月日寫入1602函數(shù)
********************************************/ void write_sfm(uchar add,uchar dat)
//寫時分秒函數(shù) { uchar shi,ge;shi=dat/10;ge=dat%10;write_com(0x80+0x40+add);write_data(0x30+shi);write_data(0x30+ge);} void write_yr(uchar add,uchar dat)
//寫月日函數(shù) { uchar shi,ge;shi=dat/10;ge=dat%10;write_com(0x80+add);write_data(0x30+shi);write_data(0x30+ge);} void write_nian(uchar add,uint dat)
//寫年函數(shù) { uint qian,bai,shi,ge;qian=dat/1000;bai=dat%1000/100;shi=dat%100/10;ge=dat%10;write_com(0x80+add);write_data(0x30+qian);write_data(0x30+bai);write_data(0x30+shi);write_data(0x30+ge);} /*************************************************** 1602初始化
***************************************************/ void init_lcd()
//液晶初始化 { lcden=0;
nian=2015;yue=1;ri=11;shi=0;
//初始shi、fen、miao fen=0;miao=0;
write_com(0x38);
//設(shè)置16x2顯示,5x7點陣,8位數(shù)據(jù)口
write_com(0x0c);
//設(shè)置開顯示,不顯示光標(biāo)
write_com(0x06);
//寫一個字符后地址指針加1 write_com(0x01);
//顯示清0,數(shù)據(jù)指針清0 }
void init()
//初始化函數(shù) { init_lcd();
//液晶初始化
write_com(0x80);
//設(shè)置顯示初始坐標(biāo)
for(a=0;a<14;a++)
//顯示年月日初始值
{
write_data(table0[a]);
delay(5);} write_com(0x80+0x40);
//設(shè)置顯示初始坐標(biāo)
for(a=0;a<8;a++)
//顯示時分秒初始值
{
write_data(table1[a]);
delay(5);}
write_nian(0,nian);write_sfm(6,miao);
//分別將shi、fen、miao送去液晶顯示
write_sfm(3,fen);write_sfm(0,shi);
count=0;xqnum=0;S1num=0;
//初始化全局變量count
TMOD=0x01;
//設(shè)置定時器0工作模式1 TH0=(65535-50000)/256;
//定時器裝初始值
TL0=(65535-50000)%256;EA=1;
//開總中斷
ET0=1;
//開定時器0中斷
TR0=1;
//啟動定時器0 }
/************************************************** 獨(dú)立鍵盤
*************************************************/ void keyscan(){ if(S1==0){
delay(5);
//確認(rèn)定義鍵被按下
if(S1==0)
{
S1num++;
//定義鍵S1按下次數(shù)記錄
while(!S1);
//釋放按鍵確認(rèn)
if(S1num==1)//S1按下一次時
{
TR0=0;
//關(guān)閉定時器
write_com(0xc0+7);//光標(biāo)定位到秒位置
write_com(0x0f);//光標(biāo)閃爍
}
if(S1num==2)
//S1按下兩次時
{
write_com(0xc0+4);//光標(biāo)定位到分位置
}
if(S1num==3)
//S1按下三次時
{
write_com(0xc0+1);
//光標(biāo)定位到時位置
}
if(S1num==4)
//S1按下四次時
{
write_com(0x80+13);
//光標(biāo)定位到星期位置
}
if(S1num==5)
//S1按下五次時
{
write_com(0x80+9);
//光標(biāo)定位到日位置
}
if(S1num==6)
//S1按下六次時
{
write_com(0x80+6);
//光標(biāo)定位到月位置
}
if(S1num==7)
//S1按下七次時
{
write_com(0x80+3);
//光標(biāo)定位到年位置
}
if(S1num==8)
//S1按下八次時
{
S1num=0;
//S1記錄按鍵次數(shù)清零
TR0=1;
//開啟定時器
write_com(0x0c);
//取消光標(biāo)閃爍
} } } if(S1num!=0)
//只有定義鍵按下后S2、S3、S4才有效 { if(S2==0){
delay(5);
//防抖
if(S2==0)
//確認(rèn)按鍵被按下
{
while(!S2);
//釋放按鍵確認(rèn)
if(S1num==1)//S1按下一次時
{
miao++;
//調(diào)整秒加1
if(miao==60)//滿60清零
miao=0;
write_sfm(6,miao);
//每調(diào)節(jié)一次送液晶顯示一次
write_com(0x80+0x40+6);
//顯示位置重新回到調(diào)節(jié)處
}
if(S1num==2)
//S1按下兩次時
{
fen++;
//調(diào)整分加1 if(fen==60)
fen=0;write_sfm(3,fen);write_com(0x80+0x40+3);} if(S1num==3)
//S1按下三次時 { shi++;
//調(diào)整時加1 if(shi==24)
shi=0;write_com(0x80+0x40);write_sfm(0,shi);} if(S1num==4)
{ xqnum++;if(xqnum==7)
xqnum=0;write_com(0x80+0x0b);for(a=0;a<3;a++){
write_data(xingqi[xqnum][a]);
delay(5);} } if(S1num==5)
{ ri++;if(yue==2){
if(nian%400==0)
{
if(ri==30)
{
ri=1;
}
}
if(nian%400!=0)
{
if(ri==29)
{
ri=1;
}
//星期加調(diào)整
//日加調(diào)整
} } else if(yue<=7){
if(yue%2==0&yue!=2)
{
if(ri==31)
{
ri=1;
}
}
else if(yue%2!=0&yue!=2)
{
if(ri==32)
{
ri=1;
}
} } else if(yue>=8){
if(yue%2==0)
{
if(ri==32)
{
ri=1;
}
}
else if(yue%2!=0)
{
if(ri==31)
{
ri=1;
}
} } write_yr(8,ri);} if(S1num==6)
{ yue++;if(yue==13)
yue=1;write_yr(5,yue);
//月加調(diào)整
}
if(S1num==7)
//年加調(diào)整
{
nian++;
if(nian==2019)
nian=2014;
write_nian(0,nian);
} } } if(S3==0){ delay(5);if(S3==0)
//確認(rèn)按鍵被按下
{
while(!S3);
if(S1num==1)
{
miao--;
//調(diào)整秒減1
if(miao==-1)
//減到00后再減重新設(shè)置為59
miao=59;
write_sfm(6,miao);
write_com(0x80+0x40+6);
}
if(S1num==2)
{
fen--;
//調(diào)整分減1
if(fen==-1)
fen=59;
write_sfm(3,fen);
write_com(0x80+0x40+3);
}
if(S1num==3)
{
shi--;
//調(diào)整時減1
if(shi==-1)
shi=23;
write_sfm(0,shi);
write_com(0x80+0x40);
}
if(S1num==4)
{
xqnum--;
//調(diào)整星期減一
if(xqnum==-1)
xqnum=6;write_com(0x80+0x0b);for(a=0;a<3;a++){
write_data(xingqi[xqnum][a]);
delay(5);} } if(S1num==5)
//調(diào)整日 { ri--;
if(yue==2){
if(nian%400==0)
{
if(ri==0)
{
ri=29;
}
}
if(nian%400!=0)
{
if(ri==0)
{
ri=28;
}
} } else if(yue<=7)
{
if(yue%2==0&yue!=2)
{
if(ri==0)
{
ri=30;
}
}
else if(yue%2!=0&yue!=2)
{
if(ri==0)
{
ri=31;
}
}
}
else if(yue>=8)
{
if(yue%2==0)
{
if(ri==0)
{
ri=31;
}
}
else if(yue%2!=0)
{
if(ri==0)
{
ri=30;
}
}
}
write_yr(8,ri);
}
if(S1num==6)
{
yue--;
if(yue==0)
yue=12;
write_yr(5,yue);
}
if(S1num==7)
{
nian--;
if(nian==2013)
nian=2018;
write_nian(0,nian);
} } } if(S4==0)
{ delay(5);if(S4==0){
S1num=0;
TR0=1;
write_com(0x0c);
//調(diào)整月
//調(diào)整年
//退出設(shè)置、開啟中斷
}
} } }
/************************************************** 定時器0 *************************************************/ void timer0()interrupt 1
//定時器0中斷服務(wù)程序 { TH0=(65535-50000)/256;
//重裝定時器初始值
TL0=(65535-50000)%256;count++;
//中斷次數(shù)累加
if(count==20)
//20次50毫秒即一秒
{
count=0;
miao++;
if(miao==60)
//秒加到60時分進(jìn)位
{
miao=0;
fen++;
if(fen==60)
//分加到60時時進(jìn)位
{
fen=0;
shi++;
if(shi==24)
//時加到24時清0
{
shi=0;
xqnum++;
ri++;
if(yue==2)
//如果是二月
{
if(nian%400==0)
//閏年判斷
{
if(ri==30)
{
ri=1;
yue++;
write_yr(5,yue);
}
}
if(nian%400!=0)
//平年判斷
{
if(ri==29)
{
ri=1;
yue++;
write_yr(5,yue);
}
}
}
else if(yue<=7&yue!=2)
//一月到七月
{
if(yue%2==0)//偶數(shù)月(除二月)
{
if(ri==31)
{
ri=1;
yue++;
}
}
else if(yue%2!=0)
//奇數(shù)月
{
if(ri==32)
{
ri=1;
yue++;
}
}
write_yr(5,yue);
}
else if(yue>=8)
//八月到12月
{
if(yue%2==0)//偶數(shù)月(除二月)
{
if(ri==32)
{
ri=1;
yue++;
if(yue==13)
//如果判斷月份為12月,則加一后重新定義月份為1
{
yue=1;
nian++;
write_nian(0,nian);
}
write_yr(5,yue);
}
}
else if(yue%2!=0)
//奇數(shù)月
{
if(ri==31)
{
ri=1;
yue++;
write_yr(5,yue);
}
}
}
write_yr(8,ri);
if(xqnum==7)
//星期寫入
xqnum=0;
write_com(0x80+0x0b);
for(a=0;a<3;a++)
{
write_data(xingqi[xqnum][a]);
delay(5);
}
}
write_sfm(0,shi);
//重新寫入數(shù)據(jù)
}
write_sfm(3,fen);
//重新寫入數(shù)據(jù)
}
write_sfm(6,miao);
//重新寫入數(shù)據(jù)
} } /************************************************* 主函數(shù)
*************************************************/ void main(){ init();while(1){
keyscan();
//不停的檢測按鍵是否被按下
} }
第二篇:萬年歷單片機(jī)課程設(shè)計報告
課程設(shè)計報告 任務(wù)和設(shè)計要求
首先要學(xué)會安裝軟件,要熟悉會使用。系統(tǒng)設(shè)計 系統(tǒng)框圖 硬件設(shè)計 3.1 電路原理圖
課程設(shè)計報告
課程設(shè)計報告
課程設(shè)計報告
3.2 主要單元電路
3.3 元件清單 軟件設(shè)計 4.1 程序流程圖
課程設(shè)計報告
4.2程序清單
TIME_WEEK DATA 52H TIME_YEAR DATA 5DH TIME_MONTH DATA 5EH TIME_DATA DATA 5FH YEARH DATA 36H YEAR DATA 35H MONTH DATA 34H DAY DATA 33H HOUR DATA 32H MINUTE DATA 31H SEC DATA 30H
課程設(shè)計報告
AAA BIT P3.0 BBB BIT P3.1 AA BIT P3.3 BB BIT P3.4 CC BIT P3.5 BL BIT P3.2 BZ1 BIT 21H.0 TIMES DATA
20H COM
DATA
P1 ORG
0000H LJMP
START ORG
0003H RETI ORG
000BH LJMP INTT0 ORG
0013H RETI ORG
001BH RETI ORG
0023H RETI START:
課程設(shè)計報告
MOV
R0,#30H MOV
R7,#9 CLEETE: MOV
@R0,#00H INC
R0 DJNZ
R7,CLEETE MOV
TIMES,#00H MOV
TMOD,#01H MOV
TL0,#0C0H MOV
TH0,#63H MOV
SEC,#0 MOV
MINUTE,#0H MOV
HOUR,#0H MOV
DAY,#01H MOV
MONTH,#01H MOV
YEAR,#01H MOV
YEARH,#20H SETB
EA SETB
ET0 SETB
TR0 MOV
R4,#19 START1:
課程設(shè)計報告
CALL
DISP JNB
AA,SETMM1 JMP
START1 SETMM1: CALL
SETMM JMP START1 SETMM: CALL
DISP CALL
DISP JB AA,SETMM0 SETMM2: JNB AA,SETMM3 CLR ET0 CLR TR0 MOV
SEC,#0 MOV
TIMES,#01H MOV
R0,#MINUTE SETMM4: NOP INC22: CALL
OFFL CALL
INC11
課程設(shè)計報告
CALL
DISP JB AA,INC22 CALL DISP JB AA,INC22 INC R0 MOV A,TIMES RL A MOV TIMES,A JNB
TIMES.5, SETMM4 SETMM12: JNB AA , SETMM11 SETMM0: SETB
TR0 SETB
ET0 RET SETMM11: CALL DISP JMP
SETMM12 SETMM3: CALL
DISP JMP
SETMM2 INC11:
課程設(shè)計報告
MOV
R3,#40 INC111: MOV A,@R0 JB
BB,INC17 ADD
A,#1 DA A CALL INC000 INC13: JNB BB , INC14 INC17: MOV
@R0,A CALL
DISP DJNZ R3,INC111 RET INC14: CALL
DISP JMP
INC13 OFFL: MOV
22H,@R0 MOV
R6,#10 OFF1: MOV
R7,#10
課程設(shè)計報告
OFF2: MOV
@ R0, # 0AAH CALL
DISP DJNZ R7 , OFF2 DJNZ R6 , OFF1 MOV
@ R0 , 22H RET INC000: JB
TIMES.0, INC001 JB
TIMES.1, INC002 JB
TIMES.2, INC003 JB
TIMES.3, INC004 JB
TIMES.4, INC005 JMP
INCOUT INC005: CJNE A, #99H, INCOUT MOV
A,#00H JMP
INCOUT INC004: CJNE A, # 13H, INCOUT MOV
A,#01H JMP
INCOUT
課程設(shè)計報告
INC003: CJNE A,# 32H ,INCOUT MOV
A,#01H JMP
INCOUT INC002: CJNE A,#24H,INCOUT MOV
A,#00H JMP
INCOUT INC001: CJNE A,# 60H , INCOUT MOV
A,#00H INCOUT: RET INTT0: PUSH
ACC PUSH
PSW ORL TL0,#0C0H MOV
TH0,#63H DJNZ R4 , CLKE111 JMP
LOOP11 CLKE111: JMP
CLKE
課程設(shè)計報告
LOOP11: MOV
R4,#19H MOV
A,SEC ADD
A,#1 DA A MOV
SEC,A CJNE A, #60H , CLKE99 MOV
SEC,#0 MOV
A,MINUTE ADD
A,#1 DA A MOV
MINUTE,A CLK0: CJNE A, # 60H, CLKE MOV
MINUTE,#0 MOV
A,HOUR ADD
A,#1 DA
A MOV
HOUR,A CJNE A, # 24H, CLKE MOV
HOUR,#0 MOV
A,DAY
課程設(shè)計報告
ADD
A,#1 DA A MOV
DAY,A MOV
A,MONTH INC
A MOVC A, @A + PC SJMP
CLK1 DB
31H,28H,31H DB
30H,31H,30H DB
31H,31H,30H DB
00H,00H,00H DB
00H,00H,00H DB
31H,30H,31H CLK1: CLR C SUBB A,DAY JNC
CLKE MOV
A,MONTH CJNE A,#2,CLK3 MOV
A,YEAR ANL A,#13H JNB
ACC.4,CLK2
課程設(shè)計報告
ADD
A,#2 CLK2: ANL A,#3 JNZ
CLK3 MOV
A,DAY XRL A,#29H JZ
CLKE CLK3: MOV
DAY,#1 MOV
A,MONTH ADD
A,#1 DA
A MOV
MONTH,A CJNE A,#13H,CLKE MOV
MONTH,#1 MOV
A,YEAR ADD
A,#1 DA
A MOV
YEAR,A CLKE99: CALL
CONVERT CLKE:
課程設(shè)計報告
POP
PSW POP
ACC RETI DISP: PUSH
PSW PUSH
ACC MOV
23H,R0 DISP99: MOV
R1,#40H MOV
R0,#30H MOV
R2,#9 DISP1: MOV A,@R0 ANL A,#0FH MOV @R1,A MOV A,@R0 SWAP A ANL A,#0FH INC R1 MOV @R1,A DJNZ R2,DISP2 CALL DISPLAY
課程設(shè)計報告
MOV R0,23H POP ACC POP PSW RET DISP2: INC R1 INC R0 JMP DISP1 DISPLAY: MOV R1,#40H MOV R5,#19 SETB AAA PLAY: SETB BBB NOP CLR BBB CLR AAA MOV A,@R1 MOV DPTR,#TAB MOVC A,@A+DPTR MOV COM,A CALL DL1MS
課程設(shè)計報告
MOV COM,#0FFH DJNZ R5,PLAY1 CLR BBB SETB AAA RET PLAY1: INC R1 JMP PLAY TAB: DB 0C0H,0F9H,0A4H, 0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0A3H,8EH,0ABH DL1MS: MOV 25H,R7 MOV 24H,R6 MOV R7,#20 DS1: MOV R6,#10 DJNZ R6,$ DJNZ R7,DS1 MOV R7,25H MOV R6,24H RET
課程設(shè)計報告
START_YEAR EQU 01 CONVERT_YEAR DATA 5CH CONVERT_MONTH DATA 38H CONVERT_DATE DATA 37H TEMP_BYTE1 DATA 57H TEMP_BYTE2 DATA 58H TEMP_BYTE3 DATA 59H TEMP_BYTE4 DATA 5AH TEMP_BYTE5 DATA 5BH CONVERT: MOV A, YEAR MOV TIME_YEAR,A MOV A,MONTH MOV TIME_MONTH,A MOV A,DAY MOV TIME_DATA,A MOV A,TIME_YEAR MOV B,#16 DIV AB MOV CONVERT_YEAR,B MOV B,#10 MUL AB
課程設(shè)計報告
ADD A,CONVERT_YEAR MOV CONVERT_YEAR,A MOV A,TIME_MONTH JNB ACC.4,CON_02 CLR ACC.4 ADD A,#10 CON_02:MOV CONVERT_MONTH,A MOV A,TIME_DATA MOV B,#16 DIV AB MOV CONVERT_DATE,B MOV B,#10 MUL AB ADD A,CONVERT_DATE MOV CONVERT_DATE,A MOV DPTR,#MONTH_DATA MOV A,CONVERT_YEAR CON_06:CLR C SUBB A,#START_YEAR MOV B,#3 MUL AB ADD A,DPL
課程設(shè)計報告
MOV DPL,A MOV A,B ADDC A,DPH MOV DPH,A MOV A, #2 MOVC A, @A+DPTR CLR ACC.7 MOV B, #32 DIV AB MOV TEMP_BYTE1,A MOV TEMP_BYTE2,B MOV TEMP_BYTE3,#0 MOV A,CONVERT_MONTH CJNE A,#10,CON_08 CON_08:JC CON_09 MOV TEMP_BYTE3,#1 CON_09:MOV A,CONVERT_YEAR ANL A,#03H JNZ CON_10 MOV A,CONVERT_MONTH LCALL GET_RUN_DAYS_LOW SJMP CON_12
課程設(shè)計報告
CON_10:MOV A,CONVERT_MONTH LCALL GET_DAYS_LOW CON_12:MOV B,CONVERT_DATE DEC B ADD A,B MOV TEMP_BYTE4,A JNC CON_14 INC TEMP_BYTE3 CON_14:MOV A,TEMP_BYTE1 LCALL GET_DAYS_LOW DEC A ADD A,TEMP_BYTE2 MOV TEMP_BYTE5,A MOV A,CONVERT_MONTH CJNE A,TEMP_BYTE1,CON_20 MOV A,CONVERT_DATE CJNE A,TEMP_BYTE2,CON_20 CON_20:JC CON_22 LJMP CON_60 CON_22:MOV A,CONVERT_YEAR JNZ CON_24 MOV A,#100
課程設(shè)計報告
CON_24:DEC A MOV CONVERT_YEAR,A MOV A,DPL CLR C SUBB A,#3 MOV DPL,A JNC CON_26 DEC DPH CON_26:MOV A,TEMP_BYTE5 CLR C SUBB A,TEMP_BYTE4 MOV TEMP_BYTE3,A MOV CONVERT_MONTH,#12 CLR F0 CLR A MOVC A,@A+DPTR ANL A,#0F0H SWAP A;MOV TEMP_BYTE4,A JZ CON_30 MOV A, #2 MOVC A , @A+DPTR
課程設(shè)計報告
MOV C, ACC.7 MOV A, #1 MOVC A, @A+DPTR RLC A SJMP CON_34 CON_30:MOV A, #1 MOVC A, @A+DPTR CON_34:MOV TEMP_BYTE5, A CON_40:MOV A, TEMP_BYTE5 RRC A MOV TEMP_BYTE5, A JC CON_42 MOV B, #29 SJMP CON_44 CON_42:MOV B, #30 CON_44:MOV A, TEMP_BYTE3 CLR C SUBB A, B JZ CON_46 JNC CON_50 CPL A INC A
課程設(shè)計報告
CON_46: INC A MOV B, #10 DIV AB SWAP A ORL A, B MOV CONVERT_DATE, A MOV A, CONVERT_MONTH MOV B, #10 DIV AB SWAP A ORL A, B MOV CONVERT_MONTH, A MOV A, CONVERT_YEAR MOV B, #10 DIV AB SWAP A ORL A, B MOV CONVERT_YEAR, A CALL WEEK RET CON_50:MOV TEMP_BYTE3, A JB F0, CON_52
課程設(shè)計報告
DEC CONVERT_MONTH CON_52:MOV A, CONVERT_MONTH CJNE A, TEMP_BYTE4, CON_54 CPL F0 CON_54:SJMP CON_40 CON_60:MOV A, TEMP_BYTE4 CLR C SUBB A, TEMP_BYTE5 MOV TEMP_BYTE4, A JNC CON_62 DEC TEMP_BYTE3 CON_62:MOV CONVERT_MONTH, #1 CLR A MOVC A, @A+DPTR MOV TEMP_BYTE5, A ANL A, #0F0H SWAP A XCH A, TEMP_BYTE5 CLR F0 ANL A, #0FH MOV TEMP_BYTE1, A MOV A, #1
課程設(shè)計報告
MOVC A, @A+DPTR MOV TEMP_BYTE2, A ANL A, #0F0H ORL A, TEMP_BYTE1 SWAP A MOV TEMP_BYTE1, A MOV A, #2 MOVC A, @A+DPTR MOV C, ACC.7 MOV A, TEMP_BYTE2 ANL A, # 0FH SWAP A MOV ACC.3, C MOV TEMP_BYTE2, A CON_70:MOV A, TEMP_BYTE2 RLC A MOV TEMP_BYTE2, A MOV A, TEMP_BYTE1 RLC A MOV TEMP_BYTE1, A JC CON_72 MOV B, #29
課程設(shè)計報告
SJMP CON_74 CON_72:MOV B, #30 CON_74:MOV A, TEMP_BYTE4 CLR C SUBB A,B JNC CON_78 MOV B, A MOV A, TEMP_BYTE3 JZ CON_76 DEC TEMP_BYTE3 MOV TEMP_BYTE4, B SJMP CON_80 CON_76:MOV A, TEMP_BYTE4 LJMP CON_46
CON_78:MOV TEMP_BYTE4, A CON_80:MOV A, CONVERT_MONTH CJNE A, TEMP_BYTE5, CON_82 CPL F0 JNB F0, CON_82 SJMP CON_70 CON_82:INC CONVERT_MONTH SJMP CON_70
課程設(shè)計報告
GET_DAYS_LOW: MOVC A, @A+PC RET DB 0,31,59,90,120,151,181,212,243,17,48,78 GET_RUN_DAYS_LOW: MOVC A, @A+PC RET DB 0,31,60,91,121,152,182,213,244,18,49,79 MONTH_DATA:
DB 04DH,04AH,0B8H;2001 DB 00DH,04AH,04CH;2002 DB 00DH,0A5H,041H;2003 DB 025H,0AAH,0B6H;2004 DB 005H,06AH,049H;2005 DB 07AH,0ADH,0BDH;2006 DB 002H,05DH,052H;2007 DB 009H,02DH,047H;2008 DB 05CH,095H,0BAH;2009 DB 00AH,095H,04EH;2010 DB 00BH,04AH,043H;2011
課程設(shè)計報告
DB 04BH,055H,037H;2012 DB 00AH,0D5H,04AH;2013 DB 095H,05AH,0BFH;2014 DB 004H,0BAH,053H;2015 DB 00AH,05BH,048H;2016 DB 065H,02BH,0BCH;2017 DB 005H,02BH,050H;2018 DB 00AH,093H,045H;2019 DB 047H,04AH,0B9H;2020 DB 006H,0AAH,04CH;2021 DB 00AH,0D5H,041H;2022 DB 024H,0DAH,0B6H;2023 DB 004H,0B6H,04AH;2024 DB 069H,057H,03DH;2025 DB 00AH,04EH,051H;2026 DB 00DH,026H,046H;2027 DB 05EH,093H,03AH;2028 DB 00DH,053H,04DH;2029 DB 005H,0AAH,043H;2030 DB 036H,0B5H,037H;2031 DB 009H,06DH,04BH;2032 DB 0B4H,0AEH,0BFH;2033
課程設(shè)計報告
DB 004H,0ADH,053H;2034 DB 00AH,04DH,048H;2035 DB 06DH,025H,0BCH;2036 DB 00DH,025H,04FH;2037 DB 00DH,052H,044H;2038 DB 05DH,0AAH,038H;2039 DB 00BH,05AH,04CH;2040 DB 005H,06DH,041H;2041 DB 024H,0ADH,0B6H;2042 DB 004H,09BH,04AH;2043 DB 07AH,04BH,0BEH;2044 DB 00AH,04BH,051H;2045 DB 00AH,0A5H,046H;2046 DB 05BH,052H,0BAH;2047 DB 006H,0D2H,04EH;2048 DB 00AH,0DAH,042H;2049 DB 035H,05BH,037H;2050 DB 009H,037H,04BH;2051 DB 084H,097H,0C1H;2052 DB 004H,097H,053H;2053 DB 006H,04BH,048H;2054 DB 066H,0A5H,03CH;2055
課程設(shè)計報告
DB 00EH,0A5H,04FH;2056 DB 006H,0B2H,044H;2057 DB 04AH,0B6H,038H;2058 DB 00AH,0AEH,04CH;2059 DB 009H,02EH,042H;2060 DB 03CH,097H,035H;2061 DB 00CH,096H,049H;2062 DB 07DH,04AH,0BDH;2063 DB 00DH,04AH,051H;2064 DB 00DH,0A5H,045H;2065 DB 055H,0AAH,0BAH;2066 DB 005H,06AH,04EH;2067 DB 00AH,06DH,043H;2068 DB 045H,02EH,0B7H;2069 DB 005H ,02DH, 04BH;2070 DB 08AH, 095H, 0BFH;2071 DB 00AH, 095H, 053H;2072 DB 00BH, 04AH, 047H;2073 DB 06BH, 055H, 03BH;2074 DB 00AH, 0D5H, 04FH;2075 DB 005H, 05AH, 045H;2076 DB 04AH, 05DH, 038H;2077
課程設(shè)計報告
DB 00AH, 05BH, 04CH;2078 DB 005H, 02BH, 042H;2079 DB 03AH, 093H, 0B6H;2080 DB 006H, 093H, 049H;2081 DB 077H, 029H, 0BDH;2082 DB 006H, 0AAH, 051H;2083 DB 00AH, 0D5H, 046H;2084 DB 054H, 0DAH, 0BAH;2085 DB 004H, 0B6H, 04EH;2086 DB 00AH, 057H, 043H;2087 DB 045H, 027H, 038H;2088 DB 00DH, 026H, 04AH;2089 DB 08EH, 093H, 03EH;2090 DB 00DH, 052H, 052H;2091 DB 00DH, 0AAH, 047H;2092 DB 066H, 0B5H, 03BH;2093 DB 005H, 06DH, 04FH;2094 DB 004H, 0AEH, 045H;2095 DB 04AH, 04EH, 0B9H;2096 DB 00AH, 04DH, 04CH;2097 DB 00DH, 015H, 041H;2098 DB 02DH, 092H, 0B5H;2090
課程設(shè)計報告
DB 00DH, 053H, 049H;2100 TIME_WEEK1 DATA 52H WEEK: MOV A, TIME_YEAR MOV B, #16 DIV AB MOV TEMP_BYTE1, B MOV B, #10 MUL AB ADD A, TEMP_BYTE1 MOV TEMP_BYTE1, A MOV A, TIME_MONTH JB ACC.7, GETW02 MOV A, #100 ADD A, TEMP_BYTE1 MOV TEMP_BYTE1, A MOV A, TIME_MONTH CLR ACC.7 GETW02: JNB ACC.4, GETW04 ADD A , #10 CLR ACC.4 GETW04: MOV TEMP_BYTE2,A
課程設(shè)計報告
MOV A, TIME_DATA MOV B, #16 DIV AB MOV TEMP_BYTE3, B MOV B, #10 MUL AB ADD A, TEMP_BYTE3 MOV TEMP_BYTE3, A MOV A ,TEMP_BYTE1 ANL A, #03H JNZ GETW10 MOV A, TEMP_BYTE2 CJNE A, #3,GETW06 GETW06: JNC GETW10 DEC TEMP_BYTE3 GETW10: MOV A,TEMP_BYTE2 LCALL GET_CORRECT ADD A, TEMP_BYTE1 MOV B, #7 DIV AB
MOV A, TEMP_BYTE1
課程設(shè)計報告
ANL A, #0FCH RR A RR A ADD A, B ADD A, TEMP_BYTE3 MOV B, #7 DIV AB MOV A, B CJNE A, #0,OUTOUT MOV B, #8 OUTOUT: MOV TIME_WEEK, B RET GET_CORRECT: MOVC A, @A+PC RET DB 0,3,3,6,1,4,6,2,5,0,3,5 END 系統(tǒng)仿真及調(diào)試
課程設(shè)計報告 仿真結(jié)果及分析
課程設(shè)計報告
上圖為運(yùn)行時的顯示,左邊兩個數(shù)碼管顯示器顯示的是年、月、日,中間的顯示的是時、分、秒,右邊顯示的是農(nóng)歷日期以及星期。若想要調(diào)試時間,可通過右下方兩個并聯(lián)開關(guān)調(diào)試,左邊開關(guān)調(diào)試數(shù)碼管顯示位置,右邊的調(diào)試增1。此刻是2013年11月29日下午15:02,星期五,時間準(zhǔn)確。訓(xùn)練體會
在整個單片機(jī)課程設(shè)計中,想要做出這個完整的設(shè)計過程,必須突破幾個難點:
1、元件得找準(zhǔn)卻,6路驅(qū)動可以用74LS244代替。
2、連線不能連錯,對應(yīng)的輸入輸出端標(biāo)上序號。
3、程序代碼不能敲錯。
4、由于單管顯示的星期數(shù)不穩(wěn)定,可以采用雙管顯示。參考文獻(xiàn):單片機(jī)課程設(shè)計指導(dǎo)。
第三篇:單片機(jī)實訓(xùn)報告范文
四川電子機(jī)械職業(yè)技術(shù)學(xué)院
單片機(jī)原理及應(yīng)用
實 訓(xùn)報告1
班級:應(yīng)電14.2班 姓名:劉華利 學(xué)號:140302058 指導(dǎo)教師:向兵
四川電子機(jī)械職業(yè)技術(shù)學(xué)院
摘要:
《單片機(jī)應(yīng)用系統(tǒng)設(shè)計項目化教程》這本書根據(jù)教育部新的教學(xué)改革要求和企業(yè)崗位技能需求,以高技能應(yīng)用型人才專業(yè)能力培養(yǎng)為目標(biāo),結(jié)合作者多年的教學(xué)經(jīng)驗與課程改革成果進(jìn)行編寫。全書通過6個典型項目任務(wù),著重介紹單片機(jī)基本原理及應(yīng)用系統(tǒng)的設(shè)計方法與技巧,包括流水燈控制系統(tǒng)設(shè)計、簡易數(shù)字時鐘設(shè)計、數(shù)字電壓表設(shè)計、低頻信號發(fā)生器設(shè)計、數(shù)據(jù)存儲及回放系統(tǒng)設(shè)計和窗簾智能控制系統(tǒng)設(shè)計等。本書采用“理實一體、項目化教學(xué)”模式進(jìn)行內(nèi)容編排,將單片機(jī)原理及應(yīng)用系統(tǒng)設(shè)計的相關(guān)知識點融入項目中進(jìn)行講解,易教易學(xué),效果良好。
目錄
摘要········································ 2 目錄········································ 2 實訓(xùn)名稱···································· 3 實訓(xùn)地點···································· 3 實訓(xùn)時間···································· 3 實訓(xùn)目的···································· 3 實訓(xùn)項目···································· 3 項目1·······································3 項目2·······································4 項目3·······································5 項目4·······································6 實訓(xùn)總結(jié)····································· 7
四川電子機(jī)械職業(yè)技術(shù)學(xué)院
實訓(xùn)名稱:單片機(jī)原理及應(yīng)用 實訓(xùn)地點:行政樓523 實訓(xùn)時間:2016.6.27—6.30 實訓(xùn)目的:1、2、3、4、5、6、7、掌握結(jié)構(gòu)化程序設(shè)計的基本方法,基本掌握面向?qū)ο蟪绦蛟O(shè)計的基本思路和方法。
掌握C的基本概念和基礎(chǔ)知識。
通過訓(xùn)練能夠讀懂較為復(fù)雜的C語言源程序并具備基本C語言程序設(shè)計的能力。
熟練掌握各種常用類的定義繼承文件的應(yīng)用,為更好的理解面向?qū)ο蟠蛳赂玫幕A(chǔ)。
掌握面向?qū)ο蟮幕驹?,提高學(xué)生綜合程序設(shè)計的能力。
培養(yǎng)自己獨(dú)立解決問題,找資料的能力。同學(xué)之間相互幫助、相互交流、相互合作的團(tuán)隊精神。
通過實訓(xùn)檢查自己學(xué)習(xí)上的不足,達(dá)到熟練掌握C語言的基本知識和技能。
實訓(xùn)項目: 項目1 點亮一個LED,每隔一定時間循環(huán)熄滅、點亮…
設(shè)計思路:端口送高電平,led熄滅,延時1s,端口送低電平,led點亮,延時1s,就這樣一直循環(huán)。
程序
#include
L2 = 1;
while(Ms--)
DelayMs(1000);
{
L2 = 0;
for(i = 0;i < 114;i+
DelayMs(1000);+);} } }
四川電子機(jī)械職業(yè)技術(shù)學(xué)院
原理圖
項目2 點亮一個LED,讓它每隔一定時間循環(huán)左移(課使用delay函數(shù)進(jìn)行延時)
設(shè)計思路:在項目1的的基礎(chǔ)上,用dalay函數(shù)進(jìn)行延時,用<<來表示左移,添加一個左移的函數(shù)。通俗一點的講的話,就如天天天同一些人排隊領(lǐng)東西,領(lǐng)完了返回隊位繼續(xù)排(當(dāng)然一只是這幾個人排)。
程序
#include } while(1){ for(i=0;i<7;i++){ delay(100); LED=(LED<<1)|0x01;P3=LED;} } 四川電子機(jī)械職業(yè)技術(shù)學(xué)院 原理圖 項目3 將任務(wù)二中delay延時改用定時器延時,且延時一秒 設(shè)計思路:在項目2的的基礎(chǔ)上,用定時器來進(jìn)行延時,首先設(shè)置定時器工作方式 也就是TMOD,在設(shè)置TH0/1,TL0/1的初值,也就是定時時間的設(shè)置,然后設(shè)置中斷允許,并開中斷。用中斷來控制。 程序 #include { TH0=(65536-50000)/256;TL0=(65536-50000)%256;j++;if(j==5){ j=0; P1=~(0x01< if(++i==8)i=0; } } 四川電子機(jī)械職業(yè)技術(shù)學(xué)院 原理圖 項目4 四位數(shù)碼管并排顯示,從左到右依次為分、秒十位、秒各位、0.1秒,相當(dāng)于移動可計時9分59.9秒,使用一個按鍵,當(dāng)按鍵第一次按下,啟動秒表,第二次按下,停止,第三次按下,清零。(數(shù)碼管可選共陰極、共陽極,至于對應(yīng)數(shù)字的段選可參考教材) 設(shè)計思路:用delay函數(shù)來進(jìn)行延時,用內(nèi)部中斷來控制T1,用外部中斷來實現(xiàn)計數(shù)、暫停、清零這三個功能。 程序 #include uintx,y; for(x=100;x>0;x--) for(y=z;y>0;y--);} void dihplay(){ P1=0xfd; 四川電子機(jī)械職業(yè)技術(shù)學(xué)院 P0=Tab[xiao%10]; delay(1); } void display(){ P1=0xfb;P0=Tab[miao/10];delay(1); P1=0xfe;P0=Tab[miao%10];dp=0;delay(1);} void dimplay(){ P1=0xf7;P0=Tab[fen%10];dp=0;delay(1);} void main(){ EA = 1;EX0 = 1;IT0 = 1; ET0=1;TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=0;xiao=0;miao=0;fen=0; while(1) { display();delay(1);dimplay();delay(1);dihplay();delay(1); } } void timer0()interrupt 1 { xiao++; if(xiao==10) { xiao=0;miao++; if(miao==59) { miao=0; fen++; if(fen==10) { fen=0; } } } } void ex0_int0()interrupt 0 { swnum++;if(swnum == 1){ TR0= 1;} if(swnum == 2){ TR0 = 0;} if(swnum == 3){ xiao = 0; miao = 0; fen = 0; swnum=0;} } 四川電子機(jī)械職業(yè)技術(shù)學(xué)院 原理圖 實訓(xùn)總結(jié): 通過今次單片機(jī)實訓(xùn),使我對單片機(jī)的認(rèn)識有了更深刻的理解。系統(tǒng)以51單片機(jī)為核心部件,利用C語言編程,通過對led燈控制到用數(shù)碼管實現(xiàn)秒表功能、中斷控制功能,能實現(xiàn)本設(shè)計題目的基本要求和發(fā)揮部分。由于時間有限和本身知識水平的限制,本系統(tǒng)還存在一些不夠完善的地方,要作為實際應(yīng)用還有一些具體細(xì)節(jié)問題需要解決。 踉踉蹌蹌地忙碌了一周,我的程序終于編譯成功。當(dāng)看著自己的程序,自己成天相伴的系統(tǒng)能夠健康的運(yùn)行,真是莫大的幸福和欣慰。我相信其中的酸甜苦辣最終都會化為甜美的甘泉。 但在這次實訓(xùn)中同時使我對C語言有了更深的認(rèn)識。當(dāng)我第一次接觸C語言就感覺很難,特別是今次實訓(xùn)要用到C語言,盡管困難重重,可我們還是克服了。這次的實訓(xùn)使培養(yǎng)了我們嚴(yán)肅認(rèn)真的做事作風(fēng),增強(qiáng)了我們之間的團(tuán)隊合作能力,使我們認(rèn)識到了團(tuán)隊合作精神的重要性。 這次實訓(xùn)的經(jīng)歷也會使我終身受益,我感受到這次實訓(xùn)是要真真正正用心去做的一件事情,是真正的自己學(xué)習(xí)的過程和研究的過程,沒有學(xué)習(xí)就不可能有研究的能力,沒有自己的研究,就不會有所突破。希望這次的經(jīng)歷能讓我在以后學(xué)習(xí)中激勵我繼續(xù)進(jìn)步。 單片機(jī)原理及應(yīng)用 實訓(xùn)報告 班級: 學(xué)號: 姓名: 指導(dǎo)教師: 實訓(xùn)總成績: 一、節(jié)日彩燈設(shè)計 題目:8位邏輯電平模塊上的LED小燈從左向右呈現(xiàn)“鞭甩”的實驗現(xiàn)象,狀態(tài)間隔為0.25秒;按鍵1開始,按鍵2結(jié)束。 原理圖 程序代碼: #include 單片機(jī)原理及應(yīng)用實訓(xùn)報告 管及驅(qū)動電路的連接,從而構(gòu)成一個完整的硬件電路。然后通過對單片機(jī)的ROM進(jìn)行編程,實現(xiàn)對彩燈閃爍的控制。 二、定時器實現(xiàn)流水燈 題目:利用定時器/計數(shù)器T0產(chǎn)生2秒鐘的定時,每當(dāng)2秒定時到來時,更換指示燈點亮,依次循環(huán)點亮。 原理圖 程序代碼 #include 50000)% 256;TH0 =(65536 單片機(jī)原理及應(yīng)用實訓(xùn)報告 程序代碼 #include 單片機(jī)原理及應(yīng)用實訓(xùn)報告 實訓(xùn)總結(jié) 通過本次單片機(jī)實訓(xùn)使得我更深層次的學(xué)習(xí)單片機(jī)原理與應(yīng)用技術(shù)這門專業(yè)課程,同時對KEIL軟件進(jìn)行復(fù)習(xí)。這次實訓(xùn)是我看到了我最薄弱的一點那就是編程,對于編程有很大的困難。對以往學(xué)習(xí)過的編程知識沒有好好掌握,特別是編程這方便的知識很薄弱。學(xué)習(xí)過的知識在實際應(yīng)用中仿佛是冰山一角,完全不夠用,需要通過查閱很多資料才能解決到碰到的相關(guān)問題。而且實訓(xùn)中出現(xiàn)的問題都是實際應(yīng)用出比較典型的問題。這次實訓(xùn)還讓我深刻的體會了結(jié)構(gòu)化程序設(shè)計的優(yōu)勢,讓我懂得當(dāng)我們要進(jìn)行一個復(fù)雜的程序設(shè)計時應(yīng)該先將其分解為多個不同的功能模塊再分別編程實現(xiàn),這樣做不僅降低了編程的難度,也容易讓編程者思路更加清晰,避免出現(xiàn)不必要的錯誤。在做仿真時,仿真圖正確也不一定就是說明一定正確。 目錄 一 方案設(shè)計說明:............................................................................................2 二 硬件設(shè)計說明:............................................................................................4 (一)電路圖:..........................................................................................4(二)單片機(jī)AT89S51的I/O口分配使用情況........................................4 (三)元器件的參數(shù)及規(guī)格:....................................................................5 三 軟件設(shè)計說明:............................................................................................6 (一)軟件設(shè)計思路及流程圖:................................................................6 (二)程序的總體框架結(jié)構(gòu)說明:............................................................8 (三)重要程序段的功能,作用及思路簡介:........................................8 四 制作調(diào)試說明:..........................................................................................13 (一)程序調(diào)試過程:..............................................................................13 (二)硬件調(diào)試:......................................................................................13 五 電路實拍:.....................................................................................................14 六 總結(jié)心得體會:..........................................................................................15 七 參考文獻(xiàn):.....................................................................................................16 一 方案設(shè)計說明: 設(shè)計方案之前,得先分解設(shè)計任務(wù)。本次的設(shè)計任務(wù)是籃球記分牌,據(jù)常識,籃球記分牌應(yīng)有分別給兩隊加分,減分,能交換顯示分?jǐn)?shù)。在進(jìn)行設(shè)計之前,應(yīng)自己提出幾個問題,待問題回答之后?;竟Α⒌脑O(shè)計方案就出來了。在設(shè)計之前我提出了一下幾個問題: a:硬件部分如何控制給A對B對加分,場地交換的時候又是如何實現(xiàn)分?jǐn)?shù)顯示交換的?應(yīng)該如何連接硬件,在硬件上設(shè)置控制端,控制端與單片機(jī)各引腳之間的連。 b:單片機(jī)只有一個CPU,如何實現(xiàn)即要掃描按鍵,又要顯示比分。數(shù)碼管工作的本質(zhì)是將要顯示的數(shù)據(jù)的字型碼送給他,如何采集到變化的分?jǐn)?shù)送給數(shù)碼管。用查表嗎? c:加分與倒計時在程序中最本質(zhì)的東西是什么,如何用程序來說明這樣的事件,各事件之間又是如何聯(lián)系的。 雖然這些問題看似很普通,似乎在設(shè)計過程中都要面對這樣的問題,何不事先就解決這些問題呢,在逐一回答這些問題的同時,該任務(wù)的設(shè)計方案已見雛形。以下就是該方案的詳細(xì)內(nèi)容以及我問題的答案。 系統(tǒng)原理圖如下圖一所示: LED數(shù)碼顯示管外部按鍵AT89S51驅(qū)動電路 3 二 硬件設(shè)計說明: (一)電路圖: (二)單片機(jī)AT89S51的I/O口分配使用情況 圖中P3.0,P3.1,P3.2,P3.3分別是加一分、加兩分、加三分、減一分。P3.4與P3.5口是外部中斷,其中斷服務(wù)程序的功能是實現(xiàn)比分交換的切換顯示和加分減分切換。電路中選擇共陽極的數(shù)碼管,可以省去輸入端的驅(qū)動電路,使電路更簡潔。P0口作為字形碼的輸出口,與數(shù)碼管的八只管教相連。 (三)元器件的參數(shù)及規(guī)格: 主要元器件有單片機(jī)芯片AT89S51,共陽極數(shù)碼管,9012PNP三極管。其中單片機(jī)承載程序,實現(xiàn)電路功能,三極管起開關(guān)及驅(qū)動數(shù)碼管顯示作用。數(shù)碼管顯示比分。 三 軟件設(shè)計說明: 程序的總體思路是主程序一直在掃描按鍵,比分顯示,比分交換,加減分隊伍切換都在中斷服務(wù)程序中完成。其具體內(nèi)容如下所示。 (一)軟件設(shè)計思路及流程圖: 中斷程序流程圖(如:圖一) 程序初始化,給存儲器賦初值按鍵掃描程序,掃描到由按鍵控制的中斷就執(zhí)行其對應(yīng)程序外部中斷1,加減外部中斷0,A、B分隊伍切換中斷程序兩隊比分切換圖一 按鍵掃描程序流程圖(如:圖二)按鍵掃描入口,檢測軟件標(biāo)志位F0,為1調(diào)用分?jǐn)?shù)顯示程序程序,為0調(diào)用加減分切換程序,同時掃描按鍵是掃描P3.0,并去抖,是否有鍵按下加一分否是掃描P3.1,并去抖,是否有鍵按下加兩分否是掃描P3.2,并去抖,是否有鍵按下加三分否是掃描P3.3,并去抖,是否有按鍵按下減一分否按鍵掃描程序結(jié)束圖二 分?jǐn)?shù)顯示程序流程圖(如:圖三) 將A對B對的分?jǐn)?shù)首先進(jìn)行BCD碼轉(zhuǎn)換,再保存到相對應(yīng)的寄存器中把各分?jǐn)?shù)分別賦給寄存器A,查表送往要顯示的數(shù)碼管由P2口的位狀態(tài)控制子程序調(diào)用結(jié)束,返回主程序,RET 圖三 其中時間顯示的子程序流程圖與分?jǐn)?shù)的大同小異,此處就不再一一列出。 (二)程序的總體框架結(jié)構(gòu)說明: 程序包含按鍵掃描程序,不斷地掃描按鍵,一旦有控制中斷的按鍵按下,就執(zhí)行中斷程序,交換比分。中斷服務(wù)程序,INT_0交換A對與B對的總分,INT_1改變軟件標(biāo)志位就可以切換加減分隊伍,同時掃描按鍵。 (三)重要程序段的功能,作用及思路簡介: 按鍵掃描程序是本程序中最重要的程序段,其連接了所有的子程序,子程序的調(diào)用都是在其中完成。下面就對該程序段的功能,作用及編寫思路做詳細(xì)說明。各部分關(guān)鍵程序 按鍵控制程序 org 0060h ajcx: jnb p3.0,s0 jnb p3.1,s1 jnb p3.2,s2 jnb p3.3,s3 jnb p3.4,s4 jnb p3.5,sz5 ljmp ajcx sz5: ljmp s5 s0: lcall del jb p3.0,s01 ljmp ajcx s01: jnb p1.0,s02 mov a,30h inc a mov 30h,a ljmp tzcx s02: mov a,31h inc a mov 31h,a ljmp tzcx s1: lcall del jb p3.1,s11 ljmp ajcx s11: jnb p1.0,s12 mov a,30h add a,#02h mov 30h,a ljmp tzcx s12: mov a,31h add a,#02h mov 31h,a ljmp tzcx s2: lcall del jb p3.2,s21 ljmp ajcx s21: jnb p1.0,s22 mov a,30h add a,#03h mov 30h,a ljmp tzcx s22: mov a,31h add a,#03h mov 31h,a ljmp tzcx s3: lcall del jb p3.3,s31 ljmp ajcx s31: jnb p1.0,s32 mov a,30h dec a mov 30h,a ljmp tzcx s32: mov a,31h dec a mov 31h,a ljmp tzcx s4: lcall del jb p3.4,s41 ljmp ajcx s41: push 30h push 31h pop 30h pop 31h lcall jscx ljmp ajcx s5: lcall del jb p3.5,s51 ljmp ajcx s51: cpl p1.0 cpl p1.1 ljmp ajcx 加分程序: org 0120h tzcx: lcall jscx ljmp ajcx org 0130h del: mov tl1,#00h mov th1,#0bh setb tr1 jnb tf1,$ mov tl1,#00h mov th1,#0bh clr tf1 ret 加減分隊伍切換程序: org 0150h dscx: mov th0,#0fch mov tl0,#18h mov a,r2 rl a mov r2,a cjne r2,#11h,d1 mov r1,#32h lcall jscx reti d1: cjne r2,#22h,d2 mov r1,#33h lcall jscx reti d2: cjne r2,#44h,d3 mov r1,#34h lcall jscx reti d3: mov r1,#35h lcall jscx reti 比分切換程序: org 0190h jscx: mov a,30h mov b,#0ah div ab mov 33h,b mov 32h,a mov a,31h mov b,#0ah div ab mov 35h,b mov 34h,a mov p2,r2 mov dptr,#tab mov a,@r1 movc a,@a+dptr mov p0,a ret org 0220h tab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h db 80h,90h end 12 四 制作調(diào)試說明: (一)程序調(diào)試過程: 程序調(diào)試我花了兩天的時間,此程序雖然不復(fù)雜,由于我平時學(xué)習(xí)的不夠深入,也沒用心學(xué)。對于我這樣的基礎(chǔ)來說調(diào)試過程真的很痛苦。剛開始調(diào)試時程序有兩處讓我感覺很亂,按鍵掃描程序中的中斷程序如何調(diào)用。當(dāng)寄存A對或B對的分?jǐn)?shù)累加到99的時候,就清零,但還沒有累加到99的時候,程序應(yīng)該跳往何處執(zhí)行,我最初的是跳了繼續(xù)累加。在仿真中的現(xiàn)象就是分?jǐn)?shù)一直顯示99,加不了。我真的是太大意了,調(diào)試的時候不踏實。 (二)硬件調(diào)試: 此次的硬件焊接很成功,電路布局很清晰,雖然在調(diào)試時也發(fā)現(xiàn)錯誤,但用萬用表很容易就檢測出來了,其中有幾根線的皮包線熔了,肉眼看不到。重新整理電路后,功能明顯成功。至此,本次的單片機(jī)課程設(shè)計圓滿結(jié)束。 五 電路實拍: 電路板正面: 電路板背面: 六 總結(jié)心得體會: 通過這一次的單片機(jī)實訓(xùn),讓我對單片機(jī)這一門知識有了更深的認(rèn)識,更鍛煉了我獨(dú)立解決問題獨(dú)立思考的能力,在電路設(shè)計和程序設(shè)計的過程中我們遇到了很多問題和困難,但通過大家的討論和老師的指點之后,一切的問題都一一被解決,但單片機(jī)的學(xué)習(xí)并不是那么的簡單,在最后也是最關(guān)鍵的程序調(diào)試的過程中,我們又遇到了很多更難的更棘手的問題,電路焊接完好也會出現(xiàn)諸多類似于不實現(xiàn)功能或是出現(xiàn)混亂顯示的情況,真的很讓人頭疼,但,大家都還是咬牙堅持了下來,最后很多電路雖然依舊還是沒能實現(xiàn)功能,但我們努力頑強(qiáng)克服重重困難的精神,是大家有目共睹的,就算是失敗了,也依舊是很值得的一次經(jīng)歷.,與此同時,也有很多同學(xué)試驗成功,看著大家臉上洋溢的笑容,大家無論失敗成功都從這次的實訓(xùn)中學(xué)到了很多很多的東西 七 參考文獻(xiàn): 胡健 主編 《單片機(jī)原理及接口技術(shù)》 張大明 主編 《單片機(jī)控制實訓(xùn)指導(dǎo)及綜合應(yīng)用實例》李勛、林廣艷《單片機(jī)微型計算機(jī)大學(xué)讀本》 機(jī)械工程出版社 機(jī)械工業(yè)出版社 北京航空航天大學(xué)出版社16第四篇:單片機(jī)實訓(xùn)報告
第五篇:單片機(jī)實訓(xùn)報告