标题: 51单片机不受代码控制,求大神解惑。 [打印本页]

作者: 单片机我来了    时间: 2018-3-31 12:45
标题: 51单片机不受代码控制,求大神解惑。
我做了三个类似的板,但都是这样的问题,引脚全是高电平。为什么会这样呢?我一直困惑不解,求解惑。

1.png (46.45 KB, 下载次数: 48)

代码已经设置全为零了。

代码已经设置全为零了。

2.png (53.68 KB, 下载次数: 58)

原理图

原理图

作者: cjjcjj1    时间: 2018-3-31 14:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: wj0755    时间: 2018-3-31 15:24
delay(50000)?这个函数有问题
作者: 5222228    时间: 2018-3-31 15:54
不是直接等于0,用P1=0x00;P2=0x00;P3=0x00;
作者: zycs    时间: 2018-3-31 16:11
IO口用16进制的写法就像3楼说的

作者: qweewq123    时间: 2018-3-31 16:48
delay(50000)?这个函数有问题,不是直接等于0,用P1=0x00;P2=0x00;P3=0x00;
作者: joy07wang    时间: 2018-3-31 18:02
P1 P2 P3是什么鬼?改成P1.1 P1.2 P1.3
作者: EvilOctopus    时间: 2018-3-31 19:11
会不会是单片机的电压不够,或者晶振没弄好
作者: abcasd    时间: 2018-3-31 20:31
delay有问题吧?
作者: angmall    时间: 2018-3-31 20:54
应该需要设置单片机的管脚属性,就是IO口寄存器,默认的也许不符合,去看看这部分,你要输出要确保IO口设置成了输出脚,不然代码对也起不了作用
作者: 单片机我来了    时间: 2018-3-31 21:21
cjjcjj1 发表于 2018-3-31 14:56
你确定程序下载进单片机了吗?

我在开发板试过可以的。
作者: 单片机我来了    时间: 2018-3-31 21:21
wj0755 发表于 2018-3-31 15:24
delay(50000)?这个函数有问题

没有问题,我在开发板验证过了。
作者: 单片机我来了    时间: 2018-3-31 21:22
5222228 发表于 2018-3-31 15:54
不是直接等于0,用P1=0x00;P2=0x00;P3=0x00;

直接等于0是可以的。开发板的led是可以亮的。
作者: zhangxiaozi    时间: 2018-3-31 22:02
你的31脚EA接法有问题,如果用外部rom接地,不然直接接电源,你现在根本就没外部ROM,就直接接电源
作者: zhaoxin123    时间: 2018-3-31 22:59
你这个原理图和程序对应不上啊
作者: 单片机我来了    时间: 2018-4-1 07:44
abcasd 发表于 2018-3-31 20:31
delay有问题吧?

没有,开发板上是可以正常运行的。
作者: 单片机我来了    时间: 2018-4-1 07:46
joy07wang 发表于 2018-3-31 18:02
P1 P2 P3是什么鬼?改成P1.1 P1.2 P1.3

P1这是一种全引用管脚的用法。代表从P1^0到P1^7,全部统一使用。
作者: 单片机我来了    时间: 2018-4-1 07:49
EvilOctopus 发表于 2018-3-31 19:11
会不会是单片机的电压不够,或者晶振没弄好

我用的是四节1.5V电池共6V,所以原理图加个二极管降压0.7,然后实际板,我也试过短路二极管,但还是一个样。至于晶振,我测过它没有短路,断路,电压在2.5v左右。
作者: 单片机我来了    时间: 2018-4-1 07:50
angmall 发表于 2018-3-31 20:54
应该需要设置单片机的管脚属性,就是IO口寄存器,默认的也许不符合,去看看这部分,你要输出要确保IO口设置 ...

好,我确实没有考虑这方面。
作者: 单片机我来了    时间: 2018-4-1 07:53
zhangxiaozi 发表于 2018-3-31 22:02
你的31脚EA接法有问题,如果用外部rom接地,不然直接接电源,你现在根本就没外部ROM,就直接接电源

嗯嗯,可是我已经试过这种方法了。把EA脚接电源和悬空都试过一次了。只是结果...不尽人愿。
作者: 单片机我来了    时间: 2018-4-1 07:58
zhaoxin123 发表于 2018-3-31 22:59
你这个原理图和程序对应不上啊

计划的代码不是这样的,我只是用 这个简单的代码控制两张LED灯 来测试一下板行不行。结果是不亮,然而在P1^0引脚接一个LED正极,另一个脚通过一个电阻再接电源阴极却亮了。随后测到的全部引脚都是 高电平。
作者: 单片机我来了    时间: 2018-4-1 08:48
angmall 发表于 2018-3-31 20:54
应该需要设置单片机的管脚属性,就是IO口寄存器,默认的也许不符合,去看看这部分,你要输出要确保IO口设置 ...

C:\Users\zhou\Desktop
51单片机的IO口操作基础知识介绍
我看了这篇文章,然后在开发板试了一下,我代码写       
P2M0 = 0x00;
P2M1 = 0xff;
我开发板是P2控制LED模块。
按照文章说我设置的是“仅为输入”,但是并没有效果啊。
LED模块仍是可以按照代码 P2=~P2;delay(50000); 闪烁不停。
作者: bailoao    时间: 2018-4-1 14:55
额,p0需要上拉电阻,p2不用
作者: 单片机我来了    时间: 2018-4-1 21:42
bailoao 发表于 2018-4-1 14:55
额,p0需要上拉电阻,p2不用

我实际的板并没有使用P0,P3,写这个代码只是想用P1^0和P2^0检验板是否正常。因为我之前做个两个板都是这个样,引所有脚全是高电平。
作者: 单片机我来了    时间: 2018-4-1 21:46
这个问题目前恐怕还是解决不了。
难道我真的是和单片机无缘了?
如何拯救我脆弱的小心灵?
求某个大神给个 简单的让一盏LED灯闪烁的原理图,封装图我,然后再给代码我。
我去做个新的电路板,试试。
谢!
作者: sharklaser    时间: 2018-4-1 22:11
参数设置写错,没有变化
作者: pmsjzj    时间: 2018-4-1 22:25
delay(50000) 陶醉了, 改成十六进制吧
作者: 单片机我来了    时间: 2018-4-1 22:27
sharklaser 发表于 2018-4-1 22:11
参数设置写错,没有变化

什么意思呢?你说的参数是....?还请明示。
作者: kaifeng88    时间: 2018-4-1 23:05
你确定复位电路正确??
作者: 单片机我来了    时间: 2018-4-1 23:16
pmsjzj 发表于 2018-4-1 22:25
delay(50000) 陶醉了, 改成十六进制吧

这delay函数是没有问题的啊。在开发板是完全胜任的啊。问题不会出现在代码代码在开发板上是正常运行的。还请帮我看下原理图吧。
作者: 笑纳倾城    时间: 2018-4-1 23:20
宏定义顺序有问题
作者: 单片机我来了    时间: 2018-4-2 07:19
kaifeng88 发表于 2018-4-1 23:05
你确定复位电路正确??

我一直怀疑的是我的最小系统有问题。我不知道。我看了网络上的,包括我树上的复位电路,都是如此啊。看不错出有什么错。无奈,还请指出。
作者: 单片机我来了    时间: 2018-4-2 07:22
笑纳倾城 发表于 2018-4-1 23:20
宏定义顺序有问题

不用纠结代码吧。
代码不规范,也可以运行的吧。
因为代码在开发板是可以正常运行的。我一直怀疑的是我的图有问题。因为我做过三次这样的最小系统。
作者: 单片机我来了    时间: 2018-4-2 18:27
居然没人和我遇到同一种情况的吗?还是没有人帮助新人?绝望....
作者: dalaoshi    时间: 2018-4-3 03:08
哈,我是看不懂C语言的,也没有用过89C52, 可是看那个EA接脚就觉得奇怪,为何是接在LED与电阻之间呢,照看那样接EA脚是在1-2V之间(忘了LED的结电压)不是0也不是1,也是0也是1,如果是这样的话,开机后偶尔跑内部程序,偶尔跑外部程序,叫“不尽人意“,大概是这个意思吧?如果没有外部程序,那所有的脚都是高电位吧? 那LED根本没什么用吧? 另外你是否用对CPU的版本,听说有两个版本的。
作者: 李金星    时间: 2018-4-3 07:53
尝试把bs18b20中间GND重新接一下
作者: yunyunyun    时间: 2018-4-3 08:36
delay  有问题
作者: drug331435771    时间: 2018-4-3 10:18
延时函数有问题 建议修改一下
作者: perfect2    时间: 2018-4-3 14:15
P1,P2,P3,P0,没有定义 无法直接使用    前面定义了 sbit D1=P1^0;  sbit led=P2^0    要控制 P1.0    P2.0口就要操作 D1  和 led 这两个变量
作者: QIANLILI    时间: 2018-4-3 21:30
根据你的程序 稍微修改下  用于测试4组IO口的高低电平切换。 仿真和实物都没问题。 你那个程序也应该没问题。问题应该是你接了那个EA脚。 那个不需要用的啊。 STC89S52 最小系统  只需要晶振和2个22PF的电容就可。自动复位电路也不需要。 我一般都是接个开关一头接电源正极一头接复位脚。另外 STC89s52的电压需要4.5伏到5伏。4伏以下就不能正常运行。 而AT89S52倒是可以在3.6伏左右运行。虽然手册上要求4伏到5伏电压。楼主把EA脚和其它电路断开再测试下。应该就是这个问题。
#include<reg52.h>

void delay(unsigned int z)
{
    while(z--);
}

void main()
{
  while(1)
{
         P0=0;
         P1=0;
   P2=0;
         P3=0;
         delay(50000);
         P0=0xFF;
         P1=0xFF;
         P2=0xFF;
         P3=0xFF;
         delay(50000);
  }        
}
作者: QIANLILI    时间: 2018-4-3 21:38
单片机我来了 发表于 2018-4-1 21:42
我实际的板并没有使用P0,P3,写这个代码只是想用P1^0和P2^0检验板是否正常。因为我之前做个两个板都是这 ...

STC89C52  P0口不需要加上拉。ATMEL公司的 AT89C52需要加上拉。
作者: 单片机我来了    时间: 2018-4-3 21:49
dalaoshi 发表于 2018-4-3 03:08
哈,我是看不懂C语言的,也没有用过89C52, 可是看那个EA接脚就觉得奇怪,为何是接在LED与电阻之间呢,照看 ...

那个EA脚有楼提醒过我,我改过了,试过接电源也试过接地了。结果就是不行,依然高电平不断。
作者: 单片机我来了    时间: 2018-4-3 21:51
perfect2 发表于 2018-4-3 14:15
P1,P2,P3,P0,没有定义 无法直接使用    前面定义了 sbit D1=P1^0;  sbit led=P2^0    要控制 P1.0    P2.0 ...

哎...不是不行,而是你没有用过。P1,P2,P3,P0在头文件里已经定义的了。你可以百科一下...
作者: kspaitjn    时间: 2018-4-3 22:12
延时定太大了吧
作者: 18712787637    时间: 2018-4-3 22:12
主函数中的while对io口赋值没有意义,可以放到循环的外边,然后写while(1);
就可以了
作者: QIANLILI    时间: 2018-4-3 22:24
依然高电平不断?楼主指的是单片机上电后一直输出高电平还是有过低电平?  我改的程序是每隔1秒左右高低电平切换。 我试下来都没问题啊。 你手上有几片这样的单片机?确定程序烧录进去了吗?  还是STC的单片机是用串口烧录的,你那个单片机是怎么烧录的?是用烧录器吗? 程序肯定没问题。 难道你那片单片机坏了?
作者: QIANLILI    时间: 2018-4-3 22:35
依然高电平不断? 刚才又看了下你的程序和电路图。 你电路图上的D2和D4  2个LED是正极接电源  负极接单片机IO口  那么当单片机口设置成  P0=0;P1=0;P2=0;P3=0; 时  LED就是亮的状态。  如果你要LED不亮  那么初始设置成P0=0xFF;P1=0xFF;P2=0xFF;P3=0xFF;  还有要把这几个设置IO代码放在  while(1)上面。 否则一直循环设置。 我估计你所说的一直高电平就是指的这个情况。 因为你把IO置低电平一直放在循环里面。 所以LED就是一直亮的状态。
void main()
{
         P0=0xFF;
         P1=0xFF;
         P2=0xFF;
         P3=0xFF;
  while(1)
{

  }        
}
作者: oohoh    时间: 2018-4-3 23:02
我也遇到过类似问题,现象很诡异,P口高电平,在VCC和地之间接led加10K电阻,运行正常。怀疑单片机和开发板不匹配
作者: ycs05201314    时间: 2018-4-4 09:09
P1不是直接=0,应该是0x00
作者: QIANLILI    时间: 2018-4-4 10:11
ycs05201314 发表于 2018-4-4 09:09
P1不是直接=0,应该是0x00

对于赋值0到9都是可以直接这么写的。P1=0; 和  P1=0x00;  效果是一样的。 如果是大于9了  直接写十进制数字和十六进制是不一样的。 也就是P1=9; 和 P1=0x09; 也可以直接写效果是一样的。 但是P1=10; 和 P1=0x10;  就不是一样的效果了。P1=16; 和 P1=0x10;  才是一样的。  这个试一下就能明白的。
作者: 不败的小强    时间: 2018-4-5 20:23
你的IO口一直都是0还是死循环 怎么控制?
作者: 单片机我来了    时间: 2018-4-7 20:43
QIANLILI 发表于 2018-4-3 21:30
根据你的程序 稍微修改下  用于测试4组IO口的高低电平切换。 仿真和实物都没问题。 你那个程序也应该没问题 ...

好好,感谢你衷心的回复。
作者: 单片机我来了    时间: 2018-4-7 20:57
QIANLILI 发表于 2018-4-3 22:24
依然高电平不断?楼主指的是单片机上电后一直输出高电平还是有过低电平?  我改的程序是每隔1秒左右高低电 ...

是的,高电平不断。一直都是高电平,从来没有出现出现过低电平。我手上有三个单片机,在开发板上都是正常的。我是用开发板烧录的,然后换到我做的板上。

我知道我的原因了。因为我做的是双面板。我身边有个人告诉我,双面板成功的概率是七分之一。我只是做了三个板。我现在困惑为何双面板成功的概率那么低 ?
作者: 单片机我来了    时间: 2018-4-7 21:05
不败的小强 发表于 2018-4-5 20:23
你的IO口一直都是0还是死循环 怎么控制?

你说的不错。但我试试过用闪烁的,都是没有反应。。。
作者: QIANLILI    时间: 2018-4-7 22:44
单片机我来了 发表于 2018-4-7 20:57
是的,高电平不断。一直都是高电平,从来没有出现出现过低电平。我手上有三个单片机,在开发板上都是正常 ...

这和双面板没关系的。 还是找找电路图和布线是否有错误的原因吧。你可以用万用板先搭个最精简的 测试下LED闪烁。 就能看出问题了。 确保晶振什么的也没问题。 建议还是用目前的STC8系列  性价比更高。
作者: wjshw    时间: 2018-4-7 23:25
这个图看着真乱!
作者: wjshw    时间: 2018-4-7 23:38
本来是想多打些字,无奈在快速回复时,按错键导致直接发出了!
看了大家的回复,都很认真!
我说下我的观点:1、图真的很乱:蜂鸣器不能直接接IO口线的;EA应该直接接VCC;两个LED上串的电阻阻值太大了(10K);2、程序如果想截图的一样,则两个LED应该始终是亮的(前提是两个限流电阻在1K以下)———原因是所有的口都是低电平;如果把截图中注释掉的两条语句加上,则两个LED应该始终是灭的————原因是输出低电平的时间太短了,只有几个机器周期,人眼根本分辨不出来;3、如果想实现亮、灭闪烁的效果,应该把P1=0;P2=0;P3=0;P0=0;这几条语句放在循环的外面即可。
作者: 单片机我来了    时间: 2018-4-8 22:20
oohoh 发表于 2018-4-3 23:02
我也遇到过类似问题,现象很诡异,P口高电平,在VCC和地之间接led加10K电阻,运行正常。怀疑单片机和开发板 ...

这样吗?我赶紧试试。谢谢
作者: 单片机我来了    时间: 2018-4-8 22:24
QIANLILI 发表于 2018-4-7 22:44
这和双面板没关系的。 还是找找电路图和布线是否有错误的原因吧。你可以用万用板先搭个最精简的 测试下LE ...

哈哈,我前天就是这样试的,得出结论我的最小系统是没有问题的。
剩下的还没找到原因,还在研究。
谢谢你用心答复,我好感动。
作者: 单片机我来了    时间: 2018-4-8 22:35
wjshw 发表于 2018-4-7 23:38
本来是想多打些字,无奈在快速回复时,按错键导致直接发出了!
看了大家的回复,都很认真!
我说下我的观 ...

哈哈,实在不好意思。初学者,抱着一颗试一下行不行的心,所以没有过多在意是否好看。
不过你说了,我才想到蜂鸣器还需要驱动芯片,LED电阻是有点大了,我再改改。
那个EA脚,我已经后台用线连过了。
但代码在开发板上是可以正常运行,就这样的代码加上后面的注释,LED是正常闪烁的。
谢谢您认真的回答。
作者: e0631    时间: 2018-4-9 14:22
CPU及其它所有的器件取电都从D1二极管的负极取,要不然有电压差。蜂鸣器加个NPN三极管驱动一下,三极管基极串接一个2.2K电阻到IO口,LED串接的电阻1K-2.2K都行,按键那2个10K的电阻做成上拉10K,按键直接对地即可。
作者: 单片机我来了    时间: 2018-4-10 21:45
e0631 发表于 2018-4-9 14:22
CPU及其它所有的器件取电都从D1二极管的负极取,要不然有电压差。蜂鸣器加个NPN三极管驱动一下,三极管基极 ...

好好,我试试。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1