首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

请教ds1990a的c编程问题

请教ds1990a的c编程问题

想用at89s52+ds1990a开发一个电子标签模块,能将ds1990a的序列号读入52,然后通过串口传输到上位机。请各位dx指教!(主要是时序问题,搞不定^_^)
单总线的东东我觉得主要得搞清楚那几个命令的信号波形.
在编程时要严格计算每一指令的执行时间,确保与命令的波形相吻合,精确到US级.
推荐用汇编来做!!!!
51 c8051f(f020,f040) msp430 arm(2410,2510) fpga(xc3s4000) dsp(5116 dm642) keilc vc++ matlab linux protel Ten_layerPCB mpegx h.26x Rscode Turbocode ofdm VideoBroadcasting ldpc_code(now!)
属于半路出家,没系统的学习单片机,只懂点c语言,能不能做呀?谢谢你呀
我没用C语方做过啊,估计应该能做,但是单片机的晶振频率要高,可能会麻烦点.
用汇编做的话也就那几条命令,看看"单片机基础"之类的书就能搞定.
51 c8051f(f020,f040) msp430 arm(2410,2510) fpga(xc3s4000) dsp(5116 dm642) keilc vc++ matlab linux protel Ten_layerPCB mpegx h.26x Rscode Turbocode ofdm VideoBroadcasting ldpc_code(now!)
我的时序主要是参考ds18b20写的,看到大多数的书上说单总线的时序都是一样的,如果有时间帮忙看一下呀,谢谢!
#include
#include //用的at89s52
#define uint unsigned int
#define uchar unsigned char
uchar SerialNum[8];
sbit DQ=P0^0;//DQ代表端口,接ds1990a

//延时
//延迟时间大约为(usecond*12+20)us
void delay(uint usecond)
{uchar i;
for(i=0;i }



//复位
uchar ow_reset(void)
{
uchar presence;
DQ=0;//拉低DQ总线开始复位
delay(36);//保持DQ低480us
DQ=1;//释放DQ
delay(5);//等待芯片应答信号
presence=DQ;//获得应答信号
delay(33);//延时以完成整个时序
return(presence);//返回应答信号,有芯片应答presence=0,无应答presence=1
}


//从1-wire总线上读取一位
uchar read_bit(void)
{
uchar i;
DQ=0;//将总线DQ拉低开始读时序
_nop_();//延时2us
_nop_();
DQ=1;//释放总线
for(i=0;i<3;i++);//延时15us后再读数据
return(DQ);//返回数据值
}


//从1-wire上读取一个字节
uchar read_byte(void)
{
uchar i;
uchar value=0;
for(i=0;i<8;i++)
{
if(read_bit())
value|=0x01< delay(6);//延时80us,完成此次读时序,之后读下一位
}
return(value);
}


//向1-wire总线上写一位数据
void write_bit(char bitval)
{
DQ=0;//拉低DQ开始一个写时序
if(bitval==1)
DQ=1;//若写1,则将总线置高
delay(6);//延时80us
DQ=1;//释放DQ总线
}


//向1-wire上写一字节数据
void write(char val)
{uchar i;
uchar temp;
for(i=0;i<8;i++)//写一字节数据,一次写一位
{
temp=val>>i;//移位操作,将在本次写的位移到最低位
temp&=0x01;
write_byte(temp);//向总线写该位
}
}

//ds1990a的crc8校验程序

uchar crc8r(uchar crcbyte) {
uchar i,crc;
crc = 0;
for(i = 0; i < 8; i++) {
if(((crc ^ crcbyte) & 0x01) == 0) crc >>= 1;
else {
crc ^= 0x18; //0x18;//CRC=X8+X5+X4+1
crc >>= 1;
crc |= 0x80;
}
crcbyte >>= 1;
}
return crc;
}



void main() {
uint i;
uint j;
InitUart(); //初始化串口
ow_reset(); //初始化单总线
while(!DQ){ 如果应答信号为0,则开始读数据
write_byte(0x33);
ow_reset();
for(i=0;i<8;i++){
SerialNum=read_byte();
delay(100);

}
crc8r(8); //crc校验
}

while(1){ //将序列号传到上位机
for(i=0;i<8;i++){
TI=0;
SBUF=SerialNum;
while(!TI);

}

}

}


延时的时间我都用示波器看了,比较准确^_^
如果延时都是正确的话,至少我从程序上看不出有什么明显的错误来...

如果有条件的话,可以用逻辑分析仪采一下波形,就可以比较清楚地看到那一块时序对不上了..

当时我破解一个IBUTTON加密的机器就是用逻辑分析仪一点点采着看的,,呵呵.
51 c8051f(f020,f040) msp430 arm(2410,2510) fpga(xc3s4000) dsp(5116 dm642) keilc vc++ matlab linux protel Ten_layerPCB mpegx h.26x Rscode Turbocode ofdm VideoBroadcasting ldpc_code(now!)
可是我烧写到片子上以后,在串口调试助手上只能显示8位空字符
如果你曾经写过这样的程序,可以发一个给我参考吗,汇编或c的都行
非常感谢你!
linuxarm您好,还是向您请教这个问题。我用keil c51单步调试程序,但是到了传送部分就执行不下去了,麻烦您帮我看看主程序吧,谢谢
这个不能单步调吧,你可以单步你的单片机,但IBUTTON是不可控的啊.
51 c8051f(f020,f040) msp430 arm(2410,2510) fpga(xc3s4000) dsp(5116 dm642) keilc vc++ matlab linux protel Ten_layerPCB mpegx h.26x Rscode Turbocode ofdm VideoBroadcasting ldpc_code(now!)
这是我的程序,是用汇编写的,不是通用的,但是所有的命令都实现了.

http://bbs.chinaecnet.com/uploadImages/ibutton.rar
51 c8051f(f020,f040) msp430 arm(2410,2510) fpga(xc3s4000) dsp(5116 dm642) keilc vc++ matlab linux protel Ten_layerPCB mpegx h.26x Rscode Turbocode ofdm VideoBroadcasting ldpc_code(now!)
谢谢linuxarm,有一段时间没上来了,现在已经搞定了,非常感谢您的指点!!!
返回列表