找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2471|回复: 0
收起左侧

STC_12C5A60S2和W77E58 双串口程序,代码

[复制链接]
ID:103513 发表于 2016-1-16 23:03 | 显示全部楼层 |阅读模式
/****************************************************************/
/* 煜:根据“ 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 这里下载.
/*
/***************************************************************/

  1. #include<12C5A60S2.h>
  2. #include<stdio.h>     //输入输出函数,要用到printf
  3. #include<string.h>     //字符串函数
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define Buf_Max 40
  7. #define Buf_Max_one 40
  8. #define Delay_Time 600
  9.          //引脚
  10. sbit M33_on=P1^0;     //M33启动信号脚  
  11. sbit H_rd=P3^7;      //RD_即OE脚   H_表示跟SRAM 相关 外部数据存储器_读选通
  12. sbit H_wr=P3^6;      //we_即WR脚        外部数据存储器_写选通
  13. //sbit H_oe=       //ds1250存储器,不需要?
  14. sbit H_ale=P3^0;     //74H573



  15. uchar i;
  16. uchar  Rec_Buf[]={"hello! Jim\n"};
  17. uchar  Rec_Buf_one[]={"Buf_CK_one\n"};

  18. /****************************************************************/
  19. /* 函数声明
  20. /*
  21. /*
  22. /***************************************************************/
  23. void Delay_ms(unsigned int time);
  24. void Init(void);
  25. void Serial_Iint(void);
  26. void Serial_Iint_one(void);
  27. void Send_Char(uchar a);
  28. void Send_Char_one(uchar a);
  29. void Send_String(uchar *tab);
  30. void Send_String_one(uchar *tab);
  31. bit HanChun(unsigned char *a);
  32. void CLR_Buf(void);
  33. void CLR_Buf_one(void);

  34. /****************************************************************/
  35. /* 函数
  36. /*
  37. /*
  38. /***************************************************************/
  39. void Delay_ms(unsigned int time)
  40. {
  41. unsigned int i_c;
  42. for(;time>0;time--)
  43. {
  44.   i_c=600;      //1T单片机i=600,若是12T单片机i=125
  45.   while(i_c--);
  46. }
  47. }
  48. /****************************************************************/
  49. /* 主函数
  50. /*
  51. /*
  52. /***************************************************************/
  53. void main(void)   
  54. {
  55. Init();        //P端口初始化为低电平 //影响第2串口_发送不成功;why        
  56.   
  57. M33_on=1;Delay_ms(5000);   //点火信号__M33_开机_拉低500ms_开机  12C的速度快3倍左右,故延时3倍时间
  58. M33_on=0;Delay_ms(800);
  59. M33_on=1;Delay_ms(500);
  60. Delay_ms(1000); Delay_ms(1000); Delay_ms(1000);

  61. TI=1;        //把TI置位1次,才能使用printf。
  62. S2CON&=0xFF;        //把TI置位1次,才能使用printf。

  63. Serial_Iint();

  64. Send_String("AT\n"); Delay_ms(500);     //发送握手指令,
  65. Send_String_one("AT\n");Delay_ms(500);     //发送握手指令,
  66. Send_String("AT\n"); Delay_ms(500);     //发送握手指令,
  67. Send_String_one("AT\n");Delay_ms(500);     //发送握手指令,
  68. Send_String("AT\n"); Delay_ms(500);     //发送握手指令,
  69. Send_String_one("AT\n");Delay_ms(500);     //发送握手指令,
  70.   //Send_Char(0x0d);    //回车
  71.   //Send_Char(0x0a);    //换行
  72.   Delay_ms(500);
  73. /*
  74. while(!HanChun("OK"))    //等待回应->握手成功
  75. {
  76.   //Send_String("AT\r\n");  //AT没发成功的话,再次发送
  77.   Send_String("AT");    //AT没发成功的话,再次发送
  78.    //Send_String("AT");   //发送联机指令 //或者用Send_String函数
  79.    Send_Char(0x0d);    //发送回车符   
  80.    Send_Char(0x0a);    //发送换行符
  81.    Delay_ms(60000);
  82. }
  83. CLR_Buf();       //清除缓存区内容
  84. */

  85. Send_String("AT+CPMS=\"MT\",\"MT\",\"MT\"\n");  //短信操作都在MT(模块终端)中进行 //1MT_读取/删除 2MT_写入/发送 3MT_接收并储存位置
  86. Delay_ms(500);
  87. Send_String_one("AT+CPMS=\"MT\",\"MT\",\"MT\"\n");  
  88.   //while(!HanChun("OK"));   //等待设置成功
  89.   //CLR_Buf();      //清除缓存内容
  90. Delay_ms(2000);
  91. Send_String("AT+CNMI=2,1\n");    //设置当有新短信到来时提示
  92. Send_String_one("AT+CNMI=2,1\n");   
  93.    
  94.   //while(!HanChun("OK"));      
  95.   //CLR_Buf();               
  96. Delay_ms(2000);
  97.    
  98. Send_String("AT+CMGF=0\n");    //消息格式 0_PDU模式 1_文本(TEXT)模式
  99. Send_String_one("AT+CMGF=0\n");      
  100.   //while(!HanChun("OK"));      
  101.   //CLR_Buf();
  102. Delay_ms(2000);


  103. while(1)
  104. {
  105.   Send_String(Rec_Buf);   //从串口发送出去
  106.   Delay_ms(1000);
  107.   
  108.   Send_String_one(Rec_Buf_one); //从(第2)串口发送出去
  109.   Delay_ms(1000);

  110. }
  111. }
  112. void Init(void)
  113. {
  114. P0=0x00;
  115. P1=0x0c;       //得设为0x0c;即避开串口脚,不能把串口脚设为低电平,否则第2串口不能发送
  116. P2=0x00;
  117. }


  118. bit HanChun(unsigned char *a)   //串口0_判断缓存中是否有指定的字符串 ,有时_返回1
  119. {          //祥
  120. if(strstr(Rec_Buf,a)!=NULL)   //如果Rec_Buf包含了a,则为1;否则为0
  121.    return 1;
  122. else
  123.    return 0;
  124. }
  125. /****************************************************************/
  126. /* 串口0(即烧写口)
  127. /*
  128. /*
  129. /***************************************************************/
  130. void Serial_Iint(void)     //已修正,可行
  131. {
  132.     TMOD = 0x20;    //定时器1工作在方式2  8位自动重装
  133.     SCON = 0x50;    //串口1工作在方式1  10位异步收发 REN=1允许接收
  134.     //TH1 = 0xFA;  //定时器1初值
  135.     TH1 = 0xFD;  //定时器1初值
  136.     TL1 = TH1;
  137.     TR1 = 1;  //定时器1开始计数
  138.     EA =1;   //开总中断
  139.     ES =1;   //开串口1中断
  140.     S2CON = 0x50;   //串口2工作在方式1  10位异步收发 S2REN=1允许接收
  141.     //BRT = 0xFA;  //独立波特率发生器初值
  142.     BRT = 0xFD;  //独立波特率发生器初值
  143.     AUXR = 0x10;    //BRTR=1 独立波特率发生器开始计数
  144.     IE2 =0x01;  //开串口2中断  ES2=1
  145. }
  146. //------------------------------------------------------
  147. void Send_Char(uchar a) //*******************发送一个字符
  148. {
  149. ES=0;
  150. SBUF=a;
  151. Delay_ms(200);
  152. while(!TI);   //等待TI变为1
  153. TI=0;    //TI清0
  154. ES=1;
  155. }
  156. void Send_String(uchar *tab)//*******************发送一个字符串
  157. {
  158. ES=0;
  159. while(*tab!='\0')
  160. {
  161.   Send_Char(*tab++);
  162. }
  163. ES=1;
  164. }
  165. void CLR_Buf(void)      //清除缓存区内容
  166. {
  167. unsigned char k;
  168. for(k=0;k<Buf_Max;k++)   
  169. {
  170.     Rec_Buf[k]=0;
  171. }
  172. i=0;             //接收字符串的起始存储位置
  173. }
  174. void Serial_Int(void) interrupt 4 //********************串口1中断函数
  175. {
  176. ES=0;   //关串口中断,防止中断的嵌套
  177. if(TI)   //如果是串口1发送中断(TI)不进行处理
  178. {
  179.   TI=0;  //TI清0
  180. }
  181. if(RI)   
  182. {
  183.   RI=0;  //RI清0
  184.   Rec_Buf[i]=SBUF;
  185.   i++;
  186.   if(i>Buf_Max)
  187.   {
  188.    i=0;
  189.   }
  190. }
  191. ES=1;   //开启串口中断
  192. }

  193. /****************************************************************/
  194. /* 串口2(即第2串口)
  195. /*
  196. /*
  197. /***************************************************************/
  198. void Send_Char_one(uchar a)   //*******************发送一个字符
  199. {
  200. IE2=0x00;
  201. S2BUF=a;
  202. Delay_ms(200);
  203. while(!(S2CON&0x02));   //while(!S2TI) 等待S2TI变为1
  204. S2CON&=0xFD;     //S2TI清0
  205. IE2=0x01;
  206. }
  207. void Send_String_one(uchar *tab) //*******************发送一个字符串
  208. {
  209. IE2=0x00;
  210. while(*tab!='\0')
  211. {
  212.   Send_Char_one(*tab++);
  213. }
  214. IE2=0x01;
  215. }
  216. void CLR_Buf_one(void)      //清除缓存区内容
  217. {
  218. unsigned char k;
  219. for(k=0;k<Buf_Max;k++)   
  220. {
  221.     Rec_Buf_one[k]=0;
  222. }
  223. i=0;             //接收字符串的起始存储位置
  224. }
  225. void Serial_Int_one(void) interrupt 8 //********************串口2中断函数
  226. {
  227. IE2=0x00;      //关串口中断,防止中断的嵌套
  228. if(S2CON&0x02)     //如果是串口2发送中断(S2TI)不进行处理
  229. {
  230.   S2CON&=0xFD;    //S2TI清0
  231. }
  232. if(S2CON&0x01)   
  233. {
  234.   S2CON&=0xFE;    //S2RI清0
  235.   Rec_Buf_one[i]=S2BUF;
  236.   i++;
  237.   if(i>Buf_Max_one)
  238.   {
  239.    i=0;
  240.   }
  241. }
  242. IE2=0x01;      //开启串口中断
  243. }
复制代码




评分

参与人数 1黑币 +5 收起 理由
阿拉灯神丁 + 5 很给力!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表