打印

同样的程序,在不同的单片机行不通?

[复制链接]
5114|44
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
puppet21|  楼主 | 2013-12-18 11:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 puppet21 于 2013-12-18 14:28 编辑

同样的一个DS18B20的程序,走线也全部一样,只是换了芯片,为什么在STCAT89C52能检测温度,在STC12C5A60S2里面,出来的数据是FF?

求解?有没做过得大神知道原因?

PS:我是知道两款单片机的速度差别的,也尝试过

//void waittime(unsigned int i)//延时函数
//{        
// while(i--);
//}
void waittime(unsigned int i)//延时函数
{        i = i*12;
while(i--);
}
用这样的延时,但效果都是FF(waittime是DS18B20上面用的专用函数,其他地方用的是其他延时程序,不知道会不会影响?理论上是没影响的)


//void waittime(unsigned int i)//延时函数 89c52延时
//{        
// while(i--);
//}
void waittime(unsigned int i)//延时函数 STC12C5A60S2 所用延时
{        i = i*12;
while(i--);
}

//18b20初始化函数
void newDS18B20(void)
{
unsigned char x=0;
DQ = 1;    //DQ复位
waittime(8);  //稍做延时
DQ = 0;    //单片机将DQ拉低
waittime(80); //精确延时 大于 480us
DQ = 1;    //拉高总线
waittime(10);
x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
waittime(5);
}

//读一个字节
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
  DQ = 0; // 给脉冲信号
  dat>>=1;
  DQ = 1; // 给脉冲信号
  if(DQ)
   dat|=0x80;
  waittime(5);
}
return(dat);
}

//写一个字节
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
  DQ = 0;
  DQ = dat&0x01;
  waittime(5);
  DQ = 1;
  dat>>=1;
}
waittime(5);
}

//读取温度
unsigned char ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
//float tt=0;
newDS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
waittime(200);
newDS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();

b<<=4;
b+=(a&0xf0)>>4;
t=b;
return(t);
}


贴代码了~虚心诚心求找碴~~
(经过检测,初始化程序已经失败,newDS18B20 ()中x 为 1)
(是否是电压有关?不过STC的这两款单片机的驱动电压貌似都是5V,I/O电压都是3.3,不知道我理解有没有错?)

相关帖子

沙发
menfiss| | 2013-12-18 12:02 | 只看该作者
后者一般比前者快挺多

使用特权

评论回复
板凳
znmcu| | 2013-12-18 12:06 | 只看该作者
你既然用18b20,你应该知道他对时间和时序要求很严格。你既然使用5a60s2,你起码应该知道它比stc52快几倍。

使用特权

评论回复
地板
as564335sa| | 2013-12-18 12:29 | 只看该作者
这问题问的.....

使用特权

评论回复
5
xyz549040622| | 2013-12-18 12:43 | 只看该作者
汗,你不知道后者是1T的速度,前者是12T的

使用特权

评论回复
6
znmcu| | 2013-12-18 13:02 | 只看该作者
很多人搞单片机,对自己手上的芯片性能根本不了解。完全是闭着眼搞。

使用特权

评论回复
7
ayb_ice| | 2013-12-18 13:03 | 只看该作者
这程序肯定不是LZ写的

使用特权

评论回复
8
airwill| | 2013-12-18 13:03 | 只看该作者
嗯, 应该是速度过快, 延迟时间不够引起的.
当然也有可能是端口配置方面的差异, 得仔细分析一下输出波形和数据手册

使用特权

评论回复
9
autopccopy| | 2013-12-18 13:19 | 只看该作者
上面说了,主要是1T/12T速度的问题。

使用特权

评论回复
10
znmcu| | 2013-12-18 13:21 | 只看该作者
对于18b20,其实大多数人都是用现成的程序。真正把时序搞的很透,完全靠自己搞通的不多。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
banalmaster + 1 赞一个!
11
szweiyang| | 2013-12-18 13:27 | 只看该作者
新手,碰到过一段STC单片机程序,包含通用头文件时就不能运行:L

使用特权

评论回复
12
puppet21|  楼主 | 2013-12-18 13:28 | 只看该作者
menfiss 发表于 2013-12-18 12:02
后者一般比前者快挺多

1.DS18B20的代码是根据网上资料摘抄的,这个我承认

2.我知道他们(单片机)速度的区别,也尝试过扩大12倍的时序延时,但同样出来的数据也是FF,这是我不解的地方。

3.同时我承认对芯片确实不是十分的了解,我想相信要对每一个使用过的芯片彻底了解,估计要实践和理论结合操作相当一段时间才能达到。进步,是需要过程的。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
贝贝妮妮heart + 1 赞一个!
13
puppet21|  楼主 | 2013-12-18 13:28 | 只看该作者
znmcu 发表于 2013-12-18 12:06
你既然用18b20,你应该知道他对时间和时序要求很严格。你既然使用5a60s2,你起码应该知道它比stc52快几倍。 ...

1.DS18B20的代码是根据网上资料摘抄的,这个我承认

2.我知道他们(单片机)速度的区别,也尝试过扩大12倍的时序延时,但同样出来的数据也是FF,这是我不解的地方。

使用特权

评论回复
14
puppet21|  楼主 | 2013-12-18 13:29 | 只看该作者
xyz549040622 发表于 2013-12-18 12:43
汗,你不知道后者是1T的速度,前者是12T的


2.我知道他们(单片机)速度的区别,也尝试过扩大12倍的时序延时,但同样出来的数据也是FF,这是我不解的地方。

使用特权

评论回复
15
xyz549040622| | 2013-12-18 13:31 | 只看该作者
puppet21 发表于 2013-12-18 13:29
2.我知道他们(单片机)速度的区别,也尝试过扩大12倍的时序延时,但同样出来的数据也是FF,这是我不解 ...

测试下你的延时函数,以及在每条指令后加几个空操作

使用特权

评论回复
16
puppet21|  楼主 | 2013-12-18 13:32 | 只看该作者
airwill 发表于 2013-12-18 13:03
嗯, 应该是速度过快, 延迟时间不够引起的.
当然也有可能是端口配置方面的差异, 得仔细分析一下输出波形和 ...

谢谢版主的建议!!

因为工具有限,所以都是靠芯片文档与现成的时序代码修改测试的,难以做到分析波形。

使用特权

评论回复
17
puppet21|  楼主 | 2013-12-18 13:34 | 只看该作者
szweiyang 发表于 2013-12-18 13:27
新手,碰到过一段STC单片机程序,包含通用头文件时就不能运行

什么意思?我没听懂……与LZ主题有关么?

我程序上面其他地方都是没有问题的,就是DS18B20返回数据不正确……

使用特权

评论回复
18
szweiyang| | 2013-12-18 13:46 | 只看该作者
puppet21 发表于 2013-12-18 13:34
什么意思?我没听懂……与LZ主题有关么?

我程序上面其他地方都是没有问题的,就是DS18B20返回数据不正 ...

我买过一个模块,卖家单片机为STC89LE52,包含的头文件为REG52.H,后来模块上单片机升级为STC11L08XE,此时程序根本无法运行,后来头文件改为STC11系列就好了
供楼主参考

使用特权

评论回复
19
puppet21|  楼主 | 2013-12-18 13:52 | 只看该作者
szweiyang 发表于 2013-12-18 13:46
我买过一个模块,卖家单片机为STC89LE52,包含的头文件为REG52.H,后来模块上单片机升级为STC11L08XE,此 ...

谢谢!

估计不是这个问题,STC12C5A60S2用的本来就是REG51.H这个头文件,而且里面只是一些地址分配的变量,STC12C5A60S2与STC89C52相同部分地址是一致的,第二串口个EPR部分我自己有写。都没问题,就是18B20的初始化出了问题,但我又分不清是哪里的问题!

使用特权

评论回复
20
有缘千里| | 2013-12-18 14:23 | 只看该作者
用示波器看看你的时序,我记得复位好像要在480~960us;其他的都有严格的时序;如果没有示波器想办法用串口把数据打出来;比如18b20复位成功后会有一个低电平,如果你检测到了串口打个数;其他的类似;不过这样很累。希望你能成功;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

140

帖子

0

粉丝