提示:实现的功能较为简单,这个是我的假期大作业(但是这个挺重要的,能为初学者节省不必要的大量时间)
8255交通灯
二、🎉主要功能介绍 1.💎流程图2.💍文字介绍用51单片机扩展一片8255,用12个发光二极管模拟一个十字路口的红、绿、黄灯,并设置二个紧急放行按键;正常行驶时,东西或南北方向的灯按绿灯亮7秒,黄灯闪烁3秒,红灯亮10秒;当东西或南北方向的紧急放行按键按下时,禁行方向红灯维持7秒,相对应放行方向为绿灯维持4秒,然后立即变为黄灯闪烁3秒,紧急情况结束后,禁行方向变为绿灯,相对方向变为红灯正常回归循环。
#include //引入头文件
#include//为了外部写入数据的头文件
#define uchar unsigned char //对变量定义名进行简略定义
#define uint unsigned int
#define PA XBYTE[0X0000] //8255A端口地址
#define PB XBYTE[0X0001]//8255B端口地址
#define PC XBYTE[0X0002]//8255C端口地址
#define COM XBYTE[0X0003]//8255A控制口地址
sbit CS = P2^7;//8255 CS片选信号
sbit button1 = P1^0;//紧急开关东西通行
sbit button2 = P1^1;//紧急开关南北通行
uint counter = 10;//倒计时10秒
uint state = 0;//状态选择
uint aaa = 0;//输出口存数
//简单的延时程序
void delay_ms(uchar x)
{uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
//控制状态 交通灯盗撩鹉
void traffic_lights()
{switch(state)//判断状态,从0开始
{//状态1,东西通行,南北禁止
case 0:
aaa = 0x09;//输出PA,东西绿灯南北红灯
PA = aaa;
break;
//状态2,东西缓速停车,南北禁止通行
case 1:
aaa = 0x0a;//东西黄灯,南北红灯
PA = aaa;
delay_ms(1);//闪烁延迟
aaa = 0x08;//东西不亮,南北红灯
PA = aaa;
delay_ms(1);
break;
//状态3,东西禁止,南北通行
case 2:
aaa = 0x24;//东西红灯,南北绿灯
PA = aaa;
break;
//状态4,东西禁止,南北缓速停车
case 3:
aaa = 0x14;//东西红灯,南北黄灯
PA = aaa;
delay_ms(1);//闪烁延迟
aaa = 0x04;//东西红灯,南北不亮
PA = aaa;
delay_ms(1);
break;
}
}
//紧急开关,控制南北或者东西通行
void button()
{if(button1 == 0)
{counter = 7;//数码管显示七秒
state = 0;//变为状态1
}
if(button2 == 0)
{counter = 7;//数码管显示七秒
state = 2;//变为状态2
}
}
//主程序
void main(void)
{//片选信号打开
CS = 0;
//定时器初始化,并启动,延时为20ms
TMOD = 0x01;
TH0 = (65536 - 20000)/256;
TL0 = (65536 - 20000)%256;
IE = 0x82;
TR0 = 1;
//设置8255控制字,PAPBPC口均以方式0输出
COM=0x80;
//进入循环
while(1)
{ button();//判断是否按下紧急开关
traffic_lights();//交通灯亮灭函数
//数码管显示数字
if(counter == 10)
{ PC = counter;
delay_ms(1);
PB = counter;
delay_ms(1);
}
else
{ PB = counter;
delay_ms(1);
PC = counter;
delay_ms(1);
}
}
}
//定时器中断函数
void T0_INT () interrupt 1
{static uint local_counter = 0;//定义循环次数
TH0 = (65536 - 20000)/256;//设置20ms延迟
TL0 = (65536 - 20000)%256;
if(local_counter++ >= 50)//20*50=1s
{ local_counter = 0;//循环次数归零
counter--;//秒数减一
if(state == 0 || state == 2)//关于1,3状态的切换
{ if(counter == 3)
{state=(state + 1)%4;}//循环切换
}
else if(counter == 0)//关于 2,4状态的切换
{ state = (state +1)%4;//循环切换
if(state ==0 || state == 2)//重新为counter置10秒
{ counter = 10;
}
}
}
}
四、🎨(初学者)操作指南
1.🎄我的软件准备2.🎋连接实验图利用protues8连接实验电路图,新建项目等一些基础操作不做赘述。
👓设备图
🥟80C51连接部分
🍜8255连接部分
3.🍟二进制文件🍞交通灯部分
利用Keil5,创建AT89C51项目后,编写导入C语言文件,调整输出设置,编译运行成功后,生成.hex(二进制文件),将这个文件导入protues8的80C51单片机即可。
我的Keil5项目大体就是这样
链接:https://pan.baidu.com/s/1Rt4ONmYPMZjuHw0gW9HVKQ?pwd=1111
提取码:1111 点我跳转
如果对您有用,别忘了帮本座点个赞再走啊!!!
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款