金牌会员
- 积分
- 1071
- 威望
- 527
- 贡献
- 308
- 兑换币
- 331
- 注册时间
- 2015-10-20
- 在线时间
- 118 小时
- 毕业学校
- 无
|
我对照时序图和51的代码写的18B20程序,不知道哪里出问题了,一直不能用unsigned int TT; //1820温度变量
unsigned char table_temp[5];
unsigned char temp_comp;
//初始化
void DS18B20_reset()
{
unsigned char x = 0;
gpio_init(PTC10,GPO,0); //输出
gpio_set (PTC10,1);
DELAY_US(16); //稍做延时
gpio_set (PTC10,0);//将DQ拉低
DELAY_US(500);//延时400us~960us
gpio_set (PTC10,1); //拉高总线
DELAY_US(18);//延时15us~60us
// gpio_init(PTC10,GPI,0); //输入
// x = gpio_get(PTC10); //如果=0则初始化成功 =1则初始化失败
// gpio_init(PTC10,GPO,0); //输出
DELAY_US(100);//延时60us~240us
/**/
}
//写一个字节
void DS18B20_write(unsigned char dat)
{
unsigned char i;
gpio_init(PTC10,GPO,0); //输出
for(i = 8; i > 0; i--)
{
gpio_set (PTC10,0);
gpio_set (PTC10,dat & 0x01);
DELAY_US(10);
gpio_set (PTC10,1);
dat >>= 1;
}
}
/*******************************************************************/
/* */
/* 读一个字节 */
/* */
/*******************************************************************/
unsigned char DS18B20_data()
{
unsigned char i,dat;
gpio_init(PTC10,GPI,0); //输入
for (i = 8; i > 0; i--)
{
gpio_init(PTC10,GPI,0);
GPIO_PDOR_REG(GPIOX_BASE(PTC10)) &= ~(1 << PTn(PTC10));
dat >>= 1;
gpio_init(PTC10,GPI,1);
GPIO_PDOR_REG(GPIOX_BASE(PTC10)) |= (1 << PTn(PTC10));
if(gpio_get(PTC10))
dat |= 0x80;
DELAY_US(8);
}
return dat;
}
// 读取温度
unsigned int read_temperature()
{
unsigned char a,b;
unsigned int t = 0;
float tt = 0;
DS18B20_reset();//DS18B20复位
DS18B20_write(0xcc); //跳过读序号列号的操作
DS18B20_write(0x44); //启动温度转换
DS18B20_reset();//DS18B20复位
DS18B20_write(0xcc); //跳过读序号列号的操作
DS18B20_write(0xbe); //读取温度寄存器
a = DS18B20_data(); //读低8位
b = DS18B20_data(); //读高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5; //放大10倍输出并四舍五入
return(t);
}
|
|