实验要求
按照电路要求在Protues中设计电路图,或者使用开发板。编程实现如下功能:
用单片机端口作输出口,控制四个方向共12个发光二极管亮灭,模拟交通灯管理。功能描述如下:初始态为四个路口的红灯全亮之后,东西路口的绿灯亮,南北路口的红灯亮,东西路口方向通车,延时一段时间后东西路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北路口方向开始通车,延时一段时间后,南北路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,再切换到东西路口方向,之后重复以上过程。
代码
#include <reg52.h>
#include <absacc.h>#define PA XBYTE[0x7FFC] //PA端口地址
#define PB XBYTE[0x7FFD]
#define PC XBYTE[0x7FFE]
#define COM XBYTE[0x7FFF]char code dx516[3] _at_ 0x003b;unsigned char Second[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10};
unsigned char count = 0, total = 0;/**************8255初始化******************************/
void init_8255(void)
{COM = 0x80; // C = out B=out A = outPA = 0xFF;PB = 0xFF;}/**************定时器1初始化******************************/
void init_T1(void)
{TMOD = 0x10; //定时器1,模式1TH1 = 0x3c; // 定时为50msTL1 = 0xb0; ET1 = 1; //允许定时器中断1EA = 1; //开总中断TR1 = 1;
}//-------------------
// 函数名称: void delay_s(unsigned t)
// 函数功能: 利用定时器延时t*0.5秒子程序
//-------------------
void delay_s(unsigned char t)
{ TR1 = 1;//启动定时total = t * 10;count = 0;while(1){if(count == total)//定时时间到{count = 0; total = 0;TR1 = 0;return;}}
}void timer1() interrupt 3 //定时器1
{ TR1 = 0;TH1 = 0x3c; // 定时为50msTL1 = 0xb0;count++;TR1 = 1;
}void main(void)
{unsigned char i = 0;init_8255();init_T1();while(1){ for(i = 10;i > 0;i--){PC = Second[i]; if(i < 4)//最后三秒东西方向绿灯和南北方向红灯闪烁。{PA = 0xFF;PB = 0xFF; delay_s(1);PA =0xf6;PB = 0xdb;delay_s(1); }else{PA = 0xf6; //东西绿灯亮PB = 0xdb; //南北红灯亮 delay_s(2);}}for(i = 3;i > 0; i--) //闪烁三秒{PC = Second[i];PA = 0xed;//东西黄灯亮PB = 0xed;//南北黄灯亮 delay_s(1);PA = 0xFF;PB = 0xFF; delay_s(1); }for(i = 10;i > 0;i--){PC = Second[i]; if(i < 4) //最后三秒南北方向绿灯和东西方向红灯闪烁{PA = 0xFF;PB = 0xFF; delay_s(1);PA = 0xDB; PB = 0xf6; delay_s(1); }else{PA = 0xdb; //东西红灯亮PB =0xf6; //南北绿灯亮delay_s(2);}}for(i = 3;i > 0;i--) //闪烁三秒{PC = Second[i];PA = 0xed; //东西黄灯亮PB = 0xed; //南北黄灯亮 delay_s(1);PA = 0xff;PB = 0xff; delay_s(1); }}
}
protues仿真
东西方向绿灯和南北方向红灯:
东西南北方向黄灯闪烁三秒:
东西方向红灯和南北方向绿灯:
总结
起初数码管数字和红绿灯不变化,后来发现是定时器初始化为定时器1,模式1时TMOD赋值出错。还有赋值的二进制是高位到低位与引脚的高位到低位对应。