/*-----------------------------------------------
名称:串口通信
内容:连接好串口或者usb转串口至电脑,下载该程序,打开电源
打开串口调试程序,将波特率设置为9600,无奇偶校验
晶振11.0592MHz,发送和接收使用的格式相同,如都使用
字符型格式,按复位重启程序,可以看到接收到 UART test, 请在发送区输入任意信
然后在发送区发送任意信息,接收区返回同样信息,表明串口收发无误
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
u8 xdata buf[10]={1,2,3,4,5,6,7,8,9,0xA};
u8 code buf1[10]={1,2,3,4,5,6,7,8,9,0xA};
sbit k1=P1^4;
sfr P4 =0Xe8;
sbit P4_0 = P4^0;
unsigned char Temp[];
u8 flag;
u8 i ;
bit ready=0;
j=0x00;
unsigned char gotData[9];
u8 jscos,jk;
/*------------------------------------------------
函数声明
------------------------------------------------*/
void SendStr(unsigned char *s);
void Send_data();
void delaynms(unsigned int di) //延时
{
unsigned int da,db;
for(da=0;da<di;da++)
for(db=0;db<10;db++);
}
/*------------------------------------------------
串口初始化
------------------------------------------------*/
void InitUART (void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
// // TMOD: timer 1, mode 2, 8-bit 重装
TMOD |= 0x21; //T1方式2、T0方式1
TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
TL1 = 0xfd; //波特率
TR1 = 1; // TR1: timer 1 打开
IE |= 0x92; //开启中断
EA = 1; //打开总中断
ES = 1; //打开串口中断
}
void Init_Timer1(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH1=(65535-20000)/256;
TL1=(65535-20000)%256;
EA=1; //总中断打开
ET1=1; //定时器中断打开
TR1=1; //定时器开关打开
}
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
u8 i;
InitUART();
Init_Timer0();
//SendStr("UART test,请在发送区输入任意信息");
Init_Timer1();
//打开串口中断
while (1)
{
if( flag)
{
for(i=0;i<9;i++)
{
SBUF= gotData[ i];
while(!TI);TI=0;
}
if(gotData[0]==0xFF)
{
// P4_0=!P4_0;
jk=1;
}
flag=0;
}
if(jscos==1)
{
Send_data();
jscos=0;
}
}
}
void Send_data()
{ u8 l;
for(l=0;l<10;l++)
{
SBUF=buf1[l];
while(!TI);
TI = 0;
}
}
/*------------------------------------------------
发送一个字节
------------------------------------------------*/
void SendByte(unsigned char buf1)
{
SBUF = buf1;
while(!TI);
TI = 0;
}
/*------------------------------------------------
发送一个字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾
{
SendByte(s);
s++;
}
}
void timer0(void) interrupt 1
{
static u16 count;
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
// TR0 = 0; //关闭T0
j = i; //暂存接收到的数据帧长度
i = 0x00; //长度清零
ready = 1; //置位接收完成标志
if (count >500&&jk==1)
{
// LED = ~LED;
// P4_0=!P4_0; count = 0;
jscos=1;
}
count ++;
}
void timer1(void) interrupt 3
{
static u16 count;
TH1=(65535-20000)/256;
TL1=(65535-20000)%256;
// TR0 = 0; //关闭T0
j = i; //暂存接收到的数据帧长度
i = 0x00; //长度清零
ready = 1; //置位接收完成标志
//
if(count>15000)
{
count=0; P4_0=!P4_0;
}
count++;
}
/* void Timer0_isr(void) interrupt 1 using 1
{
TH0=0x00; //重新赋值
TL0=0x00;
LED=~LED; //指示灯反相,可以看到闪烁
} */
/*------------------------------------------------
串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
//定义临时变量
if(RI) //判断是接收中断产生
{
RI = 0; //清零接收中断标志位
TH0 = 0xf8;
TL0 = 0x2f; //2ms定时
TR0 = 1; //开启T0
gotData[i++] = SBUF; //读取收到的字节
}
if(i==9)
{
i=0;
flag=1;
}
}
|