标题:
STC8A单片机串口通讯官方代码
[打印本页]
作者:
czhaii
时间:
2020-1-7 22:18
标题:
STC8A单片机串口通讯官方代码
这是官方代码,把两段例程合并起来,明天测试双串口通讯。
串口1切换
#include "reg51.h"
sfr P_SW1=0xa2;
void main()
{
P_SW1=0x00; //RXD/P3.0, TXD/P3.1
//P_SW1=0x40; //RXD_2/P3.6, TXD_2/P3.7
//P_SW1=0x80; //RXD_3/P1.6, TXD_3/P1.7
//P_SW1=0xc0; //RXD_4/P4.3, TXD_4/P4.4
while (1);
}
串口2切换
#include "reg51.h"
sfr P_SW2 = 0xba;
void main()
{
P_SW2=0x00; //RXD2/P1.0, TXD2/P1.1
//P_SW2=0x01; //RXD2_2/P4.0, TXD2_2/P4.2
while (1);
}
串口3切换
#include "reg51.h"
sfr P_SW2=0xba;
void main()
{
P_SW2=0x00; // RXD3/P0.0, TXD3/P0.1
//P_SW2=x02; // RXD3_2/P5.0, TXD3_2/P5.1
while (1);
}
串口4切换
#include "reg51.h"
sfr P_SW2 = 0xba;
void main()
{
P_SW2=0x00; //RXD4/P0.2, TXD4/P0.3
//P_SW2=0x04; //RXD4_2/P5.2, TXD4_2/P5.3
while (1);
}
UART 1 中断
#include "reg51.h"
#include "intrins.h"
//测试工作频率为11.0592MHz
sfr T2L=0xd7;
sfr T2H=0xd6;
sfr AUXR=0x8e;
sbit P10=P1^0;
sbit P11=P1^1;
void UART1_Isr() interrupt 4
{
if (TI)
{
TI = 0; //清中断标志
P10 = !P10; //测试端口
}
if (RI)
{
RI = 0; //清中断标志
P11 = !P11; //测试端口
}
}
void main()
{
SCON=0x50;
T2L=0xe8; //65536-11059200/115200/4=0FFE8H
T2H=0xff;
AUXR=0x15; //启动定时器
ES = 1; //使能串口中断
EA = 1;
SBUF = 0x5a; //发送测试数据
while (1);
}
UART 2 中断
#include "reg51.h"
#include "intrins.h"
//测试工作频率为11.0592MHz
sfr T2L=0xd7;
sfr T2H=0xd6;
sfr AUXR=0x8e;
sfr S2CON=0x9a;
sfr S2BUF=0x9b;
sfr IE2=0xaf;
#define ES2 0x01
sbit P12=P1^2;
sbit P13=P1^3;
void UART2_Isr() interrupt 8
{
if (S2CON & 0x02)
{
S2CON &= ~0x02; //清中断标志
P12 = !P12; //测试端口
}
if (S2CON & 0x01)
{
S2CON &= ~0x01; //清中断标志
P13 = !P13; //测试端口
}
}
void main()
{
S2CON=0x10;
T2L=0xe8; //65536-11059200/115200/4=0FFE8H
T2H=0xff;
AUXR=0x14; //启动定时器
IE2=ES2; //使能串口中断
EA=1;
S2BUF=0x5a; //发送测试数据
while(1);
}
UART 3 中断
#include "reg51.h"
#include "intrins.h"
//测试工作频率为11.0592MHz
sfr T2L=0xd7;
sfr T2H=0xd6;
sfr AUXR=0x8e;
sfr S3CON=0xac;
sfr S3BUF=0xad;
sfr IE2=0xaf;
#define ES3 0x08
sbit P10 = P1^0;
sbit P11 = P1^1;
void UART3_Isr() interrupt 17
{
if (S3CON & 0x02)
{
S3CON&=~0x02; //清中断标志
P10=!P10; //测试端口
}
if(S3CON&0x01)
{
S3CON&=~0x01; //清中断标志
P11=!P11; //测试端口
}
}
void main()
{
S3CON = 0x10;
T2L = 0xe8; //65536-11059200/115200/4=0FFE8H
T2H = 0xff;
AUXR = 0x14; //启动定时器
IE2 = ES3; //使能串口中断
EA = 1;
S3BUF = 0x5a; //发送测试数据
while (1);
}
UART 4 中断
#include "reg51.h"
#include "intrins.h"
//测试工作频率为11.0592MHz
sfr T2L=0xd7;
sfr T2H=0xd6;
sfr AUXR=0x8e;
sfr S4CON=0x84;
sfr S4BUF=0x85;
sfr IE2=0xaf;
#define ES4 0x10
sbit P10=P1^0;
sbit P11=P1^1;
void UART4_Isr() interrupt 18
{
if (S4CON & 0x02)
{
S4CON &= ~0x02; //清中断标志
P10 = !P10; //测试端口
}
if (S4CON & 0x01)
{
S4CON &= ~0x01; //清中断标志
P11 = !P11; //测试端口
}
}
void main()
{
S4CON = 0x10;
T2L = 0xe8; //65536-11059200/115200/4=0FFE8H
T2H = 0xff;
AUXR = 0x14; //启动定时器
IE2 = ES4; //使能串口中断
EA = 1;
S4BUF = 0x5a; //发送测试数据
while (1);
}
作者:
czhaii
时间:
2020-1-8 10:13
给力,搞单片机要靠平时资料整理和积累的
作者:
jhczy
时间:
2020-1-8 10:26
等待楼主汇报测试结果
作者:
czhaii
时间:
2020-1-8 13:49
串口转换到P3.6 P3.7驱动TTS语音模块测试成功,
这样符合我的要求了,我用P3.0 3.1接收数据,
P3.6 P3.7驱动语音模块。播放结束再切换返回到P3.0 3.1。
时间紧张,下一步再摸索两个串口通讯
/*无线通讯语言模块测试·PAST 2020 1 8 L72 CODE1413**/
#include <REG52.H>
#include <intrins.H>
#include "stdio.h"
#define uint unsigned int
#define uchar unsigned char
sbit OUT1=P3^2; /****输出***/
sbit OUT2=P3^4; /****输出***/
sbit MD0MD1=P3^2;
uchar DAT2=0;
bit Receive_Flag;
/*---------------延时子程序----------------*/
void delay1 (uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<200;j++)
;
}
/*------------初始化串口---------------------*/
void InitUart()
{
SCON=0X50; //8位数据,可变波特率
AUXR|=0x01; //串口1选择定时器2为波特率发生器
AUXR|=0X04; //定时器2时钟为Fosc,即1T
P_SW1=0x40; //RXD_2/P3.6, TXD_2/P3.7
T2L=0XE0; //设置定时器处置 110592》9600
T2H=0XFE; //设置定时器处置 110592》9600
AUXR|=0X10; //启动定时器2
TI=1;
EA=1;
}
/*--------UART 中断服务程序----Buff=SBUF---------------*/
void Uart() interrupt 4 using 1
{
if(RI)
{
DAT2=SBUF; //数组下标位置的数据等于j
RI=0; //
Receive_Flag=1; //接收数据标志置一
}
}
/*------------------主循环程序----------------*/
void main( ) /*主程序开始*/
{ /**加一**/
AUXR=0X80; //STC系列的1T 设置
TMOD=0X01;
InitUart(); //初始化串口
ES=1;
Receive_Flag=0; //接收到数据标志置零
MD0MD1=0; //
//Warning=0; //报警标志等于0
// Counter=0; //报警计数器等于0
// printf("报警标志");
printf("<Z>5"); //
printf("<V>2"); //
printf("<S>3"); //
while(1)
{
printf("不喝酒就没得朋友可是只要偶一喝酒就喝倒一代朋友人生真的很矛盾");
// printf("Please input up,dowm,high:\r\n");
OUT1=0;
OUT2=1;
delay1(2000);
delay1(2000);
OUT1=1;
OUT2=0;
delay1(2000);
delay1(2000);
////////////////////////////////
}
}
作者:
pengyongnet
时间:
2020-4-16 10:00
验证过吗
作者:
温柔的郎
时间:
2022-2-4 19:24
实践是检验真理的唯一标准!!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1