Em đang làm đồ án đo độ ẩm dùng HS1101 hiển thị độ ẩm lên LCD
Khi em chạy mô phỏng thì kết quả luôn hiện là 0%
anh nào có thể kiểm tra giúp em được không ạ?
Thanks !!!!
mạch mô phỏng :
(em không đính kèm được file nên mạo muội copy code vào đây ạ)
//#include <AT89X52.h>
#include <regx52.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
// noi cac chan cho LCD
sbit RS=P3^0;
sbit RW=P3^1;
sbit E=P3^7;
sbit Bf=P2^7;
sbit Fout = P3^2; // noi chan ra tu 555 voi ngat 0 cua 89x52
char x; // dung trong hien thi LCD
//khoi chuong trinh do do am
// su dung NE555
unsigned char dem=0;
int do_am;
unsigned int so_xung=0;
void ngat_ngoai0 () interrupt 0
{
so_xung++;
TF0 = 0;
TR0 = 1;
}
void ngat_timer0 () interrupt 1 //sau 50 ms ham ngat bat dau lam viec
{
dem++;
TH0 =-250;
TL0=-250; // nap gia tri ban dau cho timer
TR0 = 1;
if(dem>4000) // 4000 lan nhan voi 250 = 1s .Vay thoi gian lay mau la 1 s
{
if (so_xung>7351) do_am=0;
else if(so_xung>7224) do_am=0+ (so_xung-7224)*10/(7351-7224);
else if(so_xung>7100) do_am=10+(so_xung-7100)*10/(7224-7100);
else if(so_xung>6976) do_am=20+(so_xung-6976)*10/(7100-6976);
else if(so_xung>6853) do_am=30+(so_xung-6853)*10/(6976-6853);
else if(so_xung>6728) do_am=40+(so_xung-6728)*10/(6853-6728);
else if(so_xung>6600) do_am=50+(so_xung-6600)*10/(6728-6600);
else if(so_xung>6468) do_am=60+(so_xung-6468)*10/(6600-6468);
else if(so_xung>6330) do_am=70+(so_xung-6330)*10/(6468-6330);
else if(so_xung>6186) do_am=80+(so_xung-6186)*10/(6330-6186);
else if(so_xung>6033) do_am=90+(so_xung-6033)*10/(6186-6033);
dem=0;
so_xung=0;
}
}
///////////////////////////////////////////
// chuong trinh hien thi len LCD
void delay(unsigned int time)
{
unsigned int i;
for(i=0; i<time; i++);
}
// Ham kiem tra ban
void buflag(void)
{
P2=0xff;
RS=0; //cho phep ghi lenh
RW=1; // Doc tu LCD
P2=x;
delay(100);
while(Bf)
{
E=1;
delay(200);
E=0;
}
}
// HAm gui lenh
void lenh(unsigned char lcd_lenh)
{
buflag();
RS=0;
RW=0; //ghi tu 8051 len lcd
E=1;
delay(200);
P2=lcd_lenh;
E=0;
delay(200);
}
//Ham gui 1 ky tu
void kytu(unsigned char ky_tu)
{
buflag();
P2=ky_tu;
RS=1; // chon thanh ghi du lieu
RW=0; // ghi vao lcd
E=1;
delay(10);
E=0;
delay(10);
}
// ham gui 1 chuoi ky tu
void chuoi(unsigned char *s )
{
while(*s)
{
kytu(*s);
s++;
}
}
// Ham khoi tao
void khoitao(void)
{
lenh(0x38);
lenh(0x0c);
lenh(0x01);
lenh(0x80);
}
// Ham chinh
void main(void)
{
int hum;
char str[20];
TMOD = 0x11;
IE = 0x83;
TH0 = -250;
TL0 = -250;
TR0 = 1;
TF0 = 0;
IT0 = 1;
EA = 1;
EX0 = 1;
ET0 =1;
//IP = 0x05;
khoitao();
lenh(0x80);
while(1)
{
hum = do_am;
lenh(0xc0);
sprintf(str, "Do Am: %d %%", hum);
chuoi(str);
delay(300);
}
}
Khi em chạy mô phỏng thì kết quả luôn hiện là 0%
anh nào có thể kiểm tra giúp em được không ạ?
Thanks !!!!
mạch mô phỏng :
(em không đính kèm được file nên mạo muội copy code vào đây ạ)
//#include <AT89X52.h>
#include <regx52.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
// noi cac chan cho LCD
sbit RS=P3^0;
sbit RW=P3^1;
sbit E=P3^7;
sbit Bf=P2^7;
sbit Fout = P3^2; // noi chan ra tu 555 voi ngat 0 cua 89x52
char x; // dung trong hien thi LCD
//khoi chuong trinh do do am
// su dung NE555
unsigned char dem=0;
int do_am;
unsigned int so_xung=0;
void ngat_ngoai0 () interrupt 0
{
so_xung++;
TF0 = 0;
TR0 = 1;
}
void ngat_timer0 () interrupt 1 //sau 50 ms ham ngat bat dau lam viec
{
dem++;
TH0 =-250;
TL0=-250; // nap gia tri ban dau cho timer
TR0 = 1;
if(dem>4000) // 4000 lan nhan voi 250 = 1s .Vay thoi gian lay mau la 1 s
{
if (so_xung>7351) do_am=0;
else if(so_xung>7224) do_am=0+ (so_xung-7224)*10/(7351-7224);
else if(so_xung>7100) do_am=10+(so_xung-7100)*10/(7224-7100);
else if(so_xung>6976) do_am=20+(so_xung-6976)*10/(7100-6976);
else if(so_xung>6853) do_am=30+(so_xung-6853)*10/(6976-6853);
else if(so_xung>6728) do_am=40+(so_xung-6728)*10/(6853-6728);
else if(so_xung>6600) do_am=50+(so_xung-6600)*10/(6728-6600);
else if(so_xung>6468) do_am=60+(so_xung-6468)*10/(6600-6468);
else if(so_xung>6330) do_am=70+(so_xung-6330)*10/(6468-6330);
else if(so_xung>6186) do_am=80+(so_xung-6186)*10/(6330-6186);
else if(so_xung>6033) do_am=90+(so_xung-6033)*10/(6186-6033);
dem=0;
so_xung=0;
}
}
///////////////////////////////////////////
// chuong trinh hien thi len LCD
void delay(unsigned int time)
{
unsigned int i;
for(i=0; i<time; i++);
}
// Ham kiem tra ban
void buflag(void)
{
P2=0xff;
RS=0; //cho phep ghi lenh
RW=1; // Doc tu LCD
P2=x;
delay(100);
while(Bf)
{
E=1;
delay(200);
E=0;
}
}
// HAm gui lenh
void lenh(unsigned char lcd_lenh)
{
buflag();
RS=0;
RW=0; //ghi tu 8051 len lcd
E=1;
delay(200);
P2=lcd_lenh;
E=0;
delay(200);
}
//Ham gui 1 ky tu
void kytu(unsigned char ky_tu)
{
buflag();
P2=ky_tu;
RS=1; // chon thanh ghi du lieu
RW=0; // ghi vao lcd
E=1;
delay(10);
E=0;
delay(10);
}
// ham gui 1 chuoi ky tu
void chuoi(unsigned char *s )
{
while(*s)
{
kytu(*s);
s++;
}
}
// Ham khoi tao
void khoitao(void)
{
lenh(0x38);
lenh(0x0c);
lenh(0x01);
lenh(0x80);
}
// Ham chinh
void main(void)
{
int hum;
char str[20];
TMOD = 0x11;
IE = 0x83;
TH0 = -250;
TL0 = -250;
TR0 = 1;
TF0 = 0;
IT0 = 1;
EA = 1;
EX0 = 1;
ET0 =1;
//IP = 0x05;
khoitao();
lenh(0x80);
while(1)
{
hum = do_am;
lenh(0xc0);
sprintf(str, "Do Am: %d %%", hum);
chuoi(str);
delay(300);
}
}
Comment