基于单片机的汽车信号灯控制系统

  • 格式:docx
  • 大小:184.30 KB
  • 文档页数:16

基于单片机的汽车信号灯控制系统————————————————————————————————作者: ————————————————————————————————日期:ﻩ中南大学课程设计(附代码)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 1 0 010 0右转弯0 01 0 01 0紧急开1 01101 01 0合上刹车0 1 1 0左转弯刹车01 0 01 10右转弯刹车0 01 1 01 0紧急刹车1 0111 1 0紧急左1 01 01011 0弯刹车紧急右转弯刹车1 01 011 01停靠1 01101 0倒车0 1 1 1 注:01表示闪烁,1表示亮/鸣喇叭,0表示不亮也不闪烁/不鸣喇叭代码:#include <reg52.h>#include<intrins.h>#defineuchar unsignedchar#define uintunsignedintunsigned char jianzhi;ucharcount=0;uchar count1=0;ﻩ//记录中断次数,count2=20才产生1HZ的时钟脉冲uchar count2=0; //记录中断次数,count2=40才产生0.5HZ的时钟脉冲sbitLF=P0^0; //左头灯sbit RF=P0^1; //右头灯sbit LY=P0^2;ﻩ//左转弯灯sbit RY=P0^3; //右转弯灯sbit LB=P0^4; //左尾灯sbitRB=P0^5; //右尾灯sbit BU=P0^6;ﻩ//蜂鸣器sbitled=P0^7;sbitzong_switch=P1^6;uchar code Key[]={1,2,3,4,5,6};uchar k=16;ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};//延时voidDelayMS(uint x){ﻩuchar i;ﻩ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列的哪一列ﻩ{ﻩﻩcase 1: k=0;break;ﻩcase 2: k=1;break;ﻩcase4:k=2;break;ﻩcase 8: 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ﻩ{ﻩcase 1:ﻩk+=0;break;case 2:k+=4;break;case4:ﻩk+=8;break;case 8:ﻩk+=12;}ﻩreturn(k);}//密码锁uchar Coded_lock()ﻩ{ﻩuchar m=0,j,x=16,y=16;uchar KeyNo[]={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++; ﻩﻩﻩﻩﻩ}ﻩelse if(9<y<16&&y!=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;}//主程序void main(void){uchar i=3,sign=1,flag=0,choose=16;ﻩTMOD=0x01;TH0= (65536-50000)/256;ﻩ//定时器0,方式lTL0=(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;ﻩﻩﻩ}ﻩﻩelse if(i==1) ﻩ//三次密码错误,所有灯高频闪烁,并且蜂鸣器报警ﻩ{ﻩﻩﻩwhile(1){ﻩP0=0xff;ﻩﻩﻩﻩﻩDelayMS(20);ﻩP0=0x00;ﻩDelayMS(20);}ﻩﻩﻩ}ﻩelse if(choose==10) //密码错误,且按下确认键ﻩ{ﻩﻩﻩﻩﻩP3=~0x8e; ﻩ //显示F表示密码错误ﻩﻩﻩﻩDelayMS(100);ﻩﻩi--; //可输入密码次数减一ﻩﻩﻩﻩ}ﻩelseﻩP3=~0x86;ﻩﻩﻩﻩﻩ}ﻩbreak;}ﻩP3=0x00;ﻩTR0=1;while(1);}void time0(void) interrupt 1{//TH0=(65536-50000)/256;//TL0= (65536-50000)%256;P1=0xff;ﻩﻩﻩ// Pl先送Oxff,Pl中保存是按键的值jianzhi=P1; ﻩ//暂存键值到jianzhijianzhi=jianzhi&0x7f; ﻩ //因为最高位不用,去掉switch(jianzhi){ﻩcase 0x3e: //左转弯0011 1110{ﻩBU=0;ﻩﻩ//蜂鸣器不响ﻩﻩRF=1;RB=1;RY=1;ﻩif(count==15){ﻩLF=!LF;LB=!LB;L Y=!LY; ﻩﻩﻩcount=0;}else{count++;}}break;case0x3d:ﻩ//右转弯00111101{BU=0;ﻩﻩ//蜂鸣器不响ﻩLF=1;LB=1;L Y=1;ﻩif(count==15){ﻩRF=!RF;RB=!RB;RY=!RY;ﻩﻩﻩcount=0;ﻩﻩ}else{count++;}}break;ﻩcase0x3b:ﻩﻩ//紧急0011 1011{ﻩﻩBU=0; ﻩ//蜂鸣器不响ﻩﻩif(count==15){ ﻩﻩﻩﻩ LF=!LF;RF=!RF;LY=!LY;RY=!RY;LB=!LB;RB=!RB;count=0;ﻩ}else{count++;}}break;ﻩcase0x37:ﻩﻩ//刹车0011 0111{BU=0; ﻩ//蜂鸣器不响ﻩﻩLB=0;RB=0;ﻩﻩLF=1;RF=1;LY=1;RY=1;}break;case 0x36: //左转弯刹车00110110{BU=0;ﻩﻩﻩ//蜂鸣器不响ﻩRB=0;RF=1;RY=1;if(count==15){LB=!LB;LF=!LF;LY=!LY;count=0;ﻩﻩ}else{count++;}}break;case0x35:ﻩﻩ//右转弯刹车0011 0101{ﻩBU=0; //蜂鸣器不响ﻩLB=0;ﻩLF=1;L Y=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;case 0x32:ﻩﻩﻩﻩ//左转紧急刹车00110010{ﻩBU=0;ﻩﻩﻩ//蜂鸣器不响ﻩﻩRB=0;if(count==15){ﻩﻩﻩLB=!LB;RF=!RF;RY=!RY;LF=!LF;L Y=!LY;count=0;ﻩ}else{count++;}}break;case 0x31: ﻩ//右转紧急刹车0011 0001 {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;ﻩﻩﻩﻩ//蜂鸣器不响L Y=1;RY=1;ﻩﻩif(count1==20){ﻩLF=!LF;RF=!RF;LB=!LB;RB=!RB;ﻩﻩcount1=0;}ﻩelse{count1++;}}break;case0x1f: ﻩ//倒车0001 1111{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;}ﻩ}。