专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
51单片机串口接收的数据
2019-07-15 13:28
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
5469
5
1685
背景:本人做材料,通过光控制反应。要求有一个周期可调的光源,通过串口发送数据,并计算出周期
硬件:STC4052AD 12M晶振
思想:LED
初始频闪周期
1000 ms
,通过串口接收
2
位数,改变频闪周期,
串口第一个是数值,第二位是数量级,例如
52
表示
5*10^2 ms
,
ti
me[2]
存储这两位数字。当接收2次数据后,计算2个数据代表的周期。
软件现象:串口调试助手发送数据和接收的数据对不上号。
硬件现象:起初黑暗1s,亮1s,当使用串口发送数据时,要么频率特别高(常亮),要么长不亮(等好久才切换状态)
求助高手,帮忙修改一下程序
代码如下
/*********************************************************************************************
?
硬件支持: STC12C2052AD 外部12MHZ晶振
接口说明: 连接串口ISP下载线
流程说明:LED初始频闪周期1000 ms,通过串口接收2位数,改变频闪周期
串口第一个是数值,第二位是数量级,例如52表示5*10^2 ms,time[2]存储这两位数字。
/*********************************************************************************************/
#include <STC12C2052AD.H>
//定义变量
unsigned char time[2]={1,3};//初始频闪周期1000 *2 ms
unsigned int delaytime=1000;//初始频闪周期1000 *2 ms
unsigned int wei=0;//数据接收标志位
unsigned int flag=0; //重新计算标志位
//当wei=1时,说明接收了2个数字,此时flag变成1,主程序中判断flag是否等于1 判断是否从串口接收了2
//位数字,若是,则计算接收的数字代表的周期
unsigned int number;
sbit LED=P1^0; //频闪灯
/*********************************************************************************************
函数名:UART串口初始化函数
调 用:UART_init();
参 数:无
返回值:无
结 果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
备 注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]
/**********************************************************************************************/
void UART_init (void){
EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
ES = 1; //允许UART串口的中断
TMOD = 0x20; //定时器T/C1工作方式2
SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
TH1 = 0xF3; //定时器初值高8位设置
TL1 = 0xF3; //定时器初值低8位设置
PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)
TR1 = 1; //定时器启动
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:UART串口接收中断处理函数
调 用:[SBUF收到数据后中断处理]
参 数:无
返回值:无
结 果:
备 注:
/**********************************************************************************************/
void UART_R (void) interrupt 4 using 1{ //切换寄存器组到1
RI = 0; //令接收中断标志位为0(软件清零)
time[wei]= SBUF; //第一次收到数据放到 time[0]中,第二次收到数据放到 time[1]中,
if(wei){ //当wei=1,则说明接收到1组数据
flag=1; //此时计算标志位置1,在主程序中重新计算时间
}
SBUF =time[wei] ; //将接收的数据发送回去查看接收是否正确
wei=~wei; //改变下一次存储位置 time[0]到 time[1],或 time[1]到 time[0]
while(TI == 0); //检查发送中断标志位
TI = 0; //令发送中断标志位为0(软件清零)
}
/**********************************************************************************************/
/*********************************************************************************************/
/*********************************************************************************************
函数名:毫秒级CPU延时函数
调 用:DELAY_MS (?);
参 数:1~65535(参数不可为0)
返回值:无
结 果:占用CPU方式延时与参数数值相同的毫秒时间
备 注:应用于1T
单片机
时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
unsigned int i;
while( a-- != 0){
for(i = 0; i < 600; i++);
}
}
/*********************************************************************************************/
/*********************************************************************************************
计算延时时间
time[1]是多少,就乘以多少遍10
/**********************************************************************************************/
unsigned int daleycount(void){
unsigned int a;
a=1;
while(time[1]--!=0){
a=a*10;
}
number=time[0]*a;
return number; //当wei=1,改变定时时间
}
/*********************************************************************************************
函数名:主函数
调 用:无
参 数:无
返回值:无
结 果:读取串口值,赋值给延时函数
备 注:
/**********************************************************************************************/
void main (void){
UART_init(); //串口初始化
while(1){
if(flag){ //判断是否需要计算时间
delaytime=daleycount(); //计算时间
flag=0; //等待下一次改变
}
LED=~LED;
DELAY_MS(delaytime); //延时
}
}
/**********************************************************************************************/
复制代码
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
janerzhang
2019-07-15 23:29
现在解决了吗,我也在看这个程序改了下,,调试你的,发的跟接受的一样,开始闪得快,后来在发的时候就敞亮了
加载中...
查看其它5个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
一周热门 更多>