- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define LED_ON led=1
- #define LED_OFF led=0
- uchar dis_time_buf[16]={0};
- char code str[] = "已加热\n";
- char code str1[] = "已喂食\n";
- char code str21[] = "已关灯\n";
- char code str22[] = "已开灯\n";
- char code str3[] = "已供氧\n";
- unsigned char dat;
- uint rrr;
- //定义led灯
- sbit led=P1^0; //照明引脚
- sbit ledds1302 =P1^4; //加热棒工作
- sbit dianji1=P1^6;
- sbit dianji2=P1^5;
- sbit ledduiguan=P1^7; //水泵工作 开始供氧气
- //ds18b20引脚定义
- sbit DQ = P2 ^ 6; //定义端口DQ
- sbit led0 =P2^0;
- sbit led1 =P2^1;
- sbit led2 =P2^2;
- sbit led3 =P2^3;
- sbit k =P3^4;
- sbit l =P3^5;
- sbit led7 =P1^4;
- unsigned char q=1;
- unsigned char w=8;
- //红外对管引脚定义
- sbit OUT1=P2^5;//3
- sbit OUT2=P2^4;
- //ds18b20数组
- unsigned char tx[10]={0,0,0x2E,0,0,0,0,0xDF,0x43,0x0A};
- //ds18b20数组
- //unsigned code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
- 0xf8,0x80,0x90};//gongyang
- //unsigned code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
- //0x07,0x7f,0x6f};//gongying
- //功能:延时1毫秒
- //入口参数:x
- //出口参数:无
- //说明:当晶振为12M时,j<112;当晶振为11.0592M时,j<122
- void Delay_xms(uint x)
- {
- uint i,j;
- for(i=0;i<x;i++)
- for(j=0;j<112;j++);
- }
- /********************************************************************
- * 名称 : Delay()
- * 功能 : 微秒级延时函数
- * 输入 : num
- * 输出 : 无
- ***********************************************************************/
- void Delay(int num)//延时函数
- {
- while(num--) ;
- }
- /********************************************************************
- * 名称 : Delaynms()
- * 功能 : 毫秒级延时函数
- * 输入 : num
- * 输出 : 无
- ***********************************************************************/
- void Delaynms(unsigned int di) //延时
- {
- unsigned int da,db;
- for(da=0;da<di;da++)
- for(db=0;db<100;db++);
- }
- void Init_DS18B20(void)//初始化ds1820
- {
- unsigned char x=0;
- DQ = 1; //DQ复位
- Delay(8); //稍做延时
- DQ = 0; //单片机将DQ拉低
- Delay(80); //精确延时 大于 480us
- DQ = 1; //拉高总线
- Delay(14);
- x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
- Delay(20);
- }
- 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(4);
- }
- return(dat);
- }
- void WriteOneChar(unsigned char dat)//写一个字节
- {
- unsigned char i=0;
- for (i=8; i>0; i--)
- {
- DQ = 0;
- DQ = dat&0x01;
- Delay(2);
- DQ = 1;
- dat>>=1;
- }
- }
- void ReadTemperature(void)//读取温度
- {
- unsigned char a=0;
- unsigned char b=0;
- unsigned char Data_L=0;
- unsigned char num=0;
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳过读序号列号的操作
- WriteOneChar(0x44); // 启动温度转换
- Init_DS18B20();
- WriteOneChar(0xCC); //跳过读序号列号的操作
- WriteOneChar(0xBE); //读取温度寄存器
- a=ReadOneChar(); //读低8位
- b=ReadOneChar(); //读高8位
- tx[0] = (a/16+b*16)/10; //整数部分
- tx[1] = (a/16+b*16)%10;
- // Data_L=a&0X0F;
- // for(num=3;num<7;num++) //小数部分
- {
- Data_L=Data_L*10; //10 //100 //40 //80
- tx[num]=Data_L/16; //0 //6 //2 //5
- Data_L=Data_L%16; //10 //4 //8
- }
- }
- void anjian()
- {
- if(k==1)
- {
- Delay(5);
- if(k==1)
- {
- w++;
- if(w>=9)
- {
- w=9;
- }
- }
- }
- if(l==1)
- {
- Delay(5);
- if(l==1)
- {
- w--;
- if(w<=0)
- {
- w=0;
- }
- }
- }
- }
- //定时器中断函数
- void Timer2() interrupt 5 //定时器2是5号中断
- {
-
- static uchar t;
- TF2=0;
- t++;
- if(t==100) //间隔200ms(50ms*4)读取一次时间
- {
- t=0;
- rrr++;
- if(rrr%2)
- {
- dianji2=1;
- }
- else
- {
- dianji2=0;
- }
- }}
- //定时器2初始化
- void Init_timer2(void)
- {
- RCAP2H=0x3c;//赋T2初始值0x3cb0,溢出20次为1秒,每次溢出时间为50ms
- RCAP2L=0xb0;
- TR2=1; //启动定时器2
- ET2=1; //打开定时器2中断
- EA=1; //打开总中断
- }
- //发送字符
- //字符串发送函数
- void sendwendu( )
- // 传送字串
- {
- unsigned char i = 0;
- while(str[i] != '\0')
- {
- SBUF = str[i];
- while(!TI); // 等特数据传送
- TI = 0; // 清除数据传送标志
- i++; // 下一个字符
- }
- }
-
- void sendweishi( )
- // 传送字串
- {
- unsigned char i = 0;
- while(str1[i] != '\0')
- {
- SBUF = str1[i];
- while(!TI); // 等特数据传送
- TI = 0; // 清除数据传送标志
- i++; // 下一个字符
- }
- }
- void senddengguang1( )
- // 传送字串
- {
- unsigned char i = 0;
- while(str21[i] != '\0')
- {
- SBUF = str21[i];
- while(!TI); // 等特数据传送
- TI = 0; // 清除数据传送标志
- i++; // 下一个字符
- }
- }
- void senddengguang2( )
- // 传送字串
- {
- unsigned char i = 0;
- while(str22[i] != '\0')
- {
- SBUF = str22[i];
- while(!TI); // 等特数据传送
- TI = 0; // 清除数据传送标志
- i++; // 下一个字符
- }
- }
- void sendgongyang( )
- // 传送字串
- {
- unsigned char i = 0;
- while(str3[i] != '\0')
- {
- SBUF = str3[i];
- while(!TI); // 等特数据传送
- TI = 0; // 清除数据传送标志
- i++; // 下一个字符
- }
- }
-
- //红外引脚 ********** P3^2 *********************
- /*端口定义*/
- unsigned char irtime;//红外用全局变量
- bit irpro_ok,irok;
- unsigned char IRcord[4];//用来存放用户码、用户反码、数据码、数据反码
- unsigned char irdata[33];//用来存放32位码值
- void clear_IR()
- {
- IRcord[0] = 0;
- IRcord[1] = 0;
- IRcord[2] = 0;
- IRcord[3] = 0;
- }
- void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数
- {
- irtime++;
- }
- void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数
- {
- static unsigned char i;
- static bit startflag;
- if(startflag){
- if(irtime<63&&irtime>=33)//引导码 TC9012的头码
- i=0;
- irdata[i]=irtime;
- irtime=0;
- i++;
- if(i==33){
- irok=1;
- i=0;
- }
- }
- else{
- irtime=0;
- startflag=1;
- }
- }
- void TIM0init(void)//定时器0初始化
- {
- TMOD=0x22;//定时器0工作方式2,TH0是重装值,TL0是初值
- TH0=0x00;//reload value
- TL0=0x00;//initial value
- TL1=0xFD;
- TH1=0xFD;
- TR1=1;
- SCON = 0x50;
- ES=1;
- ET0=1;//开中断
- TR0=1;
- }
- void EX0init(void) //外部中断0子函数
- {
- IT0 = 1; // Configure interrupt 0 for falling edge on /INT0 (P3.2)
- EX0 = 1; // Enable EX0 Interrupt
- EA = 1;
- }
- void Ircordpro(void)//红外码值处理函数(关键函数)
- {
- unsigned char i, j, k=1;
- unsigned char cord,value;
- for(i=0;i<4;i++){//处理4个字节
- for(j=1;j<=8;j++){ //处理1个字节8位
- cord=irdata[k];
- value=value>>1;
- if(cord>7) value=value|0x80; //大于某值为1
- k++;
- }
- IRcord[i]=value;
- value=0;
- }
- irpro_ok=1;//处理完毕标志位置1
- }
- void none( void ) interrupt 4
- {
- if(RI) //是否接收中断
- {
- RI=0;
- dat=SBUF;
- }
- }
- //主函数
- void main(void)
- {
- led=0;
- Delay_xms(50);//等待系统稳定
- Init_DS18B20();
- Delay_xms(10);
- Init_timer2(); //外部中断0
- EX0init(); //外部中断0子函数
- TIM0init(); // 定时器0初始化
- SBUF = 1;
- dianji1=1;
- dianji2=1;
- ledds1302=0;
- ledduiguan=1;
- while(1)
- {
- if(OUT1==1||OUT2==0)//红外对管+水泵
- {
- ledduiguan=0;
- Delay_xms(900);
- ledduiguan=1;
- }
- anjian(); ////////////////////////////////////////////////////////////////////////
- ReadTemperature(); //读取温度
- if(tx[1]==w)
- {
- led=0;
- Delay(500);
- led=1;
- }
- /////////////////////////////////////////////////////////////////////////////////HX1838b
- if(irok)
- {
- Ircordpro();
- irok=0;
- }
- if(irpro_ok)
- { /*遥控成功接收*/
- irpro_ok=0;
- }
- //红外控制照明 照明
- switch(IRcord[2])
- {
- case 0x45:LED_ON;senddengguang1();clear_IR(); break;//1 灯泡
- case 0x44:LED_OFF;senddengguang2( );clear_IR(); break;//4
- case 0x07:ledds1302=0;sendwendu( );clear_IR(); break;//2 加热棒
- case 0x16:ledds1302=1;sendwendu( );clear_IR(); break;//5
- case 0x47:dianji1=1;dianji2=0;sendweishi( );clear_IR(); break;//3 喂食电机
- case 0x43:dianji1=1;dianji2=1;sendweishi( );clear_IR(); break;//6
- case 0x15:ledduiguan=0;sendgongyang( );clear_IR(); break;//8 水泵供养
- case 0x19:ledduiguan=1;clear_IR(); break;//0
- }
- }
- }
复制代码 |