标题:
STC_12C5A60S2和W77E58 双串口程序,代码
[打印本页]
作者:
51黑芯片
时间:
2016-1-16 23:03
标题:
STC_12C5A60S2和W77E58 双串口程序,代码
/****************************************************************/
/* 煜:根据“ 2016-12-4”
/*
http://www.51hei.com/mcu/3297.html
STC12串口1(独立波特率发生器)使用
/*
http://www.51hei.com/mcu/3298.html
STC12单片机串口2的应用
/* 自整合
/*
/*
/* stc12c5a.h stc12的头文件从:
http://www.51hei.com/mcu/3282.html
这里下载.
/*
/***************************************************************/
#include<12C5A60S2.h>
#include<stdio.h> //输入输出函数,要用到printf
#include<string.h> //字符串函数
#define uchar unsigned char
#define uint unsigned int
#define Buf_Max 40
#define Buf_Max_one 40
#define Delay_Time 600
//引脚
sbit M33_on=P1^0; //M33启动信号脚
sbit H_rd=P3^7; //RD_即OE脚 H_表示跟SRAM 相关 外部数据存储器_读选通
sbit H_wr=P3^6; //we_即WR脚 外部数据存储器_写选通
//sbit H_oe= //ds1250存储器,不需要?
sbit H_ale=P3^0; //74H573
uchar i;
uchar Rec_Buf[]={"hello! Jim\n"};
uchar Rec_Buf_one[]={"Buf_CK_one\n"};
/****************************************************************/
/* 函数声明
/*
/*
/***************************************************************/
void Delay_ms(unsigned int time);
void Init(void);
void Serial_Iint(void);
void Serial_Iint_one(void);
void Send_Char(uchar a);
void Send_Char_one(uchar a);
void Send_String(uchar *tab);
void Send_String_one(uchar *tab);
bit HanChun(unsigned char *a);
void CLR_Buf(void);
void CLR_Buf_one(void);
/****************************************************************/
/* 函数
/*
/*
/***************************************************************/
void Delay_ms(unsigned int time)
{
unsigned int i_c;
for(;time>0;time--)
{
i_c=600; //1T单片机i=600,若是12T单片机i=125
while(i_c--);
}
}
/****************************************************************/
/* 主函数
/*
/*
/***************************************************************/
void main(void)
{
Init(); //P端口初始化为低电平 //影响第2串口_发送不成功;why
M33_on=1;Delay_ms(5000); //点火信号__M33_开机_拉低500ms_开机 12C的速度快3倍左右,故延时3倍时间
M33_on=0;Delay_ms(800);
M33_on=1;Delay_ms(500);
Delay_ms(1000); Delay_ms(1000); Delay_ms(1000);
TI=1; //把TI置位1次,才能使用printf。
S2CON&=0xFF; //把TI置位1次,才能使用printf。
Serial_Iint();
Send_String("AT\n"); Delay_ms(500); //发送握手指令,
Send_String_one("AT\n");Delay_ms(500); //发送握手指令,
Send_String("AT\n"); Delay_ms(500); //发送握手指令,
Send_String_one("AT\n");Delay_ms(500); //发送握手指令,
Send_String("AT\n"); Delay_ms(500); //发送握手指令,
Send_String_one("AT\n");Delay_ms(500); //发送握手指令,
//Send_Char(0x0d); //回车
//Send_Char(0x0a); //换行
Delay_ms(500);
/*
while(!HanChun("OK")) //等待回应->握手成功
{
//Send_String("AT\r\n"); //AT没发成功的话,再次发送
Send_String("AT"); //AT没发成功的话,再次发送
//Send_String("AT"); //发送联机指令 //或者用Send_String函数
Send_Char(0x0d); //发送回车符
Send_Char(0x0a); //发送换行符
Delay_ms(60000);
}
CLR_Buf(); //清除缓存区内容
*/
Send_String("AT+CPMS=\"MT\",\"MT\",\"MT\"\n"); //短信操作都在MT(模块终端)中进行 //1MT_读取/删除 2MT_写入/发送 3MT_接收并储存位置
Delay_ms(500);
Send_String_one("AT+CPMS=\"MT\",\"MT\",\"MT\"\n");
//while(!HanChun("OK")); //等待设置成功
//CLR_Buf(); //清除缓存内容
Delay_ms(2000);
Send_String("AT+CNMI=2,1\n"); //设置当有新短信到来时提示
Send_String_one("AT+CNMI=2,1\n");
//while(!HanChun("OK"));
//CLR_Buf();
Delay_ms(2000);
Send_String("AT+CMGF=0\n"); //消息格式 0_PDU模式 1_文本(TEXT)模式
Send_String_one("AT+CMGF=0\n");
//while(!HanChun("OK"));
//CLR_Buf();
Delay_ms(2000);
while(1)
{
Send_String(Rec_Buf); //从串口发送出去
Delay_ms(1000);
Send_String_one(Rec_Buf_one); //从(第2)串口发送出去
Delay_ms(1000);
}
}
void Init(void)
{
P0=0x00;
P1=0x0c; //得设为0x0c;即避开串口脚,不能把串口脚设为低电平,否则第2串口不能发送
P2=0x00;
}
bit HanChun(unsigned char *a) //串口0_判断缓存中是否有指定的字符串 ,有时_返回1
{ //祥
if(strstr(Rec_Buf,a)!=NULL) //如果Rec_Buf包含了a,则为1;否则为0
return 1;
else
return 0;
}
/****************************************************************/
/* 串口0(即烧写口)
/*
/*
/***************************************************************/
void Serial_Iint(void) //已修正,可行
{
TMOD = 0x20; //定时器1工作在方式2 8位自动重装
SCON = 0x50; //串口1工作在方式1 10位异步收发 REN=1允许接收
//TH1 = 0xFA; //定时器1初值
TH1 = 0xFD; //定时器1初值
TL1 = TH1;
TR1 = 1; //定时器1开始计数
EA =1; //开总中断
ES =1; //开串口1中断
S2CON = 0x50; //串口2工作在方式1 10位异步收发 S2REN=1允许接收
//BRT = 0xFA; //独立波特率发生器初值
BRT = 0xFD; //独立波特率发生器初值
AUXR = 0x10; //BRTR=1 独立波特率发生器开始计数
IE2 =0x01; //开串口2中断 ES2=1
}
//------------------------------------------------------
void Send_Char(uchar a) //*******************发送一个字符
{
ES=0;
SBUF=a;
Delay_ms(200);
while(!TI); //等待TI变为1
TI=0; //TI清0
ES=1;
}
void Send_String(uchar *tab)//*******************发送一个字符串
{
ES=0;
while(*tab!='\0')
{
Send_Char(*tab++);
}
ES=1;
}
void CLR_Buf(void) //清除缓存区内容
{
unsigned char k;
for(k=0;k<Buf_Max;k++)
{
Rec_Buf[k]=0;
}
i=0; //接收字符串的起始存储位置
}
void Serial_Int(void) interrupt 4 //********************串口1中断函数
{
ES=0; //关串口中断,防止中断的嵌套
if(TI) //如果是串口1发送中断(TI)不进行处理
{
TI=0; //TI清0
}
if(RI)
{
RI=0; //RI清0
Rec_Buf[i]=SBUF;
i++;
if(i>Buf_Max)
{
i=0;
}
}
ES=1; //开启串口中断
}
/****************************************************************/
/* 串口2(即第2串口)
/*
/*
/***************************************************************/
void Send_Char_one(uchar a) //*******************发送一个字符
{
IE2=0x00;
S2BUF=a;
Delay_ms(200);
while(!(S2CON&0x02)); //while(!S2TI) 等待S2TI变为1
S2CON&=0xFD; //S2TI清0
IE2=0x01;
}
void Send_String_one(uchar *tab) //*******************发送一个字符串
{
IE2=0x00;
while(*tab!='\0')
{
Send_Char_one(*tab++);
}
IE2=0x01;
}
void CLR_Buf_one(void) //清除缓存区内容
{
unsigned char k;
for(k=0;k<Buf_Max;k++)
{
Rec_Buf_one[k]=0;
}
i=0; //接收字符串的起始存储位置
}
void Serial_Int_one(void) interrupt 8 //********************串口2中断函数
{
IE2=0x00; //关串口中断,防止中断的嵌套
if(S2CON&0x02) //如果是串口2发送中断(S2TI)不进行处理
{
S2CON&=0xFD; //S2TI清0
}
if(S2CON&0x01)
{
S2CON&=0xFE; //S2RI清0
Rec_Buf_one[i]=S2BUF;
i++;
if(i>Buf_Max_one)
{
i=0;
}
}
IE2=0x01; //开启串口中断
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1