AT89C52简单的串口操作
扫描二维码
随时随地手机看文章
#include
#include
#define uchar unsigned char
#define uint unsigned int
void Delay(uint del)
{
uint i,j;
for(i=0; i
for(j=0; j<1827; j++)
;
}
void Com_Init(void)
{
TMOD = 0x20;//方式2,8位自动填充
PCON = 1<<7;//设置smod为1
SCON = 0x40;//SM0,SM1,SM2,REN,TB8,RB8,TI,RI设置为0x40,不允许读,串口工作方式1,波特率可变为2smod*fosc/[32*12*(256-x)]
TH1 = 0xfd;
TL1 = 0xfd;//19200 自填充
TR1 = 1;//启动定时器
}
void Main()
{
uchar i = 0;
uchar code Buffer[] = "Welcome To The MCU World. http://dlmcu.taobao.com QQ:85536436 "; //所要发送的数据
uchar *p;
Com_Init();
while(1)
{
p = Buffer;
while(1)
{
SBUF = *p;
while(!TI) //如果发送完毕,硬件会置位TI
{
_nop_();
}
p++;
if(*p == '')
{
Delay(200); //延时2秒钟再进行下次发送
TI = 0;
break; //在每个字符串的最后,会有一个''
}
TI = 0; //TI清零
}
}
}
说明:
串口的初始化中,需要设置TIME1,这个定时器的的溢出率在波特率中有用,其中PCON电源控制器最高位SMOD与波特率有关系,然后就是设置TIME1的初始值,开启定时器。
当发送1个数值后,就是8位,即1个字符,先赋值给SBUF,由SBUF将并行的数据换成串行的数据在P3.1中根据01的不同会出现不同的电压即完成物理层的传输,另外一方即可根据电压判断不同的01,然后形成8位的并行数据。
接受程序:
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar LED_Buffer[8] = {0}; //从串口接收的数据
void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;j
for(x=0;x<=148;x++);
}
void Com_Int(void) interrupt 4
{
static uchar i = 0; //定义为静态变量,当重新进入这个子函数时 i 的值不会发生改变
if(RI == 1) //当硬件接收到一个数据时,RI会置位
{
LED_Buffer[i] = SBUF - 48; //这里减去48是因为从电脑中发送过来的数据是ASCII码。
RI = 0;
if(i==8)
{
i = 0;
}
i++;
}
}
void Com_Init(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xfd; //设置波特率 9600
TL1 = 0xfd;
TR1 = 1; //启动定时器1
ES = 1; //开串口中断
EA = 1; //开总中断
}
void Main()
{
uchar i = 0;
Delay_1ms(100);
Com_Init();
while(1)
{
P0 = table[LED_Buffer[i]];
P2 = i++;
Delay_1ms(1);
if(i == 8) i=0;
}
}
说明:
可以再串口RI或者TI置位后,设置中断函数,TI和RI由硬件。通过RI置位可以读取接受到的数组。
然后做进一步的传输。