分为一个主干道和一个次干道。主干道直行方向绿灯亮通行50s (后三 杪直行方向绿灯闪烁),接下来三秒直行方向黄灯闪烁,然后主干道直行方向灯变红灯,左拐方向灯变成绿灯,左拐持续时间为20s (后三秒左拐绿灯闪 烁),接下来三秒左拐黄灯闪烁,然后主干道直行灯和左拐灯全都变红灯。
同时,次干道直行灯由原来的红灯变成绿灯,直行通行时间为20s,左拐持续 时间15s,重复和主干道类似的过程。
然后再次重复上述过程并一直持续下去。
直行和左拐灯用LED点阵显示,剩余时间用LED数码管显示。
给定单片机频率为11. 0592MHzo设计硬件电路图并用图纸绘制电路图,在Keil中编写代码并在Proteus上做出仿真并撰写课程设计说明书。
#include "lcd1602.h"
void delay_uint(uint i)
{
while(i--);
}
/********************************************************************
* 名称 : write_com(uchar com)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_uint(20);
e=1;
delay_uint(20);
e=0;
}
/********************************************************************
* 名称 : write_data(uchar dat)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_uint(20);
e=1;
delay_uint(20);
e=0;
}
/********************************************************************
* 名称 : write_string(uchar hang,uchar add,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
write_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == '�') break;
write_data(*p);
p++;
}
}
/********************************************************************
* 名称 : init_1602()
* 功能 : 初始化1602液晶
* 输入 : 无
* 输出 : 无
***********************************************************************/
void init_1602()
{
write_com(0x38); //数据总线为8位,显示2行,5x7点阵
write_com(0x0c); //开显示,有光标,光标闪烁
write_com(0x06); //光标自动右移
delay_uint(1000); //等待设置完成
}
资料借鉴于此纷传