stc单片机串口通信问题
时间:10-02
整理:3721RD
点击:
想实现的功能是串口1接受数据,串口2将数据发送出去
帮小弟看下程序i吧谢谢
#include <STC12C5A60S2.h>
#include <intrins.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
uint i,t,num1;
uchar j;
//1602设置
void UART_init(void);
void Receive(void);
void Write_str( uchar *p );
int COM_datdeal(void);
double Result_Calculate();
//串口设置
uchar rcv_dat[11]; //连续输出A通道9字节16进制显示数据
uchar Receive_Bflag = 0; //正在接送标志
//**********************************//
// 串口1初始化 //
//**********************************//
void UART_init(void)
{
PCON &= 0x7f; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xbf; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xfe; //串口1选择定时器1为波特率发生器
TMOD &= 0x0f; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
IP = 0X10; //PS = 1;串口1中断为最高优先级中断
ES = 1; //允许串口中断
EA = 1; //开总中断
}
//***********************************************//
// 串口2初始化
//**********************************************//
void UartInit2(void) [url=]//9600bps@11.0592MHz[/url]
{
AUXR &= 0xf7; //波特率不倍速
S2CON = 0x50; //8位数据,可变波特率
BRT = 0xDC; //设定独立波特率发生器重装值
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
AUXR |= 0x10; //启动独立波特率发生器
IE2=0x01; //允许串口2中断ES2=1
EA=1; //开总中断
}
//************************************************//
// 串口2发送数据 //
//************************************************//
void sendoneByte(uchar c)
{
uchar temp=0;
IE2=0x00;//关闭串口2中断ES=0
S2CON =S2CON&0xFD;//TI=0
S2BUF=c;
do
{
temp=S2CON;
temp=temp&0x02;
}while(temp==0);
S2CON =S2CON&0xFD;//TI=0清零串口发送完成标志
IE2=0x01;//允许串口2中断ES2=1
}
void sendString(uchar *aaa)
{
while(*aaa!='\0')
{
sendoneByte(*aaa);
aaa++;
}
}
//***********************************************//
// 串口1数据处理 //
//***********************************************//
int COM_datdeal(void)
{
int COM_result;
uchar *p1,*p2;
*p1= rcv_dat[7];
*p2= rcv_dat[8];
COM_result=atoi(p1)*100+atoi(p2);
return COM_result;
}
void Printf_commdata(int n)
{
uchar scoom[5] = {0,0,0,0,103};
scoom[0]= n/1000;
scoom[1]= n%1000/100;
scoom[2]= n%100/10;
scoom[3]= n%10;
WRITE_CMD(0x80+0x08);
Write_str(scoom);
}
//***********************************************//
// 串口1中断服务 //
//***********************************************//
void Com_Service(void) interrupt 4
{
uchar j;
if(RI)
{
rcv_dat[0]=SBUF;
if(rcv_dat[0]==0x05)
{
for(j=1;j<11;j++)
{
rcv_dat[j]=SBUF;
}
if((rcv_dat[0]^rcv_dat[1]^
rcv_dat[2]^rcv_dat[3]^rcv_dat[4]
^rcv_dat[5]^rcv_dat[7]^rcv_dat[9])==rcv_dat[10])
{
Receive_Bflag = 1;
RI=0; //清标志位
ES=0;//关中断,数据发送完成以后再开中断
}
}
}
}
//********************************************//
// 串口2中断服务
//********************************************//
void Com2_Service(void) interrupt 8
{
sendString(rcv_dat);
IE2=0x01;
}
//******************************************//
// 主程序 //
//******************************************//
void main()
{
LCD_INIT();
AD_init();
UART_init();
UartInit2();
EA=1;//开总中断
while(1)
{
Printf_Decimal(Result_Calculate());
if(Receive_Bflag)
{
Printf_commdata(COM_datdeal());
Receive_Bflag = 0;
ES=1;
}
}
}
帮小弟看下程序i吧谢谢
#include <STC12C5A60S2.h>
#include <intrins.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
uint i,t,num1;
uchar j;
//1602设置
void UART_init(void);
void Receive(void);
void Write_str( uchar *p );
int COM_datdeal(void);
double Result_Calculate();
//串口设置
uchar rcv_dat[11]; //连续输出A通道9字节16进制显示数据
uchar Receive_Bflag = 0; //正在接送标志
//**********************************//
// 串口1初始化 //
//**********************************//
void UART_init(void)
{
PCON &= 0x7f; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xbf; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xfe; //串口1选择定时器1为波特率发生器
TMOD &= 0x0f; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
IP = 0X10; //PS = 1;串口1中断为最高优先级中断
ES = 1; //允许串口中断
EA = 1; //开总中断
}
//***********************************************//
// 串口2初始化
//**********************************************//
void UartInit2(void) [url=]//9600bps@11.0592MHz[/url]
{
AUXR &= 0xf7; //波特率不倍速
S2CON = 0x50; //8位数据,可变波特率
BRT = 0xDC; //设定独立波特率发生器重装值
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
AUXR |= 0x10; //启动独立波特率发生器
IE2=0x01; //允许串口2中断ES2=1
EA=1; //开总中断
}
//************************************************//
// 串口2发送数据 //
//************************************************//
void sendoneByte(uchar c)
{
uchar temp=0;
IE2=0x00;//关闭串口2中断ES=0
S2CON =S2CON&0xFD;//TI=0
S2BUF=c;
do
{
temp=S2CON;
temp=temp&0x02;
}while(temp==0);
S2CON =S2CON&0xFD;//TI=0清零串口发送完成标志
IE2=0x01;//允许串口2中断ES2=1
}
void sendString(uchar *aaa)
{
while(*aaa!='\0')
{
sendoneByte(*aaa);
aaa++;
}
}
//***********************************************//
// 串口1数据处理 //
//***********************************************//
int COM_datdeal(void)
{
int COM_result;
uchar *p1,*p2;
*p1= rcv_dat[7];
*p2= rcv_dat[8];
COM_result=atoi(p1)*100+atoi(p2);
return COM_result;
}
void Printf_commdata(int n)
{
uchar scoom[5] = {0,0,0,0,103};
scoom[0]= n/1000;
scoom[1]= n%1000/100;
scoom[2]= n%100/10;
scoom[3]= n%10;
WRITE_CMD(0x80+0x08);
Write_str(scoom);
}
//***********************************************//
// 串口1中断服务 //
//***********************************************//
void Com_Service(void) interrupt 4
{
uchar j;
if(RI)
{
rcv_dat[0]=SBUF;
if(rcv_dat[0]==0x05)
{
for(j=1;j<11;j++)
{
rcv_dat[j]=SBUF;
}
if((rcv_dat[0]^rcv_dat[1]^
rcv_dat[2]^rcv_dat[3]^rcv_dat[4]
^rcv_dat[5]^rcv_dat[7]^rcv_dat[9])==rcv_dat[10])
{
Receive_Bflag = 1;
RI=0; //清标志位
ES=0;//关中断,数据发送完成以后再开中断
}
}
}
}
//********************************************//
// 串口2中断服务
//********************************************//
void Com2_Service(void) interrupt 8
{
sendString(rcv_dat);
IE2=0x01;
}
//******************************************//
// 主程序 //
//******************************************//
void main()
{
LCD_INIT();
AD_init();
UART_init();
UartInit2();
EA=1;//开总中断
while(1)
{
Printf_Decimal(Result_Calculate());
if(Receive_Bflag)
{
Printf_commdata(COM_datdeal());
Receive_Bflag = 0;
ES=1;
}
}
}
看什么,有什么问题
我的串口2接收不到数据
这个不错,多谢小编
。。无语