求助!自己焊的一个板子,每次上电后灯亮状态都不一样。
本帖最后由 songtion 于 2012-4-24 10:33 编辑这个是具体的电路,请问各位前辈,是不是每次上电后复位没有工作啊?还是复位电路的电容有问题? 唔……都没有人赐教啊……{:sleepy:} 本帖最后由 prudent 于 2012-4-24 23:31 编辑
粗看上去,好像复位电路有问题啊,那个10K电阻接法不对啊,应该是上拉吧 電容與電阻位置反了。 P0 输出的初值是否一样 ? 本帖最后由 dz20062008 于 2012-4-25 02:16 编辑
测量晶振两端是否有二分之一的电源电压,更换复位电路的电阻电容,测量是否通电后为零伏电压。还有就是你的程序代码有问题也会这样的,最大的可能性是你的程序有问题!把源码贴上来吧,让大家看看被
编辑原因,我也把51的复位当AVR的低电平复位了,实际51单片机是高电平复位。
PS:所谓高电平复位就是上电的瞬间保持一定时间的高电平然后变为低电平的一种复位方式。
反之就是低电平复位. jjj206 发表于 2012-4-24 23:46 static/image/common/back.gif
電容與電阻位置反了。
51是高电平复位,我也一开始把它当AVR的低电平复位了! prudent 发表于 2012-4-24 23:29 static/image/common/back.gif
粗看上去,好像复位电路有问题啊,那个10K电阻接法不对啊,应该是上拉吧
51是高电平复位,所以这电路没有接错。AVR的单片机就才是低电平复位 本帖最后由 dianzichina 于 2012-4-25 06:29 编辑
是亮度不一样还是亮的灯不一样?请表述清楚。要是亮的灯不一样的话,那就是单片机没有程序,不能工作,输出的状态是的没有意义的随机值。一旦你初始化后,应该会归为全灭。 单片机里面写了程序了吗? 其实也不太对
复位是没问题的,晶振似乎也没问题
没有程序的话,出厂时应该有一个测试程序在里面的,AT的不知道了,很久没有用过了,至少STC的是有的,一般是类似流水灯的东西 电路是没错.应该是没下载程序. dianzichina 发表于 2012-4-25 06:28 static/image/common/back.gif
是亮度不一样还是亮的灯不一样?请表述清楚。要是亮的灯不一样的话,那就是单片机没有程序,不能工作,输出 ...
是亮的不一样,程序是对的,第一次上电的时候是完全按照程序走的。但后面就是每次一上电灯就乱亮…… xiaobendan001 发表于 2012-4-25 08:06 static/image/common/back.gif
其实也不太对
复位是没问题的,晶振似乎也没问题
没有程序的话,出厂时应该有一个测试程序在里面的,AT的不 ...
写了程序的,程序是对的,第一次还能完全按照程序走…… dz20062008 发表于 2012-4-25 02:03 static/image/common/back.gif
测量晶振两端是否有二分之一的电源电压,更换复位电路的电阻电容,测量是否通电后为零伏电压。还有就是你的 ...
附上程序:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit RED_A=P0^0;
sbit YELLOW_A=P0^1;
sbit GREEN_A=P0^2;
sbit RED_B=P0^3;
sbit YELLOW_B=P0^4;
sbit GREEN_B=P0^5;
uchar Flash_Count = 0;
Operation_Type = 1;
void DelayMS(uint x)
{
uchar t;
while(x--)
{
for(t=120;t>0;t--);
}
}
void Traffic_lignt()
{
switch(Operation_Type)
{
case 1:
RED_A=1;YELLOW_A=1;GREEN_A=0;
RED_B=0;YELLOW_B=1;GREEN_B=1;
DelayMS(2000);
Operation_Type = 2;
break;
case 2:
DelayMS(200);
YELLOW_A=~YELLOW_A;
if(++Flash_Count !=10)
return;
Flash_Count=0;
Operation_Type = 3;
break;
case 3:
RED_A=0;YELLOW_A=1;GREEN_A=1;
RED_B=1;YELLOW_B=1;GREEN_B=0;
DelayMS(2000);
Operation_Type = 4;
break;
case 4:
DelayMS(200);
YELLOW_B=~YELLOW_B;
if(++Flash_Count !=10)
return;
Flash_Count=0;
Operation_Type = 1;
break;
}
}
void main()
{
while(1)
{
Traffic_lignt();
}
}
看不懂C
不过我认为
大多是初始化代码有问题 兜圈儿的路过 songtion 发表于 2012-4-25 15:41 static/image/common/back.gif
附上程序:
#include
#define uchar unsigned char
P0口没有接上拉电阻??? raxb 发表于 2012-4-25 22:43 static/image/common/back.gif
P0口没有接上拉电阻???
接了啊…… 建议在CASE 2和 4里像 1 和3 里一样,对每一个IO口都赋值,而不是单纯的对某一个口进行取反。
case 2:
RED_A=1;YELLOW_A=0;GREEN_A=0;
RED_B=0;YELLOW_B=1;GREEN_B=1;
songtion 发表于 2012-4-25 23:05 static/image/common/back.gif
接了啊……
改到其它IO口试试,还是不行就是程序问题,行的话就是单片机P0口有问题 我知道问题出在哪里了
YELLOW_B=~YELLOW_B;
YELLOW_A=~YELLOW_A;
这两个取反的语句不能这样用
应该加个位变量,
bit a=0;
//////
a=~a;
YELLOW_A=a;
///////
这样试一下,楼主先把那几个取反的语句去掉,再试一下结果再告诉大家。
YELLOW_B=~YELLOW_B;
YELLOW_A=~YELLOW_A;
这样用貌似没有错,但是你是高电平接led,虽然IO已设为低电平输出,当你取反时首先在读取一次IO脚的电平, 这时有可能所读到的是高电平,而不是低电平
这就导致了每次取反的状态不一样。原因可能你的LED脚上接电阻太小了,换个阻值大点的试下,比如2K。
请楼主按我说的试下结果。
个人意见,不对请指正。
hongfadg 发表于 2012-4-26 11:03 static/image/common/back.gif
我知道问题出在哪里了
YELLOW_B=~YELLOW_B;
YELLOW_A=~YELLOW_A;
嗯、我试试看看,谢谢你们了啊! Operation_Type = 1;
为什么没有定义类型呢?
我也遇到过类似的现象,手动复位就每次都正常跑起来,上电复位容易失败,复位就恢复了。到现在也没有找打问题点,由于是新手也就没追求那么完美,估计是电源问题。问题还在!觉得要不是电源瞬态不好,就是程序初始化没写好,或者就是程序中有变量没保存被其它片段修改了。建议楼主使用KEIL的仿真调试。{:smile:} 在Main函数一开始把P0赋值!可能是上电复位时P0寄存器数值混乱了! void main()
{
P0=0x00;//加上这一行看看
while(1)
{
Traffic_lignt();
}
}
页:
[1]