標題: 單片機汽車車燈控制器程序求指導 [打印本頁]
作者: wwavd 時間: 2021-5-9 17:33
標題: 單片機汽車車燈控制器程序求指導
由于本論壇禁止直接求程序,禁止伸手黨,所以向大家請教一下大致的實現方法與思路,理清頭緒后我自己去實現,謝謝大家
這個是程序
這是電路圖
要求能夠實現:
按下剎車鍵K1,6個燈管同時點亮。
按下左轉鍵K2,D3向D1燈管延時一秒依次點亮。
按下右轉鍵K3,D4向D6燈管延時一秒依次點亮。
按下停車鍵K4,6個燈管同時閃爍點亮。
UC截圖20210509172901.png (39.34 KB, 下載次數: 58)
下載附件
電路圖
2021-5-9 17:32 上傳
單片機源程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
///////按鍵接口////////////////
sbit k1=P1^0; //剎車信號
sbit kz=P1^1; //左轉信號
sbit ky=P1^2; //右轉信號
sbit k2=P1^3; //停車信號
///////左邊led接口///////////////////////
sbit z3=P2^5; //左1
sbit z2=P2^4; //左2
sbit z1=P2^3; //左3
///////右邊led接口///////////////////////
sbit y1=P2^2; //右1
sbit y2=P2^1; //有2
sbit y3=P2^0; //右3
bit flag=0; //開始循環標志位
uchar num,miao;
void delay(uint ms) //ms級延時函數
{
uchar j;
for(ms;ms>0;ms--)
for(j=110;j>0;j--);
}
void kong_zhi() //信號控制函數
{
if(k1==0) //剎車信號
{
delay(10); //消抖
if(k1==0)
{
z1=z2=z3=y1=y2=y3=0; //剎車所有6只尾燈同時亮
}
while(!k1); //剎車松開檢測
z1=z2=z3=y1=y2=y3=1; //剎車松開所有6只尾燈同時滅
}
if(k2==0) //停止信號
{
delay(10); //消抖
TR0=1; //開啟定時器
num=0;
while(!k2) //停止松開檢測
{
//500ms的亮滅信號既是1HZ
if(num<10)z1=z2=z3=y1=y2=y3=0; //停止所有6只尾燈同時亮
if(num>10)z1=z2=z3=y1=y2=y3=1; //停止所有6只尾燈同時滅
}
z1=z2=z3=y1=y2=y3=1; //停止松開所有6只尾燈同時滅
TR0=0; //關閉定時器
}
if(kz==0) //左轉
{
delay(10);
TR0=1; //開啟定時器
num=0;
miao=0;
while(!kz)
{
if(ky==0)
{
z1=z2=z3=1;
while(!ky)
{
if(miao==0)y1=z1=0; //1s
if(miao==1)y1=z1=y2=z2=0; //1s
if(miao==2)y1=z1=y2=z2=y3=z3=0; //1s
if(miao==3)y1=z1=y2=z2=y3=z3=1; //1s
}
}
if(miao==0)z1=0; //1s
if(miao==1)z1=z2=0; //1s
if(miao==2)z1=z2=z3=0; //1s
if(miao==3)z1=z2=z3=1; //1s
}
z1=z2=z3=1; //停止松開所有尾燈同時滅
TR0=0; //關閉定時器
}
if(ky==0) //右轉
{
delay(10);
TR0=1; //開啟定時器
num=0;
miao=0;
while(!ky)
{
if(kz==0)
{
y1=y2=y3=1;
while(!ky)
{
if(miao==0)y1=z1=0;//1s
if(miao==1)y1=z1=y2=z2=0;//1s
if(miao==2)y1=z1=y2=z2=y3=z3=0;//1s
if(miao==3)y1=z1=y2=z2=y3=z3=1;//1s
}
}
if(miao==0)y1=0;//1s
if(miao==1)y1=y2=0;//1s
if(miao==2)y1=y2=y3=0;//1s
if(miao==3)y1=y2=y3=1;//1s
}
y1=y2=y3=1; //停止松開所有尾燈同時滅
TR0=0; //關閉定時器
}
}
void main() //主函數
{
TH0=(65536-50000)/256; //設置初值
TL0=(65536-50000)%256;
TMOD=0x01; //設置定時器模式
EA=1; //開啟總中斷
ET0=1; //開啟定時器中斷
TR0=0; //關閉定時器
while(1)
{
kong_zhi(); //信號控制函數
}
}
void T0_init() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==20)
{
num=0;
miao++;
if(miao==4)
miao=0;
}
}
作者: wwavd 時間: 2021-5-9 17:37
謝謝管理員大大的幫忙
作者: 花心的劉備 時間: 2021-5-9 21:06
你的程序寫的好復雜啊,cpu只檢測按鍵就行了,別的什么事都做不了了
作者: wc86110 時間: 2021-5-10 04:22
復位電路錯誤,LED 限流電阻阻值選取得怡當
作者: wulin 時間: 2021-5-10 09:56
你這程序寫得太啰嗦,而且功能不正常。給你改了,你試試。
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- ///////按鍵接口////////////////
- sbit k1=P1^0; //剎車信號
- sbit kz=P1^1; //左轉信號
- sbit ky=P1^2; //右轉信號
- sbit k2=P1^3; //停車信號
- ///////左邊led接口///////////////////////
- sbit z3=P2^5; //左1
- sbit z2=P2^4; //左2
- sbit z1=P2^3; //左3
- ///////右邊led接口///////////////////////
- sbit y1=P2^2; //右1
- sbit y2=P2^1; //有2
- sbit y3=P2^0; //右3
- bit flag=0; //閃爍標志
- uchar num,num1=0xff;
- uchar KeySec=0;
- /*
- void delay(uint ms) //ms級延時函數
- {
- uchar j;
- for(ms;ms>0;ms--)
- for(j=110;j>0;j--);
- }*/
- void kong_zhi() //信號控制函數
- {
- static uchar count=0;
- if(!k1||!k2||!kz||!ky)
- {
- if(++count>=100)//消抖
- {
- count=0;
- if(k2==0)KeySec=1; //停車
- else if(k1==0)KeySec=2; //剎車
- else if(kz==0)KeySec=3; //左轉
- else if(ky==0)KeySec=4; //右轉
- }
- }
- else
- {
- count=0;//復位
- KeySec=0; //清0
- }
- }
- void key_service()
- {
- switch(KeySec)
- {//以下代碼不影響P2.6,P2.7另作他用
- case 0: P2|=0xff; break; //無操作
- case 1: if(!flag)P2|=0xff;else P2&=0xc0;break; //停車
- case 2: P2&=0xc0; break; //剎車
- case 3: P2=(P2&0xc0)|(num1<<3|0x07);break; //左轉
- case 4: P2=(P2&0xc0)|num1;break; //右轉
- default: break;
- }
- }
- void main() //主函數
- {
- TH0=(65536-50000)/256; //設置初值
- TL0=(65536-50000)%256;
- TMOD=0x01; //設置定時器模式
- EA=1; //開啟總中斷
- ET0=1; //開啟定時器中斷
- TR0=1; //關閉定時器
- while(1)
- {
- kong_zhi(); //按鍵掃描函數
- key_service();//信號控制函數
- }
- }
- void T0_init() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- num++;
- if(num==10)//0.5s
- {
- num=0;
- if(KeySec==1||KeySec==3||KeySec==4)
- {
- flag=~flag;
- num1<<=1;
- if(num1==0xf0)
- num1=0xff;
- }
- else
- {
- flag=0;
- num1=0xff;
- }
- }
- }
復制代碼
作者: wwavd 時間: 2021-5-10 10:29
謝謝大佬,我改了1天了,試了好多方法也沒搞好,我試試大佬的代碼去
作者: wwavd 時間: 2021-5-10 10:48
我試了一下,還是沒有反應,按了開關沒反應
作者: wwavd 時間: 2021-5-10 10:53
這是我用proteus仿真的工程文件和已經編譯好的hex文件,能幫忙找一下那里出了問題嗎?
-
-
工程文件.zip
2021-5-10 10:51 上傳
點擊文件名下載附件
33.71 KB, 下載次數: 5
這是我用proteus仿真的工程文件
作者: 林大俠 時間: 2021-5-10 11:38
確實程序寫得比較復雜了,好像有更簡單的方案,我回頭晚上有空幫你重新整理一下。
作者: 吳小哥 時間: 2021-5-10 12:54
單機片51學到一半,在開發板上摸索中,看大佬的代碼我發現我不夠認真,有些代碼真的是用的頻率很高,再去復習一下以前拉下的代碼類的知識。
不過有一點我蠻奇怪就是,你這藍牙發射器和接受怎么處理的,關于硬件方面的網上購買?,還是白嫖公司的零件??
作者: wwavd 時間: 2021-5-10 12:58
謝謝大佬
作者: wulin 時間: 2021-5-10 14:36
這種簡單控制的程序并且經仿真確認沒有邏輯和功能錯誤。你仔細查驗硬件有沒有問題。這個程序中的按鍵代碼是按照排他邏輯設計:某按鍵按下執行對應功能,抬起后對應功能即停止。同時有兩個以上按下只執行優先級高的功能,其順序為1.停車,2..剎車,3.左轉,4右轉。我不開車,可能優先順序猜測有誤,你可以自行調整。
作者: wulin 時間: 2021-5-10 15:04
把完整文件發給你
測試.zip
(115.7 KB, 下載次數: 6)
2021-5-10 15:04 上傳
點擊文件名下載附件
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |