《單片機(jī)原理 數(shù)碼管動(dòng)態(tài)顯示實(shí)驗(yàn)-單片機(jī)原理-實(shí)驗(yàn)報(bào)告材料》由會(huì)員分享,可在線閱讀,更多相關(guān)《單片機(jī)原理 數(shù)碼管動(dòng)態(tài)顯示實(shí)驗(yàn)-單片機(jī)原理-實(shí)驗(yàn)報(bào)告材料(15頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、word
某某師X學(xué)院計(jì)算機(jī)系
實(shí)驗(yàn)報(bào)告
〔2014—2015學(xué)年 第 2學(xué)期〕
課程名稱 單片機(jī)原理
實(shí)驗(yàn)名稱 數(shù)碼管動(dòng)態(tài)顯示實(shí)驗(yàn)
專 業(yè)計(jì)算機(jī)科學(xué)與技術(shù)〔非師X〕
年 級(jí) 2012級(jí)
學(xué)號(hào) B2012102147 某某 王 秋
指導(dǎo)教師 楊烈君
實(shí)驗(yàn)日期 2015.4.17
實(shí)驗(yàn)?zāi)康模?
1. 鞏固Proteus軟件和Keil軟件的使用方法
2. 學(xué)習(xí)端口輸入輸出的高級(jí)應(yīng)用
2、3. 掌握7段數(shù)碼管的連接方式和動(dòng)態(tài)顯示法
4. 掌握查表程序和延時(shí)等子程序的設(shè)計(jì)
實(shí)驗(yàn)要求:
1. 在Proteus軟件中畫好51單片機(jī)最小核心電路,包括復(fù)位電路和晶振電路
2. 在電路中增加八位7段數(shù)碼管(共陽/共陰自選),將P2口作數(shù)據(jù)輸出口與7段數(shù)碼管數(shù)據(jù)引腳相連 ,P3引腳輸出位選控制信號(hào)
3. 在Keil軟件中編寫程序,采用動(dòng)態(tài)顯示法,實(shí)現(xiàn)數(shù)碼管分別顯示數(shù)字1-8
4. 實(shí)現(xiàn)指定數(shù)值的顯示 〔可使用 緩存數(shù)值〕
5. 實(shí)現(xiàn)類似時(shí)鐘的效果,如“ 13-23-25〞 13時(shí)23分25秒
6. 實(shí)現(xiàn)時(shí)鐘的自動(dòng)計(jì)時(shí)
7. 擴(kuò)展要求: 結(jié)合LED顯示,實(shí)現(xiàn)帶數(shù)碼
3、顯示的交通燈
實(shí)驗(yàn)設(shè)備〔環(huán)境〕:
1. 計(jì)算機(jī)
2. Proteus ISIS 7 Professional應(yīng)用程序
3. Keil應(yīng)用程序
實(shí)驗(yàn)內(nèi)容:
數(shù)碼管動(dòng)態(tài)顯示技術(shù) 要某某現(xiàn):
1. 動(dòng)態(tài)顯示法,實(shí)現(xiàn)數(shù)碼管分別顯示數(shù)字1-8;
2. 實(shí)現(xiàn)指定數(shù)值的顯示 〔可使用 緩存數(shù)值〕 〔33355223〕;
3. 實(shí)現(xiàn)類似時(shí)鐘的效果,如“ 13-23-25〞 13時(shí)23分25秒;
4. 實(shí)現(xiàn)時(shí)鐘的自動(dòng)計(jì)時(shí);
擴(kuò)展要求: 結(jié)合LED顯示,實(shí)現(xiàn)帶數(shù)碼顯示的交通燈;
實(shí)驗(yàn)步驟、實(shí)驗(yàn)結(jié)果與分析:
1 實(shí)驗(yàn)步驟:
2、在“庫〞下拉菜單中,選中“拾取元件〞〔快
4、捷鍵P〕,分別選擇以下元件:AT89C51、CAP、CAP-ELEC、CRYSTAL、RESPACK-8。
3、構(gòu)建仿真電路:
連接圖
顯示1-8
顯示33355223
時(shí)鐘自動(dòng)計(jì)時(shí)
連接圖
紅綠燈效果圖1
紅綠燈效果圖2
4、創(chuàng)建一個(gè)Keil應(yīng)用程序:新建一個(gè)工程項(xiàng)目文件;為工程選擇目標(biāo)器件〔AT89C52〕;為工程項(xiàng)目創(chuàng)建源程序文件并輸入程序代碼;保存創(chuàng)建的源程序項(xiàng)目文件;把源程序文件添加到項(xiàng)目中。
5、把用戶程序經(jīng)過編譯后生成的HEX文件添加到仿真電路中的處理器中〔編輯元件→文件路徑〕
2 實(shí)驗(yàn)程序 <
5、流程圖>
程序源代碼:
1. 動(dòng)態(tài)顯示法,實(shí)現(xiàn)數(shù)碼管分別顯示數(shù)字1-8;
#include
#define uchar unsigned char
#define uint unsigned int
uchar code Ledcode[]={
0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //定義一個(gè)數(shù)組里面放入1-8
void delay(uint x)
{
while(x--);
}
void main()
{
uchar i;
while(1)
{
6、
for(i=0;i<8;i++)
{
P3=1<
unsigned char code LedCode[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40
};
unsigned char D
7、ispBuf[8]={3,3,3,5,5,2,2,3}; //指定要顯示的數(shù)的位置
void delay(unsigned int x){
while(x--);
}
void main()
{
unsigned int i;
for(i=0;i<8;i++){
P3=1<
unsigned char code LedC
8、ode[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
unsigned char Hour=13,Min=23,Sec=25;
unsigned char DispBuf[8];
void delay(unsigned int x)
{
while(x--);
}
void PutTime()
{
DispBuf[7]=Sec%10; //取對(duì)應(yīng)秒數(shù)的個(gè)位放在最右邊顯示
DispBuf[6]=Sec/10; //取對(duì)應(yīng)秒數(shù)的十位放在右起第二位顯示
DispBuf[5]=10; /
9、/此處表示秒跟分之間用橫桿隔開
DispBuf[4]=Min%10;
DispBuf[3]=Min/10;
DispBuf[2]=10;
DispBuf[1]=Hour%10;
DispBuf[0]=Hour/10;
}
void main()
{
long n=0;
while(1)
{
unsigned char i;
PutTime();
for(i=0;i<8;i++)
{
P3=1<
10、
unsigned char code LedCode[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
unsigned char Hour=13,Min=23,Sec=25;
unsigned char DispBuf[8];
void delay(unsigned int x)
{
while(x--);
}
void PutTime()
{
DispBuf[7]=Sec%10;
DispBuf[6]=Sec/10;
DispBuf[5]=10;
DispBuf[4]=Min%10;
Di
11、spBuf[3]=Min/10;
DispBuf[2]=10;
DispBuf[1]=Hour%10;
DispBuf[0]=Hour/10;
}
void main()
{
long n=0;
while(1)
{
unsigned char i,ms; //定義一個(gè)ms用于控制秒數(shù)加一的延時(shí)
PutTime();
for(i=0;i<8;i++)
{
P3=1<=20)
{
Sec++;ms=0;
}
if
12、(Sec>=60) //表示進(jìn)位,當(dāng)秒滿六十如此向分鐘進(jìn)一,同時(shí)秒數(shù)清零
{
Min++;Sec=0;
}
if(Min>=60)
{
Hour++;Min=0;
}
if(Hour>=24) //當(dāng)小時(shí)數(shù)滿24小時(shí)時(shí),如此小時(shí)數(shù)清零,完成計(jì)時(shí)
{
Hour=0;
}
}
}
5. 擴(kuò)展要求: 結(jié)合LED顯示,實(shí)現(xiàn)帶數(shù)碼顯示的交通燈;
#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
#define Disp_Null 10
uchar code Le
13、dCode[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x40};
uchar DispBuf[8];
sbit r1=P2^0;sbit y1=P2^1;sbit g1=P2^2;
sbit r2=P2^3;sbit y2=P2^4;sbit g2=P2^5;
uchar sec1;sec2;sec;
void delay(uint x)
{
while(x--);
}
void PntTime( )
{
DispBuf[3]=sec2 % 10;
DispBuf[2]
14、=sec2 / 10;
DispBuf[1]=sec1 % 10;
DispBuf[0]=sec1 / 10;
}
void display()
{
uchar i;
for (i = 0;i < 8;i ++)
{
P3=0;
P1=~LedCode[ DispBuf[i] ];
P3=1<
15、play();
ms++;
if( ms >=60){
ms=0;
sec=(sec+1) % 60; //定義一個(gè)計(jì)數(shù)變量,使其一直保持在60內(nèi)
}
if( sec <20){ //sec在20以內(nèi)時(shí)g2、r1亮
sec1=20-sec; sec2=30-sec;
r1=1;y1=0;g1=0;
r2=0;y2=0;g2=1;
}
if(sec>=20 && sec<30){ //sec在20與30之間時(shí)y2、r1亮
sec1=30-sec; sec2=30-sec;
r1=1;y1=0;g1=0;
16、
r2=0;y2=1;g2=0;
}
if(sec>=30 && sec<50){ //g1、r2在sec增加20內(nèi)亮
sec1=60-sec; sec2=50-sec;
r1=0;y1=0;g1=1;
r2=1;y2=0;g2=0;
}
if(sec>=50){
sec1=60-sec; sec2=60-sec;
r1=0;y1=1;g1=0;
r2=1;y2=0;g2=0;
}
}
}
過程總結(jié):
本實(shí)驗(yàn)是將單片機(jī)的P2口做為輸出口,將四個(gè)數(shù)碼管的七段引腳分別接到P2.0
17、至P2.7.由于電路中采用共陽極的數(shù)碼管,所以當(dāng)P2端口相應(yīng)的引腳為0時(shí),對(duì)應(yīng)的數(shù)碼管段點(diǎn)亮。程序中預(yù)設(shè)了數(shù)字0-9的段碼。由于是讓八個(gè)數(shù)碼管顯示不同的數(shù)值,所以要用掃描的方式來實(shí)現(xiàn)。因此可定義掃描函數(shù),接到單片機(jī)的P3口。
在實(shí)驗(yàn)中,預(yù)設(shè)的數(shù)字段碼表存放在數(shù)組LedCode中,由于段碼表是固定的,因此存儲(chǔ)類型可設(shè)為code.在Proteus軟件中按照要求畫出電路,再利用Keil軟件按需要實(shí)現(xiàn)的功能編寫c程序,生成Hex文件,把Hex文件導(dǎo)到Proteus軟件中進(jìn)展仿真。
心得體會(huì):
實(shí)驗(yàn)數(shù)碼管顯示程序的編程方法
1〕先準(zhǔn)備好要顯示的數(shù)據(jù),放入相應(yīng)的顯示存儲(chǔ)單元中。
2〕根據(jù)要使用的
18、數(shù)碼管的具體位置來確定掃描初值和掃描方向。
3〕根據(jù)使用數(shù)碼管的個(gè)數(shù)來確定掃描的位數(shù)。
4〕查表將要顯示的數(shù)據(jù)轉(zhuǎn)換為能使數(shù)碼管正確顯示相對(duì)應(yīng)的段碼。
5〕分時(shí)送段碼和位碼,數(shù)碼管開始循環(huán)顯示。
指導(dǎo)教師評(píng)語:
1、完成所有規(guī)定的實(shí)驗(yàn)內(nèi)容,實(shí)驗(yàn)步驟正確,結(jié)果正確;
2、完成絕大局部規(guī)定的實(shí)驗(yàn)內(nèi)容,實(shí)驗(yàn)步驟正確,結(jié)果正確;
3、完成大局部規(guī)定的實(shí)驗(yàn)內(nèi)容,實(shí)驗(yàn)步驟正確,結(jié)果正確;
評(píng)定等級(jí):A〔優(yōu)秀〕 B〔良好〕 C〔中等〕 D〔與格〕 E〔不與格〕
成績(jī)?cè)u(píng)定
教師簽字
年月日
備注:
注:1、報(bào)告內(nèi)的項(xiàng)目或設(shè)置,可根據(jù)實(shí)際情況加以補(bǔ)充和調(diào)整
2、教師批改學(xué)生實(shí)驗(yàn)報(bào)告應(yīng)在學(xué)生提交實(shí)驗(yàn)報(bào)告10日內(nèi)
15 / 15