找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3599|回复: 7
收起左侧

[原创]刚写的程序,提下建议

[复制链接]
ID:38029 发表于 2012-7-11 23:53 | 显示全部楼层 |阅读模式
/*************************************/ /*功能:温度检测,温度调节,自动控温*/ /***********************************/ /********* IR_T.c ***********/ #include #define uint unsigned int #define uchar unsigned char sbit RS = P1^0; //1602数据,命令端 sbit RW = P1^1; //读写端 sbit E = P1^2; //使能端 sbit DS = P1^4; //DS18B20 sbit Hot = P2^0; //加热 sbit Feng = P2^7; //风扇降温 sbit Light = P3^1; sbit IR = P3^2; //红外 sbit Alarm = P1^3; //报警 uchar table[4]; //存储解码数据 uchar flag = 0; uchar n = 1; uchar t = 0; #include "DS18B20.h" //DS18B20温度转化 #include "1602_display.h" //1602显示 #include "IR.h" //红外线 void Init() { TMOD = 0x11; TH1 = (65536 - 1500) / 256; TL1 = (65536 - 1500) % 256; TR1 = 0; ET1 = 1; TH0 = 0x00; TL0 = 0x00; TR0 = 0; ET0 = 1; EA = 1; Hot = 0; Init_1602(); //1602初始化 } void main () { Init(); while (1) { Decode(); //红外线解码 Light = 1; } } void time1() interrupt 3 { TH1 = (65536 - 1500) / 256; TL1 = (65536 - 1500) % 256; t++; if (t >= 10) { t = 0; Write_tem(DS_average());//温度显示 Control(); } } /*************************************/ /******功能:1602液晶控制函数*********/ /******* 1602_display.h ************/ /*************************************/ uchar code table0[] = {"Range:25.0-090.0"}; uchar code table1[] = {"tempe:"}; void delay(uchar z) { uchar x = 0; uchar y = 0; for (x=z; x>0; x--) for (y=110; y>0; y--); } bit Test() //检忙 { bit STA7 = 0; RS = 0; RW = 1; E = 1; STA7 = (bit)(P0&0x80); delay(5); E = 0; return STA7; } void Write_order(uchar order) //写指令 { while (Test()); //不忙检测 RS = 0; RW = 0; P0 = order; delay(5); E = 1; delay(5); E = 0; } void Write_data(uchar dat) //写数据 { while (Test()); //不忙检测 RS = 1; RW = 0; P0 = dat; delay(5); E = 1; delay(5); E = 0; } uchar Read_order() //读指令 { uchar order = 0; while (Test()); //不忙检测 P0 = 0xff; RS = 0; RW = 1; delay(5); E = 1; delay(5); order = P0; E = 0; return order; } uchar Read_data() //读数据 { uchar dat = 0; while (Test()); //不忙检测 RS = 1; RW = 1; delay(5); E = 1; delay(5); dat = P0; E = 0; return dat; } void Init_1602() { uchar i = 0; Write_order(0x38); Write_order(0x0f); Write_order(0x80); //地址 i = 0; while (table0 != '\0') { Write_data(table0); i++; } Write_order(0x80 + 0x40); //地址 i = 0; while (table1 != '\0') { Write_data(table1); i++; } } void Write_tem(float tem) //写温度 { Write_order(0x80 + 0x46); Write_data(0x30 + (uint)tem / 100); Write_data(0x30 + (uint)tem / 10 % 10); Write_data(0x30 + (uint)tem % 10); Write_data('.'); Write_data(0x30 + (uint)(tem * 10) % 10); Write_data(0x30 + (uint)(tem * 100) % 10); Write_data(0xdf);//. Write_data('C'); Write_order(0x0c); } float Read_rang_low() //读最小温度范围 { uchar num0 = 0; uchar num1 = 0; uchar num2 = 0; Write_order(0x80 + 6); Read_order(); num0 = Read_data() % 16; Write_order(0x80 + 7); Read_order(); num1 = Read_data() % 16; Write_order(0x80 + 9); Read_order(); num2 = Read_data() % 16; return (num0 * 10 + num1 + num2 * 0.1); } float Read_rang_high() //读最大温度范围 { uchar num0 = 0; uchar num1 = 0; uchar num2 = 0; uchar num3 = 0; Write_order(0x80 + 11); Read_order(); num0 = Read_data() % 16; Write_order(0x80 + 12); Read_order(); num1 = Read_data() % 16; Write_order(0x80 + 13); Read_order(); num2 = Read_data() % 16; Write_order(0x80 + 15); Read_order(); num3 = Read_data() % 16; return (num0 * 100 + num1 * 10 + num2 + num3 * 0.1); } void Control() //对温度做相应处理 { if (Get_DS() <= Read_rang_high() && Get_DS() >= Read_rang_low()) { Hot = 0; Feng = 1; Alarm = 1; } if (Get_DS() >= Read_rang_high())//温度高,开降温 { Feng = 0; Hot = 0; Alarm = 0; delay(100); Alarm = 1; delay(100); } if (Get_DS() <= Read_rang_low())//温度低,开加热 { Feng = 1; Hot = 1; Alarm = 0; delay(100); Alarm = 1; delay(100); } } /*************************************/ /*******功能:DS128B20温度读取*******/ /******** DS18B20.h ***********/ /**********************************/ void delayms(uchar x) { while (x--); //x=0,14.11us,x=1,20.62us,x=n,14.11+6.51n us } uchar Init_DS() { uchar x = 0; DS = 1; delayms(0); DS = 0; delayms(110); //730us DS = 1; delayms(6); //50us x = DS; delayms(67); //480us DS = 1; return x; } void Write_data_DS(uchar dat) { uchar i = 0; for (i=0; i<8; i++) { DS = 0; DS = dat&0x01; //送低位 delayms(5); //45us DS = 1; dat >>= 1; } } uchar Read_data_DS() { uchar i = 0; uchar dat = 0; for (i=0;i<8;i++) { DS = 0; dat >>= 1; DS = 1; delayms(0); //4us if (DS) dat=dat|0x80; delayms(1); } return dat; } float Get_DS() { float temp = 0; while (Init_DS()); Write_data_DS(0xcc); Write_data_DS(0x44); delayms(120); //800us while (Init_DS()); Write_data_DS(0xcc); Write_data_DS(0xbe); temp = Read_data_DS(); temp = (Read_data_DS() << 8)|(uint)temp; temp = temp * 0.0625 + 0.005; return temp; } float DS_average() //十次平均温度值 { uchar i = 0; float temp = 0; for (i=10; i>0; i--) { temp = temp + Get_DS(); } temp = temp / 10.0; return temp; } /*************************************/ /******功能:红外控制解码************/ /******* IR.h *************/ /**********************************/ void Function(uchar num) //红外控制 { switch (num) { case 11:EA = 0; //设定范围 Alarm = 1; //关警报 n = 1; //游标定位 Write_order(0x86); Write_order(0x0f); flag = 1; break; case 12:Write_order(0x0c); //确定 flag = 0; EA=1; break; } if (flag == 1) { switch (num) { case 15:Write_order(0x86+n);//光标右移 n++; if (n == 2) n = 3; if (n == 4) n = 5; if (n == 8) n = 9; if (n == 10) n = 0; break; case 14:if (n <= 1) //光标左移 n = 11; if(n == 10) n = 9; if (n == 6) n = 5; if (n == 4) n = 3; Write_order(0x86+n-2); n--; break; case 0: case 1: case 2: //数字0—9 case 3: case 4: case 5: case 6: case 7: case 8: case 9: Write_data(0x30+num); Write_order(0x86+n); n++; if (n == 2) n = 3; if (n == 4) n = 5; if (n == 8) n = 9; if (n == 10) n = 0; break; } } } void Decode() //解码 { uchar i = 0; uchar j = 0; uchar temp = 0; uint hightime = 0; uint lowtime = 0; uchar num = 0; TH0 = 0x00; TL0 = 0x00; TR0 = 1; while (IR == 0); TR0 = 0; lowtime = TH0 * 256 + TL0; TH0 = 0x00; TL0 = 0x00; TR0 = 1; while (IR == 1); TR0 = 0; hightime = TH0 * 256 + TL0; if (hightime > 3600 && hightime < 4600 && lowtime > 7800 && lowtime < 8800)//引导吗 { for (i=0; i<4; i++) { for (j=0; j<8; j++) { temp >>= 1; TH0 = 0; TL0 = 0; TR0 = 1; while (IR == 0); TR0 = 0; lowtime = TH0 * 256 + TL0; TH0 = 0; TL0 = 0; TR0 = 1; while (IR == 1); TR0 = 0; hightime = TH0 * 256 + TL0; if (lowtime > 370 && lowtime < 640) { if (hightime > 420 && hightime < 640)//0 { temp = temp&0x7f; } if (hightime > 1250 && hightime < 1850)//1 { temp = temp|0x80; } } } table = temp; } if (table[2] ==~table[3]) { switch (table[2]) //用户码编码 { case 22:num = 0;break; case 12:num = 1;break; case 24:num = 2;break; case 94:num = 3;break; case 8:num = 4;break; case 28:num = 5;break; case 90:num = 6;break; case 66:num = 7;break; case 82:num = 8;break; case 74:num = 9;break; case 69:num = 10;break; case 70:num = 11;break; case 71:num = 12;break; case 68:num = 13;break; case 64:num = 14;break; case 67:num = 15;break; case 7:num = 16;break; case 21:num = 17;break; case 9:num = 18;break; case 25:num = 19;break; case 13:num = 20;break; } } Light = 0; Function(num); //调用功能函数 } }
回复

使用道具 举报

ID:38029 发表于 2012-7-11 23:53 | 显示全部楼层
/*************************************/ /*功能:温度检测,温度调节,自动控温*/ /***********************************/ /********* IR_T.c ***********/ #include #define uint unsigned int #define uchar unsigned char sbit RS = P1^0; //1602数据,命令端 sbit RW = P1^1; //读写端 sbit E = P1^2; //使能端 sbit DS = P1^4; //DS18B20 sbit Hot = P2^0; //加热 sbit Feng = P2^7; //风扇降温 sbit Light = P3^1; sbit IR = P3^2; //红外 sbit Alarm = P1^3; //报警 uchar table[4]; //存储解码数据 uchar flag = 0; uchar n = 1; uchar t = 0; #include "DS18B20.h" //DS18B20温度转化 #include "1602_display.h" //1602显示 #include "IR.h" //红外线 void Init() { TMOD = 0x11; TH1 = (65536 - 1500) / 256; TL1 = (65536 - 1500) % 256; TR1 = 0; ET1 = 1; TH0 = 0x00; TL0 = 0x00; TR0 = 0; ET0 = 1; EA = 1; Hot = 0; Init_1602(); //1602初始化 } void main () { Init(); while (1) { Decode(); //红外线解码 Light = 1; } } void time1() interrupt 3 { TH1 = (65536 - 1500) / 256; TL1 = (65536 - 1500) % 256; t++; if (t >= 10) { t = 0; Write_tem(DS_average());//温度显示 Control(); } } /*************************************/ /******功能:1602液晶控制函数*********/ /******* 1602_display.h ************/ /*************************************/ uchar code table0[] = {"Range:25.0-090.0"}; uchar code table1[] = {"tempe:"}; void delay(uchar z) { uchar x = 0; uchar y = 0; for (x=z; x>0; x--) for (y=110; y>0; y--); } bit Test() //检忙 { bit STA7 = 0; RS = 0; RW = 1; E = 1; STA7 = (bit)(P0&0x80); delay(5); E = 0; return STA7; } void Write_order(uchar order) //写指令 { while (Test()); //不忙检测 RS = 0; RW = 0; P0 = order; delay(5); E = 1; delay(5); E = 0; } void Write_data(uchar dat) //写数据 { while (Test()); //不忙检测 RS = 1; RW = 0; P0 = dat; delay(5); E = 1; delay(5); E = 0; } uchar Read_order() //读指令 { uchar order = 0; while (Test()); //不忙检测 P0 = 0xff; RS = 0; RW = 1; delay(5); E = 1; delay(5); order = P0; E = 0; return order; } uchar Read_data() //读数据 { uchar dat = 0; while (Test()); //不忙检测 RS = 1; RW = 1; delay(5); E = 1; delay(5); dat = P0; E = 0; return dat; } void Init_1602() { uchar i = 0; Write_order(0x38); Write_order(0x0f); Write_order(0x80); //地址 i = 0; while (table0 != '\0') { Write_data(table0); i++; } Write_order(0x80 + 0x40); //地址 i = 0; while (table1 != '\0') { Write_data(table1); i++; } } void Write_tem(float tem) //写温度 { Write_order(0x80 + 0x46); Write_data(0x30 + (uint)tem / 100); Write_data(0x30 + (uint)tem / 10 % 10); Write_data(0x30 + (uint)tem % 10); Write_data('.'); Write_data(0x30 + (uint)(tem * 10) % 10); Write_data(0x30 + (uint)(tem * 100) % 10); Write_data(0xdf);//. Write_data('C'); Write_order(0x0c); } float Read_rang_low() //读最小温度范围 { uchar num0 = 0; uchar num1 = 0; uchar num2 = 0; Write_order(0x80 + 6); Read_order(); num0 = Read_data() % 16; Write_order(0x80 + 7); Read_order(); num1 = Read_data() % 16; Write_order(0x80 + 9); Read_order(); num2 = Read_data() % 16; return (num0 * 10 + num1 + num2 * 0.1); } float Read_rang_high() //读最大温度范围 { uchar num0 = 0; uchar num1 = 0; uchar num2 = 0; uchar num3 = 0; Write_order(0x80 + 11); Read_order(); num0 = Read_data() % 16; Write_order(0x80 + 12); Read_order(); num1 = Read_data() % 16; Write_order(0x80 + 13); Read_order(); num2 = Read_data() % 16; Write_order(0x80 + 15); Read_order(); num3 = Read_data() % 16; return (num0 * 100 + num1 * 10 + num2 + num3 * 0.1); } void Control() //对温度做相应处理 { if (Get_DS() <= Read_rang_high() && Get_DS() >= Read_rang_low()) { Hot = 0; Feng = 1; Alarm = 1; } if (Get_DS() >= Read_rang_high())//温度高,开降温 { Feng = 0; Hot = 0; Alarm = 0; delay(100); Alarm = 1; delay(100); } if (Get_DS() <= Read_rang_low())//温度低,开加热 { Feng = 1; Hot = 1; Alarm = 0; delay(100); Alarm = 1; delay(100); } } /*************************************/ /*******功能:DS128B20温度读取*******/ /******** DS18B20.h ***********/ /**********************************/ void delayms(uchar x) { while (x--); //x=0,14.11us,x=1,20.62us,x=n,14.11+6.51n us } uchar Init_DS() { uchar x = 0; DS = 1; delayms(0); DS = 0; delayms(110); //730us DS = 1; delayms(6); //50us x = DS; delayms(67); //480us DS = 1; return x; } void Write_data_DS(uchar dat) { uchar i = 0; for (i=0; i<8; i++) { DS = 0; DS = dat&0x01; //送低位 delayms(5); //45us DS = 1; dat >>= 1; } } uchar Read_data_DS() { uchar i = 0; uchar dat = 0; for (i=0;i<8;i++) { DS = 0; dat >>= 1; DS = 1; delayms(0); //4us if (DS) dat=dat|0x80; delayms(1); } return dat; } float Get_DS() { float temp = 0; while (Init_DS()); Write_data_DS(0xcc); Write_data_DS(0x44); delayms(120); //800us while (Init_DS()); Write_data_DS(0xcc); Write_data_DS(0xbe); temp = Read_data_DS(); temp = (Read_data_DS() << 8)|(uint)temp; temp = temp * 0.0625 + 0.005; return temp; } float DS_average() //十次平均温度值 { uchar i = 0; float temp = 0; for (i=10; i>0; i--) { temp = temp + Get_DS(); } temp = temp / 10.0; return temp; } /*************************************/ /******功能:红外控制解码************/ /******* IR.h *************/ /**********************************/ void Function(uchar num) //红外控制 { switch (num) { case 11:EA = 0; //设定范围 Alarm = 1; //关警报 n = 1; //游标定位 Write_order(0x86); Write_order(0x0f); flag = 1; break; case 12:Write_order(0x0c); //确定 flag = 0; EA=1; break; } if (flag == 1) { switch (num) { case 15:Write_order(0x86+n);//光标右移 n++; if (n == 2) n = 3; if (n == 4) n = 5; if (n == 8) n = 9; if (n == 10) n = 0; break; case 14:if (n <= 1) //光标左移 n = 11; if(n == 10) n = 9; if (n == 6) n = 5; if (n == 4) n = 3; Write_order(0x86+n-2); n--; break; case 0: case 1: case 2: //数字0—9 case 3: case 4: case 5: case 6: case 7: case 8: case 9: Write_data(0x30+num); Write_order(0x86+n); n++; if (n == 2) n = 3; if (n == 4) n = 5; if (n == 8) n = 9; if (n == 10) n = 0; break; } } } void Decode() //解码 { uchar i = 0; uchar j = 0; uchar temp = 0; uint hightime = 0; uint lowtime = 0; uchar num = 0; TH0 = 0x00; TL0 = 0x00; TR0 = 1; while (IR == 0); TR0 = 0; lowtime = TH0 * 256 + TL0; TH0 = 0x00; TL0 = 0x00; TR0 = 1; while (IR == 1); TR0 = 0; hightime = TH0 * 256 + TL0; if (hightime > 3600 && hightime < 4600 && lowtime > 7800 && lowtime < 8800)//引导吗 { for (i=0; i<4; i++) { for (j=0; j<8; j++) { temp >>= 1; TH0 = 0; TL0 = 0; TR0 = 1; while (IR == 0); TR0 = 0; lowtime = TH0 * 256 + TL0; TH0 = 0; TL0 = 0; TR0 = 1; while (IR == 1); TR0 = 0; hightime = TH0 * 256 + TL0; if (lowtime > 370 && lowtime < 640) { if (hightime > 420 && hightime < 640)//0 { temp = temp&0x7f; } if (hightime > 1250 && hightime < 1850)//1 { temp = temp|0x80; } } } table = temp; } if (table[2] ==~table[3]) { switch (table[2]) //用户码编码 { case 22:num = 0;break; case 12:num = 1;break; case 24:num = 2;break; case 94:num = 3;break; case 8:num = 4;break; case 28:num = 5;break; case 90:num = 6;break; case 66:num = 7;break; case 82:num = 8;break; case 74:num = 9;break; case 69:num = 10;break; case 70:num = 11;break; case 71:num = 12;break; case 68:num = 13;break; case 64:num = 14;break; case 67:num = 15;break; case 7:num = 16;break; case 21:num = 17;break; case 9:num = 18;break; case 25:num = 19;break; case 13:num = 20;break; } } Light = 0; Function(num); //调用功能函数 } }
回复

使用道具 举报

ID:38029 发表于 2012-7-11 23:59 | 显示全部楼层
 

/*************************************/

/*功能:温度检测,温度调节,自动控温*/

/***********************************/

/*********    IR_T.c    ***********/

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char


sbit RS    = P1^0;                 //1602数据,命令端

sbit RW    = P1^1;                //读写端

sbit E     = P1^2;                 //使能端

sbit DS    = P1^4;                 //DS18B20

sbit Hot   = P2^0;                  //加热

sbit Feng  = P2^7;                  //风扇降温

sbit Light = P3^1;

sbit IR    = P3^2;                  //红外

sbit Alarm = P1^3;                   //报警


uchar table[4];                          //存储解码数据

uchar flag = 0;

uchar   n  = 1;

uchar   t  = 0;


#include "DS18B20.h"            //DS18B20温度转化

#include "1602_display.h"       //1602显示

#include "IR.h"                        //红外线


void Init()

{

       TMOD = 0x11;

      

       TH1 = (65536 - 1500) / 256;

       TL1 = (65536 - 1500) % 256;

       TR1 = 0;

       ET1 = 1;

      

       TH0 = 0x00;

       TL0 = 0x00;

       TR0 = 0;

       ET0 = 1;

      

       EA = 1;

       Hot = 0;

      

       Init_1602();                                     //1602初始化

}


void main ()

{

       Init();

                           

       while (1)

       {

              Decode();                   //红外线解码

              Light = 1;

       }

}


void time1() interrupt 3

{

       TH1 = (65536 - 1500) / 256;

       TL1 = (65536 - 1500) % 256;

       t++;

       if (t >= 10)

       {

              t = 0;

              Write_tem(DS_average());//温度显示

              Control();

       }           

}


回复

使用道具 举报

ID:38029 发表于 2012-7-12 00:00 | 显示全部楼层
 

/*************************************/

/******功能:1602液晶控制函数*********/

/*******  1602_display.h  ************/

/*************************************/

uchar code table0[] = {"Range:25.0-090.0"};

uchar code table1[] = {"tempe:"};


void delay(uchar z)

{

       uchar x = 0;

       uchar y = 0;

      

       for (x=z; x>0; x--)

              for (y=110; y>0; y--);

}


bit Test()                                          //检忙

{

       bit STA7 = 0;

      

       RS = 0;

       RW = 1;

       E  = 1;

       STA7 = (bit)(P0&0x80);

       delay(5);

       E  = 0;

      

       return STA7;

}

void Write_order(uchar order) //写指令

{

       while (Test());                           //不忙检测

       RS = 0;

       RW = 0;

       P0 = order;

       delay(5);

       E = 1;

       delay(5);

       E = 0;

}


void Write_data(uchar dat)             //写数据

{

       while (Test());                           //不忙检测

       RS = 1;

       RW = 0;

       P0 = dat;

       delay(5);

       E = 1;

       delay(5);

       E = 0;

}


uchar Read_order()                         //读指令

{

       uchar order = 0;

      

       while (Test());                           //不忙检测

       P0 = 0xff;

       RS = 0;

       RW = 1;

       delay(5);

       E = 1;

       delay(5);

       order = P0;

       E = 0;

      

       return order;

}


uchar Read_data()                          //读数据

{

       uchar dat = 0;

       while (Test());                           //不忙检测

       RS = 1;

       RW = 1;

       delay(5);

       E = 1;

       delay(5);

       dat = P0;

       E = 0;

      

       return dat;

}


void Init_1602()

{

       uchar i = 0;

       Write_order(0x38);

       Write_order(0x0f);

      

       Write_order(0x80);                  //地址

       i = 0;

       while (table0 != '\0')

       {

              Write_data(table0);

              i++;

       }

      

       Write_order(0x80 + 0x40);      //地址

       i = 0;

       while (table1 != '\0')

       {

              Write_data(table1);

              i++;

       }

}


void Write_tem(float tem)              //写温度

{

       Write_order(0x80 + 0x46);

       Write_data(0x30 + (uint)tem / 100);

       Write_data(0x30 + (uint)tem / 10 % 10);

       Write_data(0x30 + (uint)tem % 10);

       Write_data('.');

       Write_data(0x30 + (uint)(tem * 10) % 10);

       Write_data(0x30 + (uint)(tem * 100) % 10);

       Write_data(0xdf);//.

       Write_data('C');


       Write_order(0x0c);

      

}


float Read_rang_low()                    //读最小温度范围

{

       uchar num0 = 0;

       uchar num1 = 0;

       uchar num2 = 0;

      

       Write_order(0x80 + 6);

       Read_order();

       num0 = Read_data() % 16;

      

       Write_order(0x80 + 7);

       Read_order();

       num1 = Read_data() % 16;

      

       Write_order(0x80 + 9);

       Read_order();

       num2 = Read_data() % 16;

      

       return (num0 * 10 + num1 + num2 * 0.1);

}


float Read_rang_high()                   //读最大温度范围

{

       uchar num0 = 0;

       uchar num1 = 0;

       uchar num2 = 0;

       uchar num3 = 0; 

      

       Write_order(0x80 + 11);

       Read_order();

       num0 = Read_data() % 16;

      

       Write_order(0x80 + 12);

       Read_order();

       num1 = Read_data() % 16;

      

       Write_order(0x80 + 13);

       Read_order();

       num2 = Read_data() % 16;

      

       Write_order(0x80 + 15);

       Read_order();

       num3 = Read_data() % 16;

      

       return (num0 * 100 + num1 * 10 + num2 + num3 * 0.1);

}


void Control()                                 //对温度做相应处理

{

       if (Get_DS() <= Read_rang_high()

              && Get_DS() >= Read_rang_low())

       {

              Hot = 0;

              Feng = 1;

              Alarm = 1;

       }

      

       if (Get_DS() >= Read_rang_high())//温度高,开降温

       {

              Feng = 0;

              Hot = 0;

              Alarm = 0;

              delay(100);

              Alarm = 1;

              delay(100);

       }

      

       if (Get_DS() <= Read_rang_low())//温度低,开加热

       {

              Feng = 1;

              Hot = 1;

              Alarm = 0;

              delay(100);

              Alarm = 1;

              delay(100);

       }

}


回复

使用道具 举报

ID:38029 发表于 2012-7-12 00:00 | 显示全部楼层

/*************************************/

/*******功能:DS128B20温度读取*******/

/********    DS18B20.h   ***********/

/**********************************/

void delayms(uchar x)

{

       while (x--);                 //x=0,14.11us,x=1,20.62us,x=n,14.11+6.51n us

}


uchar Init_DS()

{

       uchar x = 0;

      

       DS = 1;

       delayms(0);

       DS = 0;

       delayms(110);                    //730us

       DS = 1;

       delayms(6);                //50us

       x = DS;

       delayms(67);                     //480us

       DS = 1;

      

       return x;

}


void Write_data_DS(uchar dat)

{

       uchar i = 0;

      

       for (i=0; i<8; i++)

       {

              DS = 0;

              DS = dat&0x01;        //送低位

              delayms(5);         //45us

              DS = 1;

              dat >>= 1;

       }    

}


uchar Read_data_DS()

{

       uchar i = 0;

       uchar dat = 0;

      

       for (i=0;i<8;i++)

       {

              DS = 0;

              dat >>= 1;

              DS = 1;

              delayms(0);                //4us

              if (DS)

                     dat=dat|0x80;

              delayms(1);

       }

       return dat;

}


float Get_DS()

{

       float temp = 0;

      

       while (Init_DS());

       Write_data_DS(0xcc);

       Write_data_DS(0x44);

       delayms(120);                   //800us

      

       while (Init_DS());

       Write_data_DS(0xcc);

       Write_data_DS(0xbe);

      

       temp = Read_data_DS();

       temp = (Read_data_DS() << 8)|(uint)temp;

      

       temp = temp * 0.0625 + 0.005;

      

      

       return temp;

}


float DS_average()                   //十次平均温度值

{

       uchar i = 0;

       float temp = 0;

      

       for (i=10; i>0; i--)

       {

              temp = temp + Get_DS();

       }

       temp = temp / 10.0;

      

       return temp;

}


回复

使用道具 举报

ID:38029 发表于 2012-7-12 00:01 | 显示全部楼层
 

/*************************************/

/******功能:红外控制解码************/

/*******      IR.h     *************/

/**********************************/

void Function(uchar num)                            //红外控制

{

       switch (num)

       {

              case 11:EA = 0;                               //设定范围

                            Alarm = 1;                         //关警报

                            n = 1;                                 //游标定位

                            Write_order(0x86);

                            Write_order(0x0f);

                            flag = 1;

                            break;

                           

              case 12:Write_order(0x0c);             //确定

                            flag = 0;

                            EA=1;

                            break;

       }

      

       if (flag == 1)

       {

              switch (num)

              {

                     case 15:Write_order(0x86+n);//光标右移

                                   n++;      

                                   if (n == 2)

                                   n = 3;

                                   if (n == 4)

                                   n = 5;

                                   if (n == 8)

                                   n = 9;

                                   if (n == 10)

                                   n = 0;                  

                                   break;

                                  

                     case 14:if (n <= 1)                    //光标左移

                                   n = 11;

                                   if(n == 10)

                                   n = 9;

                                   if (n == 6)

                                   n = 5;

                                   if (n == 4)

                                   n = 3;

                                   Write_order(0x86+n-2);

                                   n--; 

                                   break;

                                  

                     case 0: case 1: case 2:        //数字0—9

                     case 3: case 4: case 5:

                     case 6: case 7: case 8:

                     case 9:  

                                   Write_data(0x30+num);

                                   Write_order(0x86+n);

                                   n++;

                                   if (n == 2)

                                   n = 3;

                                   if (n == 4)

                                   n = 5;

                                   if (n == 8)

                                   n = 9;

                                   if (n == 10)

                                   n = 0;           

                                   break;

              }

       }

}


回复

使用道具 举报

ID:38029 发表于 2012-7-12 00:01 | 显示全部楼层

void Decode()                                               //解码

{

       uchar i = 0;

       uchar j = 0;

       uchar temp = 0;

       uint hightime = 0;

       uint lowtime = 0;

       uchar num = 0;

      

       TH0 = 0x00;

       TL0 = 0x00;

       TR0 = 1;

       while (IR == 0);

       TR0 = 0;

       lowtime = TH0 * 256 + TL0;

      

       TH0 = 0x00;

       TL0 = 0x00;

       TR0 = 1;

       while (IR == 1);

       TR0 = 0;

       hightime = TH0 * 256 + TL0;

      

       if (hightime > 3600 && hightime < 4600

              && lowtime > 7800 && lowtime < 8800)//引导吗

       {    

              for (i=0; i<4; i++)

              {

                     for (j=0; j<8; j++)

                     {

                            temp >>= 1;

                                  

                            TH0 = 0;

                            TL0 = 0;

                            TR0 = 1;

                            while (IR == 0);

                            TR0 = 0;

                            lowtime = TH0 * 256 + TL0;

                                  

                            TH0 = 0;

                            TL0 = 0;

                            TR0 = 1;

                            while (IR == 1);

                            TR0 = 0;

                            hightime = TH0 * 256 + TL0;

                                  

                            if (lowtime > 370 && lowtime < 640)

                            {

                                   if (hightime > 420 && hightime < 640)//0

                                   {

                                          temp = temp&0x7f;

                                   }

                                  

                                   if (hightime > 1250 && hightime < 1850)//1

                                   {

                                          temp = temp|0x80;

                                   }

                                  

                            }           

                     }

              table = temp;

              }

              if (table[2] ==~table[3])

              {

                     switch (table[2])                //用户码编码

                     {

                            case 22:num = 0;break;

                            case 12:num = 1;break;

                            case 24:num = 2;break;

                            case 94:num = 3;break;

                            case  8:num = 4;break;

                            case 28:num = 5;break;

                            case 90:num = 6;break;

                            case 66:num = 7;break;

                            case 82:num = 8;break;

                            case 74:num = 9;break;

                                  

                            case 69:num = 10;break;

                            case 70:num = 11;break;

                            case 71:num = 12;break;

                            case 68:num = 13;break;

                            case 64:num = 14;break;

                            case 67:num = 15;break;

                            case  7:num = 16;break;

                            case 21:num = 17;break;

                            case  9:num = 18;break;

                            case 25:num = 19;break;

                            case 13:num = 20;break;

                     }           

              }

              Light = 0;

              Function(num);                               //调用功能函数

       }           

}


回复

使用道具 举报

ID:42770 发表于 2012-7-12 20:06 | 显示全部楼层

你能帮我解释一下关于定时计数器的意义吗

 

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表