亲们,能不能帮我运行这些代码看看。关于单片机温度设...

2019-07-15 22:10发布

主程序代码为:#include <reg51.h> //  51系类单片机头文件#include "LCD1602.h" //包含对times New Roman">1602读写操作的头文件#include "Delay.h" //延时操作头文件#include "18B20.h" //包含对18B20操作的头文件#include<intrins.h>sbit beep = P3^0; //定义蜂鸣器信号线sbit led0=P1^0; //定义发光二极管端口sbit led1=P1^1;sbit led2=P1^2;sbit led3=P1^3;uint warn_l1=250; //定义温度下限值 温度*10uint warn_l2=220;uint warn_h1=370;uint warn_h2=350;/******************************************************函数名称:deal(uint t)                                ** 函数功能:对18B20获取的温度进行相应的处理         *    入口参数:temp                                    *出口参数:无                                       ********************************************************/void deal(uint t){if((t>warn_l2)&&(t<=warn_l1)) //22~25 度  {led0=0;  //第一个闪烁Delayms(20);led0=1;mdi();  //蜂鸣器慢“滴”}   //模拟开启制热else if(t<=warn_l2)  // <22 度{led0=0;led1=0;   //第一二灯闪烁Delayms(10);led0=1;led1=1;kdi(); //蜂鸣器快“滴”}   //模拟加大制热功率else if((t>warn_h2)&&(t<=warn_h1))   //35~37度{led2=0;  //第三个灯闪烁Delayms(20);led2=1;mdi();   //蜂鸣器慢“滴”}     //模拟开启制冷else if(t>=warn_h1) // >37度{led2=0;   //第三四个灯闪烁led3=0;Delayms(10);led2=1;led3=1;kdi();   //蜂鸣器慢“滴”}  //模拟加大制冷功率else beep=1;  //温度正常}/******************************************************函数名称:display(uint t);                                *函数功能:显示温度                                    * 入口参数:t                                            *出口参数:无                                          ********************************************************/void display(uint t){write_com(0x80+12);   //  第一行第13write_data(t/100+0x30);  // 十位+0X30转换为字符显示write_com(0x80+14);write_data(t%100/10+0x30); write_com(0x80+15);write_data(t%10+0x30);}/******************************************************函数名称:main(void);                                 **      函数功能:主函数                               *        入口参数:无                                   **      出口参数:无                                   ********************************************************/void main(void){    uchar i = 0;    uint temp  = 0;    while(1){    init();    //LCD 初始化    tempchange();    //温度转换    _nop_();    //稍作延时      temp = get_temp();    deal(temp);   //温度处理    _nop_();   for(i=10;i>0;i--)   {          display(temp());   //温度处理      }}  } 附录118B20.H 头文件#ifndef __18B20_h__    //防止重复定义#define __18B20_h__#include<reg51.h>#include<intrins.h>  #include"18B20.h"#include"Delay.h" extern void dsreset(void);   //函数声明  外部可见extern void tempwritebyte(uchar dat);extern bit tempreadbit(void);extern uchar tempreadbyte(void);extern void tempchange(void);extern uint get_temp(void); #endif   18B20.C  文件#include"18B20.h"sbit beep = P3^0; //定义蜂鸣器信号线sbit ds =  P2^7;  //定义18B20信号线static uint temp = 0;static float f_temp = 0.0; /***************************************      函数名称:dsreset(void)           **      函数功能:18B20 初始化         **      入口参数:无                   **      出口参数:无                   ****************************************/ void dsreset(void){ ds = 1;     //将数据线置高电平 _nop_();    //稍作延时,要尽可能短 ds = 0;     // 拉低数据线 Delayus(40);   //延时 _nop_(); ds = 1;  //将数据线拉高 Delayus(14);  //延时 ds = 1;    //拉高数据线} /*********************************************      函数名称:temwritebyte(uchar dat)       **      函数功能:向18B20写一个字节        **      入口参数:dat                        **      出口参数:无                        *********************************************/void tempwritebyte(uchar dat){ uint i; for(i=0;i<8;i++)  // 一个字节有8 {   ds=0;         //将数据线拉低   _nop_();    //稍作延时,待数据稳定   ds=dat&0x01;   //低位在前,高位在后   Delayus(3);   //延时45us   _nop_();   _nop_();   ds=1;  //将数据线拉高   dat>>=1;   //左移一位,继续发送下一位 }}/***************************************      函数名称:tempreadbit(void)       **      函数功能:读一位数据           **      入口参数:无                   **      出口参数:dat                   ****************************************/bit tempreadbit(void){ uint i = 0;  //定义i,做延时用 bit dat;    //定义一位数据 ds = 0;i++; ds = 1;i++;i++; dat = ds; i = 8;while(i>0)i--; return(dat);  //返回一位数据} /***************************************      函数名称:tempreadbyte(void)      **      函数功能:读一个字节            **      入口参数:无                    **      出口参数:dat                   ****************************************/uchar tempreadbyte(void){  uchar i,j,dat;  dat=0;  for(i=1;i<=8;i++)  {   j=tempreadbit();dat=(j<<7)|(dat>>1);   //读出的数据低位在前,刚好在一个字节dat  }  return(dat);} /***************************************      函数名称:tempchange(void)      **      函数功能:获取18B20温度转换   **      入口参数:无                   **      出口参数:无                   ****************************************/ void tempchange(void){ dsreset();   //18B20复位 Delayms(1); //稍作延时 tempwritebyte(0xcc);//跳过读ROM指令 tempwritebyte(0x44);//写温度转换指令} /*****************************************      **      函数名称:get_temp(void)           **      函数功能:获取18B20寄存器中的数据**      入口参数:无                      **      出口参数:temp                    *****************************************/uint get_temp(void){  uchar a,b;  dsreset();  Delayms(1);  tempwritebyte(0xcc);  //跳过ROM  tempwritebyte(0xbe);  //读暂存器  a = tempreadbyte();//读低8  b = tempreadbyte();//读高8  temp = b;  temp <<= 8;//将两个字节合为一个字  temp  =  temp|a;  f_temp = temp*0.0625;//温度在寄存器中为12为,分辨率为0.0625  temp = f_temp*10+0.5;  //温度修正 四舍五入  return temp;}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。