18b20通过定时器0中断采集温度,串口中断把温度发给pc

2019-07-15 18:23发布

pc端通过串口助手显示温度,格式是 ‘符号(0/1)’  ‘8位2进制数(整数部分)’ ‘小数点。’ ‘8位2进制数(小数部分)’。主要是两个中断不知道用的对不对。下面是主函数
#include<stdio.h>
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "18b20.h"

bit ReadTempFlag;//定义读时间标志

unsigned char TempData[3]; //存储显示值的全局变量

void Init_timer0(void);//定时器初始化
//void SendStr(unsigned char *s);
void InitUART  (void);
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{                  
unsigned int TempH,TempL,temp;
Init_Timer0();
InitUART();
while (1)         //主循环
  {


  if(ReadTempFlag==1)
  {
    ReadTempFlag=0;
    temp=ReadTemperature();
    if(temp&0x8000)
     {
     TempData[0]=0x01;//负号标志
     temp=~temp;  // 取反加1
         temp +=1;
         }
    else
     TempData[0]=0;

     TempH=temp>>4;
         TempH&=0xFF;                //8位16进制数,表示整数部分
     TempL=temp&0x0F;        //8位16进制数,表示小数部分
     TempL=TempL*6/10;//小数近似处理

         TempData[1]=TempH;
         TempData[2]='.';
         TempData[3]=TempL;
                
   }       
   //printf("tmp  is  %d%d/n",TempH,TempL);

   //ES    = 1;                  //打开串口中断

  }
}


/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
//TH0=0x00;              //给定初值
//TL0=0x00;
EA=1;            //总中断打开
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
}
/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
static unsigned int num;
TH0=(65536-2000)/256;                  //重新赋值 2ms
TL0=(65536-2000)%256;

num++;
if(num==300)        //
   {
    num=0;
    ReadTempFlag=1; //读标志位置1
        }
}

/*------------------------------------------------
                    串口初始化
------------------------------------------------*/
void InitUART  (void)
{

    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
    TH1   = 0xF3;               // TH1:  重装值 2400 波特率 晶振 12MHz  
    TL1   = 0xF3;
        //delay(1);
        TI=0;
        RI=0;
        TR1   = 1;                  // TR1:  timer 1 打开                        
    EA    = 1;                  //打开总中断
    ES    = 1;                  //打开串口中断
}  

void UART_SER (void) interrupt 4
{
        int sendPosi=0;
        if(TI)
        {
                TI = 0;
                if(sendPosi < 4) //判断是否发送完成
                {
                        sendPosi++;                     //发送一次计数器加一
                        SBUF = TempData[sendPosi];//启动发送
                }
        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
柠檬精铃
1楼-- · 2019-07-15 20:29



看贴回帖是一种美德
阿信509
2楼-- · 2019-07-16 00:40
int sendPosi=0;这个要放在外面的,要不每次进中断又变成0 了
左耳的蜗牛
3楼-- · 2019-07-16 05:32
阿信509 发表于 2014-10-7 20:03
int sendPosi=0;这个要放在外面的,要不每次进中断又变成0 了

你好,这个是串口中断函数,你说放在外面应该是什么位置呢?
阿信509
4楼-- · 2019-07-16 11:03
做成全局变量,
在函数里面叫局部变量,每次进入函数的时候上次的值会改变的,
你要想做成局部的然后上次的值还要保留,那就必须做成静态的,比如static int sendPosi=0;
左耳的蜗牛
5楼-- · 2019-07-16 13:24
 精彩回答 2  元偷偷看……

一周热门 更多>