找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1057|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

請(qǐng)問(wèn)如何將源程序中單片機(jī)低電平輸出有效修改為高電平輸出有效?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:402677 發(fā)表于 2024-12-27 09:40 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

以下是一個(gè)51單片機(jī)的交通信號(hào)紅綠燈源程序,試運(yùn)行一切正常,但我想將原來(lái)的信號(hào)燈輸出端口東西紅燈(P3.4)、東西黃燈(P3.5)、東西綠燈(P3.3);南北紅燈(P3.2)、南北黃燈(P3.1)、南北綠燈(P3.0)這六個(gè)端口由原來(lái)的低電平輸出有效修改為高電平輸出有效(也就是將源程序中定義輸出端口低電平時(shí)點(diǎn)亮信號(hào)燈修改為輸出端口高電平時(shí)點(diǎn)亮信號(hào)燈),謝謝了!
以下是電路圖僅供參考:

以下是源程序:
#include <reg52.h>                 //調(diào)用單片機(jī)頭文件
#define uchar unsigned char  //無(wú)符號(hào)字符型 宏定義        變量范圍0~255
#define uint  unsigned int         //無(wú)符號(hào)整型 宏定義        變量范圍0~65535


sbit key4 = P3^7;                //按鍵IO口定義(狀態(tài)設(shè)置)

uchar menu_1;                            //設(shè)置不同參數(shù)的變量

char dx_s = 0,nb_s = 0;        //東西  南北 倒計(jì)時(shí)變量

sbit dx_red    = P3^4;            //東西紅燈IO口定義(pin1~p3.4)
sbit dx_green  = P3^3;                //東西綠燈IO口定義(pin8~p3.3)
sbit dx_yellow = P3^5;                //東西黃燈IO口定義(pin3~p3.5)

sbit nb_red    = P3^2;                //南北紅燈IO口定義(pin7~p3.2)
sbit nb_green  = P3^0;                //南北綠燈IO口定義(pin5~p3.0)
sbit nb_yellow = P3^1;                //南北黃燈IO口定義(pin6~p3.1)       

bit flag_1s = 0;          //1秒的變量
bit flag_500ms;                  //500毫秒的變量
bit flag_dx_nb = 0;   //東西南北模式
uchar dx_time = 20,nb_time = 35;   //東西、南北的時(shí)間
uchar flag_jdgz ;     //交通管制

/********************************************************************
* 名稱(chēng) : delay_1ms()
* 功能 : 延時(shí)1ms函數(shù)
* 輸入 : q
* 輸出 : 無(wú)
***********************************************************************/
void delay_1ms(uint q)
{
        uint i,j;
        for(i=0;i<q;i++)
                for(j=0;j<120;j++);
}

uchar i;
/***********************************************************************/
void display()
{
        for(i=0;i<4;i++)
        {               
                P0 = 0xff;                  //消隱
                           //位選
//段選          
                delay_1ms(3);                  //延時(shí)
        }
}

/*********************定時(shí)器0、定時(shí)器1初始化******************/
void time0_init()          
{
        EA  = 1;                   //開(kāi)總中斷
        TMOD = 0X01;          //定時(shí)器0工作方式1
        ET0 = 1;                  //開(kāi)定時(shí)器0中斷
        TR0 = 1;                  //允許定時(shí)器0定時(shí)
        TH0 = 0x3c;
        TL0 = 0xb0;     //50ms
}

/*********************交通燈處理函數(shù)*********************************/
void jiaotongdeng_dis()
{
        if(flag_1s == 1)           //1秒執(zhí)行一次里面的程序  
        {
                flag_1s = 0;
                if(flag_dx_nb == 0)           //南北綠燈時(shí)間
                {
                        dx_s --;                   //東西倒計(jì)時(shí)時(shí)間減1
                        nb_s --;                   //南北倒計(jì)時(shí)時(shí)間減1
                        if(dx_s == 5)
                                nb_s = 5;
                }
                if(flag_dx_nb == 1)           //東西綠燈時(shí)間
                {
                        dx_s --;                   //南北倒計(jì)時(shí)時(shí)間減1
                        nb_s --;                   //東西倒計(jì)時(shí)時(shí)間減1
                        if(nb_s == 5)
                                dx_s = 5;
                }
                if(dx_s <= 0)                  //倒計(jì)時(shí)時(shí)間為0切換東西 南北綠燈時(shí)間
                {
                        flag_dx_nb = ~flag_dx_nb;
                        if(flag_dx_nb == 1)         //東西時(shí)間
                        {
                                dx_s = dx_time;          
                                nb_s = dx_time + 5;
                        }
                        else                                  //南北時(shí)間
                        {
                                dx_s = nb_time + 5;       
                                nb_s = nb_time;          
                        }
                }
        }

/***********************南北時(shí)間*********************************/
        if(flag_dx_nb == 0)  
        {
                if(dx_s > 5)
                {
                        dx_red    = 0;     //東西紅燈亮
                        dx_green  =        1;           //東西紅燈滅
                        dx_yellow = 1;           //東西黃燈滅
                        nb_red    = 1;     //南北紅燈滅
                        nb_green  =        0;           //南北綠燈亮
                        nb_yellow = 1;           //南北黃燈滅

                }else if(dx_s <= 5)                 //當(dāng)小于5秒時(shí)  黃燈要閃了
                {
                        dx_red    = 0;     //東西紅燈滅
                        dx_green  =        1;           //東西紅燈滅
                        dx_yellow = 1;           //東西黃燈滅
                        nb_red    = 1;     //南北紅燈滅
                        nb_green  =        1;           //南北綠燈滅
                        if(flag_500ms == 0)           //黃燈閃爍
                        {
                                nb_yellow = 0;        //亮       
                        }
                        else
                        {
                                nb_yellow = 1;        //滅       
                        }
                }
        }
/***********************東西時(shí)間*********************************/
        if(flag_dx_nb == 1)  
        {
                if(nb_s > 5)
                {
                        dx_red    = 1;  //東西紅燈滅
                        dx_green  =        0;        //東西紅燈亮
                        dx_yellow = 1;        //東西黃燈滅
                        nb_red    = 0;  //南北紅燈亮
                        nb_green  =        1;        //南北綠燈滅
                        nb_yellow = 1;        //南北黃燈滅
                }else if(nb_s <= 5)                 //當(dāng)小于5秒時(shí)  黃燈要閃了
                {
                        dx_red    = 1;    //東西紅燈滅
                        dx_green  =        1;          //東西紅燈滅
                        nb_red    = 0;    //南北紅燈亮
                        nb_green  =        1;          //南北綠燈滅
                        nb_yellow = 1;          //南北黃燈滅
                        if(flag_500ms == 0)         //黃燈閃爍
                        {
                                dx_yellow = 0;//東西黃燈亮       
                        }
                        else
                        {
                                dx_yellow = 1;//東西黃燈滅       
                        }

                }
        }                       
}

/********************獨(dú)立按鍵程序*****************/
uchar key_can;         //按鍵值

void key()         //獨(dú)立按鍵程序
{
        static uchar key_new;       //key_new  這個(gè)變量的功能是做按鍵松手檢測(cè)的
        key_can = 0;                //按鍵值還原成0
        if( key4 == 0)                        //有按鍵按下
        {
                delay_1ms(1);                     //按鍵延時(shí)消抖動(dòng)
                if(key_new == 1)
                {                                         
                        key_new = 0;                //key_new = 0   說(shuō)明按鍵已按下

                        if(key4 == 0)                //確認(rèn)是按鍵按下
                                key_can = 4;         //得到按鍵值
                }                       
        }
        else
                key_new = 1;         //key_new = 1   說(shuō)明按鍵已經(jīng)松開(kāi)了       
}

/********************設(shè)置函數(shù)*****************/
void key_with()
{
        if(key_can == 4)       //交通管制按鍵
        {
                flag_jdgz ++;
                if(flag_jdgz > 4)
                        flag_jdgz = 0;       
                if(flag_jdgz == 1)         //  全部亮紅燈
                {
                        dx_red    = 0;  //東西紅燈亮
                        dx_green  =        1;        //東西綠燈滅
                        dx_yellow = 1;        //東西黃燈滅
                        nb_red    = 0;  //南北紅燈亮
                        nb_green  =        1;        //南北綠燈滅
                        nb_yellow = 1;        //南北黃燈滅                       
                }
                if(flag_jdgz == 2)         //  東西紅燈  南北綠燈
                {
                        dx_red    = 0;  //東西紅燈亮
                        dx_green  =        1;        //東西綠燈滅
                        dx_yellow = 1;        //東西黃燈滅
                        nb_red    = 1;  //南北紅燈滅
                        nb_green  =        0;        //南北綠燈亮
                        nb_yellow = 1;        //南北黃燈滅                       
                }
                if(flag_jdgz == 3)         //  南北紅燈  東西綠燈
                {
                        dx_red    = 1;  //東西紅燈滅
                        dx_green  =        0;        //東西綠燈亮
                        dx_yellow = 1;        //東西黃燈滅
                        nb_red    = 0;  //南北紅燈亮
                        nb_green  =        1;        //南北綠燈滅
                        nb_yellow = 1;        //南北黃燈滅                       
                }
                if(flag_jdgz == 4)         //  南北黃燈閃  東西黃燈閃
                {
                        dx_red    = 1;  //東西紅燈滅
                        dx_green  =        1;        //東西綠燈滅
                        nb_red    = 1;  //南北紅燈滅
                        nb_green  =        1;        //南北綠燈滅
                }

        }
}

/********************************************************************
* 名稱(chēng) : main()
* 功能 : 實(shí)現(xiàn)燈的閃爍
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void main()
{
        time0_init();                  //定時(shí)器初始化程序
        dx_s = nb_time + 5;          //南北時(shí)間
        nb_s = nb_time ;          //東西時(shí)間
        while(1)
        {
                key();                           //按鍵函數(shù)
                if(key_can > 0)           //有按鍵按下
                        key_with();           //按鍵處理函數(shù)
                if((menu_1 == 0) && (flag_jdgz == 0))
                        jiaotongdeng_dis();           //交通燈處理函數(shù)

                if(flag_jdgz == 4)        //夜間模式
                        if(flag_500ms == 1)                //  南北黃燈閃  東西黃燈閃
                        {
                                flag_500ms = 0;
                                nb_yellow = ~nb_yellow;           //  東西黃燈閃
                                dx_yellow = ~dx_yellow;           //  東西黃燈閃
                        }       
                display();         //數(shù)碼管顯示函數(shù)
        }
}  

/*********************定時(shí)器0中斷服務(wù)程序************************/
void time0_int() interrupt 1  
{                                                  
        static  uchar value;                         //定時(shí)50ms中斷一次
        TH0 = 0x3c;
        TL0 = 0xb0;     //50ms
        value ++;
        if(value % 10 == 0)
                flag_500ms = ~flag_500ms;           //定時(shí)產(chǎn)生一個(gè)500毫秒的變量
        if(value >= 20)
        {
                value = 0;
                flag_1s = 1;         //定時(shí)產(chǎn)生一個(gè)1秒的變量
        }
}

交通信號(hào)紅綠燈燈~(yú)STC15F104E輸出低電平修改為高電平.png (40.75 KB, 下載次數(shù): 0)

將單片機(jī)原輸出低電平有效修改為輸出高電平有效

將單片機(jī)原輸出低電平有效修改為輸出高電平有效
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:860926 發(fā)表于 2024-12-27 15:13 | 只看該作者
把你所有燈的輸出,0改成1,1改成0,不就好了
回復(fù)

使用道具 舉報(bào)

板凳
ID:402677 發(fā)表于 2024-12-27 16:16 | 只看該作者
lzw991101 發(fā)表于 2024-12-27 15:13
把你所有燈的輸出,0改成1,1改成0,不就好了

我把東西南北的輸出狀態(tài)都取反了,但是不正常,不知哪個(gè)地方改的問(wèn)題。
回復(fù)

使用道具 舉報(bào)

地板
ID:849913 發(fā)表于 2024-12-27 19:02 | 只看該作者
樓上說(shuō)的很對(duì) 補(bǔ)充一下 驅(qū)動(dòng)ULN2003 單片機(jī)的輸出模式改成推挽模式
回復(fù)

使用道具 舉報(bào)

5#
ID:420836 發(fā)表于 2024-12-28 02:56 | 只看該作者
檢查單片機(jī)的電流驅(qū)動(dòng)能力是否小于LED的最小電流。
回復(fù)

使用道具 舉報(bào)

6#
ID:402677 發(fā)表于 2024-12-28 09:12 | 只看該作者
TTQ001 發(fā)表于 2024-12-28 02:56
檢查單片機(jī)的電流驅(qū)動(dòng)能力是否小于LED的最小電流。

單片機(jī)輸出是通過(guò)ULN2003A驅(qū)動(dòng)的
回復(fù)

使用道具 舉報(bào)

7#
ID:712097 發(fā)表于 2024-12-28 10:17 | 只看該作者
P3M0 = 0xff; P3M1 = 0x00; //P3口設(shè)置為推挽輸出
回復(fù)

使用道具 舉報(bào)

8#
ID:402677 發(fā)表于 2024-12-28 14:35 | 只看該作者
chxelc 發(fā)表于 2024-12-28 10:17
P3M0 = 0xff; P3M1 = 0x00; //P3口設(shè)置為推挽輸出

謝謝你
回復(fù)

使用道具 舉報(bào)

9#
ID:402677 發(fā)表于 2024-12-28 14:42 | 只看該作者
chxelc 發(fā)表于 2024-12-28 10:17
P3M0 = 0xff; P3M1 = 0x00; //P3口設(shè)置為推挽輸出

您好
請(qǐng)問(wèn)"
P3M0 = 0xff; P3M1 = 0x00; //P3口設(shè)置為推挽輸出"
這條語(yǔ)句加到哪個(gè)位置呢?
我太菜了,不好意思!
回復(fù)

使用道具 舉報(bào)

10#
ID:402677 發(fā)表于 2024-12-28 15:04 | 只看該作者
chxelc 發(fā)表于 2024-12-28 10:17
P3M0 = 0xff; P3M1 = 0x00; //P3口設(shè)置為推挽輸出

您好,請(qǐng)問(wèn)"P3M0 = 0xff; P3M1 = 0x00; //P3口設(shè)置為推挽輸出"這條語(yǔ)句添加到源程序中哪個(gè)位置呢?,我很菜哦!

STC15F104E IO口.jpg (121.76 KB, 下載次數(shù): 0)

STC15F104E  IO口.jpg
回復(fù)

使用道具 舉報(bào)

11#
ID:402677 發(fā)表于 2025-5-6 10:35 | 只看該作者
謝謝樓上的朋友,在源程序定時(shí)器程序中增加一條指令就可以了

STC單片機(jī)編程下載軟件中IO端口配置.jpg (240.13 KB, 下載次數(shù): 0)

STC單片機(jī)編程下載軟件中IO端口配置.jpg

設(shè)置P3.0所有端口為強(qiáng)推挽輸出模式.jpg (12.22 KB, 下載次數(shù): 0)

設(shè)置P3.0所有端口為強(qiáng)推挽輸出模式.jpg
回復(fù)

使用道具 舉報(bào)

12#
ID:402677 發(fā)表于 2025-5-6 10:48 | 只看該作者
謝謝樓上的朋友,在源程序定時(shí)器部分加入  “  P3M0 = 0x3f; P3M1 = 0x00; ”P(pán)3輸出端口配置為強(qiáng)推挽模式就行了


void time0_init()         
{
    P3M0 = 0x3f; // 配置P3端口的輸入模式
    P3M1 = 0x00; // 配置P3端口的輸入模式
    EA = 1;      // 開(kāi)總中斷
    TMOD = 0X01; // 定時(shí)器0工作方式1
    ET0 = 1;     // 開(kāi)定時(shí)器0中斷
    TR0 = 1;     // 允許定時(shí)器0定時(shí)
    TH0 = 0x3c;  // 定時(shí)器0的高8位初值
    TL0 = 0xb0;  // 定時(shí)器0的低8位初值,注釋稱(chēng)定時(shí)50ms
}

STC單片機(jī)編程下載軟件中IO端口配置.jpg (240.13 KB, 下載次數(shù): 0)

STC單片機(jī)編程下載軟件中IO端口配置.jpg

設(shè)置P3.0所有端口為強(qiáng)推挽輸出模式.jpg (12.22 KB, 下載次數(shù): 0)

設(shè)置P3.0所有端口為強(qiáng)推挽輸出模式.jpg
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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