单片机交通灯实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《单片机》技术期末总结报告

基于单片机的交通灯控制器设计

一、目的

利用发光二极管模拟交通灯的控制。

二、程序功能

模拟交通灯显示。

八位发光二极管分成2组,分别代表交通路口甲、乙两个方向的信号灯(红、黄、绿、左转)。其中,红灯与绿灯显示时间均为50s,左转显示时间为15s,黄灯显示5s。其状态表如下:

在信号灯亮的同时,在LED数码管上显示响应的时间(每个方向用2个数码管,倒计时)。

三、电路原理图

发光二极管电路图:

数码管电路图: R00

Q20 R201-2 LCD 2-3 DSY

P00 P01 P02 P03 P04 P05 P06 P07

a

b

c

d

e

f

g

dp

R01

R02

R03

R04

R05

R06

R07

R21

R22

R23

R24

R25

a b c d e f g d

p

a b c d e f g d

p

R26

R27

a

b

f

c

g

d

e

dp

a

b

f

c

g

d

e

dp

a

b

f

c

g

d

e

dp

1

298

DIG1DIG2DIG3

1

23

45

71

1

1

a b c d e f g dp

a

b

f

c

g

d

e

dp

DIG4

6

DS1

P20 P21 P22 P23 P24 P25 P26 P27

1

2

3

4

JP2

3-4 LED

VCC

a

b

f

c

g

d

e

dp

a

b

f

c

g

d

e

dp

a

b

f

c

g

d

e

dp

1

298

DIG1DIG2DIG3

1

23

45

71

1

1

a b c d e f g dp

a

b

f

c

g

d

e

dp

DIG4

6

DS2

Q21Q22Q23Q24Q25Q26Q27

四、程序流程:

五、程序源码(应有必要的注释):

程序功能:模拟交通灯显示。

其中,红灯与绿灯显示时间均为50s,中间的黄灯显示时间为15s。

绿灯用八位发光二极管流动闪烁作代表;

红灯用八位发光二极管全亮作代表;

黄灯用八位发光二极管全亮全灭闪烁作代表。

刚开始显示的为绿灯。

显示顺序:绿--黄--红--黄--绿--黄--红--………………#include

#define uchar unsigned char

#define uint unsigned int

sbit dula=P2^6;

sbit wela=P2^7;

sbit beep=P2^3;

unsigned int pp;

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar j,k,l=255;

uchar a1,a0;

uchar shijian,deng=2;

void delay(unsigned int i) //延时程序

{ for(j=i;j>0;j--)

for(k=125;k>0;k--);}

void display(unsigned char sh_c,unsigned char g_c) //定义灯亮的方式函数

{ dula=0;

P0=table[sh_c];

dula=1;

dula=0;

wela=0;

P0=0xfe;

wela=1;

wela=0;

delay(5);

P0=table[g_c];

dula=1;

dula=0;

P0=0xfd;

wela=1;

wela=0;

delay(5);}

void main() //主函数

{ TMOD=0x01;

TR0=1;

TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。

TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12

ET0=1;

EA=1;

while(1)

{ if(shijian==0)

{

switch(deng)

{

case 0: shijian=50; //红灯

deng=1;

break;

case 1: shijian=15; //黄灯

deng=2;

break;

case 2: shijian=50; //绿灯

deng=3;

break;

case 3: shijian=15; //黄灯

deng=0;

break; } }

if(pp==20)

{ pp=0;

shijian--; }

a0=shijian%10;

a1=shijian/10;

display(a1,a0);

switch(deng) //这是个循环函数,由上边switch(deng)

的循环得出灯的值为多少,对应的灯值为下边那个对用的情况来选择执行。

{ case 1: P1=0X00; //红灯

break;

case 2: //黄灯

if(shijian%2==0)

P1=0x00;

if(shijian%2==1)

P1=0xff;

break;

case 3: //绿灯

if(shijian%2==0)

P1=0x55;

if(shijian%2==1)

P1=0xaa;

相关文档
最新文档