串口通信程序

[复制链接]
 楼主| llia 发表于 2020-6-8 21:07 | 显示全部楼层 |阅读模式
怎样编写单片机的串口通信的程序,一般的步骤是怎么样的?
lium 发表于 2020-6-8 21:10 | 显示全部楼层
串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。
guoyt 发表于 2020-6-8 21:13 | 显示全部楼层

确定T1的工作方式(编程TMOD寄存器);
计算T1的初值,装载TH1、TL1;
启动T1(编程TCON中的TR1位);
确定串行口控制(编程SCON寄存器);
串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。
hanwe 发表于 2020-6-8 21:15 | 显示全部楼层
我一会写个串口程序,争取能仿真出来
wangpe 发表于 2020-6-8 21:19 | 显示全部楼层
哦,按我的思路?
langgq 发表于 2020-6-8 21:22 | 显示全部楼层
在编写程序时,首先初始化各个变量与单片机IO口,然后确定T1工作方式,最后根据串口中断就可以了
 楼主| llia 发表于 2020-6-8 21:25 | 显示全部楼层
我思路清晰多了,多谢
zhuww 发表于 2020-6-8 21:29 | 显示全部楼层
初始化设置,一般是时钟,波特率,还有IO等,然后确定T1工作方式,最后串口中断服务就可以了
zhuww 发表于 2020-6-8 21:34 | 显示全部楼层
利用定时/计数器T1产生定时时钟,
由P1口控制8个发光二极管,
使8个指示灯依次一个一个闪动,
闪动频率为10次/秒(8个灯依次亮一遍为一个周期),循环。
设晶振频率为12MHz。
#include<reg52.h> //52单片机头文件
#include <intrins.h> //包含有左右循环移位子函数的库
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit P1_0=P1^0;
uchar tt,a;
void main() //主函数
{
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
a=0xfe;
while(1);//等待中断产生
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==2)
{
tt=0;
P1=a;
a=_crol_(a,1);
}
}
我所不理解的地方时 进入主程序需要时间,在主程序中到达启动定时器0也要时间,而启动后50ms,执行中断服务程序也要时间
zhanglli 发表于 2020-6-8 21:37 | 显示全部楼层
究竟定时器怎么把时间分配的
lium 发表于 2020-6-8 21:40 | 显示全部楼层
你所说的那几个时间都是us级的,在流水灯里几ms都可以忽略更别说us了。
hanwe 发表于 2020-6-8 21:44 | 显示全部楼层

定时器计数和主函数程序是同时(并行)执行的。只有当定时器计数溢出之后才获得cpu的控制权。
楼主可知道否?
yufe 发表于 2020-6-8 21:47 | 显示全部楼层
不是程序同时执行,而是cpu在执行main函数的同时,定时器同时也在计数。
wangzsa 发表于 2020-6-8 21:53 | 显示全部楼层
当计数溢出之后,main函数就不再执行转而执行中段函数去了。
hanwe 发表于 2020-6-8 21:55 | 显示全部楼层
多写写程序体会就深了。
guoyt 发表于 2020-6-8 21:58 | 显示全部楼层
嗯。。。。我再思考一下吧
tian111 发表于 2020-6-8 22:02 | 显示全部楼层
这就是芯片设计上的问题了,会使用就好了
wangpe 发表于 2020-6-8 22:06 | 显示全部楼层

这在初始化里打开定时器,时间短,定时到产生中断,CPU先去处理中断事件
 楼主| llia 发表于 2020-6-8 22:10 | 显示全部楼层
多谢大家讨论这么多哈,呵呵
coshi 发表于 2020-7-6 14:58 | 显示全部楼层
这个这个   先看例程
您需要登录后才可以回帖 登录 | 注册

本版积分规则

961

主题

8893

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部

961

主题

8893

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部