基于51单片机汽车灯光、刹车灯

张开发
2026/4/7 21:08:43 15 分钟阅读

分享文章

基于51单片机汽车灯光、刹车灯
基于51单片机汽车灯光、刹车仿真程序原理图PCB设计报告功能介绍具体功能1.LCD1602液晶第一行显示超声波的距离第二行显示光线的强弱2.用光敏传感器测光线亮度低于阈值时自动开启灯光3.用超声波测距离低于阈值时自动将远光灯变成近光灯大于阈值时又会自动变换成远光4.按键可设置超声波测距和光敏的阈值并具有掉电保存功能数据保存在STC单片机的内部5.按键可切换成手动模式切换远/近光开/关灯6.刹车灯按键按下对应LED亮起程序#include REGX52.H #include LCD1602.H #include eeprom52.H #include adc0832.H uint time0; int S0; //测量距离 sbit echoP2^3; //超声波接口定义 sbit trigP2^4; bit ir_ok0; //定时测量标志位 sbit led1P1^4; sbit led2P1^6; //手动自动LED指示灯灯接口定义 sbit LED_1P2^0; sbit LED_2P2^1; //远近光灯接口定义 sbit key1P3^2; //设置 sbit key2P3^3; //增加 sbit key3P3^4; //减小 sbit key4P3^5; //手动/自动 sbit key5P3^6; //远光 sbit key6P3^7; //近光 bit key1_flag0; bit key2_flag0; bit key3_flag0; bit key4_flag0; bit key5_flag0; bit key6_flag0; //按键标志位 uchar sec10,sec20,ms0; //sec1、sec2按键长按标志位ms定时自加变量 uchar light_set50,S_set30,state; //光照设置值距离设置值设置变量 bit s0; //液晶闪烁效果标志位 bit memory_flag0; //存储标志位 uchar light0,ad_count; //光照值滤波用累加变量 uint ad_dat0; //ad数据 uchar beam;//0关闭 1近光 2远光 bit A_M0;//0手动 uchar count; //中断累加变量 long int distance; //测量所得距离 void memory() //存储函数 { SectorErase(0x2000); //清扇区 byte_write(0x2000,S_set/256); byte_write(0x2001,S_set%256); //往扇区存设置距离 byte_write(0x2002,light_set); //往扇区存设置光强 } void read_memory() //读存储函数 { S_setbyte_read(0x2000)*256byte_read(0x2001); //将存的数据读出来 light_setbyte_read(0x2002); // if(S_set400||light_set100) //判断数据不正常重新赋值 { S_set30; light_set50; } } void trigger() //测量启动函数 { trig0; _nop_(); //空语句用来占用时间 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); trig1; } void delayt(uint x) //延时函数 { uchar j; while(x-- 0) { for(j 0;j 125;j) { ; } } } //完整资料 /***微信公众号木子单片机********/ void init_measuring() { trig1; echo1; count0; } void measuring() //启动测距信号 { uchar l; uint h,y; TR0 1; while(echo1) { ; } TR0 0; l TL0; h TH0; y (h 8) l; y y - 0xfc66;//us部分 distance y 1000 * count;//计算总时间,单位是微秒 TL0 0x66; TH0 0xfc; delayt(30); S 3453* distance / 200000;//原始为0.34毫米/us*时间/2// } void interrupt_int() //定时器初始化 { TMOD0x11; //定时器0定时器1都用模式1 TH00x00; TL00x00; //定时器0赋初值0 ET01; //使能定时器0 TR00; //先不打开定时器0 TH10x3c; TL10xb0; //定时器1赋值50ms ET11; TR11; //打开定时器1 EA1; //打开总中断 } void display() //显示函数 { if(state0) //如果是非设置状态 { LCD1602_write(0,0x80); //第一行 LCD1602_writebyte(distance:); //显示距离 if(S99) LCD1602_write(1,0x30S/100%10); else LCD1602_writebyte( ); if(S9) LCD1602_write(1,0x30S/10%10); else LCD1602_writebyte( ); LCD1602_write(1,0x30S%10); LCD1602_writebyte(cm ); LCD1602_write(0,0xC0); //第二行 LCD1602_writebyte(light:); //显示光照强度 if(light99) LCD1602_write(1,0x30light/100%10); else LCD1602_writebyte( ); if(light9) LCD1602_write(1,0x30light/10%10); else LCD1602_writebyte( ); LCD1602_write(1,0x30light%10); LCD1602_writebyte(% ); } else //设置状态 { LCD1602_write(0,0x80); //第一行 LCD1602_writebyte(dis_set:); //设置距离 if(state1s0) LCD1602_writebyte( ); //闪烁效果 else { if(S_set99) LCD1602_write(1,0x30S_set/100%10); else LCD1602_writebyte( ); if(S_set9) LCD1602_write(1,0x30S_set/10%10); else LCD1602_writebyte( ); LCD1602_write(1,0x30S_set%10); } LCD1602_writebyte(cm ); LCD1602_write(0,0xC0); LCD1602_writebyte(lig_set:); //设置光照 if(state2s0) LCD1602_writebyte( ); else { if(light_set99) LCD1602_write(1,0x30light_set/100%10); else LCD1602_writebyte( ); if(light_set9) LCD1602_write(1,0x30light_set/10%10); else LCD1602_writebyte( ); LCD1602_write(1,0x30light_set%10); } LCD1602_writebyte(% ); } } void AD_dispose() //光照处理 { if(ad_count10) //读十次光照数据取平均值起到滤波的作用 { ad_datA_D(1); ad_count; } else { lightad_dat/10; light(light*100)/255; //最大是255所以这里扩大100倍除以255可以得到百分比数据 ad_count0; ad_dat0; } } void key_scan() //按键扫描 { if(!key1) //按键1按下 { if(key1_flag) //如果标志位是1 { key1_flag0; //清0 state(state1)%3; //设置变量自加%3限制了最大只能是2 } } else { key1_flag1; //按键松开才会给标志位置1这样的话按键按下只执行一次按键内容起到了松手检测的作用 } if(!key2) { if(key2_flag) { key2_flag0; if(state1) //设置距离状态 { if(S_set400) S_set; //小于400就自加 } else if(state2)//设置光照状态 { if(light_set100) light_set; //小于100就自加 } } if(sec20) //sec20按键长按 { if(state1) //实现连加效果 { if(S_set400) S_set; } else if(state2) { if(light_set100) light_set; } } memory_flag1; //按键每次按下存储标志位置1一次这样只有设置的时候才会存储一次一直执行存储函数会拖慢程序执行速度 } else { key2_flag1; sec22; //按键松开按键标志位置1按键长按变量赋0当按键按下时sec2不会再次赋值2定时器有他的自减当减到0即为按键长按 } if(!key3) //同上 { if(key3_flag) { key3_flag0; if(state1) { if(S_set0) S_set--; } else if(state2) { if(light_set0) light_set--; } } if(sec10) { if(state1) { if(S_set0) S_set--; } else if(state2) { if(light_set0) light_set--; } } memory_flag1; } else { key3_flag1; sec12; } if(!key4) { if(key4_flag) { key4_flag0; A_M!A_M; //手动自动切换 if(A_M0) beam0; //如果切换到手动就把灯关了 } } else { key4_flag1; } if(!key5) { if(key5_flag) { key5_flag0; if(A_M0) //手动状态 { if(beam1) beam2; //远近光灯切换 else beam1; } } } else { key5_flag1; } if(!key6) { if(key6_flag) { key6_flag0; if(A_M0) //手动状态 { beam0; //可关闭远近光灯 } } } else { key6_flag1; } } void police() //自动模式处理函数 { if(lightlight_set) //如果光照小于设置值即天黑 { if(SS_set) beam2; //如果距离大于设置距离远光打开 else beam1; //否则近光打开 } else beam0; //否则光照强就关闭远近光灯 } void main() { interrupt_int(); //调用定时器初始化函数 LCD1602_cls(); //调用1602初始化函数 read_memory(); //调用读存储 init_measuring(); //调用超声波相应端口初始化 while(1) { display(); //显示函数 if(ir_ok) { ir_ok0; trigger(); //触发超声波启动 while(echo0) //等待回声TH0200 { ; } measuring(); //进行距离测量 init_measuring(); //超声波相应端口初始化 } if(memory_flag) //如果存储标志位是1 { memory_flag0; //清0, memory(); //执行一次存储函数 } if(A_M) //如果是自动状态 { led10; //自动模式指示灯点亮 led21; police(); //执行自动处理函数 } else //否则 { led20; //手动指示灯点亮 led11; } AD_dispose(); //调用AD处理函数 switch(beam) //根据beam的值切换远近光灯状态 { case 0:LED_11;LED_21;break; //关闭 case 1:LED_11;LED_20;break; //近光 case 2:LED_10;LED_21;break; //远光 } } } void timer0(void) interrupt 1 //定时器0用来测距计时 { } void timer1(void) interrupt 3 //定时器1 { TH10x3c; //重新赋值50ms TL10xb0; ms; key_scan(); //执行按键扫描函数 if(ms%40) //50*420ms执行以下内容 { ir_ok1; s0~s0; } if(ms20) //50*201000ms1s执行以下内容 { ms0; if(sec1!0) sec1--; if(sec2!0) sec2--; } }硬件设计使用元器件单片机STC89C52注意单片机是通用的无论51还是52、无论stc还是at都一样引脚功能都一样。程序也是一样的。10uF电解电容30p瓷片电容5228光敏电阻电源接口轻触按键草帽LEDLCD1602液晶屏16P排座超声波模块4P排针8位103排阻8550三极管3K电阻10K电阻1K电阻330欧电阻自锁开关ADC0832芯片DIP8底座3mm红色LED灯12M晶振导线若干结构框图设计资料01仿真图本设计使用proteus7.8版本设计不兼容具体如图02原理图本系统原理图采用Altium Designer19设计具体如图03程序本设计使用keil5版本编程设计具体如图04设计报告一万四千字设计报告具体如下05设计资料全部资料包括程序含注释、仿真源文件 、AD原理图、开题报告、结构框图、PCB、设计报告、实物图、元件清单等。具体内容如下全网最全! ​大家共同学习进步点赞分享一起学习成长。

更多文章