完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
求助各位老师:
做实验需要,我现在有20对红外对射管用来监测小鼠的活动的(分成4组,每只小鼠用到5对红外对射管),工作时每对都会产生0或5V的数字信号,我将他们依次连接在51单片机(晶振11.989120M)上的P0/P1/P2管脚上。 现在我想每50ms(采样率为20Hz)将这些IO口上的实际值依次采集,然后按照顺序通过串口发送给电脑,用串口助手来在收集采集到的数据。 这个单片机的程序该怎么写呢?由于自己是外行,尝试写了很久也没能搞定,这个是不是需要两个定时器才能完成,一个是来设置串口波特率,另一个用来定时50ms的定时采样,有点晕了。 先谢谢了! |
|
相关推荐
11个回答
|
|
|
|
|
|
感谢楼主分享,好人呐
|
|
|
|
把P0.1.2.3口当成一个8位二进制数付给一个***uf就行啦,
|
|
|
|
#include"reg52.h" //先利用定时器0定时50ms周期进行采样,进入定时中断后再通过串口中断依次发送三组数据及一组结束标志符‘9999’ #define uchar unsigned char #define uint unsigned int uchar i; void TimerInit() { TMOD=0x02; //定时器1,工作方式1 TH0=0x3C; TL0=0xB0; //定时50ms ET0=1; EA=1; TR0=1; } void UART_Init() { SCON=0x50; //设置工作方式1 TMOD=0x20; // 计数器方式2 PCON=0x80; //波特率加倍 TH1=0xF3; //波特率4800 TL1=0xF3; ES=1; EA=1; TR1=1; } void main() { TimerInit(); UART_Init(); while(1); } void Timer0() interrupt 1 { for(i=0;i<4;i++); //分四次发送数据,前三次为IO口状态值,最后一次发送‘9999’作为结束标志 { switch(i) { case 0: SBUF=P0; while(TI==0); TI=0; case 1: SBUF=P1; while(TI==0); TI=0; case 2: SBUF=P2; while(TI==0); TI=0; case 3: SBUF=9999; while(TI==0); TI=0; } } } 老师,您看看这样写问题在哪呢,为什么串口助手接收不到数据呢?谢谢! |
|
|
|
0906356 发表于 2017-9-2 17:30 首先,楼主写的这个串口初始化有问题,未设置串口工作模式,一般设置SM0=0,SM1=1,为10位异步收发模式(8位数据),波特率可变,若需接收还需将接收允许位REN置1,还有助手和单片机的波特率要设置相同。 |
|
|
|
本帖最后由 Control8 于 2017-9-2 20:09 编辑
Control8 发表于 2017-9-2 20:00 建议楼主在入门时先去参考别人写好的程序,弄懂每一行,有一定积累后再自己写程序。 |
|
|
|
楼主的定时器工作方式设置有误,TMOD=0x02是将定时器设为8位自动重装,而且定时器初值也设置有误,一次溢出最多能计时5ms左右,楼主却想直接设为50ms,需设置标志位计算多次中断,累计起来才能得到50ms. |
|
|
|
多谢以上几位老师的指点,我是纯外行专业的,主要平时实验中需要,然后自己有兴趣想做这么一套系统来检测小鼠的活动量的,之前有人向我推荐说单片机就可以实现这个功能了,红外对射管我自己买了,然后测试了下确实能够在有物体经过会产生低电平和高电平的变化,现在就差把这些信号检测出来处理了,原本想着自己看几天单片机这方面的知识就可以搞定了,但低估了这个难度了,单个定时器,或串口通信还能勉强看的懂,但结合起来就蒙了
|
|
|
|
Control8 发表于 2017-9-2 20:00 多谢指点!但我写的“SCON=0x50;”这句不是已经说明了SM0=0,SM1=1,及REN=1了吗?还需再额外定义吗?另外我串口助手用的9600,与我程序应该是对应的吧,不过4800也试了,也没有用。 |
|
|
|
是的,这个确实需要很好的基本功,我这几天简单学了下定时器,和串口通信,但两个放在一起就乱掉了,目前还没有在网上找到和我这个类似的例子呢,可能我还没找到。 |
|
|
|
Control8 发表于 2017-9-2 20:19 多谢指点,我再按照您提的改下试试! |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1129 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1075 浏览 2 评论
2175 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1269 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1693 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 09:10 , Processed in 0.887850 second(s), Total 94, Slave 77 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号