找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请问如何将源程序中单片机低电平输出有效修改为高电平输出有效?

[复制链接]
跳转到指定楼层
楼主

以下是一个51单片机的交通信号红绿灯源程序,试运行一切正常,但我想将原来的信号灯输出端口东西红灯(P3.4)、东西黄灯(P3.5)、东西绿灯(P3.3);南北红灯(P3.2)、南北黄灯(P3.1)、南北绿灯(P3.0)这六个端口由原来的低电平输出有效修改为高电平输出有效(也就是将源程序中定义输出端口低电平时点亮信号灯修改为输出端口高电平时点亮信号灯),谢谢了!
以下是电路图仅供参考:

以下是源程序:
#include <reg52.h>                 //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
#define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535


sbit key4 = P3^7;                //按键IO口定义(状态设置)

uchar menu_1;                            //设置不同参数的变量

char dx_s = 0,nb_s = 0;        //东西  南北 倒计时变量

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;   //东西、南北的时间
uchar flag_jdgz ;     //交通管制

/********************************************************************
* 名称 : delay_1ms()
* 功能 : 延时1ms函数
* 输入 : q
* 输出 : 无
***********************************************************************/
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);                  //延时
        }
}

/*********************定时器0、定时器1初始化******************/
void time0_init()          
{
        EA  = 1;                   //开总中断
        TMOD = 0X01;          //定时器0工作方式1
        ET0 = 1;                  //开定时器0中断
        TR0 = 1;                  //允许定时器0定时
        TH0 = 0x3c;
        TL0 = 0xb0;     //50ms
}

/*********************交通灯处理函数*********************************/
void jiaotongdeng_dis()
{
        if(flag_1s == 1)           //1秒执行一次里面的程序  
        {
                flag_1s = 0;
                if(flag_dx_nb == 0)           //南北绿灯时间
                {
                        dx_s --;                   //东西倒计时时间减1
                        nb_s --;                   //南北倒计时时间减1
                        if(dx_s == 5)
                                nb_s = 5;
                }
                if(flag_dx_nb == 1)           //东西绿灯时间
                {
                        dx_s --;                   //南北倒计时时间减1
                        nb_s --;                   //东西倒计时时间减1
                        if(nb_s == 5)
                                dx_s = 5;
                }
                if(dx_s <= 0)                  //倒计时时间为0切换东西 南北绿灯时间
                {
                        flag_dx_nb = ~flag_dx_nb;
                        if(flag_dx_nb == 1)         //东西时间
                        {
                                dx_s = dx_time;          
                                nb_s = dx_time + 5;
                        }
                        else                                  //南北时间
                        {
                                dx_s = nb_time + 5;       
                                nb_s = nb_time;          
                        }
                }
        }

/***********************南北时间*********************************/
        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)                 //当小于5秒时  黄灯要闪了
                {
                        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;        //灭       
                        }
                }
        }
/***********************东西时间*********************************/
        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)                 //当小于5秒时  黄灯要闪了
                {
                        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;//东西黄灯灭       
                        }

                }
        }                       
}

/********************独立按键程序*****************/
uchar key_can;         //按键值

void key()         //独立按键程序
{
        static uchar key_new;       //key_new  这个变量的功能是做按键松手检测的
        key_can = 0;                //按键值还原成0
        if( key4 == 0)                        //有按键按下
        {
                delay_1ms(1);                     //按键延时消抖动
                if(key_new == 1)
                {                                         
                        key_new = 0;                //key_new = 0   说明按键已按下

                        if(key4 == 0)                //确认是按键按下
                                key_can = 4;         //得到按键值
                }                       
        }
        else
                key_new = 1;         //key_new = 1   说明按键已经松开了       
}

/********************设置函数*****************/
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;        //南北绿灯灭
                }

        }
}

/********************************************************************
* 名称 : main()
* 功能 : 实现灯的闪烁
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
        time0_init();                  //定时器初始化程序
        dx_s = nb_time + 5;          //南北时间
        nb_s = nb_time ;          //东西时间
        while(1)
        {
                key();                           //按键函数
                if(key_can > 0)           //有按键按下
                        key_with();           //按键处理函数
                if((menu_1 == 0) && (flag_jdgz == 0))
                        jiaotongdeng_dis();           //交通灯处理函数

                if(flag_jdgz == 4)        //夜间模式
                        if(flag_500ms == 1)                //  南北黄灯闪  东西黄灯闪
                        {
                                flag_500ms = 0;
                                nb_yellow = ~nb_yellow;           //  东西黄灯闪
                                dx_yellow = ~dx_yellow;           //  东西黄灯闪
                        }       
                display();         //数码管显示函数
        }
}  

/*********************定时器0中断服务程序************************/
void time0_int() interrupt 1  
{                                                  
        static  uchar value;                         //定时50ms中断一次
        TH0 = 0x3c;
        TL0 = 0xb0;     //50ms
        value ++;
        if(value % 10 == 0)
                flag_500ms = ~flag_500ms;           //定时产生一个500毫秒的变量
        if(value >= 20)
        {
                value = 0;
                flag_1s = 1;         //定时产生一个1秒的变量
        }
}

交通信号红绿灯灯~STC15F104E输出低电平修改为高电平.png (40.75 KB, 下载次数: 0)

将单片机原输出低电平有效修改为输出高电平有效

将单片机原输出低电平有效修改为输出高电平有效
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:860926 发表于 2024-12-27 15:13 | 只看该作者
把你所有灯的输出,0改成1,1改成0,不就好了
回复

使用道具 举报

板凳
ID:402677 发表于 2024-12-27 16:16 | 只看该作者
lzw991101 发表于 2024-12-27 15:13
把你所有灯的输出,0改成1,1改成0,不就好了

我把东西南北的输出状态都取反了,但是不正常,不知哪个地方改的问题。
回复

使用道具 举报

地板
ID:849913 发表于 2024-12-27 19:02 | 只看该作者
楼上说的很对 补充一下 驱动ULN2003 单片机的输出模式改成推挽模式
回复

使用道具 举报

5#
ID:420836 发表于 2024-12-28 02:56 | 只看该作者
检查单片机的电流驱动能力是否小于LED的最小电流。
回复

使用道具 举报

6#
ID:402677 发表于 2024-12-28 09:12 | 只看该作者
TTQ001 发表于 2024-12-28 02:56
检查单片机的电流驱动能力是否小于LED的最小电流。

单片机输出是通过ULN2003A驱动的
回复

使用道具 举报

7#
ID:712097 发表于 2024-12-28 10:17 | 只看该作者
P3M0 = 0xff; P3M1 = 0x00; //P3口设置为推挽输出
回复

使用道具 举报

8#
ID:402677 发表于 2024-12-28 14:35 | 只看该作者
chxelc 发表于 2024-12-28 10:17
P3M0 = 0xff; P3M1 = 0x00; //P3口设置为推挽输出

谢谢你
回复

使用道具 举报

9#
ID:402677 发表于 2024-12-28 14:42 | 只看该作者
chxelc 发表于 2024-12-28 10:17
P3M0 = 0xff; P3M1 = 0x00; //P3口设置为推挽输出

您好
请问"
P3M0 = 0xff; P3M1 = 0x00; //P3口设置为推挽输出"
这条语句加到哪个位置呢?
我太菜了,不好意思!
回复

使用道具 举报

10#
ID:402677 发表于 2024-12-28 15:04 | 只看该作者
chxelc 发表于 2024-12-28 10:17
P3M0 = 0xff; P3M1 = 0x00; //P3口设置为推挽输出

您好,请问"P3M0 = 0xff; P3M1 = 0x00; //P3口设置为推挽输出"这条语句添加到源程序中哪个位置呢?,我很菜哦!

STC15F104E IO口.jpg (121.76 KB, 下载次数: 0)

STC15F104E  IO口.jpg
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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