完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
目的是为了实现读取倾角传感器的数据,如果想让传感器川汇数据需要先向它发送0x75,传回的数据是4个字节,前两个是x轴数据,后两位是一周数据,经过公式计算并用数码管动态显示,问题是数码管没有反应,先谢谢各位了
程序如下: /******************************************************************************* * 传感器读取及显示 -------------------------------------------------------------------------------- * 实 验 名 : 倾角传感器 读取及显示 * 实验说明 : 单片机将接收到的数据以10进(精度0.01)制显示在数码管上上面 * 连接方式 : 传感器(RXD)--开发板(TXD) ,传感器(TXD)--开发板(RXD) * 注 意 : *******************************************************************************/ //--头文件--// #include #include #include //--宏定义--// #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 |
|
相关推荐
15个回答
|
|
蟹蟹,各位,谢谢谢谢谢
|
|
|
|
你直接给个数据给数码管显示函数 看有没有
|
|
|
|
程序结构有问题,在while(1)里,TI=1后,中断发送0x75,等发送结束后,自动置TI=1,没有软件清零,中断则继续发0x75,估计你都什么数据没收到,只是不停的发送0x75
|
|
|
|
人中狼 发表于 2017-4-28 09:41 可否留个联系方式,详细咨询下 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
你这样试吧,先关闭串口中断,模拟一串传感器数据进行显示,用来判断数据转换和显示是否正确,等这两部分调通了,再增加串口通讯
|
|
|
|
大神,咱们加个QQ或者微信,方便联系 |
|
|
|
直接链接电脑,模拟串口通讯么?用串口助手调试? |
|
|
|
等级太低,不能发消息,悲剧了 |
|
|
|
|
|
|
|
调试串口时,可以用串口助手调试,可以模拟返回传感器数据。下面这部分可以不要了,
if(TI) { TI = 0; //清除发送中断标志位 SBUF = 0x75; } 直接在 while(1) { TI=1; if(receiveOver) 把TI=1直接改成发数据就可以了,类似 TI=0; SBUF = 0x75; while(!TI) TI=0; 不需要在串口中断里发数据 |
|
|
|
蟹蟹啦,宿舍断电了,只好明天弄了 |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
飞凌嵌入式-ELFBOARD 解决PCB布线时无法捕捉到焊盘中心的问题
745 浏览 0 评论
Openharmony软件评估指南-米尔瑞芯微RK3568开发板
1018 浏览 0 评论
STM32CUBEMX(7)--移植雅特力AT32F403AVGT(兼容STM32F103VGT6),DAC输出电压
1166 浏览 0 评论
【RA-Eco-RA0E1-32PIN-V1.0开发板试用】开发板简介与上电测试
1175 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-shell脚本编写之传参
666 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11066 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-13 10:14 , Processed in 0.930395 second(s), Total 70, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号