- uchar read_bit(void) //读一位(bit)
- {
- unsigned char i,j;
- TRISC&=0xfd;//配置RC1为输出
- RC1=0; //将RC1拉低开始读时间隙
- //RC1=1; //then return high
- for(i=0;i<1;i++); // 延时
- TRISC|=0x02;//配置RC1为输入
- for(i=0;i<1;i++);
- return(RC1); // 返回RC1线上的电平值
- }
- uchar ReadOneChar(void) //读一个字节
- {
- unsigned char i = 0;
- unsigned char dat = 0;
- for (i=0;i<8;i++)
- {
- if(read_bit())
- dat|=(0x01<<i); // 然后将其左移
- Delay(4);
- }
- return (dat);
- }
- void write_bit(char bitval) //写一位
- {
- RC1=0; // 将RC1拉低开始写时间隙
- if(bitval==1)
- RC1=1; // 如果写1,RC1返回高电平
- Delay(5); // 在时间隙内保持电平值,
- RC1=1; // Delay函数每次循环延时16μs,因此delay(5) = 104μs
- }
- void WriteOneChar(unsigned char dat) //写一个字节
- {
- unsigned char i = 0;
- unsigned char temp;
- for (i=0; i<8; i++) // 写入字节, 每次写入一位
- {
- temp=(dat>>i);
- temp&=0x01;
- write_bit(temp);
- }
- Delay(5);
- }
复制代码
在网上的找的51程序,移植到PIC的单片机上,主程序就这2句
WriteOneChar(0x33);
a=ReadOneChar();
TXREG=a;
把18B20的序列号的第一位28h发生到串口;
- uchar RomCode[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
- void Delay(uint num)
- {
- while( --num );
- }
- uchar Init_DS18B20(void) //初始化ds1820,RC1作为单总线通信口
- {
- uchar presence=1;
- TRISC|=0x02;//配置RC1为输入
- Delay(8); //稍做延时
- TRISC&=0xfd;//配置RC1为输出
- RC1=0; //将RC1拉低
- Delay(150); //精确延时 大于 480us
- TRISC|=0x02;//配置RC1为输入
- Delay(20);
- presence=RC1; //读取存在信号
- Delay(8);
- return(presence); //返回信号,0=presence,1= no presence
- }
- bit read_bit(void) //读一位(bit)
- {
- unsigned char i;
- TRISC&=0xfd;//配置RC1为输出
- RC1=0; //将RC1拉低开始读时间隙
- TRISC|=0x02;//配置RC1为输入
- return(RC1); // 返回RC1线上的电平值
- }
- uchar ReadOneChar(void) //读一个字节
- {
- unsigned char i = 0;
- unsigned char dat = 0;
- for (i=0;i<8;i++)
- {
- if(read_bit())
- dat|=(0x01<<i); // 然后将其左移
- Delay(4);
- }
- return (dat);
- }
- void write_bit(uchar bitval) //写一位
- {
- TRISC&=0xfd;//配置RC1为输出
- RC1=0; // 将RC1拉低开始写时间隙
- Delay(1);
- if(bitval==1)
- TRISC|=0x02;//配置RC1为输入 // 如果写1,RC1返回高电平
- Delay(10); // 在时间隙内保持电平值,
- TRISC|=0x02;
- }
- void WriteOneChar(unsigned char dat) //写一个字节
- {
- unsigned char i = 0;
- unsigned char temp;
- for (i=0; i<8; i++) // 写入字节, 每次写入一位
- {
- temp=(dat>>i);
- temp&=0x01;
- write_bit(temp);
- }
- Delay(5);
- }
- uchar Read_RomCord(void) //读取64位序列码
- {
- unsigned char j;
- Init_DS18B20();
- WriteOneChar(0x33); // 读序列码的操作
- for (j = 0; j < 8; j++)
- {
- RomCode[j] = ReadOneChar() ;
- }
- return (RomCode[0]);
- }
-
复制代码while(1)里面就这三句:
a=Read_RomCord();
TXREG=a;
delay_1ms();
我看过时序,波形完全对的,但是读得都是FF。
下面是时序图,完全跟Read_RomCord的时序一样:
1111111.JPG (50.86 KB, 下载次数: 0)
下载附件
2014-10-24 11:01 上传
一周热门 更多>