STC单片机串口通信,测试程序,C51寄存器变量设置
单片机源程序如下(注释很详细):
- #include <STC89C5xRC.H>
- #include <LCD_12864.H>
- #include <intrins.h>
- #include <string.h>
- #include <stdio.h>
- #include <math.h>
- // 0 / 0:13位计数器;
- typedef unsigned int u16; //常用M1M0 0 / 1: 16位计数器;
- typedef unsigned char u8; // 1 / 0:自动重装8位计数器
- void UartInit(void); // 定时器1 定时器0
- //TMOD寄存器位变量: GATE C/T M1 M0 GATE C/T M1 M0
- // 0 0 1 0 0 0 1 0
- // 1 1
- // C/T=0:定时器 C/T=1:计数器
- //TCON寄存器位变量: TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
- // / 1 / 1 / 1 / 1
- // '/'代表有硬件置1或0,无需编程
- // TR1、TR0置1分别启动定时器1、0 ;置0分别关闭定时器1、0;
- // IT1、IT0置1外部中断1、0下降沿有效;置0低电平有效;
- // 下降沿或者上升沿有效可以用于1/2分频。
-
- //SCON寄存器位变量: SM0 SM1 SM2 REN TB8 RB8 TI RI
- //8位移位寄存器 0 0 0 1 /* /*
- void main() //10位波特率可变 0 1 0
- { //11位波特率固定 1 0 1
- UartInit(); //11位波特率可变 1 1 1
- //SM2接收数据第9位校验位。
- while(1); //方式0发送:TI位0允许发送,数据格式- 8 -;发送结束TI硬件置1,发送下一帧TI程序置0,TB8无作用
- //方式0接收:REN为1且RI位0允许发送,数据格式- 8 -;接收结束RI硬件置1,接收下一帧RI程序置0,RB8无作用
- // SM2==0
- } //方式1发送:TI为0允许发送,数据格式0+8+1;发送结束TI硬件置1,发送下一帧TI程序置0,TB8无作用
- //方式1接收: REN为1且RI为0允许接收,数据格式0+8+1;接收结束第9位1送至RB8、RI硬件置1,接收下一帧RI由程序置0
- // SM2=0>>RB8=1或0,都接收数据,RI硬件置1;SM2=1>>RB8=1 接收数据,RI硬件置1
- void Uart() interrupt 4 //方式2发送:TI位0允许发送,数据格式0+8+1/0+1;TB8软件置1或0代表发送数据第9位,TI硬件置1,发送下一帧TI程序置0
- { // TB8为1表示发送地址,TB8为0表示发送数据
- u8 receiveData; //方式2接收: REN为1且RI为0允许接收,数据格式0+8+1/0+1;接收结束第9位送至RB8、RI硬件置1,接收下一帧RI由程序置0
- receiveData=SBUF; // SM2=0>>RB8=1或0,都接收数据,RI硬件置1;SM2=1>>RB8=1 接收数据,RI硬件置1
- while(!RI);
- RI = 0; //方式3同方式2,只是波特率可调
- SBUF=receiveData;
- while(!TI); //IE中断允许寄存器: EA -- ET2 ES ET1 EX1 ET0 EX0
- TI=0; //EA中断总开关 ; ET2允许定时器2中断 ; ES允许串口中断 ; ET1允许定时器1中断
- } // EX1允许外部中断1断 ; ET0允许定时器0中断 ; EX0允许外部中断0断
-
- // 中断源 Keil中断编号 矢量地址
- // 最高优先级 6 0x0033
- // 外部中断0 0 0x0003
- // 定时器0溢出 1 0x000B
- // 外部中断1 2 0x0013
- // 定时器1溢出 3 0x001B
- // 串口 4 0x0023
- // 定时器2溢出 5 0x002B
- void UartInit(void) //9600bps@11.0592MHz
- {
- TMOD = 0x20;
- SCON = 0x50;
- TH1 = 0xF4;
- TL1 = 0xF4;
- PCON = 0x80;
- EA = 1;
- ES = 1;
- TR1 = 1;
- }
复制代码
所有资料51hei提供下载:
STC通信-发送数据.rar
(1.44 KB, 下载次数: 141)
|