You are on page 1of 3

Tóm tắt : Qua bài này các bạn có thể sử dụng được ADC của AVR

Giới thiệu :
Phần cứng các bạn cần 1 con biến trở nối vào portA.0
Mạch ATmega16 như bài đầu .

Các chế độ sẽ chọn :


sử dụng chế độ ngắt ADC, tự động scan giá trị analog của port A

Ví dụ : Dùng PORTA.0 nhận giá trị từ biến trở hiển thị lên LCD theo ADC 8bit (từ 0->5V
thành 0 ->255)
Chú ý :
trong chương trình có sử dụng hàm lcd_putnum(value); hiển thị chữ số

c code

1. /*****************************************************
2. This program was produced by the
3. CodeWizardAVR V1.24.8d Professional
4. Automatic Program Generator
5. © Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
6. http://www.hpinfotech.com
7.
8. Project :
9. Version :
10.Date : 1/9/2008
11.Author : LENGOCTUAN
12.Company : VAGAM
13.Comments:
14.
15.Comments:
16.
17.
18.
19.Chip type : ATmega16
20.Program type : Application
21.Clock frequency : 8.000000 MHz
22.Memory model : Small
23.External SRAM size : 0
24.Data Stack size : 256
25.*****************************************************/
26.
27.#include <mega16.h>
28.
29.// Alphanumeric LCD Module functions
30.#asm
31. .equ __lcd_port=0x15 ;PORTC
32.#endasm
33.#include <lcd.h>
34.
35.#define FIRST_ADC_INPUT 0
36.#define LAST_ADC_INPUT 7
37.unsigned char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
body | 04:39:18 10-01-08 | Posts: 20 | Thanks: 8 2

cảm ơn các bài viết của bác, em vẫn theo và thực hành thêm.

apple | 07:15:52 15-01-08 | Posts: 5 3

em gặp vấn đề rùi

Theo chỉ dẫn của bác giotdang nhưng em viết chương trình bằng asembler
bác giúp em bài toán này với. sao em thấy adc nó nhiễu ghê quá
-điện áp mẫu em sử dụng là chân AREF nối với Vcc
-biến trở sử dụng là 100k
-chon tần số biến đổi nhanh nhất (adps2..0=0)
-ADC dùng ở chế độ biến đổi đơn, ở chân ADC0 và ADC1
thực hiện biến đổi ở chân ADC0 > delay100us > đua kết quả ra portb (adch) - portc(adcl)(2 port
hien thị led) > biến dổi chân ADC1 > delay100us-->luu kết quả vào 2 thanh ghi xh:xl
em gap 2 vấn đề như vầy:
-thấy các led sáng tắt không dứt khoát
-khi vặn biến trở o chan ADC1 và không văn bien tro chan ADC0 thì thấy nó nhiễu cả sang kết
quả của chân ADC0
mong bac chỉ giùm, em khong biết tại sao lại thế.

giotdang | 02:21:52 16-01-08 | Posts: 190 | Thanks: 229 4

Nguyên nhân nó gây nhiễu chính là do bộ nguồn cấp cho ADC của bạn không ổn định .Để đảm
bảo đo lường chính xác luôn đảm bảo AREF không được thay đổi . Mạch của bạn lại sử dụng
đến 16 đèn led ( thay đổi sáng tối liên tục ) có thế làm nguồn không ổn định .Nếu các mạch thiết
kế để dùng cho đo lường thường thiết kế mạch nguồn cho AREF riêng .Dù có nguồn riêng ,
người lập trình đều cần các phương pháp lọc số để đảm bảo giá trị đo chính xác , chống được
nhiễu .

giotdang1985@yahoo.com

ckdt | 05:42:08 22-01-08 | Posts: 19 | Thanks: 7 5

lcd_putchar(48+tram);
lcd_putchar(48+chuc);
lcd_putchar(48+donvi);

a giotdang cho e hỏi về mấy câu lệnh trên nhé:


trong mã ASCII 48 <=> 0 nhưng mình cộng 48 để làm gì ạ!e cũng ko biết nhiều về ngôn ngữ
C.cám ơn a rất nhiều!

giotdang | 06:27:52 25-01-08 | Posts: 190 | Thanks: 229 6


mình cộng 48 vì khi hiện thị lên LCD ta hiển thị mã ASCII
VD:
số 1 có mã ASCII là 49
số 2 có mã ASCII là 50

vì thế bạn phải cộng 48