數碼管萬年歷實習報告_第1頁
數碼管萬年歷實習報告_第2頁
數碼管萬年歷實習報告_第3頁
數碼管萬年歷實習報告_第4頁
數碼管萬年歷實習報告_第5頁
已閱讀5頁,還剩17頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

河南機電高等專科學校

綜合實訓報告

系部:_________________

專業:_________________

班級:_________________

學生姓名:_________________

學號:_________________

2013年6月28日

實訓任務書

1.時間:2013年6月15日?2013年6月28日

2.實訓單位:河南機電高等專科學校

3.實訓目的:深入學習電子產品設計制作的全過程

4.實訓任務:

①加深學習電路圖繪制軟件的相關常識及其特點;

②以51單片機為核心設計出一個LED萬年歷;

③萬年歷具有年份、月、日、時、分、秒、周、溫度、整點報時等功能;

④自己獨立完成設計電路圖,生成PCB,轉印、腐蝕電路板,焊接等硬件制作

工作;

⑤會使用keil軟件編寫程序,并完成燒寫過程;

⑥學會調試程序,敢于發現問題,解決問題;

⑦參考相關的的書籍、資料,認真完成實訓報告。

綜合實訓報告

前言:

萬年歷是我們經常見到和使用的計時工具,使用方便,功能多。但自己做一

個讓人滿意的萬年歷,就不一定有那么輕而易舉了,本次實訓的任務就是自己親

手做一個萬年歷。利用本學期學過的單片機知識,設計出具有顯示年、月、日、

時、分、秒、周、溫度功能,同時有整點報時的功能的萬年歷。

一、實訓器件

1.溫度傳感器DS18B20

采用數字式溫度傳感器DS18B20,此類傳感器為數字式傳感器而且僅需要一

條數據線進行數據傳輸,易于與單片機連接,可以避免A/D模數轉換模塊,降低

硬件成本,簡化系統電路。另外,數字式溫度傳感器還具有測量精度高、測量范

圍廣等優點。因此,本設計DS18B20溫度傳感器作為溫度采集模塊。

2.時鐘芯片DS1302

采用DS1302時鐘芯片實現時鐘,它可以對年、月、日、周、時、分、秒進

行計時,具有閏年補償功能,工作電壓為2.5V?5.5V。采用三線接口與CPU進

行同步通信,并可采用突發方式一次傳送多個字節的時鐘信號或RAM數據。

DS1302內部有一個31X8的用于臨時性存放數據的RAM寄存器。具有主電源/后

背電源雙電源引腳,同時提供了對后背電源進行涓細電流充電的能力。主要特點

是采用串行數據傳輸,可為掉電保護電源提供可編程的充電功能,并旦可以關閉

充電功能。采用普通32.768kHz晶振。因此,本設計中采用DS1302提供時鐘。

3.74LS154

74LS154為4線―16線譯碼器,其主要電特性的典型值如下:

tpd

PD

ABCD->outputGl、G2->output

23ns19ns170mW

當選通端(Gl、G2)均為低電平時,可將地址端(ABCD)的二進制編碼在一

個對應的輸出端,以低電平譯出。若將G1和G2中的一個作為數據輸入端,由

ABCD對輸出尋址,54/74154還可作4線一16線數據分配器。

引出端符號:A、B、C、D譯碼地址輸入端(低電平有效)

Gl、G2選通端(低電平有效)

0-15輸出端(低電平有效)

可用此種芯片作為數碼管的選址芯片。

4.74HC573

74HC573是八進制3態非反轉透明鎖存器,是高性能硅門CMOS器件。當鎖

存使能端為高時,這些器件的鎖存對于數據是透明的(也就是說輸出同步)。當

鎖存使能變低時,符合建立時間和保持時間的數據會被鎖存。輸出能直接接到

CMOS,NMOS和TTL接口上操作電壓范圍:2.0V~6.0VX低輸入電流:1.OuA。

本實訓采用此芯片作為數碼管的驅動芯片。

5.數碼管

本實訓使用共陰極數碼管作為顯示器件,采用LED數碼管動態掃描,LED數

碼管價格適中,對于顯示數字也最合適。

綜上各模塊的選擇方案與論證,確定最后的主要硬件資源如下:采用

AT89s51作為主控制系統;DS1302提供時鐘;DS18B20作為數字式溫度傳感器;

74LS154作為選址芯片;74HC573作為數碼管的驅動芯片;共陰極數碼管顯示數

字;S8550驅動揚聲器。

二、實訓原理

為了使萬年歷在包裝美化時簡單化及布線的方便,我將萬年歷分為兩部分,

一部分是主體部分含有年份、月、日、時、分、秒,另一部分是小模塊包含周、

溫度。

電路圖如下:

主電路圖:

5&85&S&S

掃o2S3S8B8I

HWADO

PALIPftl/ADl

FAL2Pft2/AD2

PftS(AD3

Pa-VAEM

PftVAD5

M&AD6

Pa7/AD7

H

WTPPlJOT?

酬PL1H2EX

LBffiDGP12ECI

PI3CEXO

P1.4flCEX)

*0PI夕CEX2

LI/TxDPIOTX3

□aonPI.7OX4

ivroP2.(yA8

bnP2I/.A9

LMffiP22/AI0

17/EDP2.3/AI1

P14/AI2

P2.5/AI3

P1^AI4

5SP2.7/AI5

FRCHRP

O32768Hz_%>RSIVCC2

XI

X2VO

L

GND

GND

____________________cXIV”_______

nsimi

主電路PCB:

周,溫度電路圖:周,溫度PCB:

AA

BBW14

CCW15

DDW16

EE

FF

GG

DPDP

A

B

C

D

E

F

G

DP

三、程序編寫

使用Keil軟件編寫程序。程序包括主函數、時間顯示函數、溫度顯示函數、

時間調整函數、DS18B20模塊、DS1302模塊和周計算函數等。

程序的編寫使我熟練的掌握了Keil軟件的應用。具體程序見附錄。

四、程序的燒寫與調試

程序燒寫需要用專用的燒寫軟件將Keil軟件聲生成的.hex文件寫進單片機

里。經過多次的程序的改寫與調試,最終制作出比較滿意的成品。

五、成品展不:

心得體會:

經過此次實訓我學到了很多,剛開始以為做萬年歷很難,著手開始做這個

產品沒有一點頭緒,經過上網查資料,產生了最初的制作框架,然后就開始找

芯片,查芯片資料?,設計電路圖,又請同學幫忙指點,修改原理圖。接著買元

器件,做封裝,生成PCB,制作電路板,焊接元器件,最后完成了整個硬件部

分的制作。完成了硬件制作后,我又編了測試軟件測試硬件是否有問題,發現

數碼管不亮,經過問題排查及資料查詢,發現單片機P0口缺少了上拉電阻,接

上后,解決了問題。

編程也是比較困難的,由于掌握的知識不夠多,借鑒了別人的程序,并加

入自己的想法,經過調試,程序編寫成功。最終完成了產品的制作。

在實習的過程中我得到了別人的幫助,同時也主動幫助別人,得到了很多

經驗,為以后學習提供了方便。實習就是學習的過程,本次實習是最成功的一

次,也是學到最多的一次。

參考文獻:

《單片機C51程序設計教程與實驗》北京航空航天大學出版社

《單片機原理及應用(C51澹)》清華大學出版社

《數字電子技術》黃河水利出版社

《ProtelDXP2004電路設計與仿真教程》北京航空航天大學出版社

附錄:

程序

萬年歷.C

#include<reg5l.h>

#include<intrins.h>

#defineucharunsignedchar

#defineuintunsignedint

ucharcodedigit[]={Ox3f,0x06,0x5b,0x4f,0x66,Ox6d,0x7d,0x07,0x7f,0x6f,0x39,0x00};

ucharmode,TH,TL,TN,seconds,minutes,hours,years,months,days,WEEK,n;

ucharcount=0;

sbitSET=P3A4;

sbitADD=P3A5;〃增力口

sbitRED二P3八6;〃減小

sbitCANL=P3A7;

sbitle=P2A6;

sbitoe=P2A7;

sbiten=PlA4;

sbitbeep=P2A4;

ucharGetWeekFromDay(ucharyears,ucharmonths,uchardays);

voidWriteSet1302(ucharcmd,uchardate);

ucharReadSet1302(ucharcmd);

voidReadyreadDS18B20(void);

ucharReadDS18B20(void);

voidIntDS1302(void);

voiddelaylms(uintx)

(

uchari,j;

for(i=x;i>0;i—)

for(j=124;j>0;j-);

)

voiddelaynus(ucharn)〃延時若干微秒

(

while(n-);

)

voiddisplay_Year(year)//顯示年

(

uchari,j;

i=year/10;

j=year%10;

P0=digit[2];

Pl=8;

delaylms(2);

PO=digit[O];

Pl=9;

delaylms(2);

PO=digit[iJ;

Pl=10;

delaylms(2);

PO=digit[j];

Pl=ll;

delaylms(l);

)

voiddisplay_Month(month)〃顯示月

(

ucharij;

i=month/10;

j=month%10;

PO=digit[i];

Pl=6;

delay1ms⑵;

PO=digit[j];

Pl=7;

delaylms(l);

)

voiddisplay_Day(day)〃顯示日

(

uchari,j;

i=day/10;

j=day%10;

PO=digit|i];

Pl=4;

delayIms(2);

PO=digit|j];

Pl=5;

delaylms(l);

)

voiddisplay_Hour(hour)〃顯示時

(

uchari,j;

i=hour/10;

j=hour%10;

PO=digit[i];

Pl=2;

delay1ms⑵;

P0=digit[j]+n*0x80;

Pl=3;

delaylms(l);

voiddisplay_Minute(minute)〃顯示分

{

ucharij;

i=minute/10;

j=minute%10;

PO=digit[i];

Pl=0;

delayIms(2);

PO=digit[j];

Pl=l;

delaylms(l);

)

voiddisplay_Week(void)〃顯示周

{

WEEK=GetWeekFromDay(years,months,days);

Pl=12;

switch(WEEK)

(

casel:PO=digit[l];

delaylms(2);

break;

case2:P0=digit[2];

delaylms(2);

break;

case3:PO=digit[3];

delaylms(2);

break;

case4:P0=digit[4];

delaylms(2);

break;

case5:PO=digit[5J;

delaylms(2);

break;

case6:P0=digit[6];

delaylms(2);

break;

case7:P0=digit[8];

delaylms(2);

break;

)

)

voiddisplay_Time(void)〃顯示實時時間

ucharvalue;

value=ReadSetl302(0x83);

minutes=(((value&0x70)?4)*10+(value&0x0f));

display_Minute(minutes);

value=ReadSet1302(0x85);

hours=(((value&0x70)?4)*10+(value&0x0f));

display_Hour(hours);

value=ReadSetl302(0x87);

days=(((value&0x70)?4)*10+(value&0x0f));

display_Day(days);

value=ReadSetl302(0x89);

months=(((value&0x70)?4)*10+(value&0x0f));

display_Month(months);

value=ReadSetl302(0x8D);

years=(((value&0xf0)?4)*10+(value&0x0f));

display_Year(years);

display_Week();

/*****************時間調整部分*********************/

voidhourset(void)〃調時

uchartimevalue,hour;

delay1ms(500);〃防止多次觸發

WriteSetl302(0x8e,0x00);〃將寫保護去掉,確保能正常將調整后的數值寫入DS1302

timevalue=ReadSetl302(0x85);〃讀取此時的數值

hour=(((timevalue&0x70)?4)*10+(timevalue&0x0f));

while(l)

(

if(ADD==0)

(

delaylms(20);

if(ADD==0)

(

hour++;

delaylms(100);

whi!e(ADD==0);

)

)

if(RED==0)

delaylms(20);

if(RED==0)

hour-;

delaylms(100);

if(hour==0)hour=23;

while(RED==0);

)

)

if(hour>=24)hour=0;

timevalue=(((hour)/10)?4l(hour%10));

WriteSet1302(0x84,timevalue);

delay1ms⑵;

display_Hour(hour);

delaylms(10);

if(CANL==0)

(

mode=0;

break;

)

if(SET==O)break;

)

WriteSet1302(0x8e,0x80);

)

voidminuteset(void)〃調分

(

uchartimevalue,minute;

delaylms(500);

WriteSet1302(0x8e,0x00);

timevalue=ReadSet1302(0x83);

minute=(((timevalue&0x70)?4):ic10+(timevalue&0x0f));

while(l)

(

if(ADD==0)

(

delaylms(20);

if(ADD==0)

(

minute++;

if(minute>=60)timevalue=0;

while(ADD==0);

)

)

if(RED==0)

(

delaylms(10);

if(RED==0)

minute—;

if(minute=O)minute=59;

delaylms(300);

while(RED==O);

)

}

if(minute>=60)minute=O;

timevalue=((minute/10)?4l(minute%10));

WriteSet1302(0x82,timevalue);

delay1ms⑵;

display_Minute(minute);

delaylms(10);

if(CANL==0)

(

mode=0;

break;

)

if(SET==0)break;

)

WriteSet1302(0x8e,0x80);

voidyearset(void)〃調年

(

uchardatevalue,year;

delaylms(500);

WriteSet1302(0x8e,0x00);

datevalue=ReadSet1302(0x8d);

year=(((datevalue&0x70)?4)*10+(datevalue&0x0f));

while(l)

(

if(ADD==0)

{

delaylms(20);

if(ADD==0)

(

year++;

while(ADD==0);

)

)

if(RED==0)

delaylms(20);

if(RED==O)

year—;

delaylms(lOO);

whi!e(RED==0);

)

)

datevalue=((year/l0)?4l(year%10));

WriteSet1302(0x8c,datevalue);

delay!ms(5);

display_Year(year);

delaylms(5);

if(CANL==O)

(

mode=0;

break;

)

if(SET==O)break;

)

WriteSet1302(0x8e,0x80);

)

voidmonthset(void)〃調月

(

uchardatevalue,month;

delaylms(500);

WriteSet1302(0x8e,0x00);

datevalue=ReadSet1302(0x89);

month=(((datevalue&0x70)?4)*10+(datevalue&0x0f));

while(l)

(

if(ADD==0)

(

delaylms(20);

if(ADD==0)

(

month++;

if(month>12)month=l;

while(ADD==0);

)

)

if(RED==0)

(

delaylms(20);

if(RED==0)

month—;

delayIms(100);

if(month==0)month=12;

while(RED==0);

)

}

datevalue=((month/10)?4l(month%10));

WriteSet1302(0x88,datevalue);

delaylms(5);

display_Month(month);

delaylms(5);

if(CANL==0)

(

mode=0;

break;

)

if(SET==0)break;

)

WriteSet1302(0x8e,0x80);

)

voiddayset(void)〃調日

(

uchardatevalue,day;

delaylms(500);

WriteSet1302(0x8e,0x00);

datevalue=ReadSet1302(0x87);

day=(((datevalue&0x70)?4)*10+(datevalue&0x0f));

while(l)

(

if(ADD==0)

(

delaylms(10);

if(ADD==0)

(

day++;

if(day>31)day=l;

while(ADD==0);

)

)

if(RED==0)

delaylms(lO);

if(RED==O)

if(day==0)day=31;

day—;

delaylms(300);

while(RED==0);

datevalue=((day/l0)?4l(day%10));

WriteSet1302(0x86,datevalue);

delaylms(5);

display_Day(day);

delaylms(5);

if(CANL==0)

mode=0;

break;

if(SET==0)break;

)

WriteSet1302(0x8e,0x80);

)

voidTimeSet(void)〃時間調整函數

if(SET==0)

(

delaylms(20);

if(SET==0)

{while(!SET)

mode++;

delaylms(20);

switch(mode)

case1:{yearset();delay1ms(20);}break;

case2:{monthset();delay1ms(20);}break;

case3:{dayset();delay1ms(20);}break;

case4:{hourset();delaylms(20);}break;

case5:{minuteset();delay1ms(20);}break;

)

if(mode==5)mode=0;

ucharflag;

voidDisplay_Integer(unsignedcharx)

(

uchars,g;

s=x%100/10;

g=x%10;

PO=digit[s];

Pl=13;

delaylms(3);

P0=digit[g]+0x80;

Pl=14;

delaylms(3);

PO=digit[1O];

Pl=15;

delaylms(l);

voiddisplay_Temperature(void)

(

ReadyreadDS18B20();

TL=ReadDS18B20();

TH=ReadDS18B20();

if((TH&0XF8)!=0X00)

(

flag=l;

TL=~TL;

TH=~TH;

TL+=1;

if(TL>255)TH+=1;

TN=TH*16+TL/16;

)

TN=TH*i6+TL/16;

Display_Integer(TN);

)

/****************設置模塊******************/

voidSet(void)

(

if(SET==0)

{

delaylms(5);

if(SET==0)

delaylms(50);

while(l)

TimeSet();

if(CANL==O)

break;

voidInitTimerO(void)

TMOD=0x01;

THO=0x3C;

TL0=0x0B0;

EA=1;

ET0=1;

TR0=1;

voidmain()

(

inti;

P0=0;

InitTimerO();

IntDS1302();〃初始化DS1302

delaylms(5);

le=l;

oe=0;

en=0;

delayIms(200);

beep=1;

while(l)

{

for(i=1000;i>0;i-)

Set();

display_Time();

Display_Integer(TN);

if(hours==7llhours==8llhours==9llhours==10llhours==llllhours==12

llhours==14llhours==15llhours==16llhours==17llhours==18llhours==19

llhours==20llhours==21llhours==22)

if(minutes==OxOO)

ucharvalue,w,k;

value=ReadSet1302(0x81);

seconds=(((value&0x70)?4):{:104-(value&0x0f));

if(seconds>0&&seconds<2)

(

for(k=5;k>=0;k—)

(

for(w=100;w>0;w—)

(

beep=0;

delaylms(3);

beep=l;

delaylms(3);

)

delaylms(1000);

)

}

elsebeep=l;

)

)

}

display_Temperature();

)

)

voidt0()interrupt1

(

THO=0x3C;

TLO=OxOBO;

count++;

if(count==10)

{n=0;

)

if(count==20)

{count=0;

n=l;

)

/*******DS]302模塊*************/

sbitSCLK=P2A0;//DS1302時鐘輸入

sbitDATE=P2A1;//DS1302數據輸入

sbitREST=P2A2;//DS1302復位端口

voidWrite1302(uchardate)//|nj1302寫數據

uchari;

SCLK=O;

delaynus(2);

for(i=0;iv8;i++)

(

DATE=date&0x01;

SCLK=1;

delaynus(2);

SCLK=O;

delaynus(2);

date?=l;

)

)

voidWriteSet1302(ucharcmd,uchardate)〃根據相應的命令輸入相應的數據

(

REST=0;

SCLK=0;

REST=1;

Write1302(cmd);

delaynus(5);

Write1302(date);

SCLK=1;

REST=0;

)

ucharRead1302(void)〃讀取1302數據

(

uchari,date;

delaynus(2);

for(i=0;i<8;i++)

(

date?=l;

if(DATE==l)

datel=0x80;

SCLK=1;

delaynus(2);

SCLK=0;

delaynus(2);

)

returndate;

)

ucharReadSet1302(ucharcmd)〃根據命令讀取1302相應的值

uchardate;

REST=O;

SCLK=O;

REST=1;

Write1302(cmd);

delaynus(2);

date=Read1302();

SCLK=1;

REST=0;

returndate;

)

voidIntDS1302(void)//DS1302初始化

(

ucharflag;

flag=ReadSetl302(0x81);

if(flag&0x80)〃判斷時鐘芯片是否關閉

(

WriteSet1302(0x8E,0x00);〃根據寫狀態寄存器命令字,寫入不保護

指令

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論