串口温度采集系统,求指导

2019-07-15 17:23发布

本帖最后由 fanm66 于 2015-5-1 16:09 编辑

仿真电路图如下
已有程序并能正确运行,但小弟实在做不出串口发送(只要能发送)部分,l恳求各位大大帮忙,谢谢
#include<reg52.h>     //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<math.h>
#include<INTRINS.H>

#define uchar unsigned char
#define uint   unsigned int

/******************************************************************/
/*                    定义端口                                    */
/******************************************************************/
sbit buzzer=P1^3;//蜂鸣器端口

sbit DQ=P1^4;         //ds18b20 端口

/******************************************************************/
/*                    全局变量                                    */
/******************************************************************/
uint temp;//当前温度值
uchar TempH=0,TempL=0;
int temp_max,temp_min;//设定温度的最大值和最小值
uchar flag_get,count,num;
uchar tab[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0~~9段码
uchar  str[4];//四位数码管显示字符
uchar display_mod;//数码管显示模式
/******************************************************************/
/*                   函数声明                                     */
/******************************************************************/
unsigned int ReadTemperature(void);//读取温度函数
void Init_DS18B20(void);//18b20初始化函数
unsigned char ReadOneChar(void);//18B20读一个字节
void WriteOneChar(unsigned char dat);//18B20写一个字节
void delay(unsigned int i);//短延时

void alARM();//报警

/******************************************************************/
/*                    主函数                                      */
/******************************************************************/
main()
{
        display_mod=0;//显示当前温度
        temp_min=10;//设置最低温  
        temp_max=40;//设置最高温
        TMOD|=0x01;//定时器设置
        TH0=0xef;  //定时器初值
        TL0=0xf0;
        IE=0x82;//EA=1,ET0=1
        TR0=1;  //开定时器
        P2=0xff;  
        count=0;
        while(1)
        {
                       
                if(flag_get==1)
                {
                        flag_get=0;// 获取温度标志清零
                        temp=ReadTemperature();//读温度值
                }                       



                        if(temp&0x8000)
                     {
                             str[0]=0xbf;//负号标志
                             temp=~temp; //取反加1
                                 temp +=1;
                         }
                        else
                        {
                                str[0]=0xff;
                        }
                        TempH=temp>>4;
                          TempL=temp&0x0F;
                          TempL=TempL*6/10;//小数近似处理
                       
                        str[1]=tab[(TempH%100)/10]; //十位温度
                           str[2]=tab[(TempH%100)%10]&0x7f; //个位温度,带小数点
                           str[3]=tab[TempL];                       

                alarm();
          }
}


/******************************************************************/
/*                  定时器中断                                    */
/******************************************************************/
void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔
{
        TH0=0xea;//定时器重装值
        TL0=0xf0;
        num++;
        if (num==100)
    {
                num=0;
                  flag_get=1;//获取温度标志位有效
        }
        count++;
        if(count==1)
           {
                P2=0Xfe;
            P0=str[0];
        }//数码管扫描
        if(count==2)
   {
                if(str[1]==tab[0])
                        str[1]=0xff;//显示为空
                   P2=0Xfd;
            P0=str[1];
        }
        if(count==3)
   {
                P2=0Xfb;
             P0=str[2];
   }
        if(count==4)
   {
                P2=0Xf7;
             P0=str[3];
                count=0;
   }
}

/******************************************************************/
/*                    短延时函数                                  */
/******************************************************************/
void delay(unsigned int i)//短延时函数
{
        while(i--);
}

/******************************************************************/
/*                    初始化                                      */
/******************************************************************/
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 int ReadTemperature(void)
{       
        unsigned char a=0;
        unsigned int b=0;
        unsigned int t=0;
        Init_DS18B20();
        WriteOneChar(0xCC); // 跳过读序号列号的操作
        WriteOneChar(0x44); // 启动温度转换
        delay(200);
        Init_DS18B20();
        WriteOneChar(0xCC); //跳过读序号列号的操作
        WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
        a=ReadOneChar();   //低位
        b=ReadOneChar();   //高位
        b<<=8;
        t=a+b;
        return(t);
}



/******************************************************************/
/*                  蜂鸣器报警程序                                */
/******************************************************************/
void alarm()
{
        if(display_mod==0)//在显示当前温度时报警才会动作
        {
        if(TempH<(temp_min))
        {

                buzzer=0;
        }
        else if(TempH>=(temp_max))
        {

                buzzer=0;
        }
        else
        {

                buzzer=1;
        }
        }
}


仿真电路图 仿真电路图
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。