微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 为了实现读取倾角传感器的数据,但是数码管没有反应

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

时间:10-02 整理:3721RD 点击:
目的是为了实现读取倾角传感器的数据,如果想让传感器川汇数据需要先向它发送0x75,传回的数据是4个字节,前两个是x轴数据,后两位是一周数据,经过公式计算并用数码管动态显示,问题是数码管没有反应,先谢谢各位了
程序如下:
/*******************************************************************************
*                              传感器读取及显示
--------------------------------------------------------------------------------
* 实 验 名                 : 倾角传感器 读取及显示
* 实验说明                : 单片机将接收到的数据以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

蟹蟹,各位,谢谢谢谢谢

你直接给个数据给数码管显示函数 看有没有

程序结构有问题,在while(1)里,TI=1后,中断发送0x75,等发送结束后,自动置TI=1,没有软件清零,中断则继续发0x75,估计你都什么数据没收到,只是不停的发送0x75

可否留个联系方式,详细咨询下

有的,其他显示程序没有问题

试试这样改看行不行
if(TI)
        {
                TI = 0;                                                                //清除发送中断标志位
                SBUF = 0x75;
               while(!TI)
               TI=0;
        }

还是没有任何反应

你这样试吧,先关闭串口中断,模拟一串传感器数据进行显示,用来判断数据转换和显示是否正确,等这两部分调通了,再增加串口通讯

大神,咱们加个QQ或者微信,方便联系

直接链接电脑,模拟串口通讯么?用串口助手调试?

等级太低,不能发消息,悲剧了

只好麻烦您加我下,QQ641299120

调试串口时,可以用串口助手调试,可以模拟返回传感器数据。下面这部分可以不要了,   
if(TI)
        {
                TI = 0;                                                                //清除发送中断标志位
                SBUF = 0x75;
        }
直接在 while(1)
        {
                TI=1;
               if(receiveOver)   
把TI=1直接改成发数据就可以了,类似
TI=0;
SBUF = 0x75;
while(!TI)
TI=0;
不需要在串口中断里发数据

蟹蟹啦,宿舍断电了,只好明天弄了

那就是数据的事  你试试 在while里直接显示它

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top