单片机串行口通信程序C语言

单片机串行口通信程序C语言,第1张

发送:

#include

<reg52.h>

#include<intrins.h>

#include<string.h>

#define

uchar

unsigned

char

uchar

data

i,j,p,TEST

sbit

INTT0=P3^2

uchar

code

V_35[10]={'V','o','l','t','

','3','.','5',13,10}

void

Init()

void

Delay()

void

Volt_35()

void

main()

{

Init()

while(1)

{

if(TEST)

{

Volt_35()

TEST=0

}

}

}

void

Init()

{

P0=0XFF

//I/O口初始化

P1=0xFF

P2=0XFF

P3=0xFF

SCON=0x50

//设置成串禅态口方式1

T2CON=0x34

TH2=0xff

//晶振11.0592MHZ,波特率9600

TL2=0xdc

RCAP2H=0XFF

RCAP2L=0XdC

EA=1

EX0=1

IT0=1

TEST=0

}

void

Delay()

{

for(i=0i<100i++)

for(j=0j<陵袭衡100j++)

}

void

Volt_35()

{

for(p=0p<10p++)

{

SBUF=V_35[p]

while(!TI)

TI=0

}

}

void

int0svr(void)

interrupt

0

using

1

{

Delay()

if(!INTT0)

{

while(!INTT0)

TEST=1

}

}

接收:

#include

<reg52.h>

#include<intrins.h>尺做

#include<string.h>

#define

uchar

unsigned

char

uchar

data

i

void

Init()

void

main()

{

Init()

while(1)

{

for(i=0i<10i++)

{

while(!RI)

P1=SBUF

RI=0

}

}

}

void

Init()

{

P0=0XFF

P1=0xFF

P2=0XFF

P3=0xFF

SCON=0x50

T2CON=0x34

TH2=0xff

TL2=0xdc

RCAP2H=0XFF

RCAP2L=0XdC

}

编程原理

程耐山亏序1为查询通信方式接口程序,为一典型的数据采集例程。其中bioscom()函数初始化COM1(此函数实际调用BIOS

INT

14H中断0号功唯桥能)。这样在程序中就避免了具体昌神设置波特率因子等繁琐工作,只需直接访问发送/接收寄存器(3F8H)和线路状态寄存

以下是我刚改的程序编译成功了

请参考

#include"reg51.h"

//定义全局变量

unsigned char data_10[10]={0,0,0,0,0,0,0,0,0,0}

unsigned char Time_50ms,count

bit flag=0

bit data_flag=0

/*********************************************************************************************

函数名:UART串口初始化函数

调 用:UART_init()

参 数:无

返回值:无

结 果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率拆毁闹(占用)

备 注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]

/**********************************************************************************************/

void UART_init (void){

EA = 1//允许总中断(如不使用中断,可用//屏蔽)

ES = 1//允许UART串口的中断

TMOD |= 0x20//定时器T/C1工作方式2

SCON = 0x50//串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)

TH1 = 0xF3//定时器初值高8位设置

TL1 = 0xF3//定时器初值低8位设置

PCON = 0x80//波特率倍频(屏蔽本句波特率为2400)

TR1 = 1/余尺/定时器启动

}

/**********************************************************************************************/

/*********************************************************************************************

函数名:UART串口接收中断处理函数

调 用:[SBUF收到数据后中断处理]

参 数:无

返回值:无

结 果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)

备 注:过长的处理程序会影响后面数据的接收

/**********************************************************************************************/

void UART_R (void) interrupt 4 using 1{ //切换寄存器组到1

TR0=1 //打开定时器开始计时

RI = 0//令接收中断标志位为0(软件清零)

data_10[count] = SBUF//将接收到的数据送入变量 UART_data

count++//接收到一个字节数据计数+1

if(count>=10) //如果接收到10个数据

{

TR0=0 //停止定时器

TH0 = 0x3C //给定时器赋初值

TL0 = 0xB0 //给定时器赋初值

count=0//清零数据计数

//data_flag=1//数据有效标志位

SBUF = 0x55//返回数据 55H

while(TI == 0)//检查发送中断标志位旅罩

TI = 0//令发送中断标志位为0(软件清零)

}

if(flag)

{

TR0=0 //停止定时器

TH0 = 0x3C //给定时器赋初值

TL0 = 0xB0 //给定时器赋初值

count=0//清零数据计数

SBUF = 0xff//返回数据 ffH

while(TI == 0)//检查发送中断标志位

TI = 0//令发送中断标志位为0(软件清零)

}

}

/**********************************************************************************************/

/*********************************************************************************************

函数名:定时/计数器初始化函数

调 用:T_C_init()

参 数:无

返回值:无

结 果:设置SFR中T/C1和(或)T/C0相关参数

备 注:本函数控制T/C1和T/C0,不需要使用的部分可用//屏蔽

/**********************************************************************************************/

void T_C_init (void){

TMOD |= 0x01//高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]

EA = 1//中断总开关

TH0 = 0x3C//16位计数寄存器T0高8位

TL0 = 0xB0//16位计数寄存器T0低8位(0x3CB0 = 50mS延时)

ET0 = 1//T/C0中断开关

TR0 = 0//T/C0开关

}

/**********************************************************************************************/

/*********************************************************************************************

函数名:定时/计数器0中断处理函数

调 用:[T/C0溢出后中断处理]

参 数:无

返回值:无

结 果:重新写入16位计数寄存器初始值,处理用户程序

备 注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致

/**********************************************************************************************/

void T_C0 (void) interrupt 1 using 1{ //切换寄存器组到1

TH0 = 0x3C//16位计数寄存器T0高8位(重新写入初值)

TL0 = 0xB0//16位计数寄存器T0低8位(0x3CB0 = 50mS延时)

Time_50ms++//50ms到 计数+1

if(Time_50ms>=100)

{

Time_50ms=0// 清零50ms计数

flag=1 //5s时间 标志置位

TR0=0//关闭计时器

}

}

/**********************************************************************************************/

main()

{

IP = 0x10 //中断优先级设置(串口中断最高优先级)

UART_init()//初始化串口

T_C_init() // 初始化计数器

while(1)// 空循环

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12518216.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存