[HỌC AVR] BÀI 8: GIAO TIẾP CẢM BIẾN NHIỆT ĐỘ DS18B20
Xin chào các bạn!
Trong bài viết này, mình sẽ hướng dẫn các bạn lập trình đo nhiệt độ môi trường sử dụng cảm biến nhiệt độ DS18B20, nhiệt độ được hiển thị lên LCD16x2 với Atmega16. Project chạy trên KIT AVR V4.
I.SƠ ĐỒ PHẦN CỨNG
Trên KIT AVR V4 hỗ trợ các bạn khối DS18B20 có sơ đồ như sau:
Trong đó, chân dữ liệu của DS18B20 được kết nối với PORTD_7 của Atmega16.
Đặc điểm kỹ thuật của DS18B20:
II.LẬP TRÌNH PHẦN MỀM
Các bạn cấu hình GPIO:
// Port B initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In // State7=1 State6=1 State5=1 State4=1 State3=T State2=T State1=T State0=T PORTB=0xF0; DDRB=0xF0; // Port C initialization // Func7=In Func6=In Func5=Out Func4=Out Func3=Out Func2=In Func1=In Func0=In // State7=T State6=T State5=1 State4=1 State3=1 State2=T State1=T State0=T PORTC=0x38; DDRC=0x38; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=P State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x80; DDRD=0x00; |
Hàm DS18B20_Config(15,40,DS18B20_9BIT_RES): Đây là hàm cấu hình trước khi đo cho DS18B20 (giá trị nhiệt độ ngường, độ phân giải khi đo) trong File ds18b20 thuộc Folder User:
void DS18B20_Config(uint8_t temp_low, uint8_t temp_high, uint8_t resolution) { resolution=(resolution<<5)|0x1f; DS18B20_WriteFunc(DS1820_CMD_WRITESCRPAD); // Cho phep ghi 3 byte vao bo nho nhap: DS18B20_WriteByte(temp_high); // byte 2: Th DS18B20_WriteByte(temp_low); // byte 3: Tl DS18B20_WriteByte(resolution); // byte 4: configuration register DS18B20_WriteFunc(DS1820_CMD_COPYSCRPAD); // Ghi vao EEPROM } |
Các bạn sử dụng các hàm float DS18B20_ReadTemp(void) trong File ds18b20 thuộc Folder Userđể đo nhiệt độ môi trường:
float DS18B20_ReadTemp(void) { float temp; uint8_t buff_temp1,buff_temp2; DS18B20_WriteFunc(DS1820_CMD_CONVERTTEMP); // Khoi dong qua trinh do va chuyen doi nhiet do ra so nhi phan delay_us(200); DS18B20_WriteFunc(DS1820_CMD_READSCRPAD); // Doc du lieu tu bo nho DS18b20 buff_temp1 = DS18B20_ReadByte(); temp=((float)(buff_temp1&0x0f))/16; // Lay phan thuc cua gia tri nhiet do buff_temp2 = DS18B20_ReadByte(); buff_temp1 =((buff_temp1&0xf0)>>4)|((buff_temp2&0x0f)<<4) ; // Lay phan nguyen cua gia tri nhiet do temp=temp+buff_temp1; return temp; } |
Thực hiện chương trình chính:
while(1) { Temp=DS18B20_ReadTemp(); sprintf(str,"Temp: %2.2f C ",Temp); LCD16X2_Gotoxy(0,1); LCD16X2_Puts(str); } |
Link dowload File Code của chương trình TẠI ĐÂY :