09-08-2012, 09:29 PM | #1 |
Đệ tử 1 túi
Tham gia ngày: Jun 2011
Bài gửi: 18
: |
Xem giúp mình lỗi code cho lm35 này với
Code:
#include <16f877a.h> #include <def_877a.h> #device ADC=10 #fuses nowdt,noprotect,nolvp,hs #use delay(clock=20000000) const unsigned char ma7[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; int16 kqadc; int dem,dv,ch,tr,ng,i; unsigned char mdv,mch,mtr,mng; void giaima7doan(int16 tam) { ng=tam/1000; tam=tam%1000; tr=tam/100; tam=tam%100; ch=tam/10; dv=tam%10; mng=ma7[ng]; mtr=ma7[tr]; mch=ma7[ch]; mdv=ma7[dv]; mch=mch&0x7f; } //hien thi quet led void hienthi() { for(i=0;i<=30;i++) { output_d(mdv); output_low(pin_b2); delay_us(100); output_high(pin_b2); output_d(mch); output_low(pin_b3); delay_us(100); output_high(pin_b3); output_d(mtr); output_low(pin_b4); delay_us(100); output_high(pin_b4); output_d(0x9c); output_low(pin_b1); delay_us(100); output_high(pin_b1); output_d(0xc6); output_low(pin_b0); delay_us(100); output_high(pin_b0); } } void main() { set_tris_A(0b00000001); set_tris_D(0x00); set_tris_b(0x00); // set_tris_C(0x00); output_b(0xff); setup_ADC(ADC_clock_div_32); setup_adc_ports(AN0); set_adc_channel(0); while(1) { kqadc=4.887*read_adc(); giaima7doan(kqadc); hienthi(); if(kqadc>40) { output_high(pin_c0); } else { output_low(pin_c0); } } } |
10-08-2012, 12:06 AM | #2 |
Đệ tử 2 túi
|
bạn nên thêm dòng kqadc=0.4887*read_adc(); ở dưới hienthi(); trong vòng lặp while
__________________
[email]toancdt09@gmail.com |
10-08-2012, 02:01 PM | #3 |
Đệ tử 1 túi
Tham gia ngày: Jun 2011
Bài gửi: 18
: |
|
10-08-2012, 03:40 PM | #4 |
Đệ tử 2 túi
|
sửa như vậy mình test thử là đúng rồi, đâu bạn gửi code bạn lên đây mình kiểm tra lại xem
__________________
[email]toancdt09@gmail.com |
10-08-2012, 04:45 PM | #5 |
Đệ tử 2 túi
|
khi bạn mô phỏng thấy hiển thị chưa đến 40 mà rc0 đã lên mức cao nhưng thực tế biến kqadc đã lớn hơn 40 rất nhiều. cụ thể là tăng 1 độ thì giá trị adc của bạn sẽ tăng 2.046, nếu nhiệt độ là 5 thì giá trị adc đọc được là 2.046x5=10.23 => kqadc=4.887*10.23=49.99 => từ 5 độ trở lên biến kqadc đã lớn hơn 40 nên rc0 lên mức cao là phải thôi.
bạn sửa lại như dưới đây là chạy được. kqadc=4.887*read_adc();// nếu bạn dùng biến kqadc này để so sánh sẽ không đúng giaima7doan(kqadc); hienthi(); kqadc=0.4887*read_adc();// thêm dòng này vào if(kqadc>40)
__________________
[email]toancdt09@gmail.com thay đổi nội dung bởi: toancdt, 10-08-2012 lúc 04:52 PM. Lý do: bổ sung |
10-08-2012, 08:03 PM | #6 | |
Đệ tử 1 túi
Tham gia ngày: Jun 2011
Bài gửi: 18
: |
Trích:
kqadc=4.887*read_adc(); ma la kqadc=0.4887*read_adc(); zay ban |
|
10-08-2012, 08:59 PM | #7 | |
Đệ tử 2 túi
|
Trích:
Dùng ADC 10 bít, điện áp lấy mẫu Vdd = 5V, sensor LM35 (10 mV / 1 độ C) Xác định nhiệt độ đo được qua số đo trên chân ADC: Ta có: 5000 mV --- ứng với --- 1023 (thang đo ADC 10 bít) Vậy: 10 mV --- ứng với --- 10 x 1023/5000 = 2.046 Con số 2.046 tính được đó chính là lượng thay đổi trên chân ADC ứng với thay đổi 10mV ở đầu ra LM35 hay ứng với thay đổi 1 độ C trên LM35. Suy ra nhiệt độ đo được: Nhiệt độ = read_adc / 2.046 (1/2.046=0.4887) -----------------------------------------------------------------------------------------
__________________
[email]toancdt09@gmail.com |
|
10-08-2012, 11:59 PM | #8 |
Đệ tử 1 túi
Tham gia ngày: Jun 2011
Bài gửi: 18
: |
mình đã làm được rồi, mô phỏng chạy nhưng protues báo lỗi thế này bạn xem giùm mình nha, code
Code:
#include <16f877a.h> #include <def_877a.h> #device ADC=10 #fuses nowdt,noprotect,nolvp,hs #use delay(clock=20000000) const unsigned char ma7[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; int16 kqadc; int dem,dv,ch,tr,ng,i; unsigned char mdv,mch,mtr,mng; void giaima7doan(int16 tam) { ng=tam/1000; tam=tam%1000; tr=tam/100; tam=tam%100; ch=tam/10; dv=tam%10; mng=ma7[ng]; mtr=ma7[tr]; mch=ma7[ch]; mdv=ma7[dv]; mch=mch&0x7f; } //hien thi quet led void hienthi() { for(i=0;i<=30;i++) { output_d(mdv); output_low(pin_b2); delay_us(100); output_high(pin_b2); output_d(mch); output_low(pin_b3); delay_us(100); output_high(pin_b3); output_d(mtr); output_low(pin_b4); delay_us(100); output_high(pin_b4); output_d(0x9c); output_low(pin_b1); delay_us(100); output_high(pin_b1); output_d(0xc6); output_low(pin_b0); delay_us(100); output_high(pin_b0); } } void main() { set_tris_A(0b00000001); set_tris_D(0x00); set_tris_b(0x00); // set_tris_C(0x00); portb=0xff; setup_ADC(ADC_clock_div_32); setup_adc_ports(AN0); set_adc_channel(0); while(1) { kqadc=0; for(i=0;i<10;i++) {kqadc=kqadc+read_adc();} kqadc=kqadc/10; kqadc=kqadc*4.887; giaima7doan(kqadc); hienthi(); kqadc=0.4887*read_adc(); if(kqadc>40) { output_high(pin_c0); } else { output_low(pin_c0); } } } |
11-08-2012, 10:26 AM | #9 |
Đệ tử 2 túi
|
proteus: http://www.mediafire.com/?mcp28259cwgwmup
ccs : http://www.mediafire.com/?pwd053o8i5yco9x code và mô phỏng trên đây chạy như yêu cầu của bạn, nếu bạn chạy thấy bị lỗi nữa thì kiểm tra lại 2 phần mềm đó coi bị lỗi gì không.
__________________
[email]toancdt09@gmail.com thay đổi nội dung bởi: toancdt, 11-08-2012 lúc 12:07 PM. Lý do: bổ sung |
|
|