电工基础

电工基础知识_电工技术-电工最常见电路

单片机C语言之串口通信协议(3)

时间:2024-04-10 11:57来源:[db:来源] 作者:admin 点击:
代码如下: #include “reg51.h” /* 将P1.0虚拟成串口发送脚TX 以9600bit/s的比特率向外发送数据 因为波特率是 9600bit/s 所以me发送一位的时间是 t=1000000us/9600=10

  代码如下:

  #include “reg51.h”

  /*

  将P1.0虚拟成串口发送脚TX

  以9600bit/s的比特率向外发送数据

  因为波特率是 9600bit/s

  所以me发送一位的时间是 t=1000000us/9600=104us

  */

  sbit TX=P3^1; //P1^0 output TTL signal, need to transferred to rs232 signal, can be connected to P3^1

  #define u16 unsigned int //宏定义

  #define u8 unsigned char

  u8 sbuf;

  bit ti=0;

  void delay(u16 x)

  {

  while(x--);

  }

  void Timer0_Init()

  {

  TMOD |= 0x01;

  TH0=65440/256;

  TH0=65440%256;

  TR0=0;

  }

  void Isr_Init()

  {

  EA=1;

  ET0=1;

  }

  void Send_Byte(u8 dat)

  {

  sbuf=dat;//通过引入全局变量sbuf,可以保存形参dat

  TX=0; //A 起始位

  TR0=1;

  while(ti==0); //等待发送完成

  ti=0; //清除发送完成标志

  }

  void TF0_isr() interrupt 1 //每104us进入一次中断

  {

  static u8 i; //记录进入中断的次数

  TH0=65440/256;

  TL0=65440%256;

  i++;

  if(i》=1 && i《=8)

  {

  if((sbuf&(1《《(i-1)))==0) // (sbuf&(1《《(i-1)))表示取出i-1位

  {

  TX=0;

  }

  else

  {

  TX=1;

  }

  }

  if(i==9) //停止位

  {

  TX=1;

  }

  if(i==10)

  {

  TR0=0;

  i=0;

  ti=1; //发送完成

  }

  }

  void main()

  {

  TX=1; //使TX处于空闲状态

  Timer0_Init();

  Isr_Init();

  while(1)

  {

  Send_Byte(65); //0x41

  delay(60000);

  }

  }

  实验引入了定时器0来控制发送线上的各个位的保持时间。首先main函数进入,TX置1则使发送线处于空闲,这时候发送方和接受方都处于空闲。接下来初始化定时器0,TR0置0表示还不要启动定时器0。接着中断系统初始化,此时中断系统已经开启。进入while循环,先进Send_Byte()函数,将65传给形参dat,dat再将65赋值给sbuf,到这里准备工作就做好了。接着TX置0,这个是起始位,要保持这个起始位104us。于是就启动定时器TR0置1,计时器开始计数。当第一次溢出的时候,也就是过了104us,进入中断,同时接收方也侦测到了这个突然被拉低的信号,于是迅速启动自己的定时器。进入中断子函数后,先是重装定时器初值,然后i加1,也就是当i=1时,就应该发送数据的最低位了,总共有8位数据,所以使用条件语句if(i》=1 && i《=8)来判断是否发送完数据位。然后再通过if(i==9) 来发送停止位,最后当i=10时,也就是发送完了,这时候要关闭定时器(那么程序也就),同时i置0,ti置1(才能跳出while(ti==0)循环),最后将ti置0,保证下次要发送字节时让程序停留在while(ti==0)。 (责任编辑:admin)

织梦二维码生成器
相关文章
------分隔线----------------------------
栏目列表
推荐内容