课程设计报告
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