51单片机
回帖(1)
2021-11-4 10:40:21
1. 实验目的
- 学习模拟交通灯控制的实现方法;
- 掌握Proteus硬件仿真与调试。
*2. 任务:
- 根据要求编写程序,并写出原理性注释;
- 将检查程序运行的结果,分析一下是否正确;
- 完成所建工程的仿真及调试。
3. 实验内容及要求
按照威廉希尔官方网站
要求在Protues中设计威廉希尔官方网站
图。编程实现如下功能:
用单片机端口作输出口,控制四个方向共12个发光二极管亮灭,模拟交通灯管理。功能描述如下:初始态为四个路口的红灯全亮之后,东西路口的绿灯亮,南北路口的红灯亮,东西路口方向通车,延时一段时间后东西路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北路口方向开始通车,延时一段时间后,南北路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,再切换到东西路口方向,之后重复以上过程。
**
4
实验代码:
```c
**`#include
#include
#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 = out
PA = 0xFF;
PB = 0xFF;
}
/**************定时器1初始化******************************/
void init_T1(void)
{
TMOD = 0x01; //定时器1,模式1
TH1 = 0x4c; // 定时为50ms
TL1 = 0x00;
ET1 = 1; //允许定时器中断1
EA = 1; //开总中断
TR1 = 1; //启动定时器T1
}
//-------------------
// 函数名称: 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 = 0x4c; // 定时为50ms
TL1 = 0x00;
count++;
TR1 = 1;
}
void main(void)
{
unsigned char i = 0;
init_8255();
init_T1();
while(1)
{
for(i = 10;i > 0;i--)
{
PC = Second;
if(i < 4)
{
PA = 0xf6; //东西绿灯亮
PB = 0xdb;//南北红灯亮
delay_s(10);
PA = 0xff;//交替闪烁
PB = 0xff;//交替闪烁
delay_s(10);
}
else
{
PA = 0xf6; //东西绿灯亮
PB = 0xdb; //南北红灯亮
delay_s(10);
}
}
for(i = 3;i > 0; i--)
{
PC = Second;
PA = 0xed;//东西黄灯亮
PB = 0xed;//南北红灯亮
delay_s(10);
PA = 0xff;//交替闪烁
PB = 0xff;//交替闪烁
delay_s(10);
}
for(i = 10;i > 0;i--)
{
PC = Second;
if(i < 4)
{
PA = 0xdb;//东西红灯亮
PB = 0xf6; //南北绿灯亮
delay_s(10);
PA = 0xff; //红灯闪烁
PB = 0xff; //绿灯闪烁
delay_s(10);
}
else
{
PA = 0xdb; //东西红灯亮
PB = 0xf6; //南北绿灯亮
delay_s(20);
}
}
for(i = 3;i > 0;i--)
{
PC = Second;
PA = 0xed; //东西黄灯亮
PB = 0xed; //南北黄灯亮
delay_s(10);
PA = 0xff;//黄灯闪烁
PB = 0xff;
delay_s(10);
}
}
}
- 仿真结果
1. 实验目的
- 学习模拟交通灯控制的实现方法;
- 掌握Proteus硬件仿真与调试。
*2. 任务:
- 根据要求编写程序,并写出原理性注释;
- 将检查程序运行的结果,分析一下是否正确;
- 完成所建工程的仿真及调试。
3. 实验内容及要求
按照威廉希尔官方网站
要求在Protues中设计威廉希尔官方网站
图。编程实现如下功能:
用单片机端口作输出口,控制四个方向共12个发光二极管亮灭,模拟交通灯管理。功能描述如下:初始态为四个路口的红灯全亮之后,东西路口的绿灯亮,南北路口的红灯亮,东西路口方向通车,延时一段时间后东西路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北路口方向开始通车,延时一段时间后,南北路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,再切换到东西路口方向,之后重复以上过程。
**
4
实验代码:
```c
**`#include
#include
#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 = out
PA = 0xFF;
PB = 0xFF;
}
/**************定时器1初始化******************************/
void init_T1(void)
{
TMOD = 0x01; //定时器1,模式1
TH1 = 0x4c; // 定时为50ms
TL1 = 0x00;
ET1 = 1; //允许定时器中断1
EA = 1; //开总中断
TR1 = 1; //启动定时器T1
}
//-------------------
// 函数名称: 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 = 0x4c; // 定时为50ms
TL1 = 0x00;
count++;
TR1 = 1;
}
void main(void)
{
unsigned char i = 0;
init_8255();
init_T1();
while(1)
{
for(i = 10;i > 0;i--)
{
PC = Second;
if(i < 4)
{
PA = 0xf6; //东西绿灯亮
PB = 0xdb;//南北红灯亮
delay_s(10);
PA = 0xff;//交替闪烁
PB = 0xff;//交替闪烁
delay_s(10);
}
else
{
PA = 0xf6; //东西绿灯亮
PB = 0xdb; //南北红灯亮
delay_s(10);
}
}
for(i = 3;i > 0; i--)
{
PC = Second;
PA = 0xed;//东西黄灯亮
PB = 0xed;//南北红灯亮
delay_s(10);
PA = 0xff;//交替闪烁
PB = 0xff;//交替闪烁
delay_s(10);
}
for(i = 10;i > 0;i--)
{
PC = Second;
if(i < 4)
{
PA = 0xdb;//东西红灯亮
PB = 0xf6; //南北绿灯亮
delay_s(10);
PA = 0xff; //红灯闪烁
PB = 0xff; //绿灯闪烁
delay_s(10);
}
else
{
PA = 0xdb; //东西红灯亮
PB = 0xf6; //南北绿灯亮
delay_s(20);
}
}
for(i = 3;i > 0;i--)
{
PC = Second;
PA = 0xed; //东西黄灯亮
PB = 0xed; //南北黄灯亮
delay_s(10);
PA = 0xff;//黄灯闪烁
PB = 0xff;
delay_s(10);
}
}
}
- 仿真结果
举报
更多回帖