找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2895|回復(fù): 12
收起左側(cè)

單片機(jī)汽車車燈控制器程序求指導(dǎo)

[復(fù)制鏈接]
ID:916265 發(fā)表于 2021-5-9 17:33 | 顯示全部樓層 |閱讀模式
由于本論壇禁止直接求程序,禁止伸手黨,所以向大家請教一下大致的實現(xiàn)方法與思路,理清頭緒后我自己去實現(xiàn),謝謝大家

這個是程序
這是電路圖
要求能夠?qū)崿F(xiàn):
按下剎車鍵K1,6個燈管同時點亮。
按下左轉(zhuǎn)鍵K2,D3向D1燈管延時一秒依次點亮。
按下右轉(zhuǎn)鍵K3,D4向D6燈管延時一秒依次點亮。
按下停車鍵K4,6個燈管同時閃爍點亮。

電路圖

電路圖


單片機(jī)源程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
///////按鍵接口////////////////
sbit k1=P1^0;                //剎車信號
sbit kz=P1^1;                 //左轉(zhuǎn)信號
sbit ky=P1^2;                 //右轉(zhuǎn)信號
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;                      //開始循環(huán)標(biāo)志位
uchar num,miao;
void delay(uint ms)              //ms級延時函數(shù)
{
        uchar j;
        for(ms;ms>0;ms--)
                for(j=110;j>0;j--);
}
void kong_zhi()             //信號控制函數(shù)
{
        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;             //關(guān)閉定時器
        }
        if(kz==0)            //左轉(zhuǎn)
        {
                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;                 //關(guān)閉定時器
        }
        if(ky==0)                 //右轉(zhuǎn)
        {
                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;                   //關(guān)閉定時器
        }
}
void main()                 //主函數(shù)
{
        TH0=(65536-50000)/256;   //設(shè)置初值
        TL0=(65536-50000)%256;
        TMOD=0x01;           //設(shè)置定時器模式
        EA=1;                //開啟總中斷
        ET0=1;            //開啟定時器中斷
        TR0=0;           //關(guān)閉定時器
        while(1)
        {
                kong_zhi();   //信號控制函數(shù)
        }
}
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;
        }
}



回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2021-5-10 15:04 | 顯示全部樓層
wwavd 發(fā)表于 2021-5-10 10:48
我試了一下,還是沒有反應(yīng),按了開關(guān)沒反應(yīng)

把完整文件發(fā)給你

測試.zip (115.7 KB, 下載次數(shù): 6)

回復(fù)

使用道具 舉報

ID:916265 發(fā)表于 2021-5-9 17:37 | 顯示全部樓層
謝謝管理員大大的幫忙
回復(fù)

使用道具 舉報

ID:684049 發(fā)表于 2021-5-9 21:06 | 顯示全部樓層
你的程序?qū)懙暮脧?fù)雜啊,cpu只檢測按鍵就行了,別的什么事都做不了了
回復(fù)

使用道具 舉報

ID:96682 發(fā)表于 2021-5-10 04:22 來自手機(jī) | 顯示全部樓層
復(fù)位電路錯誤,LED 限流電阻阻值選取得怡當(dāng)
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2021-5-10 09:56 | 顯示全部樓層
你這程序?qū)懙锰珕,而且功能不正常。給你改了,你試試。
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. ///////按鍵接口////////////////
  5. sbit k1=P1^0;                //剎車信號
  6. sbit kz=P1^1;                 //左轉(zhuǎn)信號
  7. sbit ky=P1^2;                 //右轉(zhuǎn)信號
  8. sbit k2=P1^3;                 //停車信號
  9. ///////左邊led接口///////////////////////
  10. sbit z3=P2^5;                   //左1
  11. sbit z2=P2^4;                   //左2
  12. sbit z1=P2^3;                    //左3
  13. ///////右邊led接口///////////////////////
  14. sbit y1=P2^2;                    //右1
  15. sbit y2=P2^1;                    //有2
  16. sbit y3=P2^0;                    //右3
  17. bit flag=0;                      //閃爍標(biāo)志

  18. uchar num,num1=0xff;
  19. uchar KeySec=0;
  20. /*
  21. void delay(uint ms)              //ms級延時函數(shù)
  22. {
  23.         uchar j;
  24.         for(ms;ms>0;ms--)
  25.                 for(j=110;j>0;j--);
  26. }*/
  27. void kong_zhi()             //信號控制函數(shù)
  28. {
  29.         static uchar count=0;
  30.         if(!k1||!k2||!kz||!ky)
  31.         {
  32.                 if(++count>=100)//消抖
  33.                 {
  34.                         count=0;
  35.                         if(k2==0)KeySec=1;          //停車
  36.                         else if(k1==0)KeySec=2;                //剎車
  37.                         else if(kz==0)KeySec=3;                //左轉(zhuǎn)
  38.                         else if(ky==0)KeySec=4;                //右轉(zhuǎn)

  39.                 }
  40.         }
  41.         else
  42.         {
  43.                 count=0;//復(fù)位
  44.                 KeySec=0;        //清0
  45.         }
  46. }

  47. void key_service()
  48. {
  49.         switch(KeySec)
  50.         {//以下代碼不影響P2.6,P2.7另作他用
  51.                 case 0: P2|=0xff; break;                                                                //無操作
  52.                 case 1: if(!flag)P2|=0xff;else P2&=0xc0;break;        //停車
  53.                 case 2: P2&=0xc0; break;                                                                //剎車
  54.                 case 3: P2=(P2&0xc0)|(num1<<3|0x07);break;                //左轉(zhuǎn)
  55.                 case 4: P2=(P2&0xc0)|num1;break;                                                //右轉(zhuǎn)
  56.                 default: break;
  57.         }
  58. }

  59. void main()                 //主函數(shù)
  60. {
  61.         TH0=(65536-50000)/256;   //設(shè)置初值
  62.         TL0=(65536-50000)%256;
  63.         TMOD=0x01;           //設(shè)置定時器模式
  64.         EA=1;                //開啟總中斷
  65.         ET0=1;            //開啟定時器中斷
  66.         TR0=1;           //關(guān)閉定時器
  67.         while(1)
  68.         {
  69.                 kong_zhi();   //按鍵掃描函數(shù)               
  70.                 key_service();//信號控制函數(shù)
  71.         }
  72. }
  73. void T0_init() interrupt 1
  74. {
  75.         TH0=(65536-50000)/256;
  76.         TL0=(65536-50000)%256;
  77.         num++;
  78.         if(num==10)//0.5s
  79.         {
  80.                 num=0;
  81.                 if(KeySec==1||KeySec==3||KeySec==4)
  82.                 {
  83.                         flag=~flag;
  84.                         num1<<=1;
  85.                         if(num1==0xf0)
  86.                                 num1=0xff;
  87.                 }
  88.                 else
  89.                 {
  90.                         flag=0;
  91.                         num1=0xff;
  92.                 }               
  93.         }
  94. }
復(fù)制代碼

回復(fù)

使用道具 舉報

ID:916265 發(fā)表于 2021-5-10 10:29 | 顯示全部樓層
wulin 發(fā)表于 2021-5-10 09:56
你這程序?qū)懙锰珕拢夜δ懿徽。給你改了,你試試。

謝謝大佬,我改了1天了,試了好多方法也沒搞好,我試試大佬的代碼去
回復(fù)

使用道具 舉報

ID:916265 發(fā)表于 2021-5-10 10:48 | 顯示全部樓層
wulin 發(fā)表于 2021-5-10 09:56
你這程序?qū)懙锰珕拢夜δ懿徽。給你改了,你試試。

我試了一下,還是沒有反應(yīng),按了開關(guān)沒反應(yīng)
回復(fù)

使用道具 舉報

ID:916265 發(fā)表于 2021-5-10 10:53 | 顯示全部樓層
wwavd 發(fā)表于 2021-5-10 10:48
我試了一下,還是沒有反應(yīng),按了開關(guān)沒反應(yīng)

這是我用proteus仿真的工程文件和已經(jīng)編譯好的hex文件,能幫忙找一下那里出了問題嗎?

工程文件.zip

33.71 KB, 下載次數(shù): 5

這是我用proteus仿真的工程文件

回復(fù)

使用道具 舉報

ID:883167 發(fā)表于 2021-5-10 11:38 | 顯示全部樓層
wwavd 發(fā)表于 2021-5-10 10:48
我試了一下,還是沒有反應(yīng),按了開關(guān)沒反應(yīng)

確實程序?qū)懙帽容^復(fù)雜了,好像有更簡單的方案,我回頭晚上有空幫你重新整理一下。
回復(fù)

使用道具 舉報

ID:918581 發(fā)表于 2021-5-10 12:54 | 顯示全部樓層
單機(jī)片51學(xué)到一半,在開發(fā)板上摸索中,看大佬的代碼我發(fā)現(xiàn)我不夠認(rèn)真,有些代碼真的是用的頻率很高,再去復(fù)習(xí)一下以前拉下的代碼類的知識。
不過有一點我蠻奇怪就是,你這藍(lán)牙發(fā)射器和接受怎么處理的,關(guān)于硬件方面的網(wǎng)上購買?,還是白嫖公司的零件??
回復(fù)

使用道具 舉報

ID:916265 發(fā)表于 2021-5-10 12:58 | 顯示全部樓層
林大俠 發(fā)表于 2021-5-10 11:38
確實程序?qū)懙帽容^復(fù)雜了,好像有更簡單的方案,我回頭晚上有空幫你重新整理一下。

謝謝大佬
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2021-5-10 14:36 | 顯示全部樓層
wwavd 發(fā)表于 2021-5-10 10:48
我試了一下,還是沒有反應(yīng),按了開關(guān)沒反應(yīng)

這種簡單控制的程序并且經(jīng)仿真確認(rèn)沒有邏輯和功能錯誤。你仔細(xì)查驗硬件有沒有問題。這個程序中的按鍵代碼是按照排他邏輯設(shè)計:某按鍵按下執(zhí)行對應(yīng)功能,抬起后對應(yīng)功能即停止。同時有兩個以上按下只執(zhí)行優(yōu)先級高的功能,其順序為1.停車,2..剎車,3.左轉(zhuǎn),4右轉(zhuǎn)。我不開車,可能優(yōu)先順序猜測有誤,你可以自行調(diào)整。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表