目的是为了实现读取倾角传感器的数据,如果想让传感器川汇数据需要先向它发送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
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
if(TI)
{
TI = 0; //清除发送中断标志位
SBUF = 0x75;
}
直接在 while(1)
{
TI=1;
if(receiveOver)
把TI=1直接改成发数据就可以了,类似
TI=0;
SBUF = 0x75;
while(!TI)
TI=0;
不需要在串口中断里发数据
一周热门 更多>