C51单片机实现串口通信

这算是学习单片机的一个记录吧,惭愧毕业几年才开始捡起单片机。
————————————————————————————

进行串口通信需要做以下工作:
1)打开CPU的总中断EA;

2)打开串口通信的中断ES;

3)设置SCON寄存器采用哪一种的工作模式;

4)设置波特率;

5)选择定时器的工作方式。

         使用的单片机型号STC8A8K64S4A12,实现字符串的发送与接收,向单片机发送一串字符,单片机就原样返回到PC。本来以为很简单,写完程序调试发现无法实现通信,查看该芯片的官方代码,发现需要加上P_SW1 = 0x00,原来用这个芯片需要RX、TX引脚设置。

外设端口切换寄存器1( P_SW1 / AUXR1 )
 

外设端口切换寄存器1
76543210地址
S1_S1S1_S0CCP_S1CCP_S0SPI_S1SPI_S00DPSa2H

S1_S1和S1_S0决定UART1的端口选择:

S1_S1

S1_S0

选择位

0

0

RxD-P3.0

TxD-P3.1

0

1

RxD-P3.6

TxD-P3.7

1

0

RxD-P1.6

TxD-P1.7

1

1

无效

代码如下:

/****************串口通信****************/


#include <stdio.h>
#include <STC8.h>
#include <intrins.h>	//包含延时函数
#define uint unsigned int
#define uchar unsigned char
	
void Sendchar(uchar dat);
void UartInit(void);
void delay_ms(uint time2);
void SendString(uchar *p);

bit busy=0;
//uchar re;
uint k;
uchar flag;
uchar Buffer[50];


void main()
{
	
	P_SW1 = 0x00;                    //RXD/P3.0, TXD/P3.1
	UartInit();
	EA = 1;							//打开总中断
	SendString("开始测试串口通信!");
	while(1)
	{
		if(flag==1)
		{
		SendString(Buffer);
		flag=0;	
		k=0;
	   // delay_ms(50);
		}
	}
}


//串口初始化,9600波特率
void UartInit(void)		//9600bps@22.1184MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率,选择模式1
	AUXR |= 0x40;		//定时器时钟1T模式
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xB8;		//设置定时初始值
	TH1 = 0xB8;		//设置定时重载值
	ET1 = 0;		//禁止定时器%d中断
	TR1 = 1;		//定时器1开始计时
	ES = 1;			//打开串口中断
	
}


void Sendchar(uchar dat){
	
    while (busy);
    busy = 1;
    SBUF = dat;

}

void SendString(uchar *p){
	while(*p)
	{
		
		Sendchar(*p++);
	}
	
}


void UART() interrupt 4{		//串口中断号为4
	
	if (TI)
    {
        TI = 0;
        busy = 0;
    }
	if(RI)
	{
		RI=0;		//清除接收中断标志
    //	ES=0;		//关闭串口中断
		Buffer[k++]=SBUF;	//接收数据
	//re=SBUF;	
		flag=1;
		//Buffer[i+1]='\0';
	}   
}




/**********延时程序**************/
void Delay1us()		//@22.1184MHz 	,STC-ISP系统生成的延时函数
{
	unsigned char i;

	_nop_();
	i = 5;
	while (--i);
}
void delay_us(uint time1){		//封装的1us函数接口
	uint i;
	for(i=0;i<=time1;i--){
		Delay1us();
	}
}

void Delay1ms()		//@22.1184MHz	STC-ISP系统生成的延时函数
{
	unsigned char i, j;

	i = 29;
	j = 183;
	do
	{
		while (--j);
	} while (--i);
}
void delay_ms(uint time2){		//封装的1ms函数接口
	uint i;
	for(i=0;i<=time2;i--)
	{
		Delay1ms();
	}
}
	
/**********************************/

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值