一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 796|回复: 21
收起左侧

请教如何将以下源程序中单片机P1.2~P1.7端口输出低电平有效改为输出高电平有效(将...

[复制链接]
发表于 2024-10-8 11:25 | 显示全部楼层 |阅读模式
本帖最后由 Electret 于 2024-10-20 10:03 编辑

请教如何将以下源程序单片机P1.2~P1.7端口输出低电平有效改为输出高电平有效(将输出电平状态反转)?
源程序应该修改哪一部分呢?谢谢

AT89C2051原低电平驱动方式改为高电平驱动方式.png

(AT89C2051高电平输出直接驱动ULN2003A)

(AT89C2051高电平输出直接驱动ULN2003A)


以下是源程序:

#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    = P1^2;                //东西红灯IO口定义(pin14~p1.2)
sbit dx_green  = P1^4;                //东西绿灯IO口定义(pin16~p1.4)
sbit dx_yellow = P1^3;                //东西黄灯IO口定义(pin15~p1.3)

sbit nb_red    = P1^5;                //南北红灯IO口定义(pin17~p1.5)
sbit nb_green  = P1^7;                //南北绿灯IO口定义(pin19~p1.7)
sbit nb_yellow = P1^6;                //南北黄灯IO口定义(pin18~p1.6)        

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秒的变量
        }
}



将源程序中输出端口定义由低电平有效修改为高电平有效.rar

35.27 KB, 下载次数: 2, 下载积分: 一乐金币 -1

 楼主| 发表于 2024-10-8 11:32 | 显示全部楼层
以上程序编译后写入单片机试运行一切正常,只是想把输出端口原来的低电平有效修改为高电平输出有效。
发表于 2024-10-8 22:21 | 显示全部楼层
本帖最后由 Joe_Black 于 2024-10-8 22:22 编辑

『设置函数』一段,dx_red/dx_green/dx_yellow/nb_red/nb_green/nb_yellow 1改0,0改1。

但写程序要理解硬件芯片内部设计。 89c2051 P1 埠是低端有晶体管。能输入 20mA 电流,但输出很低电流。
LED 反接,可能会不亮。

Capture.JPG

https://ww1.microchip.com/downloads/en/DeviceDoc/doc0368.pdf
 楼主| 发表于 2024-10-10 08:11 | 显示全部楼层
Joe_Black 发表于 2024-10-8 22:21
『设置函数』一段,dx_red/dx_green/dx_yellow/nb_red/nb_green/nb_yellow 1改0,0改1。

但写程序要理 ...

谢谢,驱动我采用的是ULN2003A,内部达林顿结构,通过实验没有问题。
发表于 2024-10-10 11:04 | 显示全部楼层
Electret 发表于 2024-10-10 08:11
谢谢,驱动我采用的是ULN2003A,内部达林顿结构,通过实验没有问题。
...

程序不改试试改一下硬件,在输出侧ULN2003A侧再加一级反相
 楼主| 发表于 2024-10-10 14:45 | 显示全部楼层
zqele 发表于 2024-10-10 11:04
程序不改试试改一下硬件,在输出侧ULN2003A侧再加一级反相

就是为了让电路简洁才想修改程序的,之前加了一级反向的。
 楼主| 发表于 2024-10-10 14:54 | 显示全部楼层
zqele 发表于 2024-10-10 11:04
程序不改试试改一下硬件,在输出侧ULN2003A侧再加一级反相

hld.png

点评

这样用三极管反相还不如74hc04刚好6路  详情 回复 发表于 2024-10-17 13:22
这个原理图软件是什么?画出来的图挺漂亮。  详情 回复 发表于 2024-10-13 11:22
发表于 2024-10-12 11:10 | 显示全部楼层
dx_red    = 1;  //东西红灯灭
                        dx_green  =        0;        //东西绿灯亮
                        dx_yellow = 1;        //东西黄灯灭
                        nb_red    = 0;  //南北红灯亮
                        nb_green  =        1;        //南北绿灯灭
                        nb_yellow = 1;        //南北黄灯灭                 
把1改成0;然后把0改正1;0==低电平;1==高电平。

点评

修改后端口输出成为高电平输出了,只不过有个问题是初次上电后东西南北灯都没反应,30秒后显示正常,东西南北红绿灯运行也正常,不知是何原因  详情 回复 发表于 2024-10-15 10:38
发表于 2024-10-13 11:22 | 显示全部楼层

这个原理图软件是什么?画出来的图挺漂亮。

点评

日本软件 bsch3v  详情 回复 发表于 2024-10-15 09:52
 楼主| 发表于 2024-10-15 09:52 | 显示全部楼层
8055 发表于 2024-10-13 11:22
这个原理图软件是什么?画出来的图挺漂亮。

日本软件 bsch3v

点评

谢谢,原来这个软件年头也不短了~还非常小巧,我下载了一个,0.69.01比较老的版本,真的很轻巧啊。  详情 回复 发表于 2024-10-15 17:19

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-11-10 07:29 , Processed in 0.073300 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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