基于单片机的汽车信号灯控制系统Word格式.docx
《基于单片机的汽车信号灯控制系统Word格式.docx》由会员分享,可在线阅读,更多相关《基于单片机的汽车信号灯控制系统Word格式.docx(16页珍藏版)》请在冰豆网上搜索。

状态名称
输入状态
输出状态
转弯灯
头灯
尾灯
喇叭
左开关
右开关
紧急开关
刹车开关
左转弯刹车开关
右转弯刹车开关
停靠开关
倒车开关
左
右
左转弯
1
01
右转弯
01
0
紧急开关合上
01
刹车
左转弯刹车
1
右转弯刹车
紧急刹车
紧急左转弯刹车
紧急右转弯刹车
停靠
01
倒车
注:
01表示闪烁,1表示亮/鸣喇叭,0表示不亮也不闪烁/不鸣喇叭
代码:
#include<
reg52.h>
#include<intrins.h>
#define ucharunsignedchar
#defineuintunsignedint
unsignedcharjianzhi;
uchar count=0;
ucharcount1=0;
ﻩ//记录中断次数,count2=20才产生1HZ的时钟脉冲
ucharcount2=0;
//记录中断次数,count2=40才产生0.5HZ的时钟脉冲
sbit LF=P0^0;
//左头灯
sbitRF=P0^1;
//右头灯
sbitLY=P0^2;
ﻩ//左转弯灯
sbitRY=P0^3;
//右转弯灯
sbitLB=P0^4;
//左尾灯
sbitRB=P0^5;
//右尾灯
sbitBU=P0^6;
ﻩ//蜂鸣器
sbit led=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()
uchar Tmp;
ﻩ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;
case2:
k+=4;
break;
case4:
ﻩk+=8;
break;
case8:
ﻩk+=12;
ﻩreturn(k);
}
//密码锁
ucharCoded_lock()ﻩ
{ﻩ
uchar m=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<
y<
16&&y!
ﻩﻩ {
ﻩﻩ P3=~0x86;
ﻩﻩ//显示E,表示重新输入
ﻩﻩ m=0;
ﻩﻩ}ﻩﻩ
}
ﻩx=y;
ﻩy=16;
DelayMS(100);
ﻩﻩ
for(j=0;
j<6;
j++)
if(KeyNo[j]!
=Key[j])
return 0;
break;
ﻩ}
return1;
//主程序
void main(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)interrupt 1
//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;
ﻩcase 0x3b:
ﻩﻩ //紧急00111011
{
ﻩﻩBU=0;
ﻩ//蜂鸣器不响
ﻩﻩ if(count==15)
{ﻩ
ﻩﻩﻩLF=!
LF;
RF=!
LY=!
LY;
RY=!
RY;
LB=!
LB;
RB=!
RB;
count=0;
ﻩ }
else
{count++;
}
}break;
ﻩ
case 0x37:
ﻩﻩ//刹车00110111
{
BU=0;
ﻩ//蜂鸣器不响
ﻩﻩLB=0;
RB=0;
ﻩﻩLF=1;
RF=1;
LY=1;
RY=1;
}break;
case0x36:
//左转弯刹车0011 0110
{
BU=0;
ﻩﻩﻩ//蜂鸣器不响
ﻩRB=0;
RF=1;
RY=1;
if(count==15)
{
LB=!
LB;
LF=!
LF;
LY=!
LY;
count=0;
ﻩﻩ }
else
{count++;
}break;
case 0x35:
ﻩﻩ//右转弯刹车00110101
{
ﻩBU=0;
//蜂鸣器不响
ﻩLB=0;
ﻩ LF=1;
LY=1;
if(count==15)
{
ﻩ RB=!
RF=!
RF;
RY=!
count=0;
ﻩﻩ }
else
{count++;
}break;
case 0x33:
ﻩﻩﻩ//紧急刹车0011 0011
{
ﻩ BU=0;
ﻩ//蜂鸣器不响
ﻩﻩLB=0;
RB=0;
if(count==15)
{
ﻩRF=!
LF=!
LF;
RY=!
RY;
LY=!
LY;
count=0;
ﻩ}
else
{count++;
}break;
case0x32:
ﻩﻩﻩﻩ//左转紧急刹车00110010
ﻩBU=0;
ﻩﻩﻩ//蜂鸣器不响
ﻩﻩ RB=0;
if(count==15)
ﻩﻩﻩLB=!
RF=!
RY=!
LF=!
LY=!
count=0;
ﻩ }
else
{count++;
}break;
case0x31:
ﻩ //右转紧急刹车00110001
BU=0;
ﻩ LB=0;
if(count==15)
{
ﻩﻩ RB=!
RF=!
RY=!
LF=!
LF;
LY=!
count=0;
}
ﻩﻩelse
{count++;
}break;
case0x2f:
ﻩ //停靠00101111
BU=0;
ﻩﻩﻩﻩ//蜂鸣器不响
LY=1;
RY=1;
ﻩﻩ if(count1==20)
{
ﻩ LF=!
RF=!
RF;
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;
}
ﻩ}