感兴趣的朋友们可以参考哈,如有更好的建议多谢指点!!!
等我哪天把它整合到我的车载 温控GPS系统里面。
程序分主从两部分......
单片机主机源程序如下:
从机代码:
- #include "temp.H"
- void Delay1ms(unsigned int y) //延时函数
- {
- unsigned int x;
- for(y;y>0;y--)
- for(x=110;x>0;x--);
- }
-
- unsigned char Ds18b20Init() //DS18B20 的初始化函数
- {
- unsigned int i;
- DSPORT=0;
- i=70;
- while(i--);// 延时 642us
- DSPORT=1;
- i=0;
- while(DSPORT) //等待 DS18B20 拉低总线
- {
- i++;
- if(i>5000)// 等待>5MS
- return 0;//初始化失败
- }
- return 1;//初始化成功
- }
-
-
- void Ds18b20WriteByte(unsigned char dat) //向 DS18B20写入一个字节
- {
- unsigned int i,j;
- for(j=0;j<8;j++)
- {
- DSPORT=0; //每写入一位数据之前先把总线拉低 1us
- i++;
- DSPORT=dat&0x01; //然后写入一个数据,从最低位开始
- i=6;
- while(i--); // 延时 68us,持续时间最少 60us
- DSPORT=1; // 然后释放总线,至少 1us给总线恢复时间才能接着写入第
- //二个数值
- dat>>=1;
- }
- }
-
- unsigned char Ds18b20ReadByte() //向 DS18B20 读取一个字节
- {
- unsigned char byte,bi;
- unsigned int i,j;
- for(j=8;j>0;j--)
- {
- DSPORT=0;//先将总线拉低 1us
- i++;
- DSPORT=1;//然后释放总线
- i++;
- i++;//延时 6us等待数据稳定
- bi=DSPORT; //读取数据,从最低位开始读取
- /*将 byte 右移一位,然后或上左移 7 位后的 bi,注意移动之后移掉那位
- 补 0。*/
- byte=(byte>>1)|(bi<<7);
- i=4; //读取完之后等待 48us再接着读取下一个数
- while(i--);
- }
- return byte;
- }
-
- void Ds18b20ChangTemp() // 让 DS18B20 开始转换温度
- {
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳过 ROM 操作命令
- Ds18b20WriteByte(0x44); //温度转换命令
- }
-
- void Ds18b20ReadTempCom() //发送读取温度命令
- {
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳过 ROM 操作命令
- Ds18b20WriteByte(0xbe); //发送读取温度命令
- }
-
- int Ds18b20ReadTemp() //读取温度
- {
- int temp=0;
- unsigned char tmh,tml;
- Ds18b20ChangTemp(); //先写入转换命令
- Ds18b20ReadTempCom(); //然后等待转换完后发送读取温度命令
- tml=Ds18b20ReadByte(); //读取温度值共 16 位,先读低字节
- tmh=Ds18b20ReadByte(); //再读高字节
- temp=tmh;
- temp<<=8;
- temp|=tml;
- return temp;
- }
复制代码
所有代码51hei提供下载:
单片机蓝牙串口温度例子 -我修改版.7z
(27.06 KB, 下载次数: 40)
|