标题:
奉上STC15F2K60S2单片机双串口RS232程序
[打印本页]
作者:
baiyun1234
时间:
2019-10-15 10:56
标题:
奉上STC15F2K60S2单片机双串口RS232程序
如题“昨天刚调出来”。
串口1 :/P1.6/P1.7串口1 RXD/TXD
串口2 :/P1.0/P1.1串口2 RXD/TXD
3.0和3.1用来下载程序,使用内部复位电路与晶振。这款单片机很哇塞的。
PC发送2个字节,程序里可以看,返回SendString2("STC15F2K60S2\r\nUart Test 2!\r\n");
代码放上,里面可以优化,但是不影响功能。也放上了89与15系列的头文件,方便写程序。
附件.rar
(53.82 KB, 下载次数: 88)
2019-10-15 10:54 上传
点击文件名下载附件
下载积分: 黑币 -5
单片机源程序如下:
#include <stdio.h>
#include <STC15F2K60S2.H>
#include "intrins.h"
#define FOSC 12000000L //系统频率
#define BAUD 9600 //串口波特率
#define uint unsigned int
//#define S1_S0 0x40 //P_SW1.6
//#define S1_S1 0x80 //P_SW1.7
#define S2RI 0x01 //S2CON.0
#define S2TI 0x02 //S2CON.1
unsigned char a,a2,i=0,p=0;
unsigned char String[2]; //串口1接收数据缓存区
unsigned char String2[2]; //串口2接收数据缓存区
bit busy,busy2;
sbit led = P0^0;
sbit led1 = P0^1;
/*************系统初始化****************/
void sys_init(void)
{
// P20=1;
// P32=1;
// P33=1;
//P_SW1=0x40; //P3.6/P3.7串口1 RXD/TXD
P_SW1=0x80; //P1.6/P1.7串口1 RXD/TXD
P_SW2=0x00; //P1.0/P1.1串口2 RXD/TXD
}
/*************UART_1&2 初始化****************/
void UartInit(void)
{
SCON = 0x50; //COM1 8位数据,可变波特率
S2CON =0X50; //COM2 8为数据可变波特率
T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR = 0x14; //T2为1T模式, 并启动定时器2
AUXR |= 0x01; //选择定时器2为串口1的波特率发生器 /// |
ES = 1; //使能串口1中断
// ES2=1; //使能串口2中断
IE2 = 0x01;
EA = 1;
}
/*************发送字符****************/
void SendData(unsigned char dat)
{
while (busy); //等待前面的数据发送完成
busy = 1;
SBUF = dat; //写数据到UART数据寄存器
}
/*************发送字符串****************/
void SendString(char *s)
{
while (*s) //检测字符串结束标志
{
SendData(*s++); //发送当前字符
}
}
/*************发送字符****************/
void SendData2(unsigned char dat2)
{
while (busy2); //等待前面的数据发送完成
busy2 = 1;
S2BUF = dat2; //写数据到UART数据寄存器
}
/*************发送字符串****************/
void SendString2(char *ss)
{
while (*ss) //检测字符串结束标志
{
SendData2(*ss++); //发送当前字符
}
}
void delayms(uint time)
{
uint x,y;
for(x=0;x<time;x++)
for(y=0;y<120;y++);
}
/*************主函数****************/
void main()
{
delayms(2000);
led=0;
led1=0;
sys_init();
UartInit();
while(1)
{
delayms(1000);
// if(a==0x01)
if((String[0]==0x01)&&(String[1]==0x01))
{
delayms(200);
SendString("STC15F2K60S2\r\nUart Test !\r\n");
led=1;
delayms(200);
String[0] = 0x00;
String[1] = 0x00;
// a=0x00;
break;
}
// if(a==0x02)
if((String[0]==0x02)&&(String[1]==0x02))
{
//SendData(a);
delayms(200);
SendString("String\r\n");
led=1;
delayms(200);
String[0] = 0x00;
String[1] = 0x00;
// a=0x00;
break;
}
delayms(1000);
// if(a2==0x01)
if((String2[0]==0x01)&&(String2[1]==0x01))
{
delayms(200);
SendString2("STC15F2K60S2\r\nUart Test 2!\r\n");
led1=1;
delayms(200);
String2[0] = 0x00;
String2[1] = 0x00;
// a2=0x00;
break;
}
// if(a2==0x02)
if((String2[0]==0x02)&&(String2[1]==0x02))
{
//SendData(a);
delayms(200);
SendString2("String 2\r\n");
led1=1;
delayms(200);
String2[0] = 0x00;
String2[1] = 0x00;
// a2=0x00;
break;
}
}
}
/*************UART_1 中断服务程序****************/
void Uart1() interrupt 4
{
if (RI)
{
RI = 0; //清除RI位
// a = SBUF;
String[i]= SBUF;
i++;
if(i>1)i=0;
}
if (TI)
{
TI = 0; //清除TI位
busy = 0; //清忙标志
}
}
/*************UART_2 中断服务程序****************/
void Uart2() interrupt 8
{
if(S2CON & S2RI)
{
// S2RI=0; //清除RI位
S2CON &= ~S2RI;
// a2 = S2BUF;
String2[p]= S2BUF;
p++;
if(p>1)p=0;
}
if (S2CON & S2TI)
{
S2CON &= ~S2TI; //清除TI位
busy2 = 0; //清忙标志
}
}
复制代码
作者:
dlyt03
时间:
2021-8-6 20:35
请教一个问题,我试用了你的程序,但是没有正确的反馈,发送什么,返回的就是什么,请问可能是什么原因?
作者:
fif
时间:
2021-8-9 11:04
dlyt03 发表于 2021-8-6 20:35
请教一个问题,我试用了你的程序,但是没有正确的反馈,发送什么,返回的就是什么,请问可能是什么原因?
参考来自己写一个比较好把
作者:
banzhiyang
时间:
2022-8-19 09:49
感谢,经过自己改,可以用双串口通讯控制了。
作者:
cnhkh
时间:
2023-5-5 11:59
经过自己改,可以用双串口通讯控制
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1