đã thử viết nhưng k thành công,ai có thể cho e xin đoạn code hiện số lần bấm nút lên LCD dùng keilc đc không ak
đọc cmt nên e up bài của e lên để mọi ng nghiên cứu,thảo luận sửa giúp e với
- đề tài là mạch đo nhiệt độ co nút set mức nhiệt độ báo động
e đã hoàn thành xong phần đo nhiệt độ và hiển thị
- phần mức cảnh báo :nếu e gán giá trị trực tiếp là 1 hằng số thì hoạt động tốt
nhưng nếu gán thành biến x và dùng 2 chân p2.5 và p2.6 làm 2 nút tăng giảm giá trị x để so sánh đưa ra cảnh báo thì lại không hoạt động,và e không hiển thị được giá trị x lên lcd
code đây ak,file mach bên dưới đấy ạ
#include<stdio.h>
#include<reg51.h>
sbit DQ = P2^0;
sbit hot = P3^1;
sbit good = P3^0;
sbit tang = P2^5;
char readdata[2];
unsigned int t1,nhietdo,x;
// Khai bao cho LCD --
sbit RS = P2^3;
sbit RW = P2^2;
sbit EN = P2^1;
#define lcd_PORT P1
//===========================
void delay_ms1(int n)
{
int k,j;
for(k=0;k<n;k++)
{
for(j=0;j<500;j++);
}
}
//==========================
void delay_5ms(){
int i,j;
for(i=0;i<250;i++)
for(j=0;j<4;j++){}
}
//===========================
void delay_15ms(){
int i,j;
for(i=0;i<250;i++)
for(j=0;j<100;j++){}
}
//CT con ghi du lieu len LCD
void lcd_command(unsigned char c)
{
RS=0;
RW=0;
lcd_PORT=c;
EN=1;
EN=0;
delay_5ms();
}
//CT con doc du lieu tu LCD
void lcd_data(unsigned char c)
{
RS=1;
lcd_PORT=c;
EN=1;
EN=0;
delay_5ms();
}
//===============================
void lcd_init() // Khoi tao LCD
{
delay_15ms();
lcd_command(0x38);
lcd_command(0x0C);
lcd_command(0x01); // Xoa man hinh LCD
}
//=============================
void lcd_putsf(unsigned char *s)
{
while (*s)
{
lcd_data(*s);
s++;
}
}
//------------------DS18b20---------------------------------------------------------------------
void DelayUs(int us)
{
int i;
for (i=0; i<us; i++);
}
// Reset DS1820
bit ResetDS1820(void)
{
bit presence;
DQ = 0; //pull DQ line low
DelayUs(29); // leave it low for about 490us
DQ = 1; // allow line to return high
DelayUs(3); // wait for presence 55 uS
presence = DQ; // get presence signal
DelayUs(25); // wait for end of timeslot 316 uS
return(presence); // presence signal returned
} // 0=presence, 1 = no part
// Doc 1 bit tu DS18s20
unsigned char ReadBit(void)
{
unsigned char i;
DQ = 0; // pull DQ low to start timeslot
DQ=1;
for (i=0; i<3; i++); // delay 17 us from start of timeslot
return(DQ); // return value of DQ line
}
// viet 1 bit vao DS1820
void WriteBit(char bitval)
{
DQ=0;
if(bitval==1)
DQ = 1;
DelayUs(5); // delay about 39 uS
DQ = 1;
}
//-----------------------------------------
// Doc 1 byte tu DS1820
//-----------------------------------------
unsigned char ReadByte(void)
{
unsigned char i;
unsigned char value = 0;
for (i=0;i<8;i++)
{
if(ReadBit()) value|=0x01<<i;
DelayUs(6);
}
return(value);
}
// viet 1 byte tu ds1820
void WriteByte(char val)
{
unsigned char i;
unsigned char temp;
for (i=0; i<8; i++) // writes byte, one bit at a time
{
temp = val>> i;
temp &=0x01;
WriteBit(temp);
}
DelayUs(5);
}
// Doc nhiet do thuc
void ReadTemp(void)
{
int k;
int thap, cao=0;
ResetDS1820();
WriteByte(0xcc); // skip ROM
WriteByte(0x44); // perform temperatur conversion
while (ReadByte()==0xff); // wait for conversion complete
ResetDS1820();
WriteByte(0xcc); // skip ROM
WriteByte(0xbe); // read the result
for (k=0; k<9; k++) // read 9 bytes but, use only one byte
{
readdata[k]=ReadByte(); // read DS1820
}
thap = readdata[0];
cao = readdata[1];
readdata[1]=readdata[1]<<4;
readdata[1]=readdata[1] & 0x70;
thap=readdata[0];
thap=thap>>4;
thap=thap & 0x0f;
readdata[1]=readdata[1] | thap;
thap=2;
t1=readdata[1];
} // 0=presence, 1 = no part
// Ham hien thi nhiet do
void HienThi_ADC(unsigned char so)
{
if ( so<100)
{
//lcd_data(t/100+48);
lcd_data(((so/10)%10)+48);
lcd_data(so%10+48);
}
else
{
lcd_data(so/100+48);
lcd_data(((so/10)%10)+48);
lcd_data(so%10+48);
}
}
//=============================================
//-------------------------------------------- }
//--------------------------------------------
void canhbao (void)
{ if (t1 >= 20)
{ hot = 1;
delay_ms1(40);
hot = 0;
delay_ms1(40);
lcd_init();
IE=0XAF;
IT0=1;
lcd_command(0x01);
lcd_command(0x83);
lcd_putsf ("* CANH BAO *");
delay_ms1(110);
}
else {good = 1;
delay_ms1(200);
good = 0;
delay_ms1(200);
}
}
void main (void)
{
lcd_init();
IE=0XAF;
IT0=1;
lcd_command(0x01);
lcd_command(0x80);
lcd_putsf ("HANOI");
lcd_command(0xC0);
lcd_putsf ("2/12/2012");
lcd_command(0x01);
while(1)
{
canhbao();
lcd_command(0x80);
lcd_putsf("DHDL PHUONG DONG");
lcd_command(0xC0);
lcd_putsf("Nhiet do: ");
ReadTemp();
nhietdo = t1;
HienThi_ADC(nhietdo);
lcd_command(0xc0+13);
lcd_putsf("oC ");
delay_ms1(20);
}
}
mach code.zip
đọc cmt nên e up bài của e lên để mọi ng nghiên cứu,thảo luận sửa giúp e với
- đề tài là mạch đo nhiệt độ co nút set mức nhiệt độ báo động
e đã hoàn thành xong phần đo nhiệt độ và hiển thị
- phần mức cảnh báo :nếu e gán giá trị trực tiếp là 1 hằng số thì hoạt động tốt
nhưng nếu gán thành biến x và dùng 2 chân p2.5 và p2.6 làm 2 nút tăng giảm giá trị x để so sánh đưa ra cảnh báo thì lại không hoạt động,và e không hiển thị được giá trị x lên lcd
code đây ak,file mach bên dưới đấy ạ
#include<stdio.h>
#include<reg51.h>
sbit DQ = P2^0;
sbit hot = P3^1;
sbit good = P3^0;
sbit tang = P2^5;
char readdata[2];
unsigned int t1,nhietdo,x;
// Khai bao cho LCD --
sbit RS = P2^3;
sbit RW = P2^2;
sbit EN = P2^1;
#define lcd_PORT P1
//===========================
void delay_ms1(int n)
{
int k,j;
for(k=0;k<n;k++)
{
for(j=0;j<500;j++);
}
}
//==========================
void delay_5ms(){
int i,j;
for(i=0;i<250;i++)
for(j=0;j<4;j++){}
}
//===========================
void delay_15ms(){
int i,j;
for(i=0;i<250;i++)
for(j=0;j<100;j++){}
}
//CT con ghi du lieu len LCD
void lcd_command(unsigned char c)
{
RS=0;
RW=0;
lcd_PORT=c;
EN=1;
EN=0;
delay_5ms();
}
//CT con doc du lieu tu LCD
void lcd_data(unsigned char c)
{
RS=1;
lcd_PORT=c;
EN=1;
EN=0;
delay_5ms();
}
//===============================
void lcd_init() // Khoi tao LCD
{
delay_15ms();
lcd_command(0x38);
lcd_command(0x0C);
lcd_command(0x01); // Xoa man hinh LCD
}
//=============================
void lcd_putsf(unsigned char *s)
{
while (*s)
{
lcd_data(*s);
s++;
}
}
//------------------DS18b20---------------------------------------------------------------------
void DelayUs(int us)
{
int i;
for (i=0; i<us; i++);
}
// Reset DS1820
bit ResetDS1820(void)
{
bit presence;
DQ = 0; //pull DQ line low
DelayUs(29); // leave it low for about 490us
DQ = 1; // allow line to return high
DelayUs(3); // wait for presence 55 uS
presence = DQ; // get presence signal
DelayUs(25); // wait for end of timeslot 316 uS
return(presence); // presence signal returned
} // 0=presence, 1 = no part
// Doc 1 bit tu DS18s20
unsigned char ReadBit(void)
{
unsigned char i;
DQ = 0; // pull DQ low to start timeslot
DQ=1;
for (i=0; i<3; i++); // delay 17 us from start of timeslot
return(DQ); // return value of DQ line
}
// viet 1 bit vao DS1820
void WriteBit(char bitval)
{
DQ=0;
if(bitval==1)
DQ = 1;
DelayUs(5); // delay about 39 uS
DQ = 1;
}
//-----------------------------------------
// Doc 1 byte tu DS1820
//-----------------------------------------
unsigned char ReadByte(void)
{
unsigned char i;
unsigned char value = 0;
for (i=0;i<8;i++)
{
if(ReadBit()) value|=0x01<<i;
DelayUs(6);
}
return(value);
}
// viet 1 byte tu ds1820
void WriteByte(char val)
{
unsigned char i;
unsigned char temp;
for (i=0; i<8; i++) // writes byte, one bit at a time
{
temp = val>> i;
temp &=0x01;
WriteBit(temp);
}
DelayUs(5);
}
// Doc nhiet do thuc
void ReadTemp(void)
{
int k;
int thap, cao=0;
ResetDS1820();
WriteByte(0xcc); // skip ROM
WriteByte(0x44); // perform temperatur conversion
while (ReadByte()==0xff); // wait for conversion complete
ResetDS1820();
WriteByte(0xcc); // skip ROM
WriteByte(0xbe); // read the result
for (k=0; k<9; k++) // read 9 bytes but, use only one byte
{
readdata[k]=ReadByte(); // read DS1820
}
thap = readdata[0];
cao = readdata[1];
readdata[1]=readdata[1]<<4;
readdata[1]=readdata[1] & 0x70;
thap=readdata[0];
thap=thap>>4;
thap=thap & 0x0f;
readdata[1]=readdata[1] | thap;
thap=2;
t1=readdata[1];
} // 0=presence, 1 = no part
// Ham hien thi nhiet do
void HienThi_ADC(unsigned char so)
{
if ( so<100)
{
//lcd_data(t/100+48);
lcd_data(((so/10)%10)+48);
lcd_data(so%10+48);
}
else
{
lcd_data(so/100+48);
lcd_data(((so/10)%10)+48);
lcd_data(so%10+48);
}
}
//=============================================
//-------------------------------------------- }
//--------------------------------------------
void canhbao (void)
{ if (t1 >= 20)
{ hot = 1;
delay_ms1(40);
hot = 0;
delay_ms1(40);
lcd_init();
IE=0XAF;
IT0=1;
lcd_command(0x01);
lcd_command(0x83);
lcd_putsf ("* CANH BAO *");
delay_ms1(110);
}
else {good = 1;
delay_ms1(200);
good = 0;
delay_ms1(200);
}
}
void main (void)
{
lcd_init();
IE=0XAF;
IT0=1;
lcd_command(0x01);
lcd_command(0x80);
lcd_putsf ("HANOI");
lcd_command(0xC0);
lcd_putsf ("2/12/2012");
lcd_command(0x01);
while(1)
{
canhbao();
lcd_command(0x80);
lcd_putsf("DHDL PHUONG DONG");
lcd_command(0xC0);
lcd_putsf("Nhiet do: ");
ReadTemp();
nhietdo = t1;
HienThi_ADC(nhietdo);
lcd_command(0xc0+13);
lcd_putsf("oC ");
delay_ms1(20);
}
}
mach code.zip
Comment