
以下是宏晶用于STC15F4K60S4 系列的串口2代码示例,根据经验很可能可以用于STC12C60S2单片机,但未亲手验证
/---------------------------------------------------------------------// --- STC MCU Limited ------------------------------------------------/
/ --- STC15F4K60S4 系列 定时器2用作串口2的波特率发生器举例------------/
/ --- Mobile: (86)13922805190 ----------------------------------------/
/ --- Fax: 86-755-82905966 -------------------------------------------/
/ --- Tel: 86-755-82948412 -------------------------------------------/
/ --- Web:
--------------------------------------------/
/ 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序 /
/ 如果要在文章中应用此代码,请在文章中注明使用了宏晶科技的资料及程序 /
/---------------------------------------------------------------------///本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//假定测试芯片的工作频率为18432MHz#include "reg51h"
#include "intrinsh"typedef unsigned char BYTE;
typedef unsigned int WORD;#define FOSC 18432000L //系统频率
#define BAUD 115200 //串口波特率#define NONE_PARITY 0 //无校验
#define ODD_PARITY 1 //奇校验
#define EVEN_PARITY 2 //偶校验
#define MARK_PARITY 3 //标记校验
#define SPACE_PARITY 4 //空白校验#define PARITYBIT EVEN_PARITY //定义校验位sfr AUXR = 0x8e; //辅助寄存器
sfr S2CON = 0x9a; //UART2 控制寄存器
sfr S2BUF = 0x9b; //UART2 数据寄存器
sfr T2H = 0xd6; //定时器2高8位
sfr T2L = 0xd7; //定时器2低8位
sfr IE2 = 0xaf; //中断控制寄存器2#define S2RI 0x01 //S2CON0
#define S2TI 0x02 //S2CON1
#define S2RB8 0x04 //S2CON2
#define S2TB8 0x08 //S2CON3sfr P_SW2 = 0xBA; //外设功能切换寄存器2
#define S2_S0 0x01 //P_SW20bit busy;void SendData(BYTE dat);
void SendString(char s);void main()
{
P_SW2 &= ~S2_S0; //S2_S0=0 (P10/RxD2, P11/TxD2)
// P_SW2 |= S2_S0; //S2_S0=1 (P46/RxD2_2, P47/TxD2_2)#if (PARITYBIT == NONE_PARITY)
S2CON = 0x50; //8位可变波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
S2CON = 0xda; //9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
S2CON = 0xd2; //9位可变波特率,校验位初始为0
#endif T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR = 0x14; //T2为1T模式, 并启动定时器2
IE2 = 0x01; //使能串口2中断
EA = 1; SendString("STC15F2K60S2\r\nUart2 Test !\r\n");
while(1);
}/----------------------------
UART2 中断服务程序
-----------------------------/
void Uart2() interrupt 8 using 1
{
if (S2CON & S2RI)
{
S2CON &= ~S2RI; //清除S2RI位
P0 = S2BUF; //P0显示串口数据
P2 = (S2CON & S2RB8); //P22显示校验位
}
if (S2CON & S2TI)
{
S2CON &= ~S2TI; //清除S2TI位
busy = 0; //清忙标志
}
}/----------------------------
发送串口数据
----------------------------/
void SendData(BYTE dat)
{
while (busy); //等待前面的数据发送完成
ACC = dat; //获取校验位P (PSW0)
if (P) //根据P来设置校验位
{
#if (PARITYBIT == ODD_PARITY)
S2CON &= ~S2TB8; //设置校验位为0
#elif (PARITYBIT == EVEN_PARITY)
S2CON |= S2TB8; //设置校验位为1
#endif
}
else
{
#if (PARITYBIT == ODD_PARITY)
S2CON |= S2TB8; //设置校验位为1
#elif (PARITYBIT == EVEN_PARITY)
S2CON &= ~S2TB8; //设置校验位为0
#endif
}
busy = 1;
S2BUF = ACC; //写数据到UART2数据寄存器
}/----------------------------
发送字符串
----------------------------/
void SendString(char s)
{
while (s) //检测字符串结束标志
{
SendData(s++); //发送当前字符
}
}
首先,串口调试软件的波特率最好设置成9600,这种波特率也支持显示中文的,
USB转串口看你用的什么芯片,经过实验采用CH340或是341的是没有问题的,其他还有待验证。
串口调试软件也很重要,有些软件会奇怪出现乱码,但并不是程序错误,推荐你用小丁的sscom32,个人感觉很棒! ;
; 程序名称:单片机串口发送中文字符实验,232通信程序
; 硬件说明:打开《串口调试助手》,波特率设为9600速率,110592晶体
; 注 意:《串口调试助手》要设置好COM号(请核对是否和设备管理器的COM编号一致)
; *** 作说明:下载程序后打开串口调试助手sscom32exe即可显示,或按一下复位开关
;/
ORG 0000H
AJMP main
ORG 0030H
main: MOV 20H,#00H
MOV TMOD,#22H ;定时器工作方式
MOV SCON,#40H
MOV TH1,#0FAH ;波特率9600
MOV PCON,#80H
SETB TR1
SETB REN ;允许接收
ajmp start
start: mov dptr,#num ;查表
send : clr a ;
movc a,@a+dptr
cjne a,#'$',send_2
ajmp $ ;遇到$停止。
send_2:mov sbuf,a
JNB TI,$ ;串行发送一帧结束了吗?
CLR TI ;
inc dptr ;指针加一
Ljmp send
num:
db 0dh,0ah,0dh,0ah,"XY900_USB型单片机学习板USB-232串口中文发送试验 >
/ 甲机串口程序:甲机向乙机发送控制命令字符,甲机同时接收乙机发送的数字,并显示在数码管上。/
#include<reg51h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P1^0;
sbit LED2=P1^3;
sbit K1=P1^7;
uchar Operation_No=0; // *** 作代码
//数码管代码
uchar codeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//延时
void DelayMS(uint ms)
{
uchari;
while(ms--)for(i=0;i<120;i++);
}
//向串口发送字符
void Putc_to_SerialPort(uchar c)
{
SBUF=c;
while(TI==0);
TI=0;
}
//主程序
void main()
{
LED1=LED2=1;
P0=0x00;
SCON=0x50; //串口模式1,允许接收
TMOD=0x20; //T1工作模式2
PCON=0x00; //波特率不倍增
TH1=0xfd;
TL1=0xfd;
TI=RI=0;
TR1=1;
IE=0x90; //允许串口中断
while(1)
{
DelayMS(100);
if(K1==0) //按下K1时选择 *** 作代码0,1,2,3
{
while(K1==0);
Operation_No=(Operation_No+1)%4;
switch(Operation_No) //根据 *** 作代码发送A/B/C或停止发送
{
case0: Putc_to_SerialPort('X');
LED1=LED2=1;
break;
case1: Putc_to_SerialPort('A');
LED1=~LED1;LED2=1;
break;
case2: Putc_to_SerialPort('B');
LED2=~LED2;LED1=1;
break;
case3: Putc_to_SerialPort('C');
LED1=~LED1;LED2=LED1;
break;
}
}
}
}
//甲机串口接收中断函数
void Serial_INT() interrupt 4
{
if(RI)
{
RI=0;
if(SBUF>=0&&SBUF<=9)P0=DSY_CODE[SBUF];
elseP0=0x00;
}
}
/ 乙机程序接收甲机发送字符并完成相应动作:乙机接收到甲机发送的信号后,根据相应信号控制LED完成不同闪烁动作。/
#include<reg51h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P1^0;
sbit LED2=P1^3;
sbit K2=P1^7;
uchar NumX=-1;
//延时
void DelayMS(uint ms)
{
uchari;
while(ms--)for(i=0;i<120;i++);
}
//主程序
void main()
{
LED1=LED2=1;
SCON=0x50; //串口模式1,允许接收
TMOD=0x20; //T1工作模式2
TH1=0xfd; //波特率9600
TL1=0xfd;
PCON=0x00; //波特率不倍增
RI=TI=0;
TR1=1;
IE=0x90;
while(1)
{
DelayMS(100);
if(K2==0)
{
while(K2==0);
NumX=++NumX%11; //产生0~10范围内的数字,其中10表示关闭
SBUF=NumX;
while(TI==0);
TI=0;
}
}
}
void Serial_INT() interrupt 4
{
if(RI) //如收到则LED则动作
{
RI=0;
switch(SBUF)//根据所收到的不同命令字符完成不同动作
{
case'X': LED1=LED2=1;break; //全灭
case'A': LED1=0;LED2=1;break; //LED1亮
case'B': LED2=0;LED1=1;break; //LED2亮
case'C': LED1=LED2=0; //全亮
}
}
}
以上就是关于求STC5A60S2单片机的第二串口应用发送数据的一个小程序,谢谢全部的内容,包括:求STC5A60S2单片机的第二串口应用发送数据的一个小程序,谢谢、求RS232串口通信程序(C语言版)、两片单片机通过串口一发一收的C语言例程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)