找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4789|回复: 0
打印 上一主题 下一主题
收起左侧

基于单片机的汽车尾灯控制系统程序设计

[复制链接]
跳转到指定楼层
楼主
不要问为什么这么简单。在最初的要求中一个尾灯控制电路还要求有掉电存储和检测功能,也不知道用作什么的。

【设计亮点】
淘宝上常见的LCD1602的并口转IIC转接小板原本为在Arduino上使用而设计的,但是既然遵守IIC协议,并且只是PCF8574芯片通信,那么51也可以才对。经过查找,在百度贴吧上找到了使用其驱动LCD1602的程序,并且重新排版编写使之清晰明了,工程中的LCD1602_IIC.c即为此转接板的驱动程序。
使用该转接板,在刷新速度不高的情况下,大大节省了IO口的占用数量。那个转接板的样子大概是这样的:



【设计说明】

设计包含4个独立按键,两个LED灯代表左右车尾灯。
使用PCF8574转接板以IIC方式连接LCD1602到单片机。
时钟电路选用DS1302,仅下载时设定时间。
功能设定:
    待机状态下,显示当前系统时间;
    按下左转按键,左转指示灯闪烁;
    按下右转按键,右转指示灯闪烁;
    按下紧急按键,两指示灯均闪烁;
    任意状态下按住刹车按键,两灯保持常量,松开后还原为原来状态。
    上述4种状态均有文字提示。

设计使用的单片机型号为STC12C5202AD,包含的头文件任意,因为没使用片内的特殊资源。没有安装外部晶振,片内的晶振并不十分准确,我测试的时候大约在13MHz左右。

单片机源程序如下:
  1. #include<STC12C2052AD.h>
  2. #include"LCD1602_IIC.c"
  3. #include"DS1302.c"

  4. sbit LED_Left=P3^0;
  5. sbit LED_Right=P3^1;

  6. sbit Key_Left=P3^7;
  7. sbit Key_Right=P1^0;
  8. sbit Key_Stop=P1^1;
  9. sbit Key_Emergency=P1^2;

  10. //运行标志位
  11. bit flag_Key_Left=0;//按键执行标志位
  12. bit flag_Key_Right=0;
  13. bit flag_Key_Stop=0;
  14. bit flag_Key_Emergency=0;
  15. unsigned char Flash_Mode=0;//闪烁模式选择 0:正常待机模式 1:左转 2:右转 3:双闪 4:停止

  16. //运行数组
  17. char LCD1602_Buff[17];
  18. unsigned int T0_Cnt=0;

  19. /*
  20. 名称:基于单片机的汽车尾灯控制系统设计
  21. 平台:STC12C5202AD,使用内部RC振荡器,大约为13MHz
  22. 说明:
  23.         设计包含4个独立按键,两个LED灯代表左右车尾灯。
  24.         使用PCF8574转接板以IIC方式连接LCD1602到单片机。
  25.         时钟电路选用DS1302,仅下载时设定时间。
  26. 功能设定:
  27.         待机状态下,显示当前系统时间;
  28.         按下左转按键,左转指示灯闪烁;
  29.         按下右转按键,右转指示灯闪烁;
  30.         按下紧急按键,两指示灯均闪烁;
  31.         任意状态下按住刹车按键,两灯保持常量,松开后还原为原来状态。
  32.         上述4种状态均有文字提示。
  33.        
  34. 硬件制作:凌净清河
  35. 程序/文档:凌净欣羽
  36. 新矿城学习基地#2019
  37. */

  38. void delay(unsigned long i)
  39. {
  40.         while(i--);
  41. }

  42. void Time_Display()
  43. {
  44.         unsigned char i;
  45.         for(i=0;i<17;i++)
  46.         {
  47.                 LCD1602_Buff[i]='\0';//先填充截断符
  48.         }
  49.         LCD1602_Buff[0]=' ';
  50.         LCD1602_Buff[1]=' ';
  51.         LCD1602_Buff[2]=' ';
  52.         LCD1602_Buff[3]=D_year[0]+'0';
  53.         LCD1602_Buff[4]=D_year[1]+'0';
  54.         LCD1602_Buff[5]=D_year[2]+'0';
  55.         LCD1602_Buff[6]=D_year[3]+'0';
  56.         LCD1602_Buff[7]='-';
  57.         LCD1602_Buff[8]=D_month[0]+'0';
  58.         LCD1602_Buff[9]=D_month[1]+'0';
  59.         LCD1602_Buff[10]='-';
  60.         LCD1602_Buff[11]=D_day[0]+'0';
  61.         LCD1602_Buff[12]=D_day[1]+'0';
  62.         LCD1602_Buff[13]=' ';
  63.         LCD1602_Buff[14]=' ';
  64.         LCD1602_Buff[15]=' ';
  65.         LCD1602_Print(0,0,LCD1602_Buff);
  66.         delay(10000);
  67.         for(i=0;i<17;i++)
  68.         {
  69.                 LCD1602_Buff[i]='\0';//先填充截断符
  70.         }
  71.         LCD1602_Buff[0]=' ';
  72.         LCD1602_Buff[1]=' ';
  73.         LCD1602_Buff[2]=' ';
  74.         LCD1602_Buff[3]=' ';
  75.         LCD1602_Buff[4]=D_hour[0]+'0';
  76.         LCD1602_Buff[5]=D_hour[1]+'0';
  77.         LCD1602_Buff[6]=':';
  78.         LCD1602_Buff[7]=D_minute[0]+'0';
  79.         LCD1602_Buff[8]=D_minute[1]+'0';
  80.         LCD1602_Buff[9]=':';
  81.         LCD1602_Buff[10]=D_second[0]+'0';
  82.         LCD1602_Buff[11]=D_second[1]+'0';
  83.         LCD1602_Buff[12]=' ';
  84.         LCD1602_Buff[13]=' ';
  85.         LCD1602_Buff[14]=' ';
  86.         LCD1602_Buff[15]=' ';
  87.         LCD1602_Print(0,1,LCD1602_Buff);
  88. }

  89. void Timer0Init(void)                //5毫秒@13MHz
  90. {
  91.         AUXR |= 0x80;                //定时器时钟1T模式
  92.         TMOD &= 0xF0;                //设置定时器模式
  93.         TL0 = 0x18;                //设置定时初值
  94.         TH0 = 0x02;                //设置定时初值
  95.         TF0 = 0;                //清除TF0标志
  96.         TR0 = 1;                //定时器0开始计时
  97. }

  98. void sys_init()
  99. {
  100.         //Ds1302Init();//首次上电写入时间
  101.         LED_Left=0;
  102.         LED_Right=0;
  103.         LCD1602_Light_Off();
  104.         LCD1602_Init();
  105.         LCD1602_Print(0,0,"     Ready!     ");
  106.         LCD1602_Light_On();
  107.         Timer0Init();
  108.         EA=1;
  109.         ET0=1;
  110.         LED_Left=1;
  111.         LED_Right=1;
  112. }

  113. void main()
  114. {
  115.         sys_init();
  116.         while(1)
  117.         {
  118.                 GetTime();
  119.                 if(Flash_Mode==0)Time_Display();
  120.                
  121.                 if(!Key_Left&&!flag_Key_Left)
  122.                 {
  123.                         delay(2000);
  124.                         if(!Key_Left)
  125.                         {
  126.                                 flag_Key_Left=1;
  127.                                 LCD1602_Print(0,0,"   Turn Left    ");
  128.                                 LCD1602_Print(0,1," LED_Left Flash ");
  129.                                 if(Flash_Mode==1)
  130.                                 {
  131.                                         Flash_Mode=0;
  132.                                         LED_Left=1;
  133.                                 }
  134.                                 else
  135.                                 {
  136.                                         LED_Right=1;
  137.                                         Flash_Mode=1;
  138.                                 }
  139.                         }
  140.                 }
  141.                
  142.                 if(!Key_Right&&!flag_Key_Right)
  143.                 {
  144.                         delay(2000);
  145.                         if(!Key_Right)
  146.                         {
  147.                                 flag_Key_Right=1;
  148.                                 LCD1602_Print(0,0,"   Turn Right   ");
  149.                                 LCD1602_Print(0,1," LED_Right Flash");
  150.                                 if(Flash_Mode==2)
  151.                                 {
  152.                                         Flash_Mode=0;
  153.                                         LED_Right=1;
  154.                                 }
  155.                                 else
  156.                                 {
  157.                                         LED_Left=1;
  158.                                         Flash_Mode=2;
  159.                                 }
  160.                         }
  161.                 }
  162.                
  163.                 if(!Key_Stop&&!flag_Key_Stop)
  164.                 {
  165.                         unsigned char Temp_Flash_Mode=0;
  166.                         delay(2000);
  167.                         if(!Key_Stop)
  168.                         {
  169.                                
  170.                                 flag_Key_Stop=1;
  171.                                 LCD1602_Print(0,0,"     Stop     ");
  172.                                 LCD1602_Print(0,1," LED_Stop Light ");
  173.                                 Temp_Flash_Mode=Flash_Mode;//模式备份
  174.                                 Flash_Mode=4;
  175.                                 LED_Left=0;
  176.                                 LED_Right=0;
  177.                         }
  178.                         while(!Key_Stop);
  179.                         LED_Left=1;
  180.                         LED_Right=1;
  181.                         Flash_Mode=Temp_Flash_Mode;//模式还原
  182.                         switch(Flash_Mode)//文字还原
  183.                         {
  184.                                 case 1:
  185.                                 LCD1602_Print(0,0,"   Turn Left    ");
  186.                                 LCD1602_Print(0,1," LED_Left Flash ");
  187.                                 break;
  188.                                 case 2:
  189.                                 LCD1602_Print(0,0,"   Turn Right   ");
  190.                                 LCD1602_Print(0,1," LED_Right Flash");
  191.                                 break;
  192.                                 case 3:
  193.                                 LCD1602_Print(0,0,"    Emergency   ");
  194.                                 LCD1602_Print(0,1,"  Double Flash  ");
  195.                                 break;
  196.                                 default:break;
  197.                         }
  198.                 }
  199.                
  200.                 if(!Key_Emergency&&!flag_Key_Emergency)
  201.                 {
  202.                         delay(2000);
  203.                         if(!Key_Emergency)
  204.                         {
  205.                                 flag_Key_Emergency=1;
  206.                                 LCD1602_Print(0,0,"    Emergency   ");
  207.                                 LCD1602_Print(0,1,"  Double Flash  ");
  208.                                 if(Flash_Mode==3)
  209.                                 {
  210.                                         Flash_Mode=0;
  211.                                         LED_Left=1;
  212.                                         LED_Right=1;
  213.                                 }
  214.                                 else
  215.                                 {
  216.                                         LED_Left=0;
  217.                                         LED_Right=0;
  218.                                         Flash_Mode=3;
  219. ……………………

  220. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
基于单片机的汽车尾灯控制系统设计 凌净清河.7z (1.3 MB, 下载次数: 44)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表