dhl_665 发表于 2023-2-21 14:37:37

单片机始终处于复位状态,怎么回事?

版主:您好!请教一个问题,电路设计完成,程序也已经编辑完,仿真已通过,之后用面包板试做系统,程序也已经烧录到单片机中,可是没有出现预设的结果,经检查各I/O口始终输出的是复位信号,即P0口都是0,其他口都是1,怎么回事呢?

神农鼎 发表于 2023-2-21 16:26:54

把你详细的原理图的PDF 发上来,大家帮你

梁工 发表于 2023-2-21 16:28:27

能在线下载程序说明MCU已经能正常跑了,先测试STC官方的例程吧。

dhl_665 发表于 2023-2-25 13:17:43

首先感谢版主百忙之中抽出时间回复,给您添麻烦了!我这个项目的设计是这样的,用超声波检测是否有人员靠近,然后发出声音和灯光警示。

dhl_665 发表于 2023-2-25 13:20:45

上面是原理图,也是用proteus仿真的结果。下面是所编的程序。
//头文件
#include<reg51.h>
#include<intrins.h>
#include<absacc.h>
//#include <math.h>

//宏定义
#define uc unsigned char
#define ui unsigned int

sbit GM=P2^4;          //光敏
sbit TX1= P1^1;    //超声波发射引脚
sbit RX1= P1^0;          //超声波接收引脚
sbit TX2= P1^3;    //超声波发射引脚
sbit RX2= P1^2;          //超声波接收引脚
sbit TX3= P1^5;    //超声波发射引脚
sbit RX3= P1^4;          //超声波接收引脚
sbit TX4= P1^7;    //超声波发射引脚
sbit RX4= P1^6;          //超声波接收引脚
sbit TX5= P2^1;    //超声波发射引脚
sbit RX5= P2^0;          //超声波接收引脚
sbit KZ1=P2^5;          //警报灯(继电器)1
sbit KZ2=P2^6;          //警报灯(继电器)2
sbit KZ3=P2^7;          //警告音

uc m=0;                  //定义次数变量m

void delay(ui x)//延时函数
{
        ui i,j;
        for(i=0;i<x;i++)
        for(j=0;j<110;j++);
}

void init()       //初始化函数
{
   GM=0;          //光敏置低
   KZ1=1;         //警报灯(继电器)1关
   KZ2=1;         //警报灯(继电器)2关
   KZ3=0;         //警告音关
        TMOD=0x01;       //定时器工作方式
        TH0=0x3c;
        TL0=0xb0;       //赋初值50ms    这个计数初值是正确的,我已经验算过了
        ET0=1;               //打开中断允许开关
        TR0=1;               //打开定时器计时开关
        EA=1;               //打开中断总开关
}

void T0_time() interrupt 1        //定时器执行函数,每隔半秒发送一次超声波检测信号
{   
        TH0=0x3c;
        TL0=0xb0;                                //重新赋初值50ms
        m++;                                        //m加一次是50ms
        if(m>=10)                                //加到10次,就是半秒
        {
                m=0;                                //m清零
TX1=1;                                //每半秒启动一次超声波检测
TX2=1;
TX3=1;
TX4=1;
TX5=1;
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
      _nop_();
                TX1=0;
TX2=0;
TX3=0;
TX4=0;
TX5=0;
    }
}   

void main()      //主函数
{
        init();//初始化函数
        while(1)//空循环
      {
            while(!(RX1||RX2||RX3||RX4||RX5))          //当RX为零时等待
            {
                  KZ1=1;   //警报灯(继电器)1关
                  KZ2=1;   //警报灯(继电器)2关
                  KZ3=0;   //警告音关
            }
            while(RX1||RX2||RX3||RX4||RX5)                //当RX为1说明检测到有人或事物靠近
            {
                  if(GM==1)        //说明是白天
                {
                        KZ1=1;
                        KZ2=1;
                        KZ3=1;
                     delay(5000);   //延时5s
                  }
                  if(GM==0)        //说明是夜晚
                {
                        KZ1=0;
                        KZ2=0;
                        KZ3=1;
                     delay(5000);//延时5s
                  }
          }
        }
}

dhl_665 发表于 2023-2-25 13:46:41

我用面包板做完系统后没出现预想的结果,也请教了一下别人,他说面包板有时候连接不好,所以我就焊了个板子,结果跟面包板差不多,也没出现理想结果。现在我只连了声音模块,没连警报灯模块,结果警报音一直在响,无论超声波检测没检测到人。我测了一下单片机的各引脚信号,是这样,p0.0~p0.7是0V,EA是5V,ALE是0V,PSEN是5V,p2.7~p2.2都是5V,p2.1、p1.1、p1.3、p1.5、p1.7,也就是超声波的发射引脚都是0V,p2.0、p1.0、p1.2、p1.4、p1.6,也就是超声波的接收引脚都是5V,RST是0V,p3.0~p3.7是5V,XTAL2是1.4V,XTAL1是1.2V。超声波传感器用的是HC-SR04,有四个引脚,一个VCC,一个地,一个接单片机发射(触发)引脚,一个接单片机接收引脚。为什么接收引脚始终是高电平呢?请版主百忙之中抽时间帮分析一下,不胜感激!再附上实物照片。

dhl_665 发表于 2023-2-25 15:20:21

看教科书上说p1、p2、p3口作为输入口,在读取状态前应该先输入一个1,是因为这个原因吗,我的传感器接收引脚一直是高电平?但我仿真程序里并没有输入1,也读取正确状态了?
页: [1]
查看完整版本: 单片机始终处于复位状态,怎么回事?