C51单片机
回帖(1)
2021-10-20 11:22:46
实验目的:
- 学习模拟交通灯控制的实现方法;
- 掌握Proteus硬件仿真与调试。
任务:
- 根据要求编写程序,并写出原理性注释;
- 将检查程序运行的结果,分析一下是否正确;
- 完成所建工程的仿真及调试。
实验内容
按照电路要求在Protues中设计电路图。编程实现如下功能:
用单片机端口作输出口,控制四个方向共12个发光二极管亮灭,模拟交通灯管理。功能描述如下:初始态为四个路口的红灯全亮之后,东西路口的绿灯亮,南北路口的红灯亮,东西路口方向通车,延时一段时间后东西路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北路口方向开始通车,延时一段时间后,南北路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,再切换到东西路口方向,之后重复以上过程。
交通灯控制流程图
Proteus 仿真原理图
代码
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
#define CON XBYTE[0x0003] //控制寄存器端口地址
#define PA XBYTE[0x0000] //PA端口地址
#define PB XBYTE[0x0001] //PB端口地址
#define PC XBYTE[0x0002] //PC端口地址
uchar count=0;
uchar sum_time=0;
//定义一个数组,用来显示计时信息
uchar time[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10};
//定时器的初始化
void time_init(){
TMOD=0x10; //定时器1,模式1
TH1=0x3c; //定时为50ms
TL1=0xb0;
EA=1;
ET1=1;
TR1=0; //关闭定时
}
//中断函数
void int_timer_1() interrupt 3{
TR1=0;
TH1=0x3c;
TL1=0xb0;
count++;
TR1=1;
}
//利用中断写的延时函数,当形参为1时,延时500ms
void delay_500ms(uchar t){
time_init();
TR1=1; //启动定时
sum_time=t*10;
while(1){
if(count==sum_time){ //定时时间到
count=0;
sum_time=0;
TR1=0;
return;
}
}
}
//将交通灯熄灭
void clc_light(){
PA = 0xff;
PB = 0xff;
}
//8255的初始化
void init_8255(){
CON=0x80;
clc_light();
PC=0x00;
}
//交通灯显示
void traffic_lights(){
uchar i;
clc_light();
PA=0xf6;
PB=0xdb;
for(i=10;i>0;i--){
PC=time;
//最后3s,东西方向绿灯闪烁,南北方向红灯闪烁
if(i<=3){
clc_light();
delay_500ms(1);
PA=0xf6;
PB=0xdb;
delay_500ms(1);
}else{ //前7s,灯保持常亮
delay_500ms(2);
}
}
//黄灯闪烁3次
clc_light();
for(i=3;i>0;i--){
PC=time;
clc_light();
delay_500ms(1);
PA=0xed;
PB=0xed;
delay_500ms(1);
}
clc_light();
PA=0xdb;
PB=0xf6;
for(i=10;i>0;i--){
PC=time;
//最后3s,东西方向红灯闪烁,南北方向绿灯闪烁
if(i<=3){
clc_light();
delay_500ms(1);
PA=0xdb;
PB=0xf6;
delay_500ms(1);
}else{ //前7s,灯保持常亮
delay_500ms(2);
}
}
//黄灯闪烁3次
clc_light();
for(i=3;i>0;i--){
PC=time;
clc_light();
delay_500ms(1);
PA=0xed;
PB=0xed;
delay_500ms(1);
}
}
void main(){
init_8255();
//初始状态,红灯全亮
PA=0xdb;
PB=0xdb;
delay_500ms(2);
while(1){
traffic_lights();
}
}
实验目的:
- 学习模拟交通灯控制的实现方法;
- 掌握Proteus硬件仿真与调试。
任务:
- 根据要求编写程序,并写出原理性注释;
- 将检查程序运行的结果,分析一下是否正确;
- 完成所建工程的仿真及调试。
实验内容
按照电路要求在Protues中设计电路图。编程实现如下功能:
用单片机端口作输出口,控制四个方向共12个发光二极管亮灭,模拟交通灯管理。功能描述如下:初始态为四个路口的红灯全亮之后,东西路口的绿灯亮,南北路口的红灯亮,东西路口方向通车,延时一段时间后东西路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北路口方向开始通车,延时一段时间后,南北路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,再切换到东西路口方向,之后重复以上过程。
交通灯控制流程图
Proteus 仿真原理图
代码
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
#define CON XBYTE[0x0003] //控制寄存器端口地址
#define PA XBYTE[0x0000] //PA端口地址
#define PB XBYTE[0x0001] //PB端口地址
#define PC XBYTE[0x0002] //PC端口地址
uchar count=0;
uchar sum_time=0;
//定义一个数组,用来显示计时信息
uchar time[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10};
//定时器的初始化
void time_init(){
TMOD=0x10; //定时器1,模式1
TH1=0x3c; //定时为50ms
TL1=0xb0;
EA=1;
ET1=1;
TR1=0; //关闭定时
}
//中断函数
void int_timer_1() interrupt 3{
TR1=0;
TH1=0x3c;
TL1=0xb0;
count++;
TR1=1;
}
//利用中断写的延时函数,当形参为1时,延时500ms
void delay_500ms(uchar t){
time_init();
TR1=1; //启动定时
sum_time=t*10;
while(1){
if(count==sum_time){ //定时时间到
count=0;
sum_time=0;
TR1=0;
return;
}
}
}
//将交通灯熄灭
void clc_light(){
PA = 0xff;
PB = 0xff;
}
//8255的初始化
void init_8255(){
CON=0x80;
clc_light();
PC=0x00;
}
//交通灯显示
void traffic_lights(){
uchar i;
clc_light();
PA=0xf6;
PB=0xdb;
for(i=10;i>0;i--){
PC=time;
//最后3s,东西方向绿灯闪烁,南北方向红灯闪烁
if(i<=3){
clc_light();
delay_500ms(1);
PA=0xf6;
PB=0xdb;
delay_500ms(1);
}else{ //前7s,灯保持常亮
delay_500ms(2);
}
}
//黄灯闪烁3次
clc_light();
for(i=3;i>0;i--){
PC=time;
clc_light();
delay_500ms(1);
PA=0xed;
PB=0xed;
delay_500ms(1);
}
clc_light();
PA=0xdb;
PB=0xf6;
for(i=10;i>0;i--){
PC=time;
//最后3s,东西方向红灯闪烁,南北方向绿灯闪烁
if(i<=3){
clc_light();
delay_500ms(1);
PA=0xdb;
PB=0xf6;
delay_500ms(1);
}else{ //前7s,灯保持常亮
delay_500ms(2);
}
}
//黄灯闪烁3次
clc_light();
for(i=3;i>0;i--){
PC=time;
clc_light();
delay_500ms(1);
PA=0xed;
PB=0xed;
delay_500ms(1);
}
}
void main(){
init_8255();
//初始状态,红灯全亮
PA=0xdb;
PB=0xdb;
delay_500ms(2);
while(1){
traffic_lights();
}
}
举报
更多回帖