//------------------------------------------------------------------------------ // 1-wire总线复位 //------------------------------------------------------------------------------ unsigned char reset_18B20(void) { char bus_flag; CLI(); SET_DQ; SET_OUT; Delay_nus(1); CL_DQ; Delay_nus(550); //拉低至少480us时间 SET_DQ; //释放 NOP(); NOP(); SET_IN; //输入 Delay_nus(60); //等待回复 bus_flag = IN_DQ; Delay_nus(240); //回复的低电平在60到240US SET_OUT; NOP(); NOP(); SET_DQ; //回到初始DQ=1; SEI(); if(bus_flag){ return FALSE; }else{ return TRUE; } }
//------------------------------------------------------------------------------ // 读一位从总线 //------------------------------------------------------------------------------ unsigned char read_bit_18B20(void) { unsigned char k; SET_OUT; CL_DQ; //读时间片开始,拉低总线至少1us Delay_nus(1); //SET_DQ; SET_IN; Delay_nus(4); k=IN_DQ; //读数据,从低位开始 Delay_nus(10); SET_DQ; NOP(); NOP(); SET_OUT; NOP(); NOP(); if(k){ return 1; }else{ return 0; } }
/*******12864初始化函数********************************************/ void init12864lcd(void) { GPIO_SetBits(GPIOE, GPIO_Pin_3); //PSB_SET; Delay_mus(500); write_12864com(0x30); Delay_nus(500); write_12864com(0x30); Delay_nus(500); write_12864com(0x0c); Delay_nus(500); write_12864com(0x01); Delay_nus(25); // write_12864com(0x06); // Delay_nus(2500); // write_12864com(0x0c); Delay_nus(500); }
//------------------------------------------------------------------------------ // 写一位到总线 //------------------------------------------------------------------------------ void write_bit_18B20(char bitval) { SET_OUT; NOP(); NOP(); CL_DQ; Delay_nus(1); if(bitval){ //写数据,从低位开始 SET_DQ; }else{ CL_DQ; } Delay_nus(40); //15~60us SET_DQ; Delay_nus(10); }
//------------------------------------------------------------------------------ // 读一个字节 //------------------------------------------------------------------------------ unsigned char read_byte_18B20(void) { unsigned char temp,n; CLI(); temp=0; for(n=0;n<8;n++) { if(read_bit_18B20()){ temp|=(1<<n); }else{ temp&=~(1<<n); } Delay_nus(70); //60~120us } SEI(); return temp; }
/*******ms级别延时********************************************/ void Delay_mus(unsigned int nCount) { while(nCount--) Delay_nus(1100); }