找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6600|回复: 5
打印 上一主题 下一主题
收起左侧

论文:单片机测试DS18B20温度并通过两个按键设置温度上下限 LCD12864显示

[复制链接]
跳转到指定楼层
楼主


所有资料51hei提供下载:
ff.rar (7.29 MB, 下载次数: 94)


内容摘要
摘要本系统利用单片机AT89C52采用程序设计方法来测试温度,还可以通过两个按键设置温度报警上限,当测试温度超过设定的温度上限时,蜂鸣器器就会报警且绿灯关闭,红灯点亮;当温度低于上限时蜂鸣器关闭且红灯关闭,绿灯点亮。并通过液晶屏LCD12864显示其测试温度以及设置的上限温度。

1系统设计2
1.1设计任务              2
1.2基本功能              2
1.3扩展功能              2
2系统方案论证2
2.1主控模块              2
2.2显示模块              3
3 DS18B20的理论分析与计算3
4电路与程序设计6
4.1系统总体框图              6
4.2总体电路              6
4.3程序的设计            
总结
附录1
附录2









1系统设计
1.1设计任务
设计一数字温度测量系统,能自动实现实际温度的测量与显示。
1.2基本功能
(1)测温范围-30℃~+120℃。
(2)测量误差在±0.5℃之内。
(3)能正常显示测量的温度。
(4)能正常显示测量的温度的变换曲线图。
1.3扩展功能
(1)增加温控功能,并可修改设置温控的上下限。
(2)增加温控报警功能。
2系统方案论证
    本系统主要由主控模块、显示模块、按键模块、蜂鸣器模块、LED模块、传感器模块组成,下面分别论证这几个模块的选择。
2.1主控模块
方案:AT89C52单片机是一种高性能8位单片微型计算机。内核本身具有丰富的指令集,足够实现本次作品的全部基本功能和部分拓展功能,相比Atmega16我们对AT89C52更为熟悉,且芯片价格较低,性价比高。

2.2显示模块

方案:采用LCD12864显示。LCD12864屏幕显示细腻直观,且可以显示中文,但是相对昂贵。



3 DS18B20的理论分析与计算
DS18B20 通过编程,可以实现最高 12 位的温度存储值,在寄存器中,以补码的格式存储,如图1所示。
图1 DS18B20 温度数据格式
寄存器一共 2 个字节,LSB 是低字节,MSB 是高字节,其中 MSb 是字节的高位,LSb 是字节的低位。大家可以看出来,二进制数字,每一位代表的温度的含义,都表示出来了。其中 S表示的是符号位,低 11 位都是 2 的幂,用来表示最终的温度。DS18B20 的温度测量范围是从-55 度到+125 度,而温度数据的表现形式,有正负温度,寄存器中每个数字如同卡尺的刻度一样分布,如图 2所示。
图2 DS18B20 温度值
二进制数字最低位变化 1,代表温度变化 0.0625 度的映射关系。当 0 度的时候,那就是0x0000,当温度 125 度的时候,对应十六进制是 0x07D0,当温度是零下 55 度的时候,对应的数字是 0xFC90。反过来说,当数字是 0x0001 的时候,那温度就是 0.0625 度了。
DS18B20 简单介绍:
DALLAS 最新单线数字温度传感器DS18B20是一种新型的“一线器件”,其体积更小、更适用于多种场合、且适用电压更宽、更经济。DALLAS 半导体公司的数字化温度传感器DS18B20是世界上第一片支持“一线总线”接口的温度传感器。温度测量范围为-55~+125 摄氏度,可编程为9位~12 位转换精度,测温分辨率可达0.0625摄氏度,分辨率设定参数以及用户设定的报警温度存储在EEPROM 中,掉电后依然保存。被测温度用符号扩展的16位数字量方式串行输出;其工作电源既可以在远端引入,也可以采用寄生电源方式产生;多个DS18B20可以并联到3 根或2 根线上,CPU只需一根端口线就能与诸多DS18B20 通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
DS18B20 的性能特点如下:
●独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯
●DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温
●DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内
●适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电
●测温范围-55℃~+125℃,精度为±0.5℃
●零待机功耗
●测量结果直接输出数字信号,以“一线总线”穿行传送给CPU,同时可传送CRC校验位,具有极强的抗干扰纠错能力
●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作
以上特点使DS18B20非常适用与多点、远距离温度检测系统。
DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列、各种封装形式如图 4.2 所示,DQ 为数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源;GND为地信号;VDD为可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。
           

外部封装形式                        传感器电路图

4电路与程序设计4.1系统总体框图
系统总体框图如图3所示
图3 系统总体框图
4.2总体电路
总体电路图见附录2。
4.3程序的设计4.3.1程序功能描述
(1)能够测试-30℃~+120℃的温度。
(2)按下S1能增加温度报警上限,按下S2能减少温度报警上限。
4.3.2试验程序
实验程序见附录1。













总结
本系统以单片机STC89C52芯片为核心部件,利用LCD12864、独立按键、DS18B20并配合C语言算法实现了简易数字温度计设计,完成此次设计题目中的全部基本功能和部分拓展功能。在系统设计过程中,力求硬件线路简单,充分发挥软件编程方便灵活的特点,来满足系统设计要求。
在本次设计的过程中,遇到了许多突发事件和困难,设计制作曾一度止步不前,但通过仔细分析和调整后解决了一个又一个的问题。在整个过程中我们深刻的体会到团队精神的重要性,并提高了自己解决问题的能力。在课程设计的整个过程中,我遇到了许多意想不到的困难,如自己设计电路,进行软件编译等等。不仅如此,很多从未遇见过的问题和现象困扰着我,比如在调试的过程中,时常出现问题,但每次经过仔细反复查找,终于可以将这些问题针对性的找到并进行合理的改正,确保其正常实现对应的功能,在自己处理难题的过程中,真正学到了很多新的知识。


单片机源程序如下:
  1. #include<reg51.h>
  2. #include<stdlib.h>
  3. #include<stdio.h>//头文件
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit DQ=P2^2;//ds18b20与单片机连接口
  7. sbit PWM=P1^0;//控制信号的输出
  8. sbit TTT=P2^3;//控制信号的输出
  9. unsigned char code str[]={"my name is lhh "};
  10. unsigned char code str_[]={"MADE IN NUPT... "};
  11. unsigned char code str1[]={"temper:"};
  12. unsigned char code str2[]={"         "};
  13. unsigned char code nul[]={"        "};
  14. unsigned char code str3[]={"target:  "};
  15. unsigned char  str4[6];//设定温度的存储
  16. uchar data disdata[5];

  17. uchar a[4]={0,0,0,0},j,i,k,num=0;      //定义变量
  18. sbit js=P3^2;   //红外接收端
  19. uchar zhb_flag=0;//保证一次解码,只执行一次代码

  20. uint tvalue;//温度值
  21. uchar tflag;//温度正负标志
  22. uint  count=0;//按键次数初始化为0
  23. uint  number=4;//暂时规定输入的温度为xx.x的形式
  24. uchar j,key;
  25. uint time_flag=0;
  26. bit enterflag=0;     // 确认键按下与否标志
  27. uint new_t;    //转化后的十进制实时温度
  28. uint target=0;  //转化后的十进制的目标温度---有键盘输入

  29. //------------定义接口-------------//
  30. sbit RS=P3^5 ;
  31. sbit RW=P3^6;
  32. sbit E=P3^4;
  33. sbit PSB= P3^7;   //H=并口; L="串口";
  34. #define Lcd_Bus P0
  35. // P0 接 LCM
  36. #define uchar unsigned char
  37. #define FIRST_ADDR 0
  38. //定义字符/汉字显示起始位置
  39. /*------------------检查忙位-----------------------------*/
  40. void chk_busy()
  41. {
  42.     RS=0 ;
  43.     RW=1 ;
  44.     E=1 ;
  45.     Lcd_Bus=0xff ;
  46.     while((Lcd_Bus&0x80)==0x80);
  47.     E=0 ;
  48. }
  49. /*------------------延时子程序-----------------------------*/
  50. void lcd_delay(unsigned int t)
  51. {
  52.     unsigned int i,j ;
  53.     for(i=0;i<t;i++)
  54.     for(j=0;j<10;j++);
  55. }

  56. /*------------------写命令到LCD------------------------------*/
  57. void write_com(unsigned char cmdcode)
  58. {
  59.     chk_busy();
  60.     RS=0 ;
  61.     RW=0 ;
  62.     E=1 ;
  63.     Lcd_Bus=cmdcode ;
  64.     lcd_delay(5);
  65.     //------------------在数据写入的时候加入适当的延时
  66.     E=0 ;
  67.     lcd_delay(5);
  68. }

  69. /*-------------------写数据到LCD----------------------------*/
  70. void write_data(unsigned char Dispdata)
  71. {
  72.     chk_busy();
  73.     RS=1 ;
  74.     RW=0 ;
  75.     E=1 ;
  76.     Lcd_Bus=Dispdata ;
  77.     lcd_delay(5);
  78.     //------------------在数据写入的时候加入适当的延时
  79.     E=0 ;
  80.     lcd_delay(5);
  81. }
  82. /*------------------初始化LCD屏--------------------------*/
  83. void lcdreset()
  84. {
  85.     PSB = 1;
  86.     lcd_delay(2000);
  87.     write_com(0x30);
  88.     lcd_delay(10);
  89.     //选择基本指令集
  90.     write_com(0x30);
  91.     //选择8bit数据流
  92.     lcd_delay(5);
  93.     write_com(0x0c);
  94.     //开显示(无游标、不反白)
  95.     lcd_delay(10);
  96.     write_com(0x01);
  97.     //清除显示,并且设定地址指针为00H
  98.     lcd_delay(500);
  99.     write_com(0x06);
  100.     //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
  101.     lcd_delay(0);
  102. }
  103. /*------------------显示字符串--------------------------*/
  104. void hzkdis(unsigned char code*s)
  105. {
  106.     while(*s>0)
  107.     {
  108.         write_data(*s);
  109.         s++;
  110.         lcd_delay(50);
  111.     }
  112. }
  113. /*------------------首屏显示--------------------------*/
  114. void ceshi()
  115. {
  116.     write_com(0x01);
  117.     //清除显示,并且设定地址指针为00H
  118.     lcd_delay(5);

  119.     write_com(0x80);
  120.     //第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)
  121.     hzkdis("通信1503");

  122.     write_com(0x90);
  123.     //第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示)
  124.     hzkdis(str);

  125.     write_com(0x88);
  126.     //第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示)
  127.     hzkdis("李浩浩常凡");

  128.     write_com(0x98);
  129.     //第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示)
  130.     hzkdis("1513024090");
  131. }
  132. //------------------清整个GDRAM空间----------------------------
  133. void clrgdram()
  134. {
  135.     unsigned char x,y ;
  136.     for(y=0;y<64;y++)
  137.     for(x=0;x<16;x++)
  138.     {
  139.         write_com(0x34);
  140.         write_com(y+0x80);
  141.         //行地址
  142.         write_com(x+0x80);
  143.         //列地址
  144.         write_com(0x30);
  145.         write_data(0x00);
  146.         write_data(0x00);
  147.     }
  148. }
  149. //------------------------------------------------------------
  150. void clrscreen()
  151. {
  152.     write_com(0x01);
  153.     lcd_delay(10);
  154. }
  155. unsigned char ReadByte(void)
  156. {
  157.     unsigned char byReturnValue ;
  158.     chk_busy();
  159.     Lcd_Bus=0xff ;
  160.     RS=1 ;
  161.     RW=1 ;
  162.     E=0 ;
  163.     E=1 ;
  164.     byReturnValue=Lcd_Bus ;
  165.     E=0 ;

  166.     return byReturnValue ;
  167. }

  168. /*增加画点子程序
  169. 函数功能:在坐标为(x,y)点画一个点
  170. 参数意义
  171. X:12864屏幕的横坐标,范围是0到128(从左到右)
  172. Y:12864的纵坐标,范围是0到64(从上到下)
  173. Color:为1的时候表示为黑点
  174. */
  175. void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color)
  176. {
  177.     unsigned char Row,Tier,Tier_bit ;
  178.     unsigned char ReadOldH,ReadOldL ;
  179.     write_com(0x34);
  180.     write_com(0x36);
  181.     Tier=X>>4 ;
  182.     Tier_bit=X&0x0f ;
  183.     if(Y<32)
  184.     {
  185.         Row=Y ;
  186.     }
  187.     else
  188.     {
  189.         Row=Y-32 ;
  190.         Tier+=8 ;
  191.     }
  192.     write_com(Row+0x80);
  193.     write_com(Tier+0x80);
  194.     ReadByte();
  195.     ReadOldH=ReadByte();
  196.     ReadOldL=ReadByte();
  197.     write_com(Row+0x80);
  198.     write_com(Tier+0x80);
  199.     if(Tier_bit<8)
  200.     {
  201.         switch(Color)
  202.         {
  203.             case 0 :
  204.             ReadOldH&=(~(0x01<<(7-Tier_bit)));
  205.             break ;
  206.             case 1 :
  207.             ReadOldH|=(0x01<<(7-Tier_bit));
  208.             break ;
  209.             case 2 :
  210.             ReadOldH^=(0x01<<(7-Tier_bit));
  211.             break ;
  212.             default :
  213.             break ;
  214.         }
  215.         write_data(ReadOldH);
  216.         write_data(ReadOldL);
  217.     }
  218.     else
  219.     {
  220.         switch(Color)
  221.         {
  222.             case 0 :
  223.             ReadOldL&=(~(0x01<<(15-Tier_bit)));
  224.             break ;
  225.             case 1 :
  226.             ReadOldL|=(0x01<<(15-Tier_bit));
  227.             break ;
  228.             case 2 :
  229.             ReadOldL^=(0x01<<(15-Tier_bit));
  230.             break ;
  231.             default :
  232.             break ;
  233.         }
  234.         write_data(ReadOldH);
  235.         write_data(ReadOldL);
  236.     }
  237.     write_com(0x30);
  238. }


  239. void send_to_pc(void)
  240. {
  241. uint pc_flag=0;
  242. SCON=0x50;//串口方式1,允许接收
  243. TMOD=0x20;//定时器1,定时方式2
  244. TCON=0x40;//设定时器1开始计数
  245. TH1=0xE8;//11.0592MHz, 1200波特率
  246. TL1=0xE8;
  247. TI=1;
  248. TR1=1;
  249. while(1)
  250. {
  251.   if(pc_flag==1)
  252.   {
  253.    TMOD=1;
  254.   }
  255.   else
  256.   {
  257.    printf("Now temperture is ");
  258.    printf(disdata);
  259.    printf("*0.1 C");
  260.    pc_flag++;
  261.   }
  262. }
  263. }




  264. void delay_18B20(unsigned int i)//延时1微秒
  265. {
  266. while(i--);
  267. }



  268. void ds1820rst()/*ds1820复位*/
  269. {
  270. unsigned char x=0;
  271. DQ = 1;          //DQ复位
  272. delay_18B20(4); //延时
  273. DQ = 0;          //DQ拉低
  274. delay_18B20(100); //精确延时大于480us
  275. DQ = 1;          //拉高
  276. delay_18B20(40);
  277. }



  278. uchar ds1820rd()/*读数据*/
  279. {
  280. unsigned char i=0;
  281. unsigned char dat = 0;
  282. for (i=8;i>0;i--)
  283.     {   
  284.   DQ = 0; //给脉冲信号
  285.         dat>>=1;
  286.         DQ = 1; //给脉冲信号
  287.         if(DQ)
  288.    dat|=0x80;
  289.         delay_18B20(10);
  290. }
  291. return(dat);
  292. }





  293. void ds1820wr(uchar wdata)/*写数据*/
  294. {
  295.     unsigned char i=0;
  296.     for (i=8; i>0; i--)
  297. {
  298.   DQ = 0;
  299.         DQ = wdata&0x01;
  300.         delay_18B20(10);
  301.         DQ = 1;
  302.         wdata>>=1;
  303. }
  304. }


  305. read_temp1()/*读取温度值并转换*/
  306. {
  307.     ds1820rst();   
  308.     ds1820wr(0xcc);//*跳过读序列号*/
  309.     ds1820wr(0x44);//*启动温度转换*/
  310.     ds1820rst();   
  311. }
  312. read_temp2()
  313. {
  314.     uchar a,b;
  315.     ds1820wr(0xcc);//*跳过读序列号*/
  316.     ds1820wr(0xbe);//*读取温度*/
  317.     a=ds1820rd();
  318.     b=ds1820rd();
  319.     tvalue=b;
  320.     tvalue<<=8;
  321.     tvalue=tvalue|a;
  322.     if(tvalue<0x0fff)
  323.   tflag=0;
  324.     else
  325. {
  326.   tvalue=~tvalue+1;
  327.         tflag=1;
  328. }
  329.     tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
  330.     return(tvalue);
  331. }



  332. /*******************************************************************/


  333. void ds1820disp1()//温度值显示
  334. {  
  335.     uchar flagdat;
  336.                            if (tvalue>4200)
  337.   {
  338.           TTT=0;
  339.   }
  340.     disdata[0]=tvalue/1000+0x30;//百位数
  341.     disdata[1]=tvalue%1000/100+0x30;//十位数
  342.     disdata[2]=tvalue%100/10+0x30;//个位数
  343.     disdata[3]=tvalue%10+0x30;//小数位
  344.     if(tflag==0)
  345.   flagdat=0x20;//正温度不显示符号
  346.     else
  347.   flagdat=0x2d;//负温度显示负号:-
  348.     if(disdata[0]==0x30)
  349.     {
  350.   disdata[0]=0x20;//如果百位为0,不显示
  351.   if(disdata[1]==0x30)
  352.   {
  353.    disdata[1]=0x20;//如果百位为0,十位为0也不显示
  354.   }
  355. }
  356. }



  357. void ds1820disp2()
  358. {
  359.     lcd_delay(5);
  360. write_com(0x80);
  361.     hzkdis("温度为:");
  362. lcd_delay(50);
  363. write_com(0x84);
  364. write_data(disdata[1]);
  365. write_com(0x85);
  366. write_data(disdata[2]);
  367. write_com(0x86);
  368. write_data(0x2e);
  369. write_com(0x87);
  370. write_data(disdata[3]);
  371.   if(disdata[1]>=3+0x30||(disdata[2]>=8+0x30))
  372. { write_com(0x98);
  373.     hzkdis("sos");        }
  374.         else
  375.          { write_com(0x98);
  376.     hzkdis("   ");        }




  377. lcd_delay(50);
  378.     new_t=disdata[1]*10+disdata[2];
  379. }

  380. void delay(uint us)   //delay time
  381. {
  382. while(us--);
  383. }
  384. void HW_key(void)
  385. {
  386. if(zhb_flag==1)
  387. {
  388.   if((a[2]+a[3])==0xff)  //判断接收到数据是否正确
  389.   {
  390.    switch(a[2])   //将接受到的数据与所建表一一对应
  391.    {
  392.             case 0x00:
  393.     {
  394.      num=0;
  395.      if (count<number)
  396.      {
  397.       str4[count]='0';
  398.       count++;
  399.      }break;//数字键0
  400.     }
  401.             case 0x01:
  402.     {
  403.      num=1;
  404.      if (count<number)
  405.      {
  406.       str4[count]='1';
  407.       count++;
  408.      }break;//数字键1
  409.     }
  410.             case 0x02:
  411.     {
  412.      num=2;
  413.      if (count<number)
  414.      {
  415.       str4[count]='2';
  416.       count++;
  417.      }break;//数字键2
  418.     }
  419.             case 0x03:
  420.     {
  421.      num=3;
  422.      if (count<number)
  423.      {
  424.       str4[count]='3';
  425.       count++;
  426.      }break;//数字键3
  427.     }
  428.             case 0x04:
  429.     {
  430.      num=4;
  431.      if (count<number)
  432.      {
  433.       str4[count]='4';
  434.       count++;
  435.      }break;//数字键4
  436.     }
  437.             case 0x05:
  438.     {
  439.      num=5;
  440.      if (count<number)
  441.      {
  442.       str4[count]='5';
  443.       count++;
  444.      }break;//数字键5
  445.     }
  446.    case 0x06:
  447.     {
  448.      num=6;
  449.      if (count<number)
  450.      {
  451.       str4[count]='6';
  452.       count++;
  453.      }break;//数字键6
  454.     }
  455.    case 0x07:
  456.     {
  457.      num=7;
  458.      if (count<number)
  459.      {
  460.       str4[count]='7';
  461.       count++;
  462.      }break;//数字键7
  463.     }
  464.    case 0x08:
  465.     {
  466.      num=8;
  467.      if (count<number)
  468.      {
  469.       str4[count]='8';
  470.       count++;
  471.      }break;//数字键8
  472.     }
  473.    case 0x09:
  474.     {
  475.      num=9;
  476.      if (count<number)
  477.      {
  478.       str4[count]='9';
  479.       count++;
  480.      }break;//数字键9
  481.     }
  482.    case 0x0a:
  483.     {
  484.      num=10;
  485.      if (count<number)
  486.      {
  487.       str4[count]='.';
  488.       count++;
  489.      }break;//键"--/-"
  490.     }
  491.    case 0x0b:
  492.     {
  493.      num=11;
  494.      break;//键LG
  495.     }
  496.    case 0x0f:
  497.     {
  498.      num=12; break;//AV键
  499.     }
  500.    case 0x10:
  501.     {
  502.      num=13;
  503.      send_to_pc();break;//静音键
  504.     }
  505.    case 0x15:
  506.     {
  507.      num=14;
  508.      break;//开关键
  509.     }
  510.    case 0x16:
  511.     {
  512.      num=15;break;//选台键
  513.     }
  514.    case 0x17:
  515.     {
  516.     /* num=16; count = 0;//清零
  517.      for (j=0;j<number;j++)
  518.      {
  519.       str4[j]=' ';
  520.      }
  521.                     str4[j]='/0';
  522.      PWM=1;
  523.      time_flag=0;
  524.      wr_com(0xcd);
  525.      display(nul);
  526.      target=0;
  527.      enterflag = 0;break;//睡眠键*/
  528.     }

  529.             default:break;
  530.   }
  531.   if (enterflag==1)     // 如果按下确认键
  532.   {
  533.    //   enterflag = 0;      // 标志位置回0
  534. /*   wr_com(0xcd);
  535.             wr_dat(0xdf);
  536.             wr_dat(0x43);
  537.    target=str4[0]*10+str4[1];
  538.    time_flag=1;*/
  539.   }
  540. /*  wr_com(0xc0);
  541.         display(str3);
  542.         wr_com(0xc8);
  543.         display(str4);
  544.   zhb_flag=0;*/
  545.   }
  546.        }
  547. }
  548. /*void pitu_wave(void)
  549. {
  550.    uchar i,a;
  551.    uchar colour=1;
  552.    for(i=0;i<128;i+=2)
  553.     {
  554.          a=64-new_t;
  555.          DrawPoint(i,a,colour);
  556.     }
  557. }*/
  558. /********************主程序***********************************/
  559. void main()
  560. {
  561.     uchar wave=0;
  562.   uchar i=0,a;
  563.    uchar colour=1;
  564.     RW=0 ;
  565.     lcdreset();
  566.     ceshi();
  567.     clrgdram();
  568.     delay(2000);
  569.     clrscreen();
  570.     EA=1;    //初始化
  571. ET0=1;  //开计数中断0
  572. EX0=1;   //开外部中断0
  573. TMOD=1; //设置工作方式
  574. IT0=1;    //启动计时器
  575.     while(1)
  576.     {  
  577.   read_temp1();//读取温度
  578.   read_temp2();//读取温度

  579.   ds1820disp1();//显示
  580.   ds1820disp2();//显示
  581.   wave++;

  582.   if(wave>=10)
  583.   {
  584.         a=64-new_t;
  585.      if(i>=128)
  586.      {
  587.        i=0;
  588.     clrgdram();
  589.              delay(2000);
  590.              clrscreen();
  591.      }
  592.            DrawPoint(i++,a,colour);
  593.      wave=0;
  594.   }
  595.   HW_key();
  596.     }
  597. }
  598. void zhb(void) interrupt 0 // 外部中断子程序(译码过程)
  599. {
  600.     zhb_flag=1;
  601. TH0=0;   //计数器清零
  602. TL0=0;
  603. TR0=1;   //启动计数器
  604. while(!js)   //等待低电平结束
  605. {
  606.   delay(5);
  607.   if(TH0>45)  //判断低电平是否高于11.52ms如果高于则跳出等待和中断
  608.    return;
  609. }
  610. TR0=0;
  611. if(TH0<30)  //判断低电平是否低于7.68ms如果低于跳出中断
  612.   return;
  613. TH0=0;
  614. TR0=1;
  615. while(js)   //等待高电平结束
  616. {
  617.   delay(5);
  618.   if(TH0>28)  //判断高电平是否高于7.168ms如果高于则跳出等待和中断
  619.    return;
  620. }

  621. //至此为起始信号检测

  622. TR0=0;
  623. TH0=0;
  624. for(i=0;i<4;i++)  //一次锁存红外接收的四个十六进制数到a[4]中
  625. {
  626.   for(j=0;j<8;j++)
  627.   {
  628. …………
  629. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:171111 发表于 2018-5-13 19:03 | 只看该作者
这个很不错 谢谢分享
回复

使用道具 举报

板凳
ID:496717 发表于 2019-4-5 09:38 | 只看该作者
为啥看不到附件
回复

使用道具 举报

地板
ID:461985 发表于 2019-4-14 22:38 | 只看该作者
谢谢分享   
回复

使用道具 举报

5#
ID:512294 发表于 2019-4-15 08:32 来自手机 | 只看该作者
不错,有pcb图吗
回复

使用道具 举报

6#
ID:569657 发表于 2019-9-10 19:27 | 只看该作者
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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