我想用单片机写个ds18b20温度传感器的程序 但是读出来的是二进制 怎么转换成十进制呢

全部回答2
默认 最新
  • 这是我在16f877,18f1320,18f1220上通过的18b20程序,18b20主要是延时问题,这个解决了,什么都可以通过。 # include # define uch unsigned char # define unint unsigned int # define dq rb3 //定义18b20数据端口 # define dq_dir trisb3 //定义18b20d口方向寄存器 # define w1_input 1 # define w1_output 0 # define false 0 # define true !false # define dq_high() dq_dir = w1_input # define dq_low() dq = 0; dq_dir = w1_output void delay(unint x) { unint d; d=x; while(--d) {;} } bit reset(void) //初始化18b20 { static bit presence; //定义一个应答信号 dq_low(); delay(70); //置总线为低电平并保持至少480us dq_high(); //等电阻拉高总线并保持15-60us delay(5); presence=dq; //接受应答信号 delay(20); //延时60-240us return(presence); //返回应答信号 } bit read_bit(void) { static bit i; dq_low(); dq_low(); dq_high(); asm("nop"); asm("nop"); asm("nop"); i=dq; delay(3); return(i); } void write_bit(uch bitval) { dq_low(); delay(1); if (bitval==1) { dq_high(); } delay(3); dq_high(); } uch read_byte(void) { uch i; uch j; uch value=0; for (i=0;i<8;i++) { j=read_bit(); //调读位函数 if (j) //如果是 1 置1 { value|=(0x01<>i; temp&=0x01; write_bit(temp); //调写位函数 } asm("nop"); asm("nop"); asm("nop"); } main() { uch teml,temh; gie=0; osccon=0x6e; //这是18f1320的频率选择寄存器 adcon1=0x7f; do{ ; }while (reset()) ; //复位等待从机应答 write_byte(0xcc); //忽略rom匹配 write_byte(0x44); //发送温度转化命令 delay(25000); //延时100-300us do { ; }while( reset()); //再次复位,等待从机应答 write_byte(0xcc); //忽略rom匹配 write_byte(0xbe); //发送读温度命令 teml =read_byte(); //读出温度低8 temh=read_byte(); //读出温度高8位 dq_high(); //释放总线 }
    0 点赞
  • 举例说明:八位二进制为一字节,那最大为(1111 1111)255.,先将这个数除100得到百位2,然后100取余为55,将取余后的值55再除以10得到十位5,再用10取余得到个位数字5,那十进就为255;再比如说二进制为(0001 1101)29,先将这个数除100得到百位0,然后100取余29,将取余后的值再除以10得到十位2,再用10取余得到个位数字9。不知道听懂了没有?当然DS18B20输出的温度值为两个字节,即16位,其中高字节的高5位为温度符号位,即温度为正还是负(零下),下来高字节的低位与低字节的高四位组成温度的整数部分,低字节的低四位为温度值的小数部分。把11位的2进制温度值转化为10进制后在乘以0.0625便为所测的温度,好好看下DS18B20的数据手册应该都能了解,希望对你有帮助。不懂可以再问!
    0 点赞

没有更多内容了

返回顶部
产品求购 求购