求助TN901红外测温的F149程序。(我只有51的程序)

2019-03-24 11:29发布

#include"reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int

/************* 1602LCD引脚定义 *************/
#define LCD_data  P0       //数据口
sbit RS  =  P2^6;      //寄存器选择输入
sbit RW = P2^5;         //写数据端
sbit EN  =  P2^7;      //液晶使能控制

/************* 红外测温引脚定义 *************/
sbit A_TN9=P1^3;             //TN9触发
sbit CLK_TN9=P1^1;                //TN9时钟线
sbit DATA_TN9=P1^0;                //TN9数据线

/***********全局变量定义**************/
bit flag;

unsigned char TN_Data_Buff[5];                //红外模块数据缓存数组
unsigned char DATA_INDEX;
unsigned char DATA_NUM;                                //八位数据计数
unsigned char data_tmp;                                //红外模块数据缓存
unsigned char table_mbtemp[]="00.00^C";
float iTemp,MBTemp=11.01;                                //温度数据
//函数定义声明
void show_temp();                                    //温度显示子函数函数
void delay()
{
        unsigned int i;
        for(i=0;i<10;i++);
}
/************延时毫秒子程序,11.0592M晶振下*****************/
void delay_ms(unsigned int time)
{
        unsigned int i,j;
        for(i=1;i<=time;i++)
                for(j=1;j<=113;j++);
}
/*------------------------------------------------
              写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{  
        delay_ms(5);
        RS=0;
        RW=0;
        EN=1;
        P0=com;
        _nop_();
        EN=0;
}
/*------------------------------------------------
              写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
        delay_ms(5);
        RS=1;
        RW=0;
        EN=1;
        P0= Data;
        _nop_();
        EN=0;
}
/*------------------------------------------------
              写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{        
        if (y == 0)
        {     
                 LCD_Write_Com(0x80 + x);     //表示第一行
        }
        else
        {      
                LCD_Write_Com(0xC0 + x);      //表示第二行
        }        
        while (*s)
        {     
                 LCD_Write_Data( *s);     
                 s ++;     
        }
}
/*------------------------------------------------
              初始化函数
------------------------------------------------*/
void LCD_Init(void)
{
        LCD_Write_Com(0x38);    /*显示模式设置*/
        delay_ms(5);
        LCD_Write_Com(0x38);
        delay_ms(5);
        LCD_Write_Com(0x38);
        delay_ms(5);
        LCD_Write_Com(0x38);  
        LCD_Write_Com(0x08);    /*显示关闭*/
        LCD_Write_Com(0x01);    /*显示清屏*/
        LCD_Write_Com(0x06);    /*显示光标移动设置*/
        delay_ms(5);
        LCD_Write_Com(0x0C);    /*显示开及光标设置*/
}


//==========================================================================
//        //        C格式:        void TN_IRACK_EN(void);
//        实现功能:        红外模块启动函数
//        入口参数:        无
//        出口参数:        无
//==========================================================================
void TN_IRACK_EN(void)
{   
        unsigned char j;
        flag=0;
        A_TN9=0;
        delay();
    DATA_NUM=0;
    DATA_INDEX=0;

        for(j=0;j<=4;j++)
                TN_Data_Buff[j]=0;

}
//==========================================================================
//        C格式:                void TN_IRACK_UN(void);
//        实现功能:        红外模块关闭函数
//        入口参数:        无
//        出口参数:        无
//==========================================================================       
void TN_IRACK_UN(void)
{
        A_TN9=1;
}
//==========================================================================
//        C格式:                int TN_ReadData(void);
//        实现功能:        读测得数据
//==========================================================================       
void TN_ReadData(void)
{
        data_tmp=0;
        DATA_NUM=0;
        DATA_INDEX=0;
        while(DATA_INDEX<5)
        {
                   if(!CLK_TN9)
             {
                        if(flag==0)
                        {       
                                flag=1;                       
                                DATA_NUM++;
                                data_tmp<<=1;       
                              if(DATA_TN9)   
                        {
                                 data_tmp=data_tmp|0x01;
                        }
                                else
                                {
                                        data_tmp=data_tmp&0xfe;
                                }       
                               
                              if(DATA_NUM==8)
                        {
                                
                                 TN_Data_Buff[DATA_INDEX]=data_tmp;
                                 DATA_NUM=0;
                                        DATA_INDEX++;
                                        data_tmp=0;
                        }
                        }

              }
                else
                {
                        if(flag==1)
                        {
                                flag=0;
                        }

                }
        }
}
//======================================================================//
//Program:TN红外传感器目标数据测量子程序
//InPut:NULL
//OutPut:unsigned int returnData        测量结果的出错标识
//Note:
//Edit by xinqiang 20050324
//======================================================================//
unsigned char TN_IR_GetData()
{
        unsigned char iItem,MSB,LSB;
        unsigned char Back_Data;                          //定义返回变量,返回0表示读出正确数据
        Back_Data = 0xaa;

    TN_IRACK_UN();
        delay_ms(10);
        TN_IRACK_EN();        //enable the TN       
        delay();
        delay();
        delay();                                            
        TN_ReadData();
        delay();


        iItem = TN_Data_Buff[0];                //取读到第一个字节数据
        delay();
        if(iItem==0x4c)                                //判断第一个字节数据是否正确
        {
                MSB = (TN_Data_Buff[1]);              //取读到第二个字节数据
                LSB = (TN_Data_Buff[2]);              //取读到第三个字节数据
                if(TN_Data_Buff[4] == 0x0d)     //判断是否读到结束标志
                {
                        iTemp = MSB*256 +LSB;                       //计算温度值,计算方法请参考红外测温模块
                        iTemp = iTemp/16 - 273.15;
                        Back_Data = 0;                                     //返回变量赋0
                }
        }
        TN_IRACK_UN();                                                     //Unable the TN
        return Back_Data;                                //返回Back_Data
}

/*****************目标温度值MBtemp处理子程序*************/
void dis_mbtemp()
{
        unsigned int mb;
        mb=MBTemp*100;                                          //变成整数,便于单片机处理
        table_mbtemp[4]=mb%10+0x30;                  //分别取温度十位、个位、小数点后一位、小数点后二位
        mb=mb/10;
        table_mbtemp[3]=mb%10+0x30;
        mb=mb/10;
        table_mbtemp[1]=mb%10+0x30;
        mb=mb/10;
        table_mbtemp[0]=mb%10+0x30;
}
/*****************************************************
                        主函数
*****************************************************/
void main()
{       
        LCD_Init();                        //LCD1602初始化音使用
        while(1)
        {
                show_temp();//显示温度示时间
               
        }
}
/*****************************************************
                        温度显示子函数
*****************************************************/
void show_temp()                                                 
{
                                                                         //间续或连续模式
       
                if(!TN_IR_GetData())
                {   
                        MBTemp = iTemp;
                }
                dis_mbtemp();                                                           //目标温度值MBtemp处理
                LCD_Write_String(0,0,"MBTEMP:");
                LCD_Write_String(5,1,table_mbtemp);
                       
}
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
sw3926
1楼-- · 2019-03-24 17:31
< 这里还有一个G2553的程序,可是我要用F149的。


/******************************************************************************
Project: TN9 HUB (MSP430G2xx3)
MCU:msp430g2553
MCLK:8Mhz
SMCLK:1Mhz
Ver 0.01
Tony Kuai 2013/4/10
Built with IAR C/C++ Compiler for MSP430 Ver 5.40.2
******************************************************************************/

#include "msp430g2553.h"                      // MSP430 device being used.

#define pLED_TN9   BIT7
#define pLED_232   BIT6
#define pIRT_Data  BIT1
#define AlphaBit 256
unsigned char SPI_RX_BUF[5]={0};                  //SPI receive Buff
unsigned char SPI_BitCnt=8;
unsigned char SPI_FrameCnt=40;                                 //Defualt is 5*8=40 Bytes
unsigned char SPI_BUF_RX_POINTER=0;
unsigned char RX_CDATA=0;                                     //0:recieving  1: transmiting data
unsigned char fIRT_DataReady;

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;

  if (CALBC1_8MHZ==0xFF)                                        // If calibration constant erased
  {                                                                                       
    while(1);                               // do not load, trap CPU!!       
  }
  //MCU main clock setting
  DCOCTL = 0;                               // Select lowest DCOx and MODx settings
  BCSCTL1 = CALBC1_8MHZ;                    // Set range
  DCOCTL  = CALDCO_8MHZ;                     // Set DCO step + modulation */
  BCSCTL2 |= DIVS0|DIVS1;                    //Sclk=1MHZ
  BCSCTL3 |= LFXT1S_2;                      // LFXT1 = VLO(开12K内部振荡器)
  IFG1 &= ~OFIFG;                           // Clear OSCFault flag
  
  
  //UART setting, 9600BPs,
  P1SEL  |= BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD
  P1SEL2 |= BIT1 + BIT2 ;                    // P1.1 = RXD, P1.2=TXD
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  UCA0BR0 = 104;                            // 1MHz 9600
  UCA0BR1 = 0;                              // 1MHz 9600
  UCA0MCTL = UCBRS0;                        // Modulation UCBRSx = 1
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt
  
  //Port P1 and P2 setting
  P1DIR = 0xFF;      // 1111 1101
  P1OUT = 0xFF;      // 1111 1111
  P1SEL = BIT1 + BIT2 ;     // P1.1 = RXD, P1.2=TXD, P1.5=UCB0CLK ,P1.6=UCB0SOMI ,P1.7=UCB0SIMO
  P1SEL2= BIT1 + BIT2 ;   // P1.1 = RXD, P1.2=TXD, P1.5=UCB0CLK ,P1.6=UCB0SOMI ,P1.7=UCB0SIMO
   
  // P2REN |= 0x3c;     // 1111 1100 内部上拉电阻(如果外部有上拉电阻,低电平会下不来,细看手册)
  P2DIR = 0xFC;      // 1111 1100  -->IRT clock and IRT data seting as input
  P2OUT = 0x7F;      // 1111 1111
  P2SEL = 0x00;     //
  P2SEL2= 0x00;   //
  
  P2IE  = 0x01;      // 0000 0001 使能外部中断-->IRT clock
  P2IES = 0x01;      // 0000 0001 由高到低变化
  P2IFG = 0x00;      // 初始化中断数值

  //Timer0_A3 setting
  CCTL0 = CCIE;                // CCR0 interrupt enabled
  CCR0 = 5000;//5000us中断一次
  TACTL = TASSEL_2 + MC_1;     // SMCLK, upmode
  
  
   while(1)
   {
     if (fIRT_DataReady==0x55)//wait for IRT data ready
     {
       fIRT_DataReady=0;   //clear IRT data ready flag                
       //Send data to PC(RS232)
       while (!(IFG2&UCA0TXIFG));                                   // USCI_A0 TX buffer ready?
       UCA0TXBUF=SPI_RX_BUF[0];             // TX -> RXed character
       while (!(IFG2&UCA0TXIFG));                                   // USCI_A0 TX buffer ready?
       UCA0TXBUF=SPI_RX_BUF[1];             // TX -> RXed character
       while (!(IFG2&UCA0TXIFG));                                   // USCI_A0 TX buffer ready?
       UCA0TXBUF=SPI_RX_BUF[2];             // TX -> RXed character
       while (!(IFG2&UCA0TXIFG));                                   // USCI_A0 TX buffer ready?
       UCA0TXBUF=SPI_RX_BUF[3];             // TX -> RXed character
       while (!(IFG2&UCA0TXIFG));                                   // USCI_A0 TX buffer ready?
       UCA0TXBUF=SPI_RX_BUF[4];             // TX -> RXed character
       while (!(IFG2&UCA0TXIFG));                                   // USCI_A0 TX buffer ready?
     }   
   }
}



/*****************************************************************************
函数功能:P2口中断处理
应用范围:P2.0 IRT clock
入口参数:无
出口参数:无
****************************************************************************/
#pragma vector=PORT2_VECTOR
__interrupt void port2_ISR (void)
{
   CCR0 = 5000;//reset Timer A0
   if(P2IN&pIRT_Data)
    {
      RX_CDATA|=0x01;
    }
   else
    {
      RX_CDATA&=~0x01;
    }
           
   SPI_BitCnt--;                               
   SPI_FrameCnt--;                       
   if(SPI_BitCnt==0)
    {       
      SPI_RX_BUF[SPI_BUF_RX_POINTER]=RX_CDATA;
      SPI_BUF_RX_POINTER++;
      if (SPI_BUF_RX_POINTER==5)
       {
        _NOP();
       }
      SPI_BitCnt=8;
    }
   else
    {
      RX_CDATA=RX_CDATA<<1;
    }
     
}


/*****************************************************************************
函数功能:Timer A0中断处理
应用范围:用于各控制的时间记数,5ms一次
入口参数:无
出口参数:无
****************************************************************************/
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
   SPI_BitCnt=8;
   if(SPI_BUF_RX_POINTER==5)
    {
      if((SPI_RX_BUF[4]==0x0d)&&(SPI_RX_BUF[3]==(SPI_RX_BUF[0]+SPI_RX_BUF[1]+SPI_RX_BUF[2])%AlphaBit))
      {
        fIRT_DataReady=0x55;  //set data ready flag
      }       
                                       
    }
   
   SPI_BUF_RX_POINTER=0;                                       
   SPI_FrameCnt=0x28;       
}

一周热门 更多>

相关问题

    相关文章