找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于信号检测出现的问题

[复制链接]
跳转到指定楼层
楼主
大家好,刚刚学习单片机,想制作一个检测信号的设备,但是程序写好后,led5灯不亮。只写了一小部分程序进行验证。请各位大神帮忙看看程序哪里有问题。谢谢啦。(正在上班,刚刚接触单片机)
#include <reg51.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
sbit k1=P1^0;         //合闸信号(常开)
sbit k2=P1^1;    //分闸信号(常闭)
sbit k3=P1^2;    //合闸信号(常开)
sbit k4=P1^3;    //分闸信号(常闭)
sbit k5=P1^4;    //合闸信号(常开)
sbit k6=P1^5;    //分闸信号(常闭)
sbit k7=P1^6;    //储能信号(常开)
sbit k8=P1^7;    //储能信号(常闭)
sbit k9=P2^0;    //分闸测试按钮
sbit k10=P2^1;   //合闸测试按钮
sbit K11=P2^2;   //储能测试按钮
sbit led1=P0^0;         //分闸测试合格,灯亮;绿色
sbit led2=P0^1;  //合闸测试合格,灯亮;黄色
sbit led3=P0^2;  //储能测试合格,灯亮;蓝色
sbit led4=P0^3;  //信号错误指示灯。分闸不合格,led1灭,led4亮。合闸不合格,led2灭,led4亮。储能同上
sbit led5=P0^4;  //分闸测试功能指示灯
sbit led6=P0^5;  //合闸测试功能指示灯
sbit led7=P0^6;  //储能测试功能指示灯
void delayms(uint);
void jianpan();
void main()
{
        while(1)
        {
                jianpan();
        }
}
void jianpan()
{
        if(k9==0)
        {
                delayms(10);
                if(k9==0)
                {
                        led5=~led5;
                        while(!k9);
                }
        }
}
void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}



捕获.PNG (55.38 KB, 下载次数: 93)

捕获.PNG
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:158375 发表于 2017-9-19 16:28 | 只看该作者
你的 LED 不加限流电阻 ?
回复

使用道具 举报

板凳
ID:82765 发表于 2017-9-19 16:43 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

地板
ID:230847 发表于 2017-9-19 17:00 | 只看该作者
谢谢大神,我想实现的功能如下:

微博图片.jpg (147.39 KB, 下载次数: 79)

微博图片.jpg
回复

使用道具 举报

5#
ID:230847 发表于 2017-9-19 17:04 | 只看该作者
感觉程序好复杂。初步想验证主函数调用子函数。当按键k9按下,led5灯亮。刚开始led是加有限流电阻,单子仿真的时候灯不亮,以为是限流电阻太大,就把电阻去了。稍后把电阻加上。
回复

使用道具 举报

6#
ID:230915 发表于 2017-9-19 18:32 来自手机 | 只看该作者
没看完,不过led5=~led5是不合适的,应该是led5=!led5。
回复

使用道具 举报

7#
ID:230915 发表于 2017-9-19 18:35 来自手机 | 只看该作者
还有P0口要加上拉电阻
回复

使用道具 举报

8#
ID:157238 发表于 2017-9-19 20:48 | 只看该作者
在proteus仿真中,51单片机的P0口需要加上上拉电阻
回复

使用道具 举报

9#
ID:230847 发表于 2017-9-19 20:53 | 只看该作者
又仔细看了一边程序,问题出现在
if(k9==0)
                {
                        led5=~led5;
                        while(!k9);
                }
应该把维护ile(!k9)放在“}”外边,这样就可以了
回复

使用道具 举报

10#
ID:213173 发表于 2017-9-19 21:11 | 只看该作者
一束光的旅程 发表于 2017-9-19 17:04
感觉程序好复杂。初步想验证主函数调用子函数。当按键k9按下,led5灯亮。刚开始led是加有限流电阻,单子仿 ...

你仿真不成功问题不在LED限流电阻,应该是89C52没有导入程序HEX文件。

回复

使用道具 举报

11#
ID:230847 发表于 2017-9-19 21:35 | 只看该作者
这次将所有程序的功能全部写出来了。程序如下。
#include <reg51.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
sbit k1=P1^0;         //合闸信号(常开)
sbit k2=P1^1;    //分闸信号(常闭)
sbit k3=P1^2;    //合闸信号(常开)
sbit k4=P1^3;    //分闸信号(常闭)
sbit k5=P1^4;    //合闸信号(常开)
sbit k6=P1^5;    //分闸信号(常闭)
sbit k7=P1^6;    //储能信号(常开)
sbit k8=P1^7;    //储能信号(常闭)
sbit k9=P2^0;    //分闸测试按钮
sbit k10=P2^1;   //合闸测试按钮
sbit k11=P2^2;   //储能测试按钮
sbit led1=P0^0;         //分闸测试合格,灯亮;绿色
sbit led2=P0^1;  //合闸测试合格,灯亮;黄色
sbit led3=P0^2;  //储能测试合格,灯亮;蓝色
sbit led4=P0^3;  //信号错误指示灯。分闸不合格,led1灭,led4亮。合闸不合格,led2灭,led4亮。储能同上
sbit led5=P0^4;  //分闸测试功能指示灯
sbit led6=P0^5;  //合闸测试功能指示灯
sbit led7=P0^6;  //储能测试功能指示灯
void delayms(uint);//延时定义
void anjiank9();//定义按键k9
void anjiank10();//定义按键k10
void anjiank11();//定义按键k11
void main()
{
        while(1)
        {
                anjiank9();
                anjiank10();
                anjiank11();
        }
}
void anjiank9()   //按键9功能定义
{
        if(k9==0)
        {
                delayms(10);
                if(k9==0)
                {
                        led5=~led5;
                }
                        while(!k9);
                                if(k1==1&k2==0&k3==1&k4==0&k5==1&k6==0&k7==1&k8==1)
                                {
                                        led1=0;
                                }
                                else
                                {
                                        led1=1;
                                        led4=0;
                                }
                               
        }
}

void anjiank10()  //定义按键k10功能
{
        if(k10==0)
        {
                delayms(10);
                if(k10==0)
                {
                        led6=~led6;
                }
                while(!k10);
                        if(k1==0&k2==1&k3==0&k4==1&k5==0&k6==1&k7==0&k8==0)
                        {
                                led2=0;
                        }
                        else
                        {
                                led2=1;
                                led4=0;
                        }
                }
}

void anjiank11()  //定义按键k11功能
{
        if(k11==0)
        {
                delayms(10);
                if(k11==0)
                {
                        led7=~led7;
                }
                while(!k11);
                        if(k7!=0&k8!=0)
                        {
                                led3=0;
                        }
                        else
                        {
                                led3=1;
                                led4=0;
                        }
        }
}
               

void delayms(uint xms)  //延时函数
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}
               


捕获.PNG (53.5 KB, 下载次数: 94)

捕获.PNG
回复

使用道具 举报

12#
ID:230847 发表于 2017-9-19 21:41 | 只看该作者
gaochang000000 发表于 2017-9-19 18:35
还有P0口要加上拉电阻

你好,已经加上了,还想问一下发光二极管与单片机之间需要加一个锁存器吗?按键是不是也得并上分压电阻?
谢谢啦
回复

使用道具 举报

13#
ID:213173 发表于 2017-9-20 08:45 | 只看该作者
一束光的旅程 发表于 2017-9-19 21:35
这次将所有程序的功能全部写出来了。程序如下。
#include
#include

你用拨码开关才能模拟P1端口状态


回复

使用道具 举报

14#
ID:234353 发表于 2017-9-20 13:52 | 只看该作者
好文章,可是看不懂,与我现在从事的工作很有关联
回复

使用道具 举报

15#
ID:230847 发表于 2017-9-23 11:38 | 只看该作者
wulin 发表于 2017-9-20 08:45
你用拨码开关才能模拟P1端口状态

谢谢。一时没有想到拨码开关。SW1实际上是辅助开关信号点。已经制作了一部分。

1.PNG (254.48 KB, 下载次数: 71)

1.PNG
回复

使用道具 举报

16#
ID:230847 发表于 2017-10-3 18:11 | 只看该作者
之前测试时出现信号勿动的问题,并且灯太多,不容易判断。又重新改了一下板子和程序。程序如下:
#include <reg51.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
sbit s1=P1^0;         //合闸信号(常开)
sbit s2=P1^1;    //分闸信号(常闭)
sbit s3=P1^2;    //合闸信号(常开)
sbit s4=P1^3;    //分闸信号(常闭)
sbit s5=P1^4;    //合闸信号(常开)
sbit s6=P1^5;    //分闸信号(常闭)
sbit s7=P1^6;    //储能信号(常开)
sbit s8=P1^7;    //储能信号(常开)
sbit k1=P2^0;    //分闸测试按钮
sbit k2=P2^1;    //合闸测试按钮
sbit k3=P2^2;    //储能测试按钮
sbit led1=P0^0;         //分闸测试合格,灯亮;绿色,不合格闪烁,且红灯亮
sbit led2=P0^1;  //合闸测试合格,灯亮;黄色,不合格闪烁,且红灯亮
sbit led3=P0^2;  //储能测试合格,灯亮;蓝色,不合格闪烁,且红灯亮
sbit led4=P0^3;  //信号错误指示灯
void delayms(uint);//延时定义
void f1();//定义F-D分闸信号
void h1();//定义F-D合闸信号
void c1();//定义F-D储能信号
void bj1();//定义警示灯闪烁
void bj2();//定义警示灯闪烁
void bj3();//定义警示灯闪烁
/**************************************
*延时程序
**************************************/
void delayms(uint xms)  //延时函数
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}
/**************************************
*分闸信号异常报警
**************************************/
void bj1()//分闸信号异常报警
{
  while(1)
  {
        led4=0;
        led1=0;
        delayms(200);
        led4=1;
        led1=1;
        delayms(200);
  }
}
/**************************************
*合闸信号异常报警
**************************************/
void bj2()//合闸信号异常报警
{
        while(1)
        {
                led4=0;
                led2=0;
                delayms(200);
                led4=1;
                led2=1;
                delayms(200);
        }
}
/**************************************
*储能信号异常报警
**************************************/
void bj3()//储能信号异常报警
{
        while(1)
        {
                led4=0;
                led3=0;
                delayms(200);
                led4=1;
                led3=1;
                delayms(200);
        }
}
/**************************************
*SOG分闸信号判断
**************************************/
void f1()
{
        if(k1==0)
        {
                if(s1==1&&s2==0&&s3==1&&s4==0&&s5==1&&s6==0&&s7==1&&s8==1)
                {
                        led1=0;
                }
                else
                {
                        bj1();
                }
        }
        while(!k1);
}
/**************************************
*SOG合闸信号判断
**************************************/
void h1()
{
        if(k2==0)
        {
                if(s1==0&&s2==1&&s3==0&&s4==1&&s5==0&&s6==1&&s7==0&&s8==0)
                {
                        led2=0;
                }
                else
                {
                        bj2();
                }
        }
        while(!k2);
}
/**************************************
*SOG储能信号判断
**************************************/
void c1()
{
        if(k3==0)
        {
                if(s1==0&&s2==1&&s3==0&&s4==1&&s5==0&&s6==1&&s7==1&&s8==1)
                {
                        led3=0;
                }
                else
                {
                        bj3();
                }
        }
        while(!k3);
}
/**************************************
*主程序
**************************************/
void main()
{
        while(1)
        {
                       
                f1();
                h1();
                c1();
        }
}

捕获.PNG (66.92 KB, 下载次数: 56)

捕获.PNG
回复

使用道具 举报

17#
ID:237156 发表于 2017-10-3 19:35 来自手机 | 只看该作者
你是在做毕业设计吗
回复

使用道具 举报

18#
ID:230847 发表于 2017-10-3 20:10 来自手机 | 只看该作者
8956797481 发表于 2017-10-3 19:35
你是在做毕业设计吗

不是,已经工作了,在做工装。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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