第一篇:單片機控制交通燈的案例
單片機控制交通燈
AT89C51單片機及由Keil 軟件編寫單片機程序,并且通過Proteus仿真測試,設計一個交通燈系統,實現簡單的交通燈的管理功能。在交通燈系統的管理中,用發光二極管模擬交通信號燈,用邏輯電平開關模擬控制開關。在交通繁忙時,交通信號燈控制系統應有手控開關,可人為地改變信號燈的狀態,以緩解交通擁擠狀況。
工作內容及最終成果:
十字路口的交通指揮信號燈控制要求如下:
(1)信號燈受一個起動開關控制,當起動開關接通時,信號系統開始工作,且先南北紅燈亮,東西綠燈亮。當起動開關斷開時,所有信號燈都熄滅。(2)南北綠燈和東西綠燈不能同時亮,如果同時亮時應關閉信號燈系統,并報警。
(3)南北紅燈亮維持25S。在南北紅燈亮的同時東西綠燈也亮,并維持20S。到20S時,東西綠燈閃爍,閃爍3S后熄滅。在東西綠燈熄滅時,東西黃燈亮,并維持2S。到2S時,東西黃燈熄,東西紅燈亮。同時,南北紅燈熄滅,南北綠燈亮。
(4)東西紅燈亮維持30S。南北綠燈亮維持25S。然后閃爍3S,熄滅。同時南北黃燈亮,維持2S后熄滅,這時南北紅燈亮,東西綠燈亮。(5)周而復始。
ORG
0000H
LJMP START
ORG
0040H START:
MOV
SP,#60H
LCALL STATUS0;初始狀態(都是紅燈)CIRCLE:
LCALL STATUS1;南北綠燈,東西紅燈
LCALL STATUS2;南北綠燈閃轉黃燈,東西紅燈
LCALL STATUS3;南北紅燈,東西綠燈
LCALL STATUS4;南北紅燈,東西綠燈閃轉黃燈
LJMP CIRCLE STATUS0:
;南北紅燈,東西紅燈
MOV DPTR,#8300H
MOV A,#0FH
MOVX @DPTR,A
MOV R2,#10
;延時1秒
LCALL DELAY
RET STATUS1:
;南北綠燈,東西紅燈
MOV DPTR,#08300H
MOV A,#96H
;南北綠燈,東西紅燈
MOVX @DPTR,A
MOV R2,#200
;延時20秒
LCALL DELAY
RET STATUS2:
;南北綠燈閃轉黃燈,東西紅燈
MOV DPTR,#8300H
MOV R3,#03H
;綠燈閃3次 FLASH:
MOV A,#9FH
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
MOV A,#96H
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
DJNZ R3,FLASH
MOV A,#06H
;南北黃燈,東西紅燈
MOVX @DPTR,A
MOV R2,#10
;延時1秒
LCALL DELAY
RET STATUS3:
;南北紅燈,東西綠燈
MOV DPTR,#8300H
MOV A,#69H
MOVX @DPTR,A
MOV R2,#200
;延時20秒
LCALL DELAY
RET STATUS4:
;南北紅燈,東西綠燈閃轉黃燈
MOV DPTR,#8300H
MOV R3,#03H
;綠燈閃3次 FLASH1:
MOV A,#6FH
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
MOV A,#69H
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
DJNZ R3,FLASH1
MOV A,#09H
;南北紅燈,東西黃燈
MOVX @DPTR,A
MOV R2,#10
;延時1秒
LCALL DELAY
NOP
RET DELAY:
;延時子程序
PUSH 2
PUSH 1
PUSH 0 DELAY1:
MOV 1,#00H DELAY2:
MOV 0,#0B2H
DJNZ 0,$
DJNZ 1,DELAY2;延時 100 mS
DJNZ 2,DELAY1
POP 0
POP 1
POP 2
RET
END
第二篇:基于51單片機的交通燈控制電路設計
交通燈
一、功能要求
要求甲車道和乙車道兩條交叉道路上的車輛交替運行,每次通行時間都設為25秒,黃燈先亮5秒鐘,才能變換運行車道;黃燈亮時,要求每秒鐘閃亮一次。
二、電路圖
說明:1)每一位數碼管位選要分開,對應IO口參照程序中紅色部分 2)圖示數碼管為共陽,沒加驅動數碼管顯示較暗,建議加驅動
三、程序
//TrafficLight.c #include“reg52.h”
//IO口定義 sbit red_1 =P2^0;//南北方向 sbit red_2 =P2^3;//東西方向 sbit yellow_1 =P2^1;sbit yellow_2 =P2^4;sbit green_1 =P2^2;sbit green_2 =P2^5;sbit com1_1 =P3^6;//十位 南北方向 數碼管位選 sbit com1_2 =P3^7;//個位 南北方向 sbit com2_1 =P3^4;//十位 東西方向 sbit com2_2 =P3^5;//個位 東西方向
//全局變量 char time=30;//倒計時
unsigned char num1=0,num2=0;//輔助計時 unsigned char flag1=0,flag2=0;//黃燈閃標志位 unsigned char shi1,shi2,ge1,ge2;//數碼管十位個位
const unsigned char ledNum[] =
{// 0 1
A
b
c
d
E
F
不顯示-o(18)H(19)h(20)C(21)0(22)n(23)0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8e,0xFF,0xbf,0xa3,0x89,0x8b,0xc6,0xc0,0xab };//共陽數碼管
//中斷優先級別T0>T1,數碼管顯示中斷間隔2ms,計時時間間隔50ms //計時要求比較精確,間隔長,不應該被打斷,故中斷優先級要高,使用T0 //數碼管中斷可以被打斷,打斷時間較短,不會影響顯示,使用T1 //在交通燈中,計時和數碼管顯示一直進行,故定時器開啟后不用停止 void InitInter(void){ TMOD=0x11;//設置定時器工作方式為16位計時器
TH0=(65535-45872)/256;//11.0592M晶振,50ms TL0=(65535-45872)%256;TH1=(65535-1835)/256;//11.0592M晶振,2ms TL1=(65535-1835)%256;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;}
void Display(void){ static unsigned char i=1;
switch(i){ case 1:
com2_2=0;
P0=ledNum[shi1];
com1_1=1;
break;case 2:
com1_1=0;
P0=ledNum[ge1];
com1_2=1;
break;case 3:
com1_2=0;
P0=ledNum[shi2];
com2_1=1;
break;case 4:
com2_1=0;
P0=ledNum[ge2];
com2_2=1;
break;
default:;}
i++;if(i>4)i=1;}
//紅燈可以直接變成綠燈,但綠燈必須先變成黃燈再變紅燈 void main(void){ bit i=0;InitInter();
while(1){
red_1=0;//0為亮
red_2=1;
green_2=0;
time=30;
while(time>5)
{
shi1=time/10;
ge1=time%10;
shi2=(time-5)/10;
ge2=(time-5)%10;
}
green_2=1;
yellow_2=0;
flag2=1;
num2=0;
while(time>0)
{
shi1=time/10;
ge1=time%10;
shi2=time/10;
ge2=time%10;
}
flag2=0;
yellow_2=1;
red_2=0;
red_1=1;
green_1=0;
time=30;
while(time>5)
{
shi2=time/10;
ge2=time%10;
shi1=(time-5)/10;
ge1=(time-5)%10;
}
green_1=1;
yellow_1=0;
flag1=1;
num2=0;
while(time>0)
{
shi2=time/10;
ge2=time%10;
shi1=time/10;
ge1=time%10;
}
flag1=0;
yellow_1=1;
//red_1=0;
//green_2=0;} } void Timer_0(void)interrupt 1//計時 { TH0=(65535-45872)/256;TL0=(65535-45872)%256;num1++;if(num1>=20){
num1=0;
time--;
//if(time<0)time=30;
//處理time,顯示方式
} if(flag1||flag2){
num2++;
if(num2>=10)
{
num2=0;
if(flag1)yellow_1=~yellow_1;
if(flag2)yellow_2=~yellow_2;
} } }
void Timer_1(void)interrupt 3 { TH1=(65535-1835)/256;//11.0592M晶振,2ms TL1=(65535-1835)%256;
Display();}
第三篇:基于單片機控制的交通燈設計系統
基于單片機控制的交通燈設計系統
班級:
姓名:
學號:
第一章 概述 1.設計內容
本系統需要采用AT89C51單片機AT89C5中心器件來設計交通燈控制器,實現以下功能: 1.1初始東西綠燈亮,南北紅燈亮,東西方向通車。1.2黃燈閃爍后,東西路口紅燈亮同時南北路口綠燈亮,南北方向開始通車。1.3延時27s,南北方向綠燈滅,黃燈閃爍3次,然后又切換成東西方向通車,如此重復。
設計交通燈控制系統硬件電路與軟件控制程序,對硬件電路與軟件程序分別進行調試,并進行軟硬件聯調,要求獲得調試成功的仿真圖。2.設計目的
2.1 了解交通燈管理的基本工作原理。2.2 熟悉AT89C51工作原理和應用編程。
2.3 熟悉AT89C51行接口的各種工作方式和應用。
2.4 熟悉AT89C51數器/定時器的工作方式和應用編程外部中斷的方法。2.5 掌握多位LED顯示問題的解決。3.設計原理
AT89C51片機具有控制二連體共陰極數碼管和發光二極管的輸出顯示以及檢測按鍵輸入的功能。利用AT89C51片機模仿制作室外十字路口多功能交通燈,實現室內控制與室外顯示的功能。合理控制交通繁忙,交通特殊情況和恢復交通正常的三種情況。
本設計用4個共陽極LED數碼管的分別表示東、西、南、北四個方向路口,以數碼管的上、中、下3個橫段分別代表紅、黃、綠3盞燈,用P0、P1口分別輸出控制模擬交通燈的狀態顯示的數碼管和倒計時顯示數碼管的狀態碼,P3^
1、P3^
2、P3^4-P3^7控制數碼管的位選,P2^0-P2^4接收中斷信號并反饋給INT0接口進行中斷處理。
第二章 硬件設計
1.設計框圖 如圖2-1所示 此處要有文字說明
圖2-1設計框圖
2.元器件選擇及其功能介紹
AT89C51是一種帶4K字節LASH存儲器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低電壓、高性能CMOS 8位微處理器,俗稱單片機。AT89C2051是一種帶2K字節閃存可編程可擦除只讀存儲器的單片機。單片機的可擦除只讀存儲器可以反復擦除1000次。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。AT89C51單片機為很多嵌入式控制系統提供了一種靈活性高且價廉的方案。AT89C51片引腳圖如下圖2-2所示。
圖2-2 AT89C51片引腳圖
主要特性:
·與MCS-51 兼容
·4K字節可編程閃爍存儲器 ·壽命:1000寫/擦循環 ·數據保留時間:10年 ·全靜態工作:0Hz-24MHz ·三級程序存儲器鎖定 ·128×8位內部RAM ·32可編程I/O線
·兩個16位定時器/計數器,5個中斷源 ·可編程串行通道
·低功耗的閑置和掉電模式 ·片內振蕩器和時鐘電路 3.設計原理圖
硬件電路圖通過Proteus 仿真之后如圖2-3所示,其中: 按鈕K0連接P2^0端口實現紅燈全亮,處理交通意外 按鈕K1連接P2^1端口實現南北方向亮燈時間+1s 按鈕K2連接P2^2端口實現南北方向亮燈時間-1s 按鈕K3連接P2^3端口實現東西方向亮燈時間+1s 按鈕K4連接P2^4端口實現東西方向亮燈時間-1s
圖2-3整體連接電路原理圖
第三章 軟件設計
1.各個程序段介紹 1.1數碼管顯示
void Display(uchar j)//j控制顯示table中連續位的起始點 { char h,l;if(j<11)//根據狀態判定時間
{
h=Time_EW/10;//EW通行時間十位
l=Time_EW%10;//EW通行時間個位
} else if(j<23){
h=Time_SN/10;//SN通行時間十位
l=Time_SN%10;//SN通行時間個位
} for(i=0;i<4;)//按位顯示通行狀況及時間
{
P0=table1[j];//通行狀況顯示
P3=tab[i];//位選顯示
i++;
j++;
if(i%2)//兩位計時顯示
{
P1=table[l];
Delay(400);
}
else
{
P1=table[h];
Delay(400);
} } Delay(5);} 1.2 INT0外部中斷服務程序
void EXINT0(void)interrupt 0//INT0外部中斷 { EX0=0;//關中斷
if(Busy_Button==0){
P0=0xFE;//意外按鈕按下全顯示紅燈
for(;Busy_Button!=1;)//意外按鈕彈起時恢復之前狀態
Display(24);} /*四個時間控制按鈕分別控制SN、EW方向初始通行時間加減,最長不超過s,最少不低于s*/ if(SN_Add==0)//SN+1 {
SN1+=1;
if(SN1>99)
SN1=99;} if(SN_Red==0)//SN-1 {
SN1-=1;
if(SN1<20)
SN1=20;} if(EW_Add==0)//EW+1 {
EW1+=1;
if(EW1>99)
EW1=99;} if(EW_Red==0)//EW-1 {
EW1-=1;
if(EW1<20)
EW1=20;} EX0=1;//開中斷 } 1.3延時子程序
void Delay(uchar a)//循環a次 { uchar x;x=a;while(x--){;} } 2.程序
#define uchar unsigned char #include
uchar x;x=a;while(x--){;} } void Display(uchar j){ char h,l;if(j<11){
h=Time_EW/10;
l=Time_EW%10;} else if(j<23){
h=Time_SN/10;
l=Time_SN%10;} for(i=0;i<4;){
P0=table1[j];
P3=tab[i];
i++;
j++;
if(i%2)
{
P1=table[l];
Delay(400);
}
else
{
P1=table[h];
Delay(400);
} } Delay(5);} void EXINT0(void)interrupt 0 { EX0=0;if(Busy_Button==0){
P0=0xFE;
for(;Busy_Button!=1;)Display(24);} if(SN_Add==0){
SN1+=1;
if(SN1>99)
SN1=99;} if(SN_Red==0){
SN1-=1;
if(SN1<20)
SN1=20;} if(EW_Add==0){
EW1+=1;
if(EW1>99)
EW1=99;} if(EW_Red==0){
EW1-=1;
if(EW1<20)
EW1=20;} EX0=1;
} void timer0(void)interrupt 1 using 1 { TH0=0x3C;TL0=0xB0;count++;if(count==20){
Time_EW--;
Time_SN--;
count=0;} } 第四章 仿真結果及其總結
1.仿真結果圖
1.1正常狀態的仿真結果如圖4-1所示
圖4-1正常狀態
1.2黃燈狀態的仿真結果如圖4-2所示
圖4-2黃燈狀態
1.3緊急狀態的仿真結果如圖4-3所示
圖4-3 緊急狀態
1.4延長通行時間的仿真結果如圖4-4所示
圖4-4延長通行時間
2.總結
通過這次交通燈的課程設計,使我得到了一次用專業知識、專業技能分析和解決現實問題的能力。使我在單片機的基本原理、單片機應用學習過程中,以及在常用編程設計思路技巧的掌握方面都能向前邁了一大步,為日后成為一名合格的應用型人才打下良好的基礎。綜合課程設計讓我把以前學習到的知識得到鞏固和進一步的提高認識,對已有知識有了更深層次的理解和認識。在此,由于自身能力有限,在課程設計中碰到了很多的問題,我通過查閱相關書籍、資料以及和周圍同學交流得到解決。
通過這次交通燈的課程設計,使我了解了寫畢業設計的流程和方法。為自己以后的畢業論文的設計做一次練習,具有積極的意義。還有交通燈是我們生活中非常常見的一種東西,對于我們學以致用的這種能力得到了很好鍛煉,能夠為我們以后的工作于學習打下基礎。
由于本人的水平有限,設計中難免會有一些不合理的部分,系統的穩定性還有待提高,望批評更正。
第四篇:單片機交通燈控制程序
#include
//*****define led port ********** sbit R1=P2^4;//east and west red led sbit Y1=P2^3;//east and west yellow led sbit G1=P2^2;//east and west green led sbit R2=P2^5;//south and north red led sbit Y2=P2^6;//south and north yellow led sbit G2=P2^7;//south and north green led
//*********define key************** sbit k0=P3^0;//emergency sbit k1=P3^1;//east and west pass sbit k2=P3^2;//south and north pass sbit k3=P3^3;//start and subtract 1 sbit k4=P3^4;//pause and add 1 sbit k5=P3^5;//set time
//*********define variable********* bit flag,flag_t;uchar dx_time,nb_time;uchar cnt,pass_time,cnt1,y_time;uchar k0num,k1num,k2num,k3num,k4num,k5num;
//*********define key******** void delay(uint i){ uint x,y;for(x=i;x>0;x--)
for(y=110;y>0;y--);} void timer0_init(){ TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;ET0=1;ET1=1;}
void led_display(uchar dx,nb){ uchar dx1,dx2,nb1,nb2;dx2=dx/10;dx1=dx%10;nb2=nb/10;nb1=nb%10;if(dx>99){
led_w1=1;
led_w2=1;} else {
led_w1=0;
P0=table[dx1];
delay(5);
led_w1=1;
if(dx<10&&dx>0)led_w2=1;
else
{
led_w2=0;
P0=table[dx2];
delay(5);
led_w2=1;
} } if(nb>99){
led_w3=1;
led_w4=1;} else {
led_w3=0;
P0=table[nb1];
delay(5);
led_w3=3;
if(nb<10&&nb>0)led_w4=1;
else
{
led_w4=0;
P0=table[nb2];
delay(5);
led_w4=4;
} } } //*************light work********** void circle_led(){ if(!flag){
if(pass_time>5)
{
led_display(pass_time-5,pass_time);
R1=1;Y1=1;G1=0;
//east and west pass
R2=0;Y2=1;G2=1;
//south and north stop
}
if(pass_time<=5&&pass_time>0)
{
if(cnt>=10)led_display(pass_time,pass_time);
else led_display(100,pass_time);
R1=1;G1=1;
//east and west yellow led flash
if(cnt>=10)Y1=0;
else Y1=1;
R2=0;Y2=1;G2=1;
}
if(pass_time==0)
{
pass_time=nb_time;
flag=1;
} } else {
if(pass_time>5)
{
led_display(pass_time,pass_time-5);
R1=0;Y1=1;G1=1;
//east and west stop
R2=1;Y2=1;G2=0;
//south and north pass
}
if(pass_time<=5&&pass_time>0)
{
if(cnt>=10)led_display(pass_time,pass_time);
else led_display(pass_time,100);
R1=0;Y1=1;G1=1;
R2=1;G2=1;
//south and north yellow led flash
if(cnt>=10)Y2=0;
else Y2=1;
}
if(pass_time==0)
{
pass_time=dx_time;
flag=0;
} } }
void emergency()
//east and west,south and north stop { led_display(0,0);R1=0;Y1=1;G1=1;R2=0;Y2=1;G2=1;} void dx_pass()
//east and west pass,south and north stop { led_display(100,100);if(y_time<=5&&y_time>0){
TR1=1;
R1=0;Y1=1;G1=1;
R2=1;G2=1;
//south and north yellow led flash
if(cnt1>=10)Y2=0;
else Y2=1;} if(y_time==0){
TR1=0;
R1=1;Y1=1;G1=0;
R2=0;Y2=1;G2=1;} } void nb_pass()
//south and north pass,east and west stop { led_display(100,100);if(y_time<=5&&y_time>0){
TR1=1;
R1=1;G1=1;
if(cnt1>=10)Y1=0;//east and west yellow led flash
else Y1=1;
R2=0;Y2=1;G2=1;
} if(y_time==0){
TR1=0;
R1=0;Y1=1;G1=1;
R2=1;Y2=1;G2=0;} }
//***********keyboard scan************ void keyscan(){
if(!k5num)
{
if(k0==0)//*******emergency*******
{
delay(10);
if(k0==0)
{
while(!k0);
TR0=0;
k0num=1;
}
}
if(!k1num&&!k0num)
{
if(k1==0)
{
delay(10);
if(k1==0)
{
while(!k1);
k1num=1;
k2num=0;
y_time=5;//單方向通行時,黃燈閃爍時間
TR0=0;
TR1=1;
}
}
}
if(!k2num&&!k0num)
{
if(k2==0)
{
delay(10);
if(k2==0)
{
while(!k2);
k1num=0;
k2num=1;
y_time=5;//單方向通行時,黃燈閃爍時間
TR0=0;
TR1=1;
}
}
}
if(k3==0)
{
delay(10);
if(k3==0)
{
while(!k3);
if(k1num||k2num)pass_time=dx_time;//由東西或南北通行返回時,重新開始執行。
k0num=0;
k1num=0;
k2num=0;
k4num=0;
k5num=0;
TR0=1;
TR1=0;
flag_t=0;
}
} {
} if(!k4&&!k0num)
//pause { delay(10);if(k4==0){
while(!k4);
TR0=0;
k4num=1;} }
if(k4num==1)
//暫停鍵按下時,才可以調整兩個方向通行時間 if(k5==0){ delay(10);if(k5==0){
k5num++;
while(!k5);
switch(k5num)
{
case 1:
TR0=1;
flag_t=1;//調整時間時,pass_time值不變。
k5num=1;
break;
case 2:
k5num=2;
break;
case 3:
TR0=0;
k5num=0;
pass_time=dx_time;//重新賦值
break;
} } } if(k5num!=0){ if(k3==0){
delay(10);
if(k3==0)
{
while(!k3);
switch(k5num)
{
case 1:
dx_time--;
if(dx_time<10)
break;
case 2:
nb_time--;
if(nb_time<10)
break;
}
}
}
if(k4==0)
{
delay(10);
if(k4==0)
{
while(!k4);
switch(k5num)
{
case 1:
dx_time++;
if(dx_time>=100)
break;
case 2:
nb_time++;
if(nb_time>=100)
break;
}
}
}
} } } void main(){ timer0_init();dx_time=45;nb_time=30;
dx_time=99;nb_time=99;dx_time=10;nb_time=10;
pass_time=dx_time;while(1){ keyscan();if(k0num)emergency();else { switch(k4num){
case 0:
if(!k1num&&!k2num)
circle_led();
else
{
if(k1num)dx_pass();
if(k2num)nb_pass();
}
break;
case 1:
switch(k5num)
{
case 0:
if(!k1num&&!k2num)
circle_led();
else
{
if(k1num)dx_pass();
if(k2num)nb_pass();
}
break;
case 1:
R1=1;Y1=1;G1=1;//調整時間時,關閉所有燈
R2=1;Y2=1;G2=1;
if(cnt<=10)
led_display(100,nb_time);
else
led_display(dx_time,nb_time);
break;
case 2:
R1=1;Y1=1;G1=1;//調整時間時,關閉所有燈
R2=1;Y2=1;G2=1;
if(cnt<=10)
led_display(dx_time,100);
else
led_display(dx_time,nb_time);
break;
}
break;
}
}
} } void timer0()interrupt 1 { TH0=(65536-50000)/256;TL0=(65536-50000)%256;cnt++;if(cnt==20){
cnt=0;
if(flag_t==0)pass_time--;//調整時間時,不執行此操作
} } void timer1()interrupt 3 { TH1=(65536-50000)/256;TL1=(65536-50000)%256;cnt1++;if(cnt1==20){
cnt1=0;
y_time--;//單方向通行時,黃燈閃爍時間。
} }
第五篇:交通燈單片機課程設計
《單片機原理與接口技術課程設計報告》
課題:以交通燈為主的多功能任務設計
班級 學號 學生姓名
指導教師
淮陰工學院 電子與電氣工程學院
2015-6 1
目錄
一、課程設計目的......................................................................................................3
二、設計要求..............................................................................................................3 1. 總體要求........................................................................................................3 2. 具體要求........................................................................................................3 3. 系統硬件總框圖............................................................................................4 1)AT89C52單片機.......................................................................................5 3)數碼管顯示電路........................................................................................6 4)LED燈顯示...............................................................................................7 5)鍵盤掃描模塊............................................................................................7 6)蜂鳴器電路................................................................................................8
三、硬件電路的設計及描述......................................................................................8 1. 硬件總框圖及原理圖....................................................................................8 2. 主程序流程圖..............................................................................................10 3. 各模塊流程圖..............................................................................................11 1)時間顯示程序流程圖..............................................................................12 2)流水燈程序流程圖..................................................................................12 3)利用蜂鳴器的音樂流程圖......................................................................13 4)交通燈控制..............................................................................................13
四、源程序代碼........................................................................................................14
六、調試情況
六、設計心得............................................................................................................20
七、參考文獻............................................................................................................20
一、設計目的
《單片機原理及應用》課程設計是一項重要的實踐性教育環節,是學生在校期間必須接受的一項工程訓練。在課程設計過程中,在教師指導下,應用工程的方法,通過一個簡單課題的設計練習,可使學生初步體驗單片機應用系統的設計過程、設計要求、完成的工作內容和具體的設計方法,了解必須提交的各項工程文件,也達到鞏固、充實和綜合運用所學知識解決實際問題的目的。
通過課程設計,應該能加強學生如下能力的培養:(1)獨立工作能力和創造力;
(2)綜合運用專業及基礎知識,解決實際工程技術問題的能力;(3)查閱圖書資料、產品手冊和各種工具書的能力;(4)工程繪圖的能力;
(5)編寫技術報告和編寫技術資料的能力。
二、設計要求
1.總體要求
(1)獨立完成設計任務(2)繪制系統硬件總框圖(3)繪制系統原理電路圖
(4)制定編寫設計方案,編制軟件框圖,完成詳細完整的程序清單和注釋(5)制定編寫調試方案,編寫用戶操作使用說明書
(6)寫出設計工作小結。對在完成以上文件過程所進行的有關步驟如設計思想、指標論證、方案確定、參數計算、元器件選擇、原理分析等作出說明,并對所完成的設計作出評價,對自己整個設計工作中經驗教訓,總結收獲和今后研究方向。
2.具體要求
本次工程實踐的校內部分主要以單片機為基礎,進行單片機軟件編程,目的 3 是為了提高學生的軟件編程和系統設計能力,整個設計系統包括兩個部分,硬件及軟件部分,硬件部分已經制作成功,學生只需要掌握其原理和焊接相應的元器件,掌握元器件的辨別和元器件的作用以及應用場所即可,另外對所焊接的電路還需要進行仔細的檢查,判斷是否有焊接錯誤的地方或者短路的地方,對出現的異常情況要能夠根據現象判別原因,并具備解決問題的能力,從而切實提高學生的硬件電子電路的分析、判斷能力。
軟件編程是本次課程設計的重要環節。在為期兩周的工程實踐中,將占據主要時間,完成的軟件編程任務主要包括以下幾點:
1)、熟悉Keil C51編程平臺及相關編程軟件
2)、編寫、調試蜂鳴器、繼電器動作、方波程序并進行軟硬件聯調 3)、編寫、調試LED流水燈(循環顯示)程序并進行軟硬件聯調 4)、編寫、調試鍵盤掃描子程序并進行軟硬件聯調 5)、編寫、調試數碼管動態掃描程序并進行軟硬件聯調 6)、基于交通燈的多功能控制設計
其中前五個內容是后兩個內容的基礎,主要是編制一些子程序,為后繼的整個系統設計打下基礎。交通燈控制是在五個課題中選做的一個設計,是一個簡單的單片機編程設計,來實現智能交通燈的多功能作用。
3.系統硬件總框圖
圖1 系統設計總框圖
此次課程設計,AT89C52是一種帶2K字節閃爍可編程可擦除只讀存儲器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低電壓,高性能CMOS 8位微處理器,俗稱單片機。1)AT89C52單片機
設計中所用的單片機型號為AT89C52,其主要功能為:
AT89C52是低功耗、高性能的CMOS 8位單片機。片內帶有8KB的Flash存儲器,且允許在系統內改寫或用編程器編程。另外,AT89C52的指令系統和引腳與80C52完全兼容,所以,近幾年AT89C52單片機應用極為廣泛。
AT89C52單片機除了含有8KB的Flash存儲器外,片內還有256 B的RAM,32條I/O口線,3個16位定時/計算器、6個中斷源、1個全雙工串行口等。同時,與80C52一樣,有空閑和掉電兩種節電運行方式。
AT89C52引腳如下圖所示:
圖2 AT89C52引腳
AT89C52單片機為40腳雙列直插封裝的8 位通用微處理器,采用工業標準的C51內核,在內部功能及管腳排布上與通用的8xc52 相同,其主要用于會聚調整時的功能控制。功能包括對會聚主IC 內部寄存器、數據RAM及外部接口等功能部件的初始化,會聚調整控制,會聚測試圖控制,紅外遙控信號IR的接收解碼及與主板CPU通信等。
2)DS1302模塊
DS1302的RST是復位/片選線,通過把RST輸入驅動置高電平來啟動所有的數據傳送。當RST為高電平時,所有的數據傳送被初始化,允許對DS1302進行操作。如果在傳送過程中RST置為低電平,則會終止此次數據傳送,I/O引腳變為高阻態。
其管腳圖如下:
圖3 DS1302管腳圖
各引腳功能:Vcc1為后備電源,VCC2為主電源,X1和X2是振蕩源,SCLK為輸入端
RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節或多字節數據的傳送手段。
3)數碼管顯示電路
圖4 數碼管顯示電路
設計中采用六位共陰極數碼管,通過單片機STC89C52的P0口控制其位選和段選,以達到動態顯示相應數值的效果。在其位選控制部分,采用了一個9012型三極管,要求當P0口輸出低電平時,位選成功。
所謂動態掃描就是指我們采用分時的方法,輪流控制各個顯示器的COM端,6 使各個顯示器輪流點亮。在輪流點亮掃描過程中,每位顯示器的點亮時間是極為短暫的(約1ms),但由于人的視覺暫留現象及發光二極管的余輝效應,盡管實際上各位顯示器并非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩定的顯示數據,不會有閃爍感。
4)LED燈顯示
圖5 LED顯示模塊
本次課程設計中,“程序語言”通過“翻譯”軟件“翻譯”成單片機所需的二進制代碼,單片機可工作。要用外加電源和分壓電阻來控制低電平驅動點亮,因為單片機不能直接高電平驅動LED燈。如圖D1-D8和R1、R2以及R6-R11連接到單片機IO口,當P1口某腳變低時相應LED發光。實現LED燈的閃爍,只需利用編程方法依次從低位到高位逐個變為低電平,等待少許時刻再變高即可。
5)鍵盤掃描模塊
圖6 按鍵輸入電路
本模塊四個開關分別用于控制流水燈控制電路,時間顯示電路,音樂蜂鳴器電路,交通燈四部分功能。當按下其中一個開關時,該部分電路導通,給單片機 發出地址信號,實現其中一項功能的運做,如圖4所示。
KEYA鍵:其功能是當該鍵按下時,蜂鳴器程序工作; KEYB鍵:其功能是當該鍵按下時,流水燈程序工作;
KEYC鍵:其功能是當該鍵按下時,數碼管動態掃描程序工作; KEYD鍵:其功能是當該鍵按下時,交通燈程序工作。
6)蜂鳴器電
圖7 蜂鳴器電路
路
蜂鳴器單元電路是通過一個PNP三極管來放大驅動蜂鳴器,蜂鳴器的正極接到+5V電源上面,蜂鳴器的負極接到三極管的發射極,三極管的基極經過限流電阻后由單片機的P3.4控制。
當輸出高電平時,三極管截止,蜂鳴器的兩引腳間的直流電壓接近于0V,沒有電流流過線圈,蜂鳴器不發聲;當輸出低電平時,三極管導通,使蜂鳴器的兩個引腳間獲得將接近+5V的直流電壓,這樣蜂鳴器的電流形成回路,發出聲音。因此,我們可以通過程序控制IO口輸出的電平來控制蜂鳴器是否發出聲音,實現各種可能音響的產生。
三、硬件電路的設計及描述
1.硬件總框圖及原理圖
圖8 硬件總框圖
圖9 硬件總原理圖
2.主程序流程圖
3.各模塊流程圖 1)時間顯示程序流程圖
2)流水燈程序流程圖
3)利用蜂鳴器的音樂流程圖
4)智能交通燈
四、源程序代碼
/******************************************************************** * 文件名
: 4個功能由按鍵控制.c * 描
述
: 按下A鍵,實現蜂鳴器動作。
按下B鍵,實現LED流水燈循環顯示。
按下C鍵,實現數碼管動態掃描顯示。
按下D鍵,實現交通燈功能。* 創建人
:
***********************************************************************/ #include
#define uint unsigned int
// 無符號整形習慣的定義
#define uchar unsigned char
//無符號字符型習慣的定義 void buzz_key(void);
//子函數聲明 void led_key(void);void tube_key(void);void traffic(void);unsigned char code duanma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 0 1 2 3 4 5 6 7 8 9
unsigned char code weima[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
// 選擇哪個數碼管
unsigned char temp[6];uchar i=35;uchar k=30;uchar l=5;uchar j;uchar b;
//定義變量
sbit duan=P2^6;//定義管腳 sbit wei=P2^7;sbit key_A=P3^4;sbit key_B=P3^5;sbit key_C=P3^6;sbit key_D=P3^7;sbit buzz=P2^3;sbit DIOLA=P2^5;sbit csda=P3^2;sbit red=P1^0;//交通燈管腳定義 sbit green=P1^1;sbit yellow=P1^2;/******************************************************************** * 名稱 : Delay_1ms()* 功能 : 延時子程序,延時時間為 1ms * x * 輸入 : x(延時一毫秒的個數)* 輸出 : 無
***********************************************************************/
void Delay_1ms(unsigned int t){ unsigned char x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);
}
/******************************************************************** * 名稱 : Main()* 功能 : 實現蜂鳴器,流水燈,數碼管,交通燈
***********************************************************************/ void main(){
DIOLA=0;//流水燈鎖存器關 流水燈未選通
wei=0;//位選關
duan=1;
P0=0;
duan=0;
csda=0;
while(1){
if(key_A==0 || key_B==0 || key_C==0|| key_D==0)
{
if(key_A==0)
//A鍵按下
{
buzz_key();
//調用蜂鳴器子程序
}
else if(key_B==0)//B鍵按下
{
led_key();
//調用流水燈子程序
}
else if(key_C==0)//C鍵按下時
{
tube_key();//調用數碼管顯示子程序
}
else
//D鍵按下時
{
traffic();
//調用交通燈子程序
i=35;
k=30;
l=5;
return;
}
}
} }
/******************************************************************** * 名稱 : buzz_key(void)* 功能 : 蜂鳴器子程序
***********************************************************************/
void buzz_key(void)
{
DIOLA=0;wei=0;
buzz=0;
//蜂鳴器響
while(key_B&&key_C&&key_D&&!key_A);
buzz=1;
//關蜂鳴器
}
/********************************************************************* * 名稱 : led_key(void)* 功能 : 流水燈子程序
***********************************************************************/ void led_key(void){
DIOLA=1;b=0xfe;
P1=b;//11111110 while(key_B==0){
b=_crol_(b,1);
//左移11111101
Delay_1ms(500);
P1=b;
//111111011
Delay_1ms(500);
}
while(key_A&&key_B&&key_C&&key_D);
P1=0xff;
}
/******************************************************************** * 名稱 : tube_key(void)* 功能 : 數碼管子程序
***********************************************************************/
void tube_key(void){
DIOLA=0;
//流水燈使能端置0 while(key_C==0)
{ unsigned int i;
for(i=0;i<6;i++)
{
wei=1;
P0=weima[i];
//位選信號
wei=0;
duan=1;
P0=duanma[i];//段選信號
duan=0;
Delay_1ms(500);
}
duan=1;
P0=0;
duan=0;
//清零
}
}
/******************************************************************** * 名稱 : traffic_key(void)* 功能 : 交通燈子程序
***********************************************************************/
void traffic(void)
{
DIOLA=0;
while(key_D==0)
{
if(i>0)
{
DIOLA=1;
b=0xfe;
P1=b;//11111110
for(j=0;j<40;j++)
{
P0 = 0;
wei=1;
//消隱
P0 = weima[0];
wei=0;
duan=1;
//第1位數碼管顯示
P0 = duanma[(i / 10)%10];//在這里取 i 的個位數
Delay_1ms(40);
//延時40毫秒后顯示下一個數
P0 = 0;
wei=1;
//消隱
P0 = weima[1];
wei=0;
duan=1;
//第2位數碼管顯示
P0 = duanma[i % 10];
//在這里取 i 的個位數
Delay_1ms(40);
//延時40毫秒后顯示下一個數
}
i--;
}
else if(k>0)
{
DIOLA=1;
b=0xfd;
P1=b;//11111110
for(j=0;j<40;j++)
{
P0 = 0;
wei=1;
//消隱
P0 = weima[0];
wei=0;
duan=1;
//第1位數碼管顯示
P0 = duanma[(k / 10)%10];//在這里取 i 的個位數
Delay_1ms(40);
//延時3毫秒后顯示下一個數
P0 = 0;
wei=1;
//消隱
P0 = weima[1];
wei=0;
duan=1;
//第2位數碼管顯示
P0 = duanma[k % 10];
//在這里取 i 的個位數
Delay_1ms(40);
//延時3毫秒后顯示下一個數
}
k--;
}
else if(l>0)
{
DIOLA=1;
b=0xfb;
P1=b;//11111110
for(j=0;j<40;j++)
{
P0 = 0;
wei=1;
//消隱
P0 = weima[0];
wei=0;
duan=1;
//第1位數碼管顯示
P0 = duanma[(l / 10)%10];//在這里取 i 的個位數
Delay_1ms(40);
//延時3毫秒后顯示下一個數
P0 = 0;
wei=1;
//消隱
P0 = weima[1];
wei=0;
duan=1;
//第2位數碼管顯示
P0 = duanma[l % 10];
//在這里取 i 的個位數
Delay_1ms(40);
//延時3毫秒后顯示下一個數
}
l--;
}
}
}
五、設計心得
通過兩個星期的實驗,我的設計雖然有一些毛病,但總體上還是成功的。兩周的時間雖然短暫,但我從中受益匪淺,畢竟在課堂學習到的東西真真正正的用到實際中還是有很大困難的,要把理論運用于實踐確實并非一件易事。我從最初的設想設計一個什么樣的數字電路到繪制電路圖,然后打印排版,最后矯正設計中的漏洞與不足,整個過程我翻閱了大量的資料。
這次交通燈的課程設計,也使我得到了一次用專業知識、專業技能分析和解決現實問題的能力。使我在單片機的基本原理、單片機應用學習過程中,以及在常用編程設計思路技巧的掌握方面都能向前邁了一大步,為日后成為一名合格的應用型人才打下良好的基礎。綜合課程設計讓我把以前學習到的知識得到鞏固和進一步的提高認識,對已有知識有了更深層次的理解和認識。在此,由于自身能力有限,在課程設計中碰到了很多的問題,我通過查閱相關書籍、資料以及和周圍同學交流得到解決。
還有交通燈是我們生活中非常常見的一種東西,對于我們學以致用的這種能力得到了很好鍛煉,能夠為我們以后的工作于學習打下基礎。
六、參考文獻
1.《單片機原理及接口技術》 李朝青 北京航空航天大學出版社,2004 2.《單片機原理及應用》 李全力 高等教育出版社,2001 3.《電子系統設計與實踐》 楊剛,周群 電子工業出出版社,1997 4.《單片機微型計算機技術》 劉國榮 機械工業出版社,1997 5.《數字電子技術》 楊志忠 高等教育出版社,2003 6.《電子技術》 胡宴如 高等教育出版社,2001 7.《電子線路CAD》 王延才 機械工業出版社,2001 8.《單片機應用技術選編》 何利民 北京航空航天大學出版社,1996 9.《單片機應用技術》 吳國經 中國電力出版社,2004 10.《單片機及接口技術實踐教程》 胡健 北京機械工業出版社,2002 11.《使用接口技術》 李廣軍 成都電子科技大學出版社,1998