微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于STC12C5A08S2串口初始化问题

关于STC12C5A08S2串口初始化问题

时间:10-02 整理:3721RD 点击:
我感觉是串口初始化问题,求高手给看看!我用的是上海万硅电子的板子!程序考进去没反应啊!
#include<STC12C5A08S2.h>
#include<string.h>
#include<stdio.h>
#define Buf_Max 60
#define Delay_Time 300
sbit LED1 = P0^0; //继电器状态指示灯1
sbit LED2 = P0^1; //状态指示灯2
sbit LED3 = P0^2; //状态指示灯3
sbit LED4 = P0^3; //状态指示灯4
sbit LED5 = P0^4;  //继电器5
sbit IGT=P1^0;

int Phone_num;
unsigned char  i = 0;               //定义缓存指针
unsigned char Rec_Buf[Buf_Max];    //定义缓存数组
void Serial_Init(void);            //声明串口初始化函数
void Send_ASCII(unsigned char *b); //声明发送字符(ASCII码)函数
void Delay_ms(unsigned int time);  //声明延时函数
void CLR_Buf(void);                                   //声明清除缓存内容       
void Send_Hex(unsigned char b);    //声明发送字符(十六进制)函数
bit  Hand(unsigned char *a);       //声明判断缓存中是否含有指定的字符串函数
int Phone_Number(void);//确定那个手机,并进行判断是否是指定手机
void Send_Class(int class);//向模块终端发送短信内容
void AT_CMGS(int Phone_num);        //向模块终端发送发短信指令

/**********************************主函数******************************/
void main(void)
{                       
                         LED1 =0; //开始均置低电平
                         LED2 =0;
                         LED3 =0;
                         LED4 =0;
                        LED5 =0;
                        IGT=0;
            Delay_ms(1000);        //延时
            IGT=1;
                Serial_Init();         //初始化串口
                        CLR_Buf();             //清除缓存内容
                while(!Hand("OK"))     //判断是否握手成功,如果不成功延时一会,再发送AT握手指令
                                {
                                        Send_ASCII("AT"); //发送联机指令
                        Send_Hex(0x0d);   //发送回车符   
                                        Send_Hex(0x0a);   //发送换行符
                                        Delay_ms(6000);   //延时
                                }
                        CLR_Buf();                //清除缓存内容
               
                       
               
                       
                        Delay_ms(Delay_Time);     //延时
                        Send_ASCII("AT+CNMI=2,1");//设置当有新短信到来时提示
                        Send_Hex(0x0d);           //发送回车符
                          Send_Hex(0x0a);           //发送换行符
                        Delay_ms(Delay_Time);     //延时
                        while(!Hand("OK"));       //等待设置成功
                        CLR_Buf();                //清除缓存内容
                                                          
                       
                        Delay_ms(Delay_Time);     //延时
       
                        Delay_ms(Delay_Time);     //延时
                        Send_ASCII("AT+CMGF=1");  //文本(TEXT)模式
                        Send_Hex(0x0d);           //发送回车符
                        Send_Hex(0x0a);           //发送换行符
                        Delay_ms(Delay_Time);     //延时
                        while(!Hand("OK"));              //等待设置成功
                        CLR_Buf();                //清除缓存内容
                                      
                        Delay_ms(Delay_Time);     //延时
                        Send_ASCII("AT+CMGD=1");  //删除第一条信息
                        Send_Hex(0x0d);           //发送回车符
                        Send_Hex(0x0a);           //发送换行符
                        Delay_ms(Delay_Time);     //延时
                        while(!Hand("OK"));              //等待设置成功
                        CLR_Buf();                //清除缓存内容
                                         
            Delay_ms(2000);
                        LED2=0;
                        while(1)
                        {
                     if(strstr(Rec_Buf,"+CMTI")!=NULL)    //若缓存字符串中含有"+CMTI"就表示有新的短信
                      {        LED1=0;
                                  CLR_Buf();                   //清除缓存内容
                                Delay_ms(Delay_Time);        //延时
                                Send_ASCII("AT+CMGR=1");     //发送读取信息指令
                            Send_Hex(0x0d);              //发送回车符
                                Send_Hex(0x0a);              //发送换行符
                                Delay_ms(Delay_Time);        //延时
                            while(!Hand("OK"));          //等待设置成功
                                LED3=0;
                            Phone_Number();
                                CLR_Buf();
                                Delay_ms(2000);
                                if(Phone_num)
                                 {
                                             if(strstr(Rec_Buf,"openled1")!=NULL)       //如果信息内容是"open1"
                                            {        LED1 = 1;          AT_CMGS(Phone_num);           //点亮LED1指示灯
                                                                Send_Hex(0x0d);           //发送回车符
                                                        Send_Hex(0x0a);           //发送换行符
                                                       while(!Hand(">"));
                                                                Send_ASCII("success");
                                                                Send_Hex(0x1a);       
                                                        }                        
                                            else if(strstr(Rec_Buf,"closeled1")!=NULL) //如果信息内容是"close1"
                                                        {        LED1 = 0;          AT_CMGS(Phone_num);           //关闭LED1指示灯
                                                                Send_Hex(0x0d);           //发送回车符
                                                        Send_Hex(0x0a);           //发送换行符
                                                       while(!Hand(">"));
                                                                Send_ASCII("failed");
                                                                Send_Hex(0x1a);       
                                                                }                                               //熄灭LED1指示灯
                                                               else if(strstr(Rec_Buf,"openled2")!=NULL)  //如果信息内容是"open2"
                                                                        {        LED2 = 1;          AT_CMGS(Phone_num);           //点亮LED1指示灯
                                                                                Send_Hex(0x0d);           //发送回车符
                                                                        Send_Hex(0x0a);           //发送换行符
                                                                       while(!Hand(">"));
                                                                                Send_ASCII("success");
                                                                                Send_Hex(0x1a);       
                                                                        }                                   //点亮LED2指示灯
                                                                else if(strstr(Rec_Buf,"closeled2")!=NULL) //如果信息内容是"close2"
                                                                    {        LED2 = 0;          AT_CMGS(Phone_num);           //关闭LED1指示灯
                                                                                        Send_Hex(0x0d);           //发送回车符
                                                                                Send_Hex(0x0a);           //发送换行符
                                                                               while(!Hand(">"));
                                                                                        Send_ASCII("failed");
                                                                                        Send_Hex(0x1a);       
                                                                                }                
                                  }
                                  else
                                  {                       
                                          AT_CMGS(Phone_num);
                                          Send_Hex(0x0d);           //发送回车符
                                      Send_Hex(0x0a);           //发送换行符
                                    while(!Hand(">"));
                                          Send_ASCII("You haven't authority");
                                          Send_Hex(0x1a);                                                                           
                                  }
                                 
                    Delay_ms(3000);           
                      CLR_Buf();
                        Phone_num=0;  
                        Delay_ms(1000);               
                        Delay_ms(Delay_Time);                   //延时
                        Send_ASCII("AT+CMGD=1");                //删除读取后的信息
                        Send_Hex(0x0d);                         //发送回车符
                        Send_Hex(0x0a);                         //发送换行符
                        Delay_ms(Delay_Time);                   //延时
                        while(!Hand("OK"));                            //等待设置成功
                        CLR_Buf();          
                        }
      }
}
/***************************串口初始化函数*****************************/
void Serial_Init(void)//串口初始化函数
{
SCON = 0x50;//串口:方式1,允许发送和接收
TMOD = 0x20;//定时器1:模式2,8位自动重装模式,用于产生波特率   
TH1 = 0xFD; //11.0592MHZ晶振,波特率为9600
TL1 = 0xFD;   
TR1 = 1;    //开启定时器1   
ES = 1;     //开启串口中断
EA = 1;     //开启全局中断
}
/****************************串口中断处理函数**************************/
void Serial_Int() interrupt 4
{       
        ES = 0;         //关串口中断,防止中断嵌套
        if(TI)         //如果是发送中断,则不做任何处理
                {
                        TI = 0;  //清除发送中断标志位
                }
        if(RI)         //如果是接送中断,则进行处理
                {
                        RI = 0; //清除接收中断标志位
                        Rec_Buf[i] = SBUF; //将接收到的字符串存到缓存中
                        i++;               //缓存指针向后移动
                        if(i>200)          //如果缓存满,将缓存指针指向缓存的首地址
                                {
                                        i = 0;
                                }
                }
        ES = 1;         //开启串口中断
}
/****************************发送字符(ASCII)函数***********************/
void Send_ASCII(unsigned char *b)         
{
    ES = 0;                   //关串口中断
    for (b; *b!='\0';b++)
            {
                SBUF = *b;
                while(TI!=1);     //等待发送完成
                        TI = 0;           //清除发送中断标志位
                }          
        ES = 1;                   //开串口中断
}
/****************************time ms延时函数***************************/
void Delay_ms(unsigned int time)
{
unsigned char j;
for(;time>0;time--)
        {
                  j = 1500;
                  while(j--);
        }
}
/**************************清除缓存数据函数****************************/
void CLR_Buf(void)
{
        unsigned char k;
    for(k=0;k<Buf_Max;k++)    //将缓存内容清零
            {
                        Rec_Buf[k] = 0;
                }
    i = 0;                    //接收字符串的起始存储位置
}
/*************************发送字符(十六进制)函数********************/
void Send_Hex(unsigned char c)         
{
    ES = 0;               //关串口中断
    SBUF = c;
    while(TI!=1);         //等待发送完成
    TI = 0;               //清除发送中断标志位
        ES = 1;               //开串口中断
}
/*****************判断缓存中是否含有指定的字符串函数******************/
bit Hand(unsigned char *a)
{
    if(strstr(Rec_Buf,a)!=NULL)
            return 1;
        else
                return 0;
}
/**************确定那个手机***************************************/
int Phone_Number(void)//确定那个手机,并进行判断是否是指定手机
{
if(Hand("15307736480"))
Phone_num=1;
  else if(Hand("13807839598"))
          Phone_num=2;
else Phone_num=0;
return Phone_num;
}
/***********************向模块终端发送短信内容***************************/
/*{
if(class==1)
Send_ASCII("Math");
else if(class==2)
Send_ASCII("Chinese");
else if(class==3)
Send_ASCII("English");
else if(class==4)
Send_ASCII("History");
else if(class==5)
Send_ASCII("PE");
else if(class==6)
Send_ASCII("Science");
else if(class==7)
Send_ASCII("Self-study");
else if(class==8)
Send_ASCII("Self-study");
else if(class==9)
Send_ASCII("Self-study");
}
*/
void AT_CMGS(int Phone_num)        //向模块终端发送发短信指令
{
  if(Phone_num==1)
  {Send_ASCII("AT+CMGF=1");  //文本(TEXT)模式
   Send_Hex(0x0d);           //发送回车符
   Send_Hex(0x0a);           //发送换行符
   Delay_ms(Delay_Time);     //延时
   while(!Hand("OK"));              //等待设置成功
   CLR_Buf();                //清除缓存内容
  Send_ASCII("AT+CMGS=15307736480");
  }
  else if(Phone_num==2)
  {       
   Send_ASCII("AT+CMGF=1");  //文本(TEXT)模式
   Send_Hex(0x0d);           //发送回车符
   Send_Hex(0x0a);           //发送换行符
   Delay_ms(Delay_Time);     //延时
   while(!Hand("OK"));              //等待设置成功
   CLR_Buf();
   Send_ASCII("AT+CMGS=13807839598");
   }
}/***

串口初始化的时候最好加一条
PCON = 0x00;   //不倍频
void Send_ASCII(unsigned char *b)         
{
    ES = 0;                   //关串口中断
    while(*b++ != '\0')            
            {
                SBUF = *b;
                while(TI!=1);     //等待发送完成
                        TI = 0;           //清除发送中断标志位
                }           
        ES = 1;                   //开串口中断
}

谢谢  我试试啊  昨天没登的 !

void Send_ASCII(unsigned char *b)         
{
    ES = 0;                   //关串口中断
    while(*b++ != '\0')            
            {
                SBUF = *b;
                while(TI!=1);     //等待发送完成
                        TI = 0;           //清除发送中断标志位
                }           
        ES = 1;                   //开串口中断
}那您加这段代码是?

它是靠串口2进行接收和发送的 怎么设置呢 ?

void Serial_Init(void)//串口初始化函数
{
SCON = 0x50;//串口:方式1,允许发送和接收
TMOD = 0x20;//定时器1:模式2,8位自动重装模式,用于产生波特率   
TH1 = 0xFD; //11.0592MHZ晶振,波特率为9600
TL1 = 0xFD;   
TR1 = 1;    //开启定时器1   
//ES = 1;     //开启串口中断
//EA = 1;     //开启全局中断
}
//以上经过证实可用

学习了,好东西。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top