附录一:系统电路图 (张力中)
11
附录二:程序框图 (张力中)
M2=0 紧急模式 Max7219 倒计时显示 M1=0 普通模式 夜间模式 K2=0 东西向 80s 南北向 60s 键盘赋值 K1=0 初始化 15s 临时通行模式 12
附录三:程 序 (张力中)
#include
#define DIG_0 0x01 #define DIG_1 0x02 #define DIG_2 0x03 #define DIG_3 0x04 #define DIG_4 0x05 #define DIG_5 0x06 #define DIG_6 0x07 #define DIG_7 0x08 Unsigned char
//定义max7219数码管 位
second,second2,count2=0,count1=0,flag1,flag2,shuru1,shuru2,data
disdata[4],i,num1,num2,A,C;
sbit buzzer = P1^3; //报警接口
sbit K1 = P1^4; //初值设定接口 sbit K2 = P1^5; //夜间模式判断接口
sbit redA = P0^0; //东西向红绿灯 sbit yellowA = P0^1;
sbit greenA = P0^2;
sbit DXZ = P0^3; //红灯时东西向右转接口 sbit redB = P0^4; //南北向红绿灯 sbit yellowB = P0^5;
sbit greenB = P0^6;
sbit NBZ = P0^7; //红灯时南北向右转接口 void DelayUs2x(unsigned char t); void DelayMs(unsigned char t); void alarm();
void delay(unsigned int xms); void night_mode(); void normal_mode();
/***************************主程序**************************/ void main() {
Init_Max7219();
redA=0,greenA=0,yellowA=0; //初始状态设定 redB=0,greenB=0,yellowB=0; DXZ=0, NBZ=0; buzzer=0; K1=1; K2=1;
13
if(!K1) //如果K1键按下,说明按键按下,进行初值输入 { i=0; A=keyscan(); while(i<4) //输入4位0~9的数,跳出循环
{
if(A<=9&&A>=0) {
disdata[i]=A; i++;
} A=keyscan();
} num1=disdata[0]*10+disdata[1];
num2=disdata[2]*10+disdata[3]; shuru1=num1; //东西向通行时间赋初值
shuru2=num2;
//南北向通行时间赋初值
} else shuru1=80,shuru2=60; //K1未按下,赋原始初值,东西80s,南北60s second=shuru1; if(!K2) //如果K2键按下,进入夜间模式;不然,进入普通模式 {
night_mode(); } else {
normal_mode(); } }
/*****************定时器、中断初始化*************
void Init_Timer_interrupt() {
TMOD |=0x11; //定时器0、1设置16位定时方式 10ms in 12M crystal TH0=0xd8; //定时器0赋初值
TL0=0xf0;
TH1=0xd8; //定时器1赋初值 TL1=0xf0;
IE =0x8f; //打开全部中断(除串行口) IT0=0; //外部中断设为电平出发
IT1=0; }
/**************定时中断0服务程序*****************/
14
void Interrupt_Timer0() interrupt 1 {
TH0=0xd8; //定时器0重新赋值 TL0=0xf0; count1++;
if (count1==100) //100次为1s {
count1=0;
second--; //second 减1 if(second<=3)
{
switch(flag1)
//second<3s时,绿灯灭,黄灯闪烁、蜂鸣器报警
//flag1为黄灯闪烁标志,为0东西黄灯闪烁,为1南北方向
黄灯闪烁
{
case 0: case 1:
greenA=0;yellowA=!yellowA;buzzer=!buzzer;break; greenB=0;yellowB=!yellowB;buzzer=!buzzer;break;
} }
if(second==0)
{
switch(flag2) {
case 0:
//second读尽时,依据flag2标志,更改second值
//flag2==0时,second=shuru2,读尽时flag2取反;flag2==1时,
second=shuru1,读尽时flag2取反
//同时红绿灯状态变化
buzzer=0;flag1=1;second=shuru2;redA=1;greenA=0;yellowA
=0;redB=0;greenB=1;yellowB =0;DXZ=1;NBZ=0;flag2=!flag2;break;
case 1: buzzer=0;flag1=0;second=shuru1;redA=0;greenA=1;yellowA =0;redB=1;greenB=0;yellowB =0;DXZ=0;NBZ=1;flag2=!flag2;break;
}
} }
}
/****************定时中断1服务程序**************/ void Interrupt_Timer1() interrupt 3 {
unsigned char i;
second=second2;
TH1=0xd8; //定时器1重新赋值 TL1=0xf0; count2++;
for(i=1;i<=9;i++) {
if(count2==10*i)
15
//为达到闪烁效果,100ms闪一次