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.
Chú ý : Source code bài viết dưới đây được biên dịch bằng phần mềm CodeVisionAVR để biên dịch code không lỗi xin vui lòng Download bản CodeVisionAVR Tại Đây
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:
- Sử dụng chuẩn giao tiếp 1 WIRE:
-
- Nhiều cảm biến có thể kết nối vào cùng 1 dây dữ liệu (chiều dài tối đa khoảng 300m).
- Không hạn chế số lượng cảm biến kết nối.
- Có thể cấp nguồn nuôi bằng đường dữ liệu, điện áp nguồn nuôi trong khoảng 3.0V – 5.5V.
- Dải nhiệt độ đo được -55oC – 125oC ( chính xác đến 0.5oC trong dải -10oC – 85oC).
- Có thể cài đặt độ phân giải khi đo bằng phần mềm: 9 bit, 10 bit, 11 bit, 12 bit (độ chính xác của nhiệt độ đo được tương ứng: 0.5, 0.25, 0.125, 0.0625).
- Có cờ báo khi nhiệt độ đo được nằm ngoài khoảng giá trị nhiệt độ cài đặt.
- Mỗi cảm biến có một mã định danh 64bit duy nhất chứa trong bộ nhớ ROM.
II.LẬP TRÌNH PHẦN MỀM
Các bạn cấu hình GPIO:
- PORTC3:5 (các chân điều khiển LCD16x2), PORTB4:7 (các chân dữ liệu LCD16x2) là OUTPUT với mức điện áp đầu ra ban đầu là mức 1.
- PORTD7 là INPUT có trở kéo lên bên trong.
// 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 :