PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Analog - Bộ nhớ - Bảo mật - Cảm biến nhiệt độ (http://www.picvietnam.com/forum/forumdisplay.php?f=59)
-   -   hỏi về pic 16f886 và lm35, 74595 (http://www.picvietnam.com/forum/showthread.php?t=10032)

thanhtb_89 14-07-2011 11:30 AM

hỏi về pic 16f886 và lm35, 74595
 
em mới học pic và làm sơ đồ đo nhiệt độ dùng lm35 , pic 16f886 và 2 ic74595
em đã làm mạch thật
nhưng khi đưa code vào nó ko hoạt động
em đã thử code khác thì hoạt đông bình thường
các bác có thể xem hộ em code mà em viết được ko?
em rất mong được các bác chỉ giáo cho

thanhtb_89 14-07-2011 11:33 AM

đây là code của em viết.các bác xem giúp em nhé

================================================== =================
#include <16F886.h>
#device adc=10

#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES PROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOIESO //No Internal External Switch Over mode enabled
#FUSES NOFCMEN //No Fail-safe clock monitor enabled
#FUSES NOLVP //No Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NODEBUG //No Debug mode for ICD
#FUSES WRT //Program memory write protected
#FUSES BORV40 //Brownout reset at 4v

#use delay(clock=4000000)


#byte PORTA = 0x05
#byte TRISA = 0x85

#byte PORTB = 0x06
#byte TRISB = 0x86

#byte PORTC = 0x07
#byte TRISC = 0x87

#byte ANSELL = 0x188
#byte ANSELH = 0x189
#byte ANSELL = 0x188

#byte SSPCON = 0x14
#byte SSPCON2 = 0x91
#byte SSPADD = 0x93
#byte SSPSTAT = 0x94

#byte SSPCON = 0x14
#byte SSPCON2 = 0x91
#byte SSPADD = 0x93
#byte SSPSTAT = 0x94

#byte PORTB = 0x06
#byte TRISB = 0x86
#bit rb5 = portb.5

//===================================
//define
//===================================


#define MASK_LED_0 0b00101000
#define MASK_LED_1 0b10101111
#define MASK_LED_2 0b10011000
#define MASK_LED_3 0b10001010
#define MASK_LED_4 0b00001111
#define MASK_LED_5 0b01001010
#define MASK_LED_6 0b01001000
#define MASK_LED_7 0b10101110
#define MASK_LED_8 0b00001000
#define MASK_LED_9 0b00001010

//#define led_1 0b00001000 //du lieu hien tren 4 led 7 thanh
//#define led_2 0b00000100
//#define led_3 0b00000010
//#define led_4 0b00000001

#define hien_thi_led_1 0b11110111
#define hien_thi_led_2 0b11111011
#define hien_thi_led_3 0b11111101
#define hien_thi_led_4 0b11111110

#define led_1 led[0] //du lieu hien tren 4 led 7 thanh
#define led_2 led[1]
#define led_3 led[2]
#define led_4 led[3]

const unsigned char hien_thi_led[] ={hien_thi_led_1,hien_thi_led_2,hien_thi_led_3,hie n_thi_led_4};
//const unsigned char led[]={led_1,led_2,led_3,led_4};

char value;


//===================================
//KHAI BAO CHUONG TRINH CON
//===================================
void HEX_BCD();
void HIENTHI();
void lat();

//#int_RTCC
//void RTCC_isr(void)
//{void HIENTHI(); }

//===================================
//chuong trinh doc adc
//===================================
void main()
{
int8 value;
set_tris_A(1);
// init_board();
//===================================
//khoi tao che do cho ADC
//===================================

Setup_ADC(ADC_CLOCK_INTERNAL);//khoi tao ADC
setup_ADC_ports(sAN0|VSS_VDD);
Set_ADC_channel(0);
delay_us(10); //ket thuc khoi tao ADC

//===================================
//lay mau nhiet do cho lan dau tien
//===================================
while(true)
{
value=read_ADC();
value=500*value/1024;
//===================================
//chuong trinh hien thi
//===================================

HEX_BCD();
HIENTHI();
}
}

//================================================== ====================
//tach lay so hang tram, hang chuc, hang don vi de hien thi ra led
//================================================== ====================

void HEX_BCD()
{
int16 value;

led_1=value/1000;
value=value%1000;
led_2=value/100;
value=value%100;
led_3=value/10;
led_4=value%10;
}

//================================================== ====================
//chuong trinh latch
//================================================== ====================

void lat()
{
output_high(PIN_B3);
output_low(PIN_B3);

}

//================================================== ====================
//HIEN THI
//================================================== ====================
void HIENTHI()
{
unsigned char mask,i,n,k;
int1 data;
set_tris_B(0);
do
{
for(n=4;n>=0;n--)
{
k=led[n];
for(i=8;i>=0;i--)
{
data = bit_test(k,n-1);
output_bit(pin_b5,data);
output_high(PIN_B4);
output_low(PIN_B4);

}
}


mask = hien_thi_led[n];
for(i=8;i>=0;i--)
{
data = bit_test(mask,i-1);
output_bit(pin_b5,data);
output_high(PIN_B4);
output_low(PIN_B4);
lat();
delay_ms(20);
}
}while(n<4);
}

thanhtb_89 14-07-2011 11:37 AM

có ai ko?
mọi người vào giúp em với

phatcddt08a 16-07-2011 09:56 PM

mình thấy tự mình tìm hiểu là tốt nhất .trong đây không có ai giúp được đâu.bản thân học điện tử mới thấy được sự ích kỷ.nếu mà không ích kỷ thì khó sống về nghề này lắm.

hein_ts 15-08-2011 10:14 AM

To phatcddt08a:
- Nếu phát biểu như bạn thì có khỏi làm chạnh lòng biết bao người trên diễn đàn đã giúp đỡ tận tình các em, các bạn? Như bác fall chẳng hạn, lan hương...
- Tôi thấy bạn là đệ tự 4 túi mà suy nghĩ như thế này chắc chỉ lên đây kiếm chác thôi. Nên ra đi bạn ạ. "Kỷ sở dục, đạt nhân đạt nhi" - Tặng bạn câu nói này nhé

hein_ts 15-08-2011 10:35 AM

Bạn dùng 74595 cũng được nhưng thử nghiên cứu về phần quét led xem thế nào.
Về chương trình bạn viết còn khá nhiều vấn đề:
Đọc ADC 10bit mà ban đầu bạn chỉ khởi tạo value là int8. Tôi không biết trình dịch có tự sửa không nhưng khi đã lập trình thì mọi thứ phải thật rõ ràng mới dễ dàng quản lý được. "Char value" là như thế nào mình cũng chưa hiểu, hjhj. Nói tóm lại là sao tôi thấy cái "value" của bạn linh tinh quá, chỗ thì char, chỗ thì int8, chỗ thì int16.
- Theo công thức tính nhiệt độ của bạn thì giá trị từ 0~500 độ. LM35 mình mới chỉ thấy loại cao nhất là 150 độ thôi. Nhưng đó chưa quan trọng lắm vì khi hiển thị sai cũng sẽ dễ hiệu chỉnh thôi. Vấn đề là chúng ta sẽ test như thế nào. Để cho chắc ăn tôi sẽ thử riêng với cái hàm hiển thị của bạn trước xem sao. Tức là một chương trình chính sẽ chỉ có hàm hiển thị, sau đó ta đặt vào một tham số xem nó có chạy không đã. Từng bước một, bạn sẽ tối ưu hóa được thuật toán và code.
Một vấn đề nữa là thời gian cập nhật. Bạn nên để ít nhất là nửa giây để người ta còn đọc được. Bởi vì cảm biến loại này đôi khi bị nhiễu hoặc giá trị thay đổi trong phạm vi nhỏ, nếu ta cập nhật nhanh quá led sẽ nhảy lung tung lên, hơi khó đọc đấy.
Tôi đã làm một project khá đơn giản chỉ dùng pic16 với led7 đoạn thôi. Dùng phương pháp quét hiển thị 2 led, bạn có thể mở rộng ra thoải mái, mong bạn tham khảo trong luồng này

phatcddt08a 17-08-2011 09:38 AM

Xin lổi nhé mình bạn lòng tốt của bạn nhưng chỉ nguoi ta thì chỉ cho đúng nhé .uc =5v và adc 10 bit thì công thức trên hoàn toàn gần đúng nhé vì còn chổ sai số. Value = read_adc()*500/1024 =read_adc()/2.048 kô biết bạn đã dùng công thuc này chưa nhỉ.nếu là 8bit chọn uc=2.56v thi kêt quả đoc về gần đúng kô cần chuyển đổi.khai báo như thế thì có khác gì đâu char value hoăc int8 value cũng là 8 bit thôi.ở các chương trình khác hiểu thằng này là 8 bit,còn trong ct hex_BCD thì là 16 bít vì 4 led số phải lớn hơn 255.

pstin 20-08-2011 10:32 AM

Hì, chắc là do bạn xuất dữ liệu ra thanh ghi dịch "gặp trục trặc" thôi!!!!!!!.
Tui mới có "luận" về truyền dữ liệu trên thanh ghi dịch 74hc595 đó!!!!!!!. bạn coi thử có giúp ích gì được ko?.
http://www.picvietnam.com/forum/showthread.php?t=10381


Múi giờ GMT. Hiện tại là 09:10 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam