远程温湿度测量系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

远程温湿度测量系统
一、 任务
制作一个远程温湿度测量仪,该测试仪具有温湿度测量和远程显示等功能。

其结构框图如下:
二、要求 1、基本要求
(1)通过可编程控制器、变换器和温湿度传感器采集温湿度数据并在LED 上显示;
(2)温度误差<1℃,湿度误差<1%,温度测量范围0℃~120℃,湿度测量范围1%
~99%;
(3)可用电池供电;
2、发挥部分
(1)设计红外二极管发射电路和红外接收电路,实现温湿度数据的准确可靠发送和接收;
(2)设计射频发射电路和接收电路,实现温湿度数据的准确可靠发送和接收; (3)最好采用微型化的温湿度传感器,无线传输距离>5米;
2.2.1 无线数据发射接收模块
模块所选用工作频率为315M ,采用声表谐振器SAW 稳频,频率稳定度极高。

电路采用ASK 方式调制,当数据信号停止时发射电流降为零,功耗很低。

电路本身未设编码集成电路,而增加了一只数据调制三极管Q1,这种结构使得它可以方便地和其它固定编码电路、滚动码电路及单片机接口,而不必考虑编码电路的工作电压和输出幅度信号值的大小。

模块输出功率由电压决定,电压变化时发射频率基本不变,发射电压为3V 时,空旷地传输距离约20 ~ 50m ,发射功率较小,当电压5V 时约100~200m ,当电压9V 时约300~500m ,当发射电
压为12V时,为最佳工作电压,具有较好的发射效果,发射电流约60mA,空旷地传输距离700~800m,发射功率约500mW。

综合考虑路面状况,通过试验选择了70m左右的发射距离。

地址及数据信息的标识采用PT2262芯片。

A0~A7为地址, 采用三进制编码,即可为3的8次方共6561组编码; D0~D3为数据编码引脚, 采用二进制编码即8421码, 可以编2的4次方共16组状态码。

数据解码器PT2272在嵌入式单片微机控制系统的干预下, 对信息采集器送来的信息编码数据, 进行数据融合, 并完整、准确地解析出站址标识的数据信息。

无线数据发射接收电路如图2、图3所示:
图2 无线数据发射模块
图3 无线数据接收模块
2.2.7温度检测模块:
温度传感器对室内温度进行测量,测量结果将被放置在DS18B20内存中,并可以让阅读发出记忆功能的指挥,阅读内容的片上存储器。

DS18B20为一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。

主要首先提供以下功能命令之一: 1 )读ROM, 2 )ROM匹配, 3 )搜索ROM,4 )跳过ROM,5 )报警检查。

这些指令操作作用在没有一个器件的64位光刻ROM序列号,可以在挂在一线上多个器件选定某一个器件,同时,总线也可以知道总线上挂有有多少,什么样的设备。

电路如图12所示:
图12 温度传感电路
DS18B20简介:
DS18B20是Dallas半导体公司生产的数字化温度传感器,一线总线的接口方式独特切经济,可轻松地组建传感网络。

其管脚图如图13所示:
图13 DS18B20引脚图
DS18B20功能特点:
1.图特的单线接口,仅需一个端口引脚进行通讯。

2.简单的多点分布应用。

3.无需外部器件。

4.可通过数据线供电。

5.零待机功耗。

6.测温范围-55~+125°C,以0.5°C递增,华氏期间-67°C~+257°C,以0.9°
F递增。

7.温度以9位数字量读出。

8.温度数字转换时间200ms(典型值)。

9.用户可定义的非易失性温度报警设置。

10.报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件。

11.应用包括温度控制、工业系统、消费品、温度计或任何热感测系统。

液晶显示LCD128X64
本系统采用液晶显示模块是128×64 点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置国标GB2312 码简体中文字库(16X16 点阵)、128 个字符(8X16 点阵)及64X256 点阵显示RAM(GDRAM)。

可与CPU 直接接口,提供两种界面来连接微处理机:8-位并行及串行两种连接方式。

具有多种功能:光标显示、画面移位、睡眠模式等。

该部分电路图如下所示:
最小应用系统设计
AT89S52是片内有ROM/EPROM的单片机,因此,这种芯片构成的最小系统简单﹑可靠。

用AT单片机构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可,如图3.1 AT89S52单片机最小系统所示。

由于集成度的限制,最小应用系统只能用作一些小型的控制单元。

其应用特点:
(1)有可供用户使用的大量I/O口线。

(2)内部存储器容量有限。

(3)应用系统开发具有特殊性。

图3-2-1 51系列单片机最小系统
1、时钟电路
AT89S52虽然有内部振荡电路,但要形成时钟,必须外部附加电路。

A T89S52单片机的时钟产生方法有两种。

内部时钟方式和外部时钟方式。

本设计采用内部时钟方式,利用芯片内部的振荡电路,在XTAL1、XTAL2引脚上外接定时元件,内部的振荡电路便产生自激振荡。

本设计采用最常用的内部时钟方式,即用外接晶体和电容组成的并联谐振回路。

振荡晶体可在1.2MHZ到12MHZ之间选择。

电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小、振荡电路起振速度
有少许影响,CX1、CX2可在20pF到100pF之间取值,但在60pF到70pF时振荡器有较高的频率稳定性。

所以本设计中,振荡晶体选择6MHZ,电容选择65pF。

2、复位电路
AT89S52的复位是由外部的复位电路来实现的。

复位引脚RST通过一个斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。

复位电路通常采用上电自动复位和按钮复位两种方式。

最简单的上电自动复位电路中上电自动复位是通过外部复位电路的电容充电来实现的。

只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。

时钟频率用6MHZ时C取22uF,R取1KΩ。

除了上电复位外,有时还需要按键手动复位。

本设计就是用的按键手动复位。

按键手动复位有电平方式和脉冲方式两种。

其中电平复位是通过RST端经电阻与电源Vcc接通而实现的。

按键手动复位电路见图3.2。

时钟频率选用6MHZ时,C取22uF,Rs取200Ω,R K 取1KΩ。

AT89S52
AA T89
图3-2-2 AT89S52复位电路
温度检测采用HS1101型温度传感器,HS1101是HUMIREL公司生产的变容式相对湿度传感器,采用独特的工艺设计。

HS1101测量湿度采用将HS1101置于555振荡电路中,将电容值的变化砖换成电压频率信号,可以直接被微处理器采集。

设计的电路如图1所示。

图1 湿度测量电路
555芯片外接电阻R57,R58与HS1101,构成对HS1101的充电回路。

7端通过芯片内部的晶体管对地短路实现对HS1101的放电回路,并将引脚2,6端相连引入到片内比较器,构成一个多谐波振荡器,其中,R57相对于R58必须非常的小,但决不能低于一个最小值。

R51是防止短路的保护电阻。

HS1101作为一个变化的电容器,连接2和6引脚。

引脚作为R57的短路引脚。

HS1101的等效电容通过R57和R58充电达到上限电压(近似于0.67 VCC,时间记为T1),这时555的引脚3由高电平变为低电平,然后通过R58开始放电,由于R57被7引脚内部短路接地,所以只放电到触发界线(近似于0.33 VCC,时间记为T2),这时555芯片的引脚3变为高电平。

通过不同的两个电阻R19,R20进行传感器的不停充放电,产生方波输出。

充电、放电时间分别为
输出波形的频率和占空比的计算公式如下:
由此可以看出,空气相对湿度与555芯片输出频率存在一定线性关系。

表2给出了典型频率湿度关系(参考点:25℃,相对湿度:55%,输出频率:6.208k Hz)。

可以通过微处理器采集555芯片的频率,然后查表即可得出相对湿度值。

为了更好提高测量精度,将采用下位机负责采集频率,将频率值送入上位机进行分段处理。

程序:
湿度程序:
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
uchar tem0 , tem1;
uchar temp0 , temp1;
uint f=0; //初值
/****************************************************************************
* 名称:timer0()
* 功能:定时器1,每50000us中断一次。

* 入口参数:
****************************************************************************/
void timer0() interrupt 1
{
EA =0;
TR0=0;
TR1=0;
TL0=0xFF; //重装值定时50000us OX4BFFH
TH0=0x4B;
tem0 = TL1; //读数
tem1 = TH1;
TL1=0x00; //定时器1清零
TH1=0x00;
f=1; //作标注位
TR0=1;
TR1=1;
EA=1;
}
/****************************************************************************
* 名称:timer1()
* 功能:计数器,用于计数将555输出的频率,以计数相对湿度。

* 入口参数:
****************************************************************************/
void timer1() interrupt 3 //T1中断,表示计数的频率溢出,超出了可测量的频率范围,显然在这里不可能。

所以重新启动。

{
EA =0;
TR0=0;
TR1=0;
TL0=0x00; //重装值定时50000us
TH0=0x4C;
TL1=0x00; //定时器1清零
TH1=0x00;
TR0=1;
TR1=1;
EA=1;
}
void Init_timer()
{
TMOD=0x51; //0101 0001 定时器0在模式1下工作16位定时器,定时方式定时器1在模式1下工作16位计数器,T1负跳变加1 TL0=0x00; //定时器0初值定时50000us
TH0=0x4C;
TL1=0x00; //定时器1清零
TH1=0x00;
ET0=1; //使能定时器0中断
ET1=1; //使能定时器1中断
EA=1; //使能总中断
TR0=1; //开始计时
TR1=1;
}
void delay(unsigned int m)
//--------------------------------------
{
unsigned int n;
for(;m>0;m--)
for(n=0;n<125;n--);
}
void Ddisp()
{
uchar i;
uchar code dabit[]={0xfe,0xfd,0xfb,0xf7};
uchar code da[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
// 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40;共阳0~f字型码
uchar tp[2];
tp[0]=temp0; //i是湿度的最后两位
tp[1]=temp1; //
for(i=0;i<2;i++)
{
P2=dabit[i]; // 湿度十位
P0=da[tp[i]];
delay(1);
}
}
void tran()
{
f = tem1;
f = ( f<<8 ) | tem0;
f = f * 20; //这里f的值是最终读到的频率,不同频率对于不同相对湿度。

if(( 5623<= f)&&( f<=6852) )//相对湿度在有效范围内(0%--100%)
{
if(( 6734<f)&&( f<= 6852) )
{ temp0 = 0; temp1 =(6852 -f)*10/118; }
if( (6618<f)&&( f<= 6734) )
{ temp0 = 1; temp1 =(6734 -f)*10/116; }
if( (6503<f)&&( f<= 6618 ) )
{ temp0 = 2; temp1 =(6618 -f)*10/115; }
if( (6388<f)&&( f<= 6503 ) )
{ temp0 = 3; temp1 =(6503 -f)*10/115; }
if( (6271<f)&&( f<= 6388 ) )
{ temp0 = 4; temp1 =(6388 -f)*10/117; }
if( (6152<f)&&( f<= 6271 ) )
{ temp0 = 5; temp1 =(6271 -f)*10/119; }
if( (6029<f)&&( f<= 6152 ) )
{ temp0 = 6; temp1 =(6152 -f)*10/123; }
if( (5901<f)&&( f<= 6029 ) )
{ temp0 = 7;temp1 =(6029 -f)*10/128; }
if( (5766<f)&&( f<= 5901 ))
{ temp0 = 8; temp1 =(5901 -f)*10/135; }
if( (5623<f)&&(f<= 5766))
{ temp0 = 9; temp1 =(5766 -f)*10/143; }
}
else
{
temp0 = 0; temp1 = 0;
}
}
void main()
{
uchar i,k;
uchar count;
Init_timer();
count = 0;
while(1)
{
// for (i=0;i<200;i++)
// for (k=0;k<200;k++); //延时
tran();
/* temp0 &= 0x0F;
temp1 &= 0x0F;
temp0 = temp0 <<4;
count=temp0 | temp1; */
Ddisp();
}
}
温度程序:
#include<REG52.H>
#include<math.h>
#include<INTRINS.H>
#define uchar unsigned char
#define uint unsigned int;
/*****************************************************************************/ sbit seg1=P2^0;
sbit seg2=P2^1;
sbit seg3=P2^2;
sbit DQ=P1^7;//ds18b20 端口
sfr dataled=0x80;//显示数据端口
/**********************************************************************/ uchar temp;
uchar flag_get,count,num,minute,second;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 7段数码管段码表共阴
uchar str[3];
/***********************************************************************/
void delay1(uchar MS);
unsigned char ReadTemperature(void);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void delay(unsigned int i);
/************************************************************************/
main()
{
TMOD|=0x01;//定时器设置
TH0=0xef;
TL0=0xf0;
IE=0x82;
TR0=1;
P2=0x00;
count=0;
while(1)
{
str[2]=0x39;//显示C符号
str[0]=tab[temp/10]; //十位温度
str[1]=tab[temp%10]; //个位温度
if(flag_get==1) //定时读取当前温度
{
temp=ReadTemperature();
flag_get=0;
}
}
}
void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔{
TH0=0xef;//定时器重装值
TL0=0xf0;
num++;
/*count1++;
if(count1==100)
{
count1=0;
}*/
if (num==50)//200ms检测一次
{
num=0;
flag_get=1;//标志位有效
second++;
if(second>=60)
{
second=0;
minute++;
}
}
count++;
if(count==1)
{P2=0xfe;
dataled=str[0];}//数码管扫描
if(count==2)
{P2=0xfd;
dataled=str[1];}
if(count==3)
{ P2=0xfb;
dataled=str[2];
count=0;}
}
/*********************************************************************************** **/
void delay(unsigned int i)//延时函数
{
while(i--);
}
/*********************************************************************************** ****/
//18b20初始化函数
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时大于480us
DQ = 1; //拉高总线
delay(10);
x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败
delay(5);
}
//读一个字节
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(5);
}
return(dat);
}
//写一个字节
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
delay(5);
}
//读取温度
unsigned char ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
//float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay(200);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
b<<=4;
b+=(a&0xf0)>>4;
t=b;
//tt=t*0.0625;
//t= tt*10+0.5; //放大10倍输出并四舍五入
return(t);
}
红外发射程序:
#include <AT89X51.h>
sbit DQ=P1^7;//ds18b20 端口
static bit OP,flag; //红外发射管的亮灭
static unsigned int count; //延时计数器
static unsigned int endcount; //终止延时计数
static unsigned char Flag,temp,count1,count2; //红外发送标志
float tt;
code unsigned char shuju[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x0 7,0x7f,0x6f}; //数码管显示数字0-9
void SendIRdata(char p_irdata);
void delay();
/*********************************************************************************** **/
void delay2(unsigned int i)//延时函数
{
while(i--);
}
void hongwai_Delay(int j) //延时函数
{
int m;
for(m=0;m<j;m++)
{
int i;
for(i=0; i<300; i++){;} //约1ms
}
}
/*********************************************************************************** ****/
//18b20初始化函数
void Init_DS18B20(void)
{
unsigned char x=0;
//EA=0;
DQ = 1; //DQ复位
delay2(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay2(80); //精确延时大于480us
DQ = 1; //拉高总线
delay2(10);
x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败
delay2(5);
//EA=1;
}
//读一个字节
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
//EA=0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay2(5);
}
return(dat);
//EA=1;
}
//写一个字节
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
//EA=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay2(5);
DQ = 1;
dat>>=1;
}
delay2(5);
//EA=1;
}
//读取温度
unsigned char ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
//float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay2(200);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
b<<=4;
b+=(a&0xf0)>>4;
t=b;
//tt=t*0.0625;
//t= tt*10+0.5; //放大10倍输出并四舍五入
return(t);
}
void main(void)
{
count = 0;
Flag = 0;
OP = 0;
P3_7 = 1;
EA = 1; //允许CPU中断
TMOD = 0x11; //设定时器0和1为16位模式1
ET0 = 1; //定时器0中断允许
P1=0xff;
TH0 = 0xFF;
TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;
TR1 = 1;//开始计数
ET1=1;
do{
if(flag==1)
{
count1=0;
flag=0;
TR0 = 0;
temp=ReadTemperature();
TR0 = 1;//开始计数
SendIRdata(temp); //开始发送数据
}
}while(1);
}
void timer_1() interrupt 3
{
TH1=(65535-4000)/256;
TL1=(65535-4000)%256;
count2++;
if(count2>=200)
flag=1;
count1++;
if(count1==1) //数码管扫描
{
P2=0xfe;
P0=shuju[temp/10];
}
if(count1==2)
{
P2=0xfd;
P0=shuju[temp%10];
}
if(count1==3)
{
P2=0xfb;
P0=0x39;
count1=0;
}
}
//定时器0中断处理
void timeint(void) interrupt 1
{
TH0=0xFF;
TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次count++;
}
void SendIRdata(char p_irdata)
{
int i;
char irdata=p_irdata;
//ET1=0;
//发送9ms的起始码
endcount=223;
Flag=1;
count=0;
P3_7=0;
do{}while(count<endcount);
//发送4.5ms的结果码
endcount=117;
Flag=0;
count=0;
P3_7=1;
do{}while(count<endcount);
//发送八位数据
irdata=~p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
Flag=1;
count=0;
P3_7=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=15;
}
else
{
endcount=41;
}
Flag=0;
count=0;
P3_7=1;
do{}while(count<endcount);
irdata=irdata>>1;
}
//发送八位数据的反码
irdata=p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
Flag=1;
count=0;
P3_7=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=15;
}
else
{
endcount=41;
}
Flag=0;
count=0;
P3_7=1;
do{}while(count<endcount);
irdata=irdata>>1;
}
endcount=10;
Flag=1;
count=0;
P3_7=0;
do{}while(count<endcount);
P3_7=1;
Flag=0;
ET1=1;
}
红外接收程序:
#include "At89x51.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define JINGZHEN 48
#define TIME0TH ((65536-100*JINGZHEN/12)&0xff00)>>8 //time0,10 0us,红外遥控
#define TIME0TL ((65536-100*JINGZHEN/12)&0xff)
#define TIME1TH ((65536-5000*JINGZHEN/12)&0xff00)>>8
#define TIME1TL ((65536-5000*JINGZHEN/12)&0xff)
#define uchar unsigned char
#define uint unsigned int
code unsigned char shuju[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x0 7,0x7f,0x6f}; //数码管显示数字0-9
code uchar BitMsk[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,};
uint IrCount=0,Show=0,Cont=0;
uchar IRDATBUF[32],s[20];
static uchar IrDat[5]={0,0,0,0,0};
uchar IrStart=0,IrDatCount=0;
extern void initLCM( void);
//LCD初始化子程序
extern void DisplayListChar(uchar X,uchar Y, unsigned char *DData);
//显示指定坐标的一串字符子函数
void hongwai_Delay(int j) //延时函数
{
int m;
for(m=0;m<j;m++)
{
int i;
for(i=0; i<300; i++){;} //约1ms
}
}
void timer0int (void) interrupt 1 using 1{ //定时器0
uchar i,a,b,c,d;
EA=0;
TH0 = TIME0TH;
TL0 = TIME0TL;
if(IrCount>500)IrCount=0;
if(IrCount>300&&IrStart>0){IrStart=0;IrDatCount=0;/*IrDat[0]=IrDat[1]= IrDat[2]=IrDat[3]=0;*/IrCount=0;}
if(IrStart==2)
{
IrStart=3;
for(i=0;i<IrDatCount;i++)
{
if(i<16)
{
a=i/8;
b=IRDATBUF[i];
c=IrDat[a];
d=BitMsk[i%8];
if(b>5&&b<14)c|=d;
if(b>16&&b<25)c&=~d;
IrDat[a]=c;
}
}
if(IrDat[0]!=~IrDat[1])
{
IrStart=0;IrDatCount=0;IrDat[0]=IrDat[1]=IrDat[2]=IrDat[3]=0;IrCo unt=0;
}
EA=1;
return;
}
IrCount++;
EA=1;
}
//外部中断0
void int0() interrupt 0 using 0 {
EA=0;
if(IrStart==0)
{
IrStart=1;IrCount=0;TH0 = TIME0TH;TL0 = TIME0TL;
IrDatCount=0;EA=1;
return;
}
if(IrStart==1)
{
if(IrDatCount>0&&IrDatCount<17)
IRDATBUF[IrDatCount-1]=IrCount;
if(IrDatCount>15)
{IrStart=2;TH0 = TIME0TH;TL0 = TIME0TL;EA=1;return;}
if(IrCount>114&&IrCount<133&&IrDatCount==0) {IrDatCount=1;}else if(IrDatCount>0)IrDatCount++;
}
IrCount=0;TH0 = TIME0TH;TL0 = TIME0TL;
EA=1;
}
main()
{
TMOD |= 0x011;
TH0 = TIME0TH;
TL0 = TIME0TL;
ET0=1;
TR0=1;
ET1=1;
IT0 = 1; //下降沿
EX0 = 1;
EA=1;
for(;;)
{
P2=0xfe;
P0=shuju[IrDat[1]/10];
hongwai_Delay(4);
P2=0xfd;
P0=shuju[IrDat[1]%10];
hongwai_Delay(4);
P2=0xfb;
P0=0x39;
hongwai_Delay(4);
}
}。

相关文档
最新文档