一.系统概述
系统使用51单片机进行主控,数码管进行站点显示,具体功能如下:
1、一共有6个站点,分别用1~6表示,用发光二极管表示。地铁未启动前6个站以绿灯表示。
2、启动后,将要到的站以黄灯闪烁,开过的站以黄灯表示,将要到站的站号在数码管上显示。
3、可以倒过来运行,用一个按键切换。
4、可以加开关门信息,关门时用蜂鸣器提示。
二.仿真概述
1. 启动仿真,此时地铁没有运行,左侧的提醒灯都是绿灯,站点信息未更新。
2. 当按下启动按键后,每到一个站点对应的站点灯就会亮,并打开开门灯和蜂鸣器提醒。数码管上也会实时更新站点信息。此时到达终点站,地铁停车。
3. 到达终点站后按下换向按键并再按启动按键后,地铁就会原路返回。返程的灯光提醒控制和蜂鸣器的响应方式也是同理。
三.程序设计
#include <REGX52.H>
#include <stdio.h>
#include "delay.h"
#include "key.h"
#include "Nixie.h"
#include "Timer0.h"
sbit G1 = P3^0; // 第一站未启动
sbit Y1 = P1^0; // 第一站指示灯
sbit G2 = P3^1;
sbit Y2 = P1^1;
sbit G3 = P3^2;
sbit Y3 = P1^2;
sbit G4 = P3^3;
sbit Y4 = P1^3;
sbit G5 = P3^4;
sbit Y5 = P1^4;
sbit G6 = P3^5;
sbit Y6 = P1^5;
sbit kaimen = P1^6; //开门
sbit BUZZER = P1^7; //蜂鸣器
unsigned char KeyNum;
unsigned char i,j,Z,Flag,flag1 = 1;
void LED_liang(unsigned char n,unsigned char m);
void LED_shan(unsigned char m);
void main()
{
Timer0_Init();
P3 = 0;
BUZZER = 0;
while(1)
{
KeyNum = Key(); //判断按钮哪个按下
if(KeyNum == 1) //正常运行
{
P3 = 0xFF; //绿灯全灭
Flag = 1; //启动标志
flag1++;
}
if(KeyNum == 2) //
{
Flag = 0;
P1 = 0x7F;
P3 = 0;
flag1++;
if(flag1 > 5)
{
flag1 = 0;
}
}
if(Flag == 1)
{
if(flag1 == 2)
{
Nixie_SetBuf(1,1);
for(Z = 0;Z < 7;Z++)
{
for(j = 0;j < 5;j++)
{
LED_shan(Z+1);
}
kaimen = 0; //开门
LED_liang(1,Z+1); //黄灯
if(Z < 5)
{
Nixie_SetBuf(1,Z+2);
}
if(Z < 6)
{
flag1 = 3;
Delay(5);
BUZZER = 1;
kaimen = 1;
Delay(2);
BUZZER = 0;
}
}
kaimen = 1;
}
if(flag1 == 5)
{
Nixie_SetBuf(1,6);
for(Z = 7;Z > 0;Z--)
{
for(j = 0;j < 5;j++)
{
LED_shan(Z-1);
}
kaimen = 0;
LED_liang(1,Z-1);
if(Z > 2)
{
Nixie_SetBuf(1,Z-2);
}
if(Z > 1)
{
flag1 = 0;
Delay(5);
BUZZER = 1;
kaimen = 1;
Delay(2);
BUZZER = 0;
}
}
kaimen = 1;
}
}
}
}