给帮同学调试ds18b20,使用的是正点原子的程序。按道理只要移植IO口的管脚就没问题了。但是还是不行,所以去看了一下发现:

这是他原来的程序

//IO方向设置
#define DS18B20_IO_IN()  {GPIOA->CRH&=0XFFFFFFF0;GPIOA->CRH|=8<<0;}
#define DS18B20_IO_OUT() {GPIOA->CRH&=0XFFFFFFF0;GPIOA->CRH|=3<<0;}
////IO操作函数											   
#define	DS18B20_DQ_OUT PAout(8) //数据端口	PA0
#define	DS18B20_DQ_IN  PAin(8)  //数据端口	PA0 

 现在我使用PA11,应该只要改一点点:比如

//IO方向设置
#define DS18B20_IO_IN()  {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=8<<3;}
#define DS18B20_IO_OUT() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=3<<3;}
////IO操作函数											   
#define	DS18B20_DQ_OUT PAout(8) //数据端口	PA0
#define	DS18B20_DQ_IN  PAin(8)  //数据端口	PA0 

  其实问题就出在这个想当然把左移当成3位,其实他移动一个16进制就应该移动4位,所以我应该移动12位

//IO方向设置
#define DS18B20_IO_IN()  {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=8<<12;}
#define DS18B20_IO_OUT() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=3<<12;}
////IO操作函数											   
#define	DS18B20_DQ_OUT PAout(8) //数据端口	PA0
#define	DS18B20_DQ_IN  PAin(8)  //数据端口	PA0 

  或者这样写简单易懂

//IO方向设置
#define DS18B20_IO_IN()  {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=0x00008000;}
#define DS18B20_IO_OUT() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=0x00003000;}
////IO操作函数											   
#define	DS18B20_DQ_OUT PAout(11) //数据端口	PA11
#define	DS18B20_DQ_IN  PAin(11)  //数据端口	PA11 

  好了,这样就没有问题了