不要問為什么這么簡單。在最初的要求中一個尾燈控制電路還要求有掉電存儲和檢測功能,也不知道用作什么的。
【設計亮點】
淘寶上常見的LCD1602的并口轉IIC轉接小板原本為在Arduino上使用而設計的,但是既然遵守IIC協議,并且只是PCF8574芯片通信,那么51也可以才對。經過查找,在百度貼吧上找到了使用其驅動LCD1602的程序,并且重新排版編寫使之清晰明了,工程中的LCD1602_IIC.c即為此轉接板的驅動程序。
使用該轉接板,在刷新速度不高的情況下,大大節省了IO口的占用數量。那個轉接板的樣子大概是這樣的:
【設計說明】
設計包含4個獨立按鍵,兩個LED燈代表左右車尾燈。
使用PCF8574轉接板以IIC方式連接LCD1602到單片機。
時鐘電路選用DS1302,僅下載時設定時間。
功能設定:
待機狀態下,顯示當前系統時間;
按下左轉按鍵,左轉指示燈閃爍;
按下右轉按鍵,右轉指示燈閃爍;
按下緊急按鍵,兩指示燈均閃爍;
任意狀態下按住剎車按鍵,兩燈保持常量,松開后還原為原來狀態。
上述4種狀態均有文字提示。
設計使用的單片機型號為STC12C5202AD,包含的頭文件任意,因為沒使用片內的特殊資源。沒有安裝外部晶振,片內的晶振并不十分準確,我測試的時候大約在13MHz左右。
單片機源程序如下:
- #include<STC12C2052AD.h>
- #include"LCD1602_IIC.c"
- #include"DS1302.c"
- sbit LED_Left=P3^0;
- sbit LED_Right=P3^1;
- sbit Key_Left=P3^7;
- sbit Key_Right=P1^0;
- sbit Key_Stop=P1^1;
- sbit Key_Emergency=P1^2;
- //運行標志位
- bit flag_Key_Left=0;//按鍵執行標志位
- bit flag_Key_Right=0;
- bit flag_Key_Stop=0;
- bit flag_Key_Emergency=0;
- unsigned char Flash_Mode=0;//閃爍模式選擇 0:正常待機模式 1:左轉 2:右轉 3:雙閃 4:停止
- //運行數組
- char LCD1602_Buff[17];
- unsigned int T0_Cnt=0;
- /*
- 名稱:基于單片機的汽車尾燈控制系統設計
- 平臺:STC12C5202AD,使用內部RC振蕩器,大約為13MHz
- 說明:
- 設計包含4個獨立按鍵,兩個LED燈代表左右車尾燈。
- 使用PCF8574轉接板以IIC方式連接LCD1602到單片機。
- 時鐘電路選用DS1302,僅下載時設定時間。
- 功能設定:
- 待機狀態下,顯示當前系統時間;
- 按下左轉按鍵,左轉指示燈閃爍;
- 按下右轉按鍵,右轉指示燈閃爍;
- 按下緊急按鍵,兩指示燈均閃爍;
- 任意狀態下按住剎車按鍵,兩燈保持常量,松開后還原為原來狀態。
- 上述4種狀態均有文字提示。
-
- 硬件制作:凌凈清河
- 程序/文檔:凌凈欣羽
- 新礦城學習基地#2019
- */
- void delay(unsigned long i)
- {
- while(i--);
- }
- void Time_Display()
- {
- unsigned char i;
- for(i=0;i<17;i++)
- {
- LCD1602_Buff[i]='\0';//先填充截斷符
- }
- LCD1602_Buff[0]=' ';
- LCD1602_Buff[1]=' ';
- LCD1602_Buff[2]=' ';
- LCD1602_Buff[3]=D_year[0]+'0';
- LCD1602_Buff[4]=D_year[1]+'0';
- LCD1602_Buff[5]=D_year[2]+'0';
- LCD1602_Buff[6]=D_year[3]+'0';
- LCD1602_Buff[7]='-';
- LCD1602_Buff[8]=D_month[0]+'0';
- LCD1602_Buff[9]=D_month[1]+'0';
- LCD1602_Buff[10]='-';
- LCD1602_Buff[11]=D_day[0]+'0';
- LCD1602_Buff[12]=D_day[1]+'0';
- LCD1602_Buff[13]=' ';
- LCD1602_Buff[14]=' ';
- LCD1602_Buff[15]=' ';
- LCD1602_Print(0,0,LCD1602_Buff);
- delay(10000);
- for(i=0;i<17;i++)
- {
- LCD1602_Buff[i]='\0';//先填充截斷符
- }
- LCD1602_Buff[0]=' ';
- LCD1602_Buff[1]=' ';
- LCD1602_Buff[2]=' ';
- LCD1602_Buff[3]=' ';
- LCD1602_Buff[4]=D_hour[0]+'0';
- LCD1602_Buff[5]=D_hour[1]+'0';
- LCD1602_Buff[6]=':';
- LCD1602_Buff[7]=D_minute[0]+'0';
- LCD1602_Buff[8]=D_minute[1]+'0';
- LCD1602_Buff[9]=':';
- LCD1602_Buff[10]=D_second[0]+'0';
- LCD1602_Buff[11]=D_second[1]+'0';
- LCD1602_Buff[12]=' ';
- LCD1602_Buff[13]=' ';
- LCD1602_Buff[14]=' ';
- LCD1602_Buff[15]=' ';
- LCD1602_Print(0,1,LCD1602_Buff);
- }
- void Timer0Init(void) //5毫秒@13MHz
- {
- AUXR |= 0x80; //定時器時鐘1T模式
- TMOD &= 0xF0; //設置定時器模式
- TL0 = 0x18; //設置定時初值
- TH0 = 0x02; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- }
- void sys_init()
- {
- //Ds1302Init();//首次上電寫入時間
- LED_Left=0;
- LED_Right=0;
- LCD1602_Light_Off();
- LCD1602_Init();
- LCD1602_Print(0,0," Ready! ");
- LCD1602_Light_On();
- Timer0Init();
- EA=1;
- ET0=1;
- LED_Left=1;
- LED_Right=1;
- }
- void main()
- {
- sys_init();
- while(1)
- {
- GetTime();
- if(Flash_Mode==0)Time_Display();
-
- if(!Key_Left&&!flag_Key_Left)
- {
- delay(2000);
- if(!Key_Left)
- {
- flag_Key_Left=1;
- LCD1602_Print(0,0," Turn Left ");
- LCD1602_Print(0,1," LED_Left Flash ");
- if(Flash_Mode==1)
- {
- Flash_Mode=0;
- LED_Left=1;
- }
- else
- {
- LED_Right=1;
- Flash_Mode=1;
- }
- }
- }
-
- if(!Key_Right&&!flag_Key_Right)
- {
- delay(2000);
- if(!Key_Right)
- {
- flag_Key_Right=1;
- LCD1602_Print(0,0," Turn Right ");
- LCD1602_Print(0,1," LED_Right Flash");
- if(Flash_Mode==2)
- {
- Flash_Mode=0;
- LED_Right=1;
- }
- else
- {
- LED_Left=1;
- Flash_Mode=2;
- }
- }
- }
-
- if(!Key_Stop&&!flag_Key_Stop)
- {
- unsigned char Temp_Flash_Mode=0;
- delay(2000);
- if(!Key_Stop)
- {
-
- flag_Key_Stop=1;
- LCD1602_Print(0,0," Stop ");
- LCD1602_Print(0,1," LED_Stop Light ");
- Temp_Flash_Mode=Flash_Mode;//模式備份
- Flash_Mode=4;
- LED_Left=0;
- LED_Right=0;
- }
- while(!Key_Stop);
- LED_Left=1;
- LED_Right=1;
- Flash_Mode=Temp_Flash_Mode;//模式還原
- switch(Flash_Mode)//文字還原
- {
- case 1:
- LCD1602_Print(0,0," Turn Left ");
- LCD1602_Print(0,1," LED_Left Flash ");
- break;
- case 2:
- LCD1602_Print(0,0," Turn Right ");
- LCD1602_Print(0,1," LED_Right Flash");
- break;
- case 3:
- LCD1602_Print(0,0," Emergency ");
- LCD1602_Print(0,1," Double Flash ");
- break;
- default:break;
- }
- }
-
- if(!Key_Emergency&&!flag_Key_Emergency)
- {
- delay(2000);
- if(!Key_Emergency)
- {
- flag_Key_Emergency=1;
- LCD1602_Print(0,0," Emergency ");
- LCD1602_Print(0,1," Double Flash ");
- if(Flash_Mode==3)
- {
- Flash_Mode=0;
- LED_Left=1;
- LED_Right=1;
- }
- else
- {
- LED_Left=0;
- LED_Right=0;
- Flash_Mode=3;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
基于單片機的汽車尾燈控制系統設計 凌凈清河.7z
(1.3 MB, 下載次數: 44)
2019-6-5 20:30 上傳
點擊文件名下載附件
|