这个代码为什么不需要有选择单片机的定时工作方式的函数段

2019-03-24 17:35发布

#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);
                        
}
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。