|
主函数//////////
#include"reg51.h"
#include"intrins.h"
#include"lcd1602.h"
#define u8 unsigned char
#define u16 unsigned int
sbit Da=P1^3;
sbit led0=P1^4;
//sbit led1=P1^5;
//bit flag=0;
//u8 data_byte;
//u8 RH,RL,TH,TL;
u8 Data[5];
//u8 Dat;
void delay10us(u8 z)
{
u8 i;
for(i=z;i>0;i--)
{_nop_();}
}
//void delay10us(u8 t)
//{
// while(--t);
//}
//void delayms0(u8 t)
//{
// while(t--)
// {
// //大致延时1mS
// delay10us(245);
// delay10us(245);
// }
//}
void start()
{
Da=1;
delay10us(10);
Da=0;
delayms(30);
Da=1;
delay10us(40);
}
void receive()
{
u8 i,j;
//u8 tem;
u8 Dat;
start();
while(Da);//等待响应
while(!Da);//等待响应结束,拉高准备传输数据
while(Da);//开始传送
for(i=0;i<5;i++)
{
for(j=0;j<8;j++)
{
while(!Da);//检测0或1
delay10us(40);
//tem=0;
if(Da==1)
{Dat<<=1;
Dat|=0x01;
}
else
{Dat<<=1;
Dat&=0xfe;}
// tem=1;
while(Da);
// Dat<<=1;
// Dat|=tem;
//
}
Data=Dat;
Dat=0;
}
Da=1;
}
u8 jiaoyan()
{
u16 a=0;
u8 i;
for(i=0;i<4;i++)
{a+=Data;}
if((u8)a!=Data[4])
return 0;
else return 1;
}
/**********************接收一个字节**********************/
//u8 receive_byte()
//{
// u8 i,temp,count;
// for(i=0;i<8;i++)
// {
// count=2;
// while((!Da)&&count++)
// temp=0;
// delay10us(40); //关键时间:10~23之间
// if(Da==1)temp=1;
// count=2;
// while((Da)&&count++);
// if(count==1)break;
// data_byte<<=1;
// data_byte|=temp;
// }
// return data_byte;
//}
//void receive()
//{
// u8 T_H,T_L,R_H,R_L,check,num_check;
// u8 count;
// start(); //开始信号
//
// while(Da);
// count=2;
// while((!Da)&&count++); //DHT11高电平80us是否结束
// count=2;
// while((Da)&&count++);
// R_H=receive_byte();
// R_L=receive_byte();
// T_H=receive_byte();
// T_L=receive_byte();
// check=receive_byte();
//
// Da=0;
// delayms(1); //拉低延时
// Da=1;
// num_check=R_H+R_L+T_H+T_L;
//
// if(num_check=check)
// {
// RH=R_H;
// RL=R_L;
// TH=T_H;
// TL=T_L;
//
// flag=0;
// led1=0;
// delayms(500);
// led1=1;
// }
// else
// flag=1;
//
//}
void main()
{
u8 i;
lcd_init();
lcd_initdata();
while(1)
{
receive();
i=jiaoyan();
if(i!=0)
{
// if(flag==0)
// {
// lcd_conv(RH,TH);
lcd_conv(Data[0],Data[2]);
lcd_dis0();
lcd_dis1();
led0=0;
delayms(500);
led0=1;
}
else
lcd_dis2();
delayms(2000);
}
}
lcd1602 显示函数///////////
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P1^2;
sbit lcdrw=P1^1;
sbit lcden=P1^0;
uchar code tab0[]={"shidu:"};
uchar code tab1[]={"wendu:"};
uchar code tab2[]={"erroy"};
uchar dis_buf[4];
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
bit lcd_busy()
{
bit result;
lcdrs=0;
lcdrw=1;
lcden=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=(bit)(P2&0x80);
lcden=0;
return(result);
}
void write_com(uint com)
{
while(lcd_busy());
lcdrs=0;
lcdrw=0;
P2=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void write_data(uint date)
{
while(lcd_busy());
lcdrs=1;
lcdrw=0;
P2=date;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void lcd_clr()
{
write_com(0x01);
delayms(5);
}
void lcd_init()
{
write_com(0x38);
delayms(5);
write_com(0x38);
delayms(5);
write_com(0x38);
delayms(5);
write_com(0x0c);
delayms(5);
write_com(0x06);
delayms(5);
write_com(0x01);
}
void lcd_initdata()
{
uchar i;
write_com(0x00|0x80);
delayms(2);
i=0;
while(tab0!='\0')
{
write_data(tab0);
delayms(2);
i++;
}
delayms(10);
write_com(0x40|0x80);
delayms(2);
i=0;
while(tab1!='\0')
{
write_data(tab1);
delayms(2);
i++;
}
delayms(10);
}
void lcd_conv(uchar in0,in1)
{
dis_buf[0]=in0/10+0x30;
dis_buf[1]=in0%10+0x30;
dis_buf[2]=in1/10+0x30;
dis_buf[3]=in1%10+0x30;
}
void lcd_dis0()
{
write_com(0x06|0x80);
delayms(2);
write_data(dis_buf[0]);
delayms(2);
write_data(dis_buf[1]);
delayms(2);
write_data(0x25);
delayms(2);
}
void lcd_dis1()
{
write_com(0x46|0x80);
delayms(2);
write_data(dis_buf[2]);
delayms(2);
write_data(dis_buf[3]);
delayms(2);
write_data(0xdf);
delayms(2);
write_data('C');
delayms(2);
}
void lcd_dis2()
{
uchar i;
write_com(0x06|0x80);
delayms(2);
i=0;
while(tab2!='\0')
{
write_data(tab2);
delayms(2);
i++;
}
}
|
评分
-
查看全部评分
|