基于单片机.汽车信号灯控制系统方案.doc
《基于单片机.汽车信号灯控制系统方案.doc》由会员分享,可在线阅读,更多相关《基于单片机.汽车信号灯控制系统方案.doc(12页珍藏版)》请在冰点文库上搜索。
word完美格式
中南大学课程设计
(附代码)
20)设计一个基于单片机的汽车信号灯控制系统
设计要求:
分析系统需求,设计出电路原理图,说明工作原理,编写程序及程序流程图。
设计一个基于单片机的汽车信号灯控制系统。
汽车驾驶执行的操作由相应的开关状态反映,所需控制的信号灯有仪表盘左/右转弯灯、左右头灯和左右尾灯共六类灯,还有蜂鸣器喇叭控制的信号。
设计功能:
驾驶操作与灯光信号对应关系如下:
(1)左/右转弯(合上左/右开关):
仪表盘左/右转弯灯、左/右头灯、左/右尾灯闪烁。
(2)紧急开关合上:
所有灯闪烁。
(3)刹车(合上刹车开关):
左右尾灯亮。
(4)左/右转弯刹车:
仪表盘左/右转弯灯、左/右头灯、左/右尾灯闪烁,右/左尾灯亮。
(5)刹车、合上紧急开关:
尾灯亮、仪表板灯、头灯闪烁。
(6)左/右转弯刹车,并合上紧急开关:
右/左尾灯亮,其余灯闪烁。
(7)停靠(合上停靠开关):
头灯、尾灯以1Hz的频率闪烁。
(8)倒车:
尾灯长亮、蜂鸣器以0.5Hz的频率报警。
设计要求:
设计出电路原理图,说明工作原理,编写程序及程序流程图。
仿真操作及现象:
1)合上左转弯开关:
仪表板左转弯灯、左头灯、左尾灯闪烁。
2)合上右转弯开关:
仪表板右转弯灯、右头灯、右尾灯闪烁。
3)合上紧急开关:
所有灯闪烁
4)合上刹车开关:
左右尾灯亮
5)合上左开关和刹车开关:
仪表板左转弯灯、左头灯、左尾灯闪烁,右尾灯亮。
6)合上右开关和刹车开关:
仪表板右转弯灯、右头灯、右尾灯闪烁,左尾灯亮。
7)合上刹车开关、紧急开关(紧急刹车):
左右尾灯亮、左右仪表板灯、头灯闪烁。
8)合上左开关和刹车开关、紧急开关(紧急左转弯刹车):
右尾灯亮,其余灯闪烁。
9)合上右开关和刹车开关、紧急开关(紧急右转弯刹车):
左尾灯亮,其余灯闪烁。
10)合上停靠开关:
左右头灯、尾灯以1Hz的频率闪烁
1)合上倒车开关:
左右尾灯,蜂鸣器以0.5Hz的频率报警。
状态名称
输入状态
输出状态
转弯灯
头灯
尾灯
喇叭
左开关
右开关
紧急开关
刹车开关
左转弯刹车开关
右转弯刹车开关
停靠开关
倒车开关
左
右
左
右
左
右
左转弯
1
0
0
0
0
0
0
0
01
0
01
0
01
0
0
右转弯
0
1
0
0
0
0
0
0
0
01
0
01
0
01
0
紧急开关合上
0
0
1
0
0
0
0
0
01
01
01
01
01
01
0
刹车
0
0
0
1
0
0
0
0
0
0
0
0
1
1
0
左转弯刹车
0
0
0
0
1
0
0
0
01
0
01
0
01
1
0
右转弯刹车
0
0
0
0
0
1
0
0
0
01
0
01
1
01
0
紧急刹车
0
0
1
1
0
0
0
0
01
01
01
01
1
1
0
紧急左转弯刹车
0
0
1
0
1
0
0
0
01
01
01
01
01
1
0
紧急右转弯刹车
0
0
1
0
0
1
0
0
01
01
01
01
1
01
0
停靠
0
0
0
0
0
0
1
0
0
0
01
01
01
01
0
倒车
0
0
0
0
0
0
0
1
0
0
0
0
1
1
1
注:
01表示闪烁,1表示亮/鸣喇叭,0表示不亮也不闪烁/不鸣喇叭
代码:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharjianzhi;
ucharcount=0;
ucharcount1=0; //记录中断次数,count2=20才产生1HZ的时钟脉冲
ucharcount2=0; //记录中断次数,count2=40才产生0.5HZ的时钟脉冲
sbitLF=P0^0; //左头灯
sbitRF=P0^1; //右头灯
sbitLY=P0^2; //左转弯灯
sbitRY=P0^3;//右转弯灯
sbitLB=P0^4; //左尾灯
sbitRB=P0^5; //右尾灯
sbitBU=P0^6; //蜂鸣器
sbitled=P0^7;
sbitzong_switch=P1^6;
ucharcodeKey[]={1,2,3,4,5,6};
uchark=16;
ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};
//延时
voidDelayMS(uintx)
{
uchari;
while(x--)
{for(i=0;i<120;i++);
}
}
//矩阵键盘扫描
ucharKeys_Scan()
{
ucharTmp;
P2=0x0f; //高4位置0,放入4行
DelayMS
(1);
Tmp=P2^0x0f;//按键后0f变成0000XXXX,X中一个为0,3个仍为1,通过异或把3个1变为0,唯一的0变为1
switch(Tmp) //判断按键发生于0~3列的哪一列
{
case1:
k=0;break;
case2:
k=1;break;
case4:
k=2;break;
case8:
k=3;break;
default:
k=16; //无键按下
}
P2=0xf0;//低4位置0,放入4列
DelayMS
(1);
Tmp=P2>>4^0x0f;//按键后f0变成XXXX0000,X中有1个为0,三个仍为1;高4位转移到低4位并异或得到改变的值
switch(Tmp) //对0~3行分别附加起始值0,4,8,12
{
case1:
k+=0;break;
case2:
k+=4;break;
case4:
k+=8;break;
case8:
k+=12;
}
return(k);
}
//密码锁
ucharCoded_lock()
{
ucharm=0,j,x=16,y=16;
ucharKeyNo[]={16,16,16,16,16,16}; //按键序号,16表示无按键
P2=0xf0; //高4位置0,放入4行
//led=1;
while(m<6)
{
P2=0xf0;
if(P2!
=0xf0)
{
y=Keys_Scan(); //扫描键盘获取输入的密码
//P3=~DSY_CODE[y];
if(y<=9&&y!
=x)
{
KeyNo[m]=y;
P3=~DSY_CODE[y];
m++;
}
elseif(9=x)
{
P3=~0x86; //显示E,表示重新输入
m=0;
}
}
x=y;
y=16;
DelayMS(100);
}
for(j=0;j<6;j++)
{
if(KeyNo[j]!
=Key[j])
{
return0;
break;
}
}
return1;
}
//主程序
voidmain(void)
{
uchari=3,sign=1,flag=0,choose=16;
TMOD=0x01;
TH0=(65536-50000)/256; //定时器0,方式l
TL0=(65536-50000)%256; //置初值,产生50ms定时
IE=0x82; //允许T0中断
TR0=0; //关中断
P0=0x3f;
P1=0xff;
P2=0xf0;
P3=0x00;
for(;zong_switch!
=0;) //循环直到总开关按下
{
DelayMS(50);
P3=~0x00;
}
P3=~0x86;
while(zong_switch==0)//总开关按下
{
DelayMS(50);
while
(1)
{
flag=Coded_lock();
DelayMS(50);
choose=16;
while((choose!
=10)&&(choose!
=11)) //循环,直到按下确定或者取消
{
P3=~0xa1; //按确认或者取消
P2=0xf0;
if(P2!
=0xf0)
choose=Keys_Scan();
DelayMS(100);
}
P3=~DSY_CODE[choose];
DelayMS(50);
if(flag==1) //密码正确
{
if(choose==10) //确定
{
break;
}
else
P3=~0x86;
}
elseif(i==1) //三次密码错误,所有灯高频闪烁,并且蜂鸣器报警
{
while
(1)
{
P0=0xff;
DelayMS(20);
P0=0x00;
DelayMS(20);
}
}
elseif(choose==10) //密码错误,且按下确认键
{
P3=~0x8e; //显示F表示密码错误
DelayMS(100);
i--; //可输入密码次数减一
}
else
P3=~0x86;
}
break;
}
P3=0x00;
TR0=1;
while
(1);
}
voidtime0(void)interrupt1
{
//TH0=(65536-50000)/256;
//TL0=(65536-50000)%256;
P1=0xff; //Pl先送Oxff,Pl中保存是按键的值
jianzhi=P1; //暂存键值到jianzhi
jianzhi=jianzhi&0x7f; //因为最高位不用,去掉
switch(jianzhi)
{
case0x3e:
//左转弯00111110
{
BU=0; //蜂鸣器不响
RF=1;
RB=1;
RY=1;
if(count==15)
{
LF=!
LF;
LB=!
LB;
LY=!
LY;
count=0;
}
else
{count++;}
}break;
case0x3d:
//右转弯00111101
{
BU=0; //蜂鸣器不响
LF=1;
LB=1;
LY=1;
if(count==15)
{
RF=!
RF;
RB=!
RB;
RY=!
RY;
count=0;
}
else
{count++;}
}break;
case0x3b:
//紧急00111011
{
BU=0; //蜂鸣器不响
if(count==15)
{
LF=!
LF;
RF=!
RF;
LY=!
LY;
RY=!
RY;
LB=!
LB;
RB=!
RB;
count=0;
}
else
{count++;}
}break;
case0x37:
//刹车00110111
{
BU=0; //蜂鸣器不响
LB=0;
RB=0;
LF=1;
RF=1;
LY=1;
RY=1;
}break;
case0x36:
//左转弯刹车00110110
{
BU=0; //蜂鸣器不响
RB=0;
RF=1;
RY=1;
if(count==15)
{
LB=!
LB;
LF=!
LF;
LY=!
LY;
count=0;
}
else
{count++;}
}break;
case0x35:
//右转弯刹车00110101
{
BU=0; //蜂鸣器不响
LB=0;
LF=1;
LY=1;
if(count==15)
{
RB=!
RB;
RF=!
RF;
RY=!
RY;
count=0;
}
else
{count++;}
}break;
case0x33:
//紧急刹车00110011
{
BU=0; //蜂鸣器不响
LB=0;
RB=0;
if(count==15)
{
RF=!
RF;
LF=!
LF;
RY=!
RY;
LY=!
LY;
count=0;
}
else
{count++;}
}break;
case0x32:
//左转紧急刹车00110010
{
BU=0; //蜂鸣器不响
RB=0;
if(count==15)
{
LB=!
LB;
RF=!
RF;
RY=!
RY;
LF=!
LF;
LY=!
LY;
count=0;
}
else
{count++;}
}break;
case0x31:
//右转紧急刹车00110001
{
BU=0; //蜂鸣器不响
LB=0;
if(count==15)
{
RB=!
RB;
RF=!
RF;
RY=!
RY;
LF=!
LF;
LY=!
LY;
count=0;
}
else
{count++;}
}break;
case0x2f:
//停靠00101111
{
BU=0; //蜂鸣器不响
LY=1;
RY=1;
if(count1==20)
{
LF=!
LF;
RF=!
RF;
LB=!
LB;
RB=!
RB;
count1=0;
}
else
{count1++;}
}break;
case0x1f:
//倒车00011111
{
LB=0;
RB=0;
LF=1;
RF=1;
LY=1;
RY=1;
if(count2==40)
{
BU=!
BU;
count2=0;
}
else
{count2++;}
}break;
default:
P0=0x3f;break;
}
}
精心整理学习帮手