河南师范大学本科毕业论文(设计)
DQ_CLR; delayUs(255);
/*延时500uS(480-960)*/
delayUs(255); delayUs(128); DQ_SET; DQ_IN; delayUs(100);
/*延时80uS*/
i = DQ_R; delayUs(255);
/*延时500uS(保持>480uS)*/
delayUs(255); delayUs(128); if (flag & 0x80) {
/*恢复中断状态*/
SEI(); }
if (i) {
return 0x00; }
else {
return 0x01;
}
}
/*DS18B20字节读取函数*/
unsigned char ds1820_read_byte(void) { unsigned char i; unsigned char value = 0; flag = SREG; /*中断保护*/ CLI();
/*关中断*/
for (i = 8; i != 0; i--) {
value >>= 1; DQ_OUT; DQ_CLR; delayUs(2); /*延时4uS*/
NOP();
NOP();
35
河南师范大学本科毕业论文(设计)
NOP(); NOP(); NOP(); DQ_SET; DQ_IN; delayUs(4);
/*延时10uS*/
delayUs(4); if (DQ_R) { value|=0x80;
}
delayUs(35);
/*延时60uS*/ delayUs(35); }
if (flag & 0x80) {
/*恢复中断状态*/
SEI();
}
return(value);
}
/*DS18B20字节写入函数*/
void ds1820_write_byte(unsigned char value) { unsigned char i; flag = SREG; /*中断保护*/ CLI();
/*关中断*/
for (i = 8; i != 0; i--) {
DQ_OUT; DQ_CLR; delayUs(2); /*延时4uS*/
NOP(); NOP(); NOP(); NOP(); NOP();
if (value & 0x01) {
DQ_SET;
36
河南师范大学本科毕业论文(设计)
}
delayUs(100); /*延时80uS*/ DQ_SET;
/*位结束*/
value >>= 1;
}
if (flag & 0x80) {
/*恢复中断状态*/
SEI();
}
}
/*启动ds1820转换*/ void ds1820_start(void) { ds1820_reset();
ds1820_write_byte(0xCC); /*勿略地址*/ ds1820_write_byte(0x44);
/*启动转换*/
}
/*DS8B20读取温度信息*/
unsigned int ds1820_read_temp(void) { unsigned int i; unsigned char buf[9]; ds1820_reset();
ds1820_write_byte(0xCC); /*勿略地址*/ ds1820_write_byte(0xBE); /*读取温度*/
for (i = 0; i < 9; i++) { buf[i] = ds1820_read_byte();
}
i = buf[1]; i <<= 8; i |= buf[0]; return i;
}
37
河南师范大学本科毕业论文(设计)
//DS18B20用数据位端口初始化 void port_1820(void) {
DDRA=0x00; PORTA=0x80; //DS18B20的数据位接口上拉
}
串口通信函数 #include \#include
UCSRB = 0x18; /*允许接收和发送*/ UCSRC = 0x06; /*8位数据*/ UBRRH = 0x00; UBRRL = 47;
/*9600*/
}
/*数据发送,查询方式*/
void Uart_Transmit(unsigned char i) { while (!(UCSRA & (1< UDR = i; /* 发送数据*/ } /*数据接收,查询方式*/ unsigned char Uart_Receive( void ) { while (!(UCSRA & (1< return UDR; /* 获取并返回数据*/ } PWM函数 #include 38 河南师范大学本科毕业论文(设计) int OcrReg = 1024; //OCR1A初始值 int Icr1Reg = 0x7ff; //PWM的计数顶部值 Icr1Reg = 2047 void pwm_init(void) { //比较匹配时清零,计数到最大时置位OC1A TCCR1A |= (1< //11位分辨率,快速PWM模式,使用系统时钟作为计数时钟 TCCR1B |= (1< } 延时函数 #include\#include /********************************************************************** functionName: void delayUs(BYTE temp) description :延时函数 晶振频率:7.3728MHZ delayUs(1); //2.71us delayUs(2); //3.53us delayUs(4); //5.15us delayUs(8); //8.41us delayUs(16); //14.92us delayUs(32); //27.94us delayUs(64); //53.98us delayUs(128); //106.07us delayUs(255); //209.42us delayUs(18); //16.55us delayUs(34); //29.57us delayUs(35); //30.38us delayUs(100); //83.28 _NOP(); //0.14us **********************************************************************/ void delayUs(unsigned int temp) { 39