Chương trình thực hiện đo nhiệt độ, điện áp, hiển thị kết quả lên màn hình LCD 16x2, và truyền giá trị lên máy tính.
Mô phỏng trên Proteus:
mô phỏng trên Proteus
Sơ đồ nguyên lý:
Sơ đồ nguyên lý
Mã nguồn:
#include "16f877a.h"
#include "def_877a.h"
#device *=16 ADC=10
#use delay(clock=20000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include "lcd_lib_4bit.c"
//=======================================================================
void send(int8 a);
void HIENTHI_LCD(int8 t);
void HIENTHI_LCD_float(int8 t);
int8 count=0;
int8 i,value,vl[10];
//=======================================================================
#INT_RDA //ngat khi nhan du lieu.
Receive_isr()
{
char c;
c=getc();
switch(c)
{
case '0': //xoa man hinh LCD
{
LCD_putcmd(0x01);
}
break;
//o day co the su dung ma thap phan! (ngoai tru cac ky tu dieu khien)
case '-': //lui con tro hien thi LCD 1 don vi.
{
LCD_putcmd(0x10);
}
break;
case '1': //truyen len may tinh: gia tri do duoc.
{
Set_ADC_channel(0); //kenh 0 chan so2
delay_us(10);
for(i=0;i<10;i++)
{
vl[i]=read_adc();
delay_us(10);
}
value=(vl[0]+vl[1]+vl[2]+vl[3]+vl[4]+vl[5]+vl[6]+vl[7]+vl[8]+vl[9])/20.48;
send(value);
}
break;
case '2': //truyen len may tinh: gia tri do duoc.
{
Set_ADC_channel(1); //kenh 1 chan so3
delay_us(10);
if(read_adc()==0)
{
for(i=0;i<10;i++)
{
vl[i]=read_adc();
delay_us(10);
}
value=(vl[0]+vl[1]+vl[2]+vl[3]+vl[4]+vl[5]+vl[6]+vl[7]+vl[8]+vl[9])/10;
}
else
{
value=read_adc()+6;
for(i=0;i<10;i++)
{
vl[i]=read_adc()+6;
delay_us(10);
}
value=(vl[0]+vl[1]+vl[2]+vl[3]+vl[4]+vl[5]+vl[6]+vl[7]+vl[8]+vl[9])/10;
}
send(value);
}
break;
case '9': //thoat khoi ham ngat, cho ADC làm viec.
{
count=0; //ket thuc viec truyen ky tu len LCD
LCD_putcmd(0x01);
}
break;
default : //truyen ky tu xuong LCD ^^.
{
count++;
if(count==1) LCD_putcmd(0x01);
if(count==16) LCD_putcmd(0xC0);
if(count==32)
{
LCD_putcmd(0x01);
count=0;
}
LCD_putchar(c);
}
}
}
//=======================================================================
void main()
{
//trisD=0x0C; //D0,D1 LA CONG VAO, D2-D7 LA CONG RA.
enable_interrupts(int_rda); //cho phep ngat noi tiep nhan.
enable_interrupts(GLOBAL);
LCD_init(); //Khoi tao LCD.
LCD_putcmd(0xC0);
Printf(LCD_putchar,"Khoi tao...");
delay_ms(250);
setup_adc_ports(AN0_AN1_AN3); //Khoi tao che do cho bo ADC.
setup_adc(ADC_CLOCK_INTERNAL);
delay_us(10);
while(1)
{
//do nhiet do
{
Set_ADC_channel(0); //kenh 0 chan so2
delay_us(10);
value=read_adc();
value=value/2.048;
LCD_putcmd(0x80);
LCD_putchar("Nhiet do: ");
LCD_putcmd(0x89);
HIENTHI_LCD(value);
LCD_putcmd(0x8C);
LCD_putchar("oC");
delay_ms(0.1);
}
//do diep ap
{
Set_ADC_channel(1); //kenh 1 chan so3
delay_us(10);
if(read_adc()==0)
{
for(i=0;i<10;i++)
{
vl[i]=read_adc();
delay_us(10);
}
value=(vl[0]+vl[1]+vl[2]+vl[3]+vl[4]+vl[5]+vl[6]+vl[7]+vl[8]+vl[9])/10;
}
else
{
value=read_adc()+6;
for(i=0;i<10;i++)
{
vl[i]=read_adc()+6;
delay_us(10);
}
value=(vl[0]+vl[1]+vl[2]+vl[3]+vl[4]+vl[5]+vl[6]+vl[7]+vl[8]+vl[9])/10;
}
LCD_PutCmd(0xC0);
LCD_putchar("DIEN AP : ");
LCD_putcmd(0xC9);
//HIENTHI_LCD(value);
HIENTHI_LCD_float(value);
LCD_putcmd(0xCD);
LCD_putchar("V ");
}
}
}
//=======================================================================
void HIENTHI_LCD(int8 t)
{
unsigned char v;
if(t<10)
LCD_putchar(t+48);
else
if(t<100)
{
LCD_putchar(t/10+48);
LCD_putchar(t%10+48);
}
else
{
v=t/10;
LCD_putchar(v/10+48);
LCD_putchar(v%10+48);
LCD_putchar(t%10+48);
}
}
void send(int8 a)
{
if(a<10)
{
putc(a+48);
}
if(a>9&&a<100)
{
unsigned char c=a/10;
unsigned char d=a%10;
putc(c+48);
putc(d+48);
}
if(a>99)
{
unsigned char t=a/100;
unsigned char c=a/10-10*t;
unsigned char d=a%10;
putc(t+48);
putc(c+48);
putc(d+48);
}
}
void HIENTHI_LCD_float(int8 t)
{
int8 v;
if(t<10)
{
LCD_putchar(48);
LCD_putchar(46);
LCD_putchar(t+48);
LCD_putchar(32);
}
else
if(t<100)
{
LCD_putchar(t/10+48);
LCD_putchar(46);
LCD_putchar(t%10+48);
LCD_putchar(32);
}
else
{
v=t/10;
LCD_putchar(v/10+48);
LCD_putchar(v%10+48);
LCD_putchar(46);
LCD_putchar(t%10+48);
}
}
/*
void send_float(float a)
{
if(a<10)
{
putc(a+48);
}
if(a>9&&a<100)
{
unsigned char c=a/10;
unsigned char d=a%10;
putc(c+48);
putc(d+48);
}
if(a>99)
{
unsigned char t=a/100;
unsigned char c=a/10-10*t;
unsigned char d=a%10;
putc(t+48);
putc(c+48);
putc(d+48);
}
}*/
//=======================================================================
Thư Viện: lcd_lib_4bit.c
Sơ Đồ Nguyên Lý: NguyenLy.pdf
sao code ko chay duoc admin oi:((
Trả lờiXóaNhững code này mình đã chạy tốt cả.
Trả lờiXóaNếu bạn gặp lỗi gì hãy mô tả cụ thể cho mình biết.
Thân!
khi mình chạy thì có rất nhìu lỗi thông báo là Expecting a declaration
Trả lờiXóavà khi down lcd_lib_4bit.c trên mạng thì mỗi thư viện lcd_lib_4bit.c lại ra thông báo lỗi ở 1 số chõ khác nhau..bạn có thể gửi cho mình file lcd_lib_4bit.c bạn dùng không
Sao mình dùng thư viện lcd_lib_4bit đều bị lỗi. bạn xem lại đi ạ. bạn có thể gửi cho mình cái thư viện bạn đang dùng cho mình được chứ. mail: toancs@gmail.com
Trả lờiXóathanks so much!
Thư viện lcd_lib_4bit.c đây bạn: http://www.mediafire.com/?c3adajpns1bb4bz
Trả lờiXóa@Đinh Văn Hiếu: Bạn kiểm tra lại:
Trả lờiXóa+ Các thư viện đã có đủ trong cùng thư mục project chưa? nếu báo thiếu thư viện nào thì bạn coppy đầy đủ thư viện vào.
+ Bạn sửa lại các cặp dấu <> thành "" trong các dòng #include. VD: #include"16f877a.h"
+ Phần khai báo ở đầu CCS theo đúng thứ tự như trên chưa? Đôi khi bạn khai báo sai thứ tự cũng gây ra lỗi.
+ Chú ý các chân trong thư viện LCD_4BIT.C bạn phải khai báo lại theo đúng các chân trong mạch nguyên lý của bạn.
Thân!
bạn mới sửa code à? mới hôm trước mình vào còn khác mà
Trả lờiXóaMình sửa lại các dòng #include"..." cho đỡ gặp lỗi:)
Trả lờiXóaThân!
Bạn cho mình xin cái file sơ đồ nguyên lý đi, hình trên mờ qua mình ko nhìn rõ dc.
Trả lờiXóaMail của mình : minhsang08ddt1@gmail.com
Thanks bạn nhiều
hì... bác ơi cho em xin cái sơ đồ nguyên lí đi.. ảnh mờ quá.... mail của em là.... joneyquest1711@gmail.com... thanks bác
Trả lờiXóaOk mình up thêm File sơ đồ nguyên lý ở trên rồi đó.
Trả lờiXóaThân!
thanks bạn nhiều. Nhưng mà cái file đó mình ko đọc được, bạn có thể gửi file orcad hay chép sang word để dễ đọc hơn ko?
Trả lờiXóaMình chuyển qua file PDF ở trên rồi đó!
Trả lờiXóaThân!
code nay hien thi dc chu ko nhi
Trả lờiXóasao minh copy ve ma lai bao loi o doan (unsigned char d=a%10;)
Trả lờiXóaBạn xem trình biên dịch báo lỗi gì ở dòng đó?
Trả lờiXóabạn ơi sao mình copy code rồi chạy thử tren proteus và vb6 mà nó ko kết để truyền dữ liệu đc.hic
Trả lờiXóabạn ơi bổ xung thư viện thế nào nhỉ?
Trả lờiXóaNhận xét này đã bị tác giả xóa.
Trả lờiXóaT bị lỗi này trong thư viện lcd_lib_4bit:
Trả lờiXóaA #DEVIDE required before this line
t viết bằng CCS, c sửa hộ t nha, thank c ^^
bạn ơi gui minh file vb va protues duoc ko ban
Trả lờiXóamail:hiepcuibapspkt@gmail.com
e cũng làm về đề tài này ,nhưng không biết bắt đâu như thế nào.
Trả lờiXóaac giúp e mới.
đầu tiên cần phải có những cài gì vây?
có bạn nào làm mạch thành công chưa vậy
Trả lờiXóađã bluild code nhưng còn 1 lỗi khng6 biết sửa ở đâu !! lổi : Unknown device type ''pic16f877a'' . nhờ mod xem qua!
Trả lờiXóacho mình xin file nguyen lí và file mo phỏng đi bạn ơi, minh ko tải đc
Trả lờiXóacám ơn bạn nhiều
email:buivanhieu2105@gmail.com