Tôi muốn đo nhiệt độ dùng LM35 giao tiếp với bộ ADC của ATmega16L.Tuy nhiên tôi đang gặp khó khăn về lắp mạch và lập trình.Xin mọi người giúp đỡ.Cám ơn nhiều.
Thông báo
Collapse
No announcement yet.
LM35 và AVR
Collapse
X
-
Tôi đưa chân OUT của LM35 vào kênh 0 (chân AD0) của ADC.
Chương trình như sau:
//real_time_hut@yahoo.com
//khai bao thu vien
#include<mega16.h>
#include<stdio.h>
#include <delay.h>
//khai bao bien toan cuc
unsigned int temp;
//mau ham
void khoi_tao_serial(void);
void khoi_tao_ports(void);
void khoi_tao_ADC(void);
unsigned int doc_ADC(void);
void main(void)
{
khoi_tao_ports();
khoi_tao_serial();
khoi_tao_ADC();
while(1) //vong lap chinh
{
temp=~doc_ADC();
temp=380*(temp/1024); //Vref=3.8V
//10mV ung voi 1 do C
printf("%i\n\r",temp);
delay_ms(100); //cap nhat du lieu sau 100ms
}
}
unsigned int doc_ADC(void)
{
unsigned int value;
ADCSRA = ADCSRA | 0x40; // bat dau chuyen doi
while( (ADCSRA & 0x10) == 0 ); // cho cho den khi chuyen doi //thanh cong
value = ADCW; //lay gia tri ADC
ADCSRA = ADCSRA | 0x10; // xoa co
return value;
}
void khoi_tao_serial(void) //9600/8/N/1
{
UCSRA=0x02;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;
}
void khoi_tao_ports(void)
{
DDRC = 0xFF; // PortC lam cong ra
PORTC = 0x00;
}
void khoi_tao_ADC(void)
{
ADMUX = 0x00; // chon kenh 0
ADMUX = ADMUX | 0x40; // chon dien ap nguong
ADMUX = ADMUX | 0x20;
ADCSRA = 0x07; // chon tan so thach anh
ADCSRA = ADCSRA | 0x80; // cho phep ADC hoat dong
}Last edited by digi_pow; 13-10-2006, 22:07.
Comment
-
tôi gửi bạn đoạn code
;=====================
;last edition 28/9/06;
;=====================
.include "m16def.inc"
.org 0x000
rjmp main
.org 0x01C
rjmp ADC_Complete
main:
;Dat con tro ngan xep
ldi temp,HIGH(RAMEND)
out SPH,temp
ldi temp,LOW(RAMEND)
out SPL,temp
ldi temp,0xFF
out DDRB,temp ;ra led 7 thanh
out DDRC,temp ;dk nhiet do
out DDRD,temp ;ra led 7 thanh
ldi temp,0b11111100 ;chi dung 2 bit 0,1 de lam dau vao co`n lai la` da^`u ra
out DDRA,temp
;Dat clk cho ADC
ldi temp,0b11011110 ;tan so 125 KHz 110
out ADCSRA,temp
;===================
;Chon MUX va Vref
;AREF Internal Vref turn of; Mux 0:00000
ldi temp,0b01100000 ;
out ADMUX,temp
sei ;Cho phep ngat
;wait interrupt
loop:
rjmp loop
;============
; ISR ;
;============
ADC_Complete:
;dk nhiet do
;Calling: convert; display, control
clr rdivL
clr rdivH
in rdivL,ADCL
in rdivH,ADCH
rcall Convert
rcall Display
rcall Control
reti
còn lại bạn làm tiếp nhé
Bạn phải viết chương trình đổi số 10bit sang BCD để hiển thị|
Comment
-
sao mình dùng terminal của protues lại không thấy gì nhỉ??? mình nối 2chân RXD và TXD tương ứng với 2 chân RXD và TXD của vi diều khiển. mình copy code của bạn vào mà vẫn không được. ai biết chỉ giúp mình cái.Nguyên văn bởi digi_pow Xem bài viếtTôi đưa chân OUT của LM35 vào kênh 0 (chân AD0) của ADC.
Chương trình như sau:
//real_time_hut@yahoo.com
//khai bao thu vien
#include<mega16.h>
#include<stdio.h>
#include <delay.h>
//khai bao bien toan cuc
unsigned int temp;
//mau ham
void khoi_tao_serial(void);
void khoi_tao_ports(void);
void khoi_tao_ADC(void);
unsigned int doc_ADC(void);
void main(void)
{
khoi_tao_ports();
khoi_tao_serial();
khoi_tao_ADC();
while(1) //vong lap chinh
{
temp=~doc_ADC();
temp=380*(temp/1024); //Vref=3.8V
//10mV ung voi 1 do C
printf("%i\n\r",temp);
delay_ms(100); //cap nhat du lieu sau 100ms
}
}
unsigned int doc_ADC(void)
{
unsigned int value;
ADCSRA = ADCSRA | 0x40; // bat dau chuyen doi
while( (ADCSRA & 0x10) == 0 ); // cho cho den khi chuyen doi //thanh cong
value = ADCW; //lay gia tri ADC
ADCSRA = ADCSRA | 0x10; // xoa co
return value;
}
void khoi_tao_serial(void) //9600/8/N/1
{
UCSRA=0x02;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;
}
void khoi_tao_ports(void)
{
DDRC = 0xFF; // PortC lam cong ra
PORTC = 0x00;
}
void khoi_tao_ADC(void)
{
ADMUX = 0x00; // chon kenh 0
ADMUX = ADMUX | 0x40; // chon dien ap nguong
ADMUX = ADMUX | 0x20;
ADCSRA = 0x07; // chon tan so thach anh
ADCSRA = ADCSRA | 0x80; // cho phep ADC hoat dong
}
cảm ơn nhiều.Never forget who you are!
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi dinhthuong92Dạ, cảm ơn bác đã nghe qua và có lời khích lệ cháu ạ.
Thật lòng cháu không dám nhận hai danh hiệu Kỹ sư và Nhạc sĩ đâu ạ, vì phải thật hiểu sâu nắm vững cơ, chứ thực lực cháu đây chỉ là biết chút ít thôi à. Về phần...-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 11:58 -
-
Trả lời cho Có mạch sạc nlmt nào có mppt không các bácbởi bqvietĐơn giản thì có trải nghiệm này
http://www.dientuvietnam.net/forums/...ch%C3%AA%CC%81
Chỉ phần cứng,...-
Channel: Điện tử công suất
27-01-2026, 21:32 -
-
Trả lời cho Có mạch sạc nlmt nào có mppt không các bácbởi Nexus 6Pphức tạp quá, nếu mà có mạch làm sẵn thì ngon, e dùng 2 tấm pv loại 18v 55w thôi bác
-
Channel: Điện tử công suất
26-01-2026, 08:52 -
-
Trả lời cho Có mạch sạc nlmt nào có mppt không các bácbởi Nexus 6Pcảm ơn bác nhiều nha, để e nghiên cứu
-
Channel: Điện tử công suất
26-01-2026, 07:38 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi vi van phamkỹ sư nhạc sĩ dinhthuong dạo này lên tay nghề khá quá.
-
Channel: Tâm tình dân kỹ thuật
25-01-2026, 21:29 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi dinhthuong92Hát Mừng Sinh Nhật, sáng tác: HĐT, hòa âm-thể hiện: AI
-
Channel: Tâm tình dân kỹ thuật
24-01-2026, 22:13 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi dinhthuong92Chào bác, gần Tết công việc bác bận lắm phải không?
Vâng mọi người đều thế cả.
Em mới trả phí cho nó 1 tháng, nhờ nó hát thử ấy ạ. Tiếc vì em đã dốt nhạc lí lại lười học nên sáng tác thì vụng về mà hát demo...-
Channel: Tâm tình dân kỹ thuật
24-01-2026, 21:53 -
-
Trả lời cho Có mạch sạc nlmt nào có mppt không các bácbởi bqvietCảm thấy cứng tay thì làm theo hướng dẫn khá chi tiết ở trang sau
https://www.instructables.com/DIY-1k...ge-Controller/-
Channel: Điện tử công suất
23-01-2026, 16:50 -
-
bởi Nexus 6PNhư tiêu đề, các bác giới thiệu e mạch sạc nlmt mppt có chức năng chỉnh dòng với, tấm PV của em 18V 55W, dùng để sạc cho khối pin sắt 3.2V 45A (sắp tới sẽ thay bằng ắc quy 12V)
e cảm ơn-
Channel: Điện tử công suất
23-01-2026, 11:23 -

Comment