为了实现读取倾角传感器的数据,但是数码管没有反应

2019-07-15 11:08发布

目的是为了实现读取倾角传感器的数据,如果想让传感器川汇数据需要先向它发送0x75,传回的数据是4个字节,前两个是x轴数据,后两位是一周数据,经过公式计算并用数码管动态显示,问题是数码管没有反应,先谢谢各位了
程序如下:
tica Neue, Helvetica, Arial, sans-serif">/*******************************************************************************
*                              传感器读取及显示
--------------------------------------------------------------------------------
* 实 验 名                 : 倾角传感器 读取及显示
* 实验说明                : 单片机将接收到的数据以10进(精度0.01)制显示在数码管上上面
* 连接方式                 : 传感器(RXD)--开发板(TXD) ,传感器(TXD)--开发板(RXD)
* 注    意                 :
*******************************************************************************/

//--头文件--//

#include<reg51.h>
#include<intrins.h>
#include<math.h>

//--宏定义--//

#define PI 3.1415926535898                                                      //定义π

//--定义使用的IO口--//

#define GPIO_DIG   P0                                                                //段选
#define GPIO_PLACE P1                                                                //位选

//--定义全局变量--//

unsigned char receiveData[4];                                                        //存放原始数据的数组

unsigned char receiveOver;                                                        //数据接收完成的标志信号

unsigned char code DIG_CODE_1[16]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,                                        //共阴数码管段选码表,无小数点
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};        
unsigned char code DIG_CODE_2[16]={
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,                                         //共阴数码管段选码表,带小数点
0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};               
unsigned char code DIG_PLACE[8] = {
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};                                        //位选控制,查表的方法控制

//--声明全局函数--//           

void UsartConfiguration();                                                        //声明串口设置函数
double ComputeAxleAngle(unsigned int SensorData);                        //声明计算角度函数
void DigDisplay(double DisplayData);                                         //动态显示函数

/*******************************************************************************
* 函 数 名                : main
* 函数功能                : 主函数
* 输    入                : 无
* 输    出                : 无
*******************************************************************************/
void main()
{
        unsigned int SensorData_X;
        unsigned int SensorData_Y;
        double resultData_X;
        double resultData_Y;

        EA=1;                                                                                //打开总中断

        UsartConfiguration();

        while(1)
        {
                TI=1;

                if(receiveOver)                                                        //如果接收完成开始计算并显示
                {
                        SensorData_X = receiveData[0];
                        SensorData_X = _crol_(SensorData_X,8);
                        SensorData_X &= receiveData[1];

                        resultData_X = ComputeAxleAngle(SensorData_X);

                        DigDisplay(resultData_X);

                        SensorData_Y = receiveData[2];
                        SensorData_Y = _crol_(SensorData_Y,8);
                        SensorData_Y &= receiveData[3];

                        resultData_Y = ComputeAxleAngle(SensorData_Y);

                        DigDisplay(resultData_Y);
                }
        }
}

/*******************************************************************************
* 函 数 名                : UsartConfiguration()
* 函数功能                : 设置串口
* 输    入                : 无
* 输    出                : 无
*******************************************************************************/
void UsartConfiguration()
{
        SCON=0X50;                                                                        //设置为工作方式1

        TMOD &= 0X0F;                                                                //用T1为了不使T0改变它原来的模式
        TMOD |= 0X20;                                                                //设置计数器工作方式2

        PCON = 0X80;                                                                //SMOD=1,方式1、2、3的波特率加倍

        TH1 = 256 - 1105926 * 2 / 4800 / 32 / 12;                                    //计数器初始值设置,注意波特率是4800的
        TL1 = TH1;

        ES = 1;                                                                        //开启串口中断使能

        TR1 = 1;                                                                            //打开计数器
}


/*******************************************************************************
* 函 数 名                : Usart()
* 函数功能                : 串行接收
* 输    入                : 无
* 输    出                : 无
*******************************************************************************/
void Usart() interrupt 4   //标志位TI和RI需要手动复位,TI和RI置位共用一个中断入口
{
        static unsigned char sum = 0;

        if(RI)
        {
                RI = 0;                                                                //清除接收中断标志位
                receiveData[sum] = SBUF;
                sum ++ ;
                if( sum == 4 )                                                        //当sum=4时,说明数据接收完成
                {
                        sum = 0;
                        receiveOver=1;                                                //数据接收完成的标志信号
                }
        }

        if(TI)
        {
                TI = 0;                                                                //清除发送中断标志位
                SBUF = 0x75;
        }

}

/*******************************************************************************
* 函 数 名                : ComputeAxleAngle
* 函数功能                : 把原始角度数据通过公式{θ=arcsin[(XOUT-0x8000)÷16384]rad}计算
* 输    入                : SensorData
* 输    出                : result
*******************************************************************************/
double ComputeAxleAngle(unsigned int SensorData)
{
        double result;

        result = asin( ( ( SensorData - 0x8000 ) / 16384 ) );                //带入计算公式
        result = result * PI / 180;                                                //把弧度换算成角度

        return result;                                                                //返回计算结果        
}

/*******************************************************************************
* 函 数 名                : DigDisplay
* 函数功能                : 使用数码管显示精度位0.01的计算结果
* 输    入                : 无
* 输    出                : 无
*******************************************************************************/
void DigDisplay(double DisplayData)
{
        int a,b,c,d,e,j;
        int i=500;                                                                        /**调整显示时间**/
        while(i--)               
        {
            DisplayData = (DisplayData * 100);                                //把数据扩大100倍,方便后面取值

                a = DisplayData / 10000;                                        //取数据的百位(%取余必须为整数)
                b = ( ( (int) DisplayData / 1000 ) ) % 10;                //取数据的十位
                c = ( ( (int) DisplayData / 100 ) ) % 10;                        //取数据的个位
                d = ( ( (int) DisplayData / 10 ) ) % 10;                        //取数据的小数点后第一位
                e = ( (int) DisplayData ) % 10;                                //取数据的小数点后第二位
            if( a != 0 )
            {
                  GPIO_PLACE = DIG_PLACE[3];
                  GPIO_DIG = DIG_CODE_1[a];
            }        

            if( ( b != 0 ) || ( a != 0 ))
            {
                  GPIO_PLACE = DIG_PLACE[4];
                  GPIO_DIG = DIG_CODE_1;
            }

                  GPIO_PLACE = DIG_PLACE[5];
                  GPIO_DIG = DIG_CODE_2[c];

                  GPIO_PLACE = DIG_PLACE[6];
                  GPIO_DIG = DIG_CODE_1[d];

                  GPIO_PLACE = DIG_PLACE[7];
                  GPIO_DIG = DIG_CODE_1[e];

                j = 10;                                                                //扫描间隔时间设定
                while( j -- );        
                GPIO_DIG = 0x00;
      }        
}

请使用手机"扫一扫"x
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
人中狼
2019-07-17 00:25
调试串口时,可以用串口助手调试,可以模拟返回传感器数据。下面这部分可以不要了,   
if(TI)
        {
                TI = 0;                                                                //清除发送中断标志位
                SBUF = 0x75;
        }

直接在 while(1)
        {
                TI=1;
               if(receiveOver)   
把TI=1直接改成发数据就可以了,类似
TI=0;
SBUF = 0x75;
while(!TI)
TI=0;
不需要在串口中断里发数据

一周热门 更多>