单片机控制十字路口交通灯概要 下载本文

课程设计报告

dts = 0; Easw = 79;

//东西方向数码管初值79 Soun = 82;

//南北方向数码管初值82 P1 = 0X24;

//初始化东西方向亮绿灯 //初始化南北方向亮红灯

}

/*数码管数字显示处理函数:通过定时器精确定时,动态地显示交通灯时间的变化 */

void Display() {

unchar i;

unchar Ewsn[4]={0};

//定义一个只含四个元素的一位数组 void Digit_deal(); //数字变化处理函数声明 if(t >= 20)

//t=20时,定时1秒,Easw、Soun做自减 {

t= 0; Easw--; Soun--; }

Digit_deal();

//数字变化处理函数 Ewsn[0] = Easw/10; //东西显示数字十位 Ewsn[1] = Easw; //东西显示数字个位 Ewsn[2] = Soun/10; //南北显示数字十位 Ewsn[3] = Soun; //南北显示数字个位 for(i=1;i<5;i++) {

Write7219(i,Ewsn[i-1]); //4位共阴数码管显示 } }

/*地址、数据发送子程序:MAX7219地址和数据的发送,以确保数码管的正常显示*/

void Write7219(unchar address,unchar dat)

17

课程设计报告

{

unchar i; LOAD=0;

//拉低片选线,选中器件 //发送地址

for (i=0;i<8;i++) //移位循环8 次 {

CLK=0;

//清零时钟总线

DIN=(bit)(address&0x80); //每次取高字节 address<<=1; //左移一位 CLK=1;

//时钟上升沿,发送地址 }

//发送数据

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

CLK=0;

DIN=(bit)(dat&0x80); dat<<=1; CLK=1;

//时钟上升沿,发送数据 }

LOAD=1;

//发送结束,上升沿锁存数据

}

/*数字变化处理函数:对东西南北方向数字变换时值的处理 void Digit_deal() {

//东西方向数字变换

if(!Easw)

//Easw为0时,dte加1 {

dte ++; }

if((Easw == 0) && (dte == 1))

//Easw为0且dte为1时,东西方向数字置为3,亮黄灯{

Easw = 3; P16 = 1; P15 = 0;

*/ 18

课程设计报告

P17 = 0; }

if((Easw == 0) && (dte == 2))

//Easw为0且dte为2时,东西方向数字置为63,亮红灯 {

Easw = 63; P16 = 0; P15 = 0; P17 = 1; }

if((Easw == 0) && (dte == 3))

//Easw为0且dte为3时,东西方向数字置为79,dte置0,亮绿灯 {

Easw = 79; dte = 0; P16 = 0; P15 = 1; P17 = 0; }

//南北方向数字变换

if(!Soun)

//Soun为0时,dts加1 {

dts ++; }

//Soun为0且dts为1时,南北方向数字置为60,亮绿灯 if((Soun == 0) && (dts == 1)) {

Soun = 60; P10 = 1; P11 = 0; P12 = 0;

} if((Soun == 0) && (dts == 2))

//Soun为0且dts为2时,南北方向数字置为3,亮黄灯 {

Soun = 3; P10 = 0; P11 = 1; P12 = 0; }

if((Soun == 0) && (dts == 3))

//Soun为0且dts为3时,南北方向数字置为82,dts置0,亮红灯 {

19

课程设计报告

Soun = 82; dts = 0; P10 = 0; P11 = 0; P12 = 1; }

}

/*定时器0中断函数:产生50ms脉冲,实现1s钟时间定时*/ void Time0() interrupt 1 {

TH0 = 0X4C; TL0 = 0X00; t++; } 20