找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2171|回复: 5
打印 上一主题 下一主题
收起左侧

求助一段单片机代码 中断套中断的

[复制链接]
跳转到指定楼层
楼主
ID:209822 发表于 2017-6-28 22:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码目的:单片机通过定时器0产生中断 ,定时发送串口数据并接受返回值 通过判断返回值来判断SIM900a模块工作状态,通过检测LED5亮 否则LED5熄 ,但是总是不知道哪里的问题 达不到效果,请大神们指教 单片机爱好者 初学 谢谢!代码如下:
  1. #include <reg52.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #define Buf_Max 90
  5. unsigned char i = 0;           
  6. unsigned char T0RL =0;
  7. unsigned char T0RH =0;
  8. xdata unsigned char Rec_Buf[Buf_Max];   

  9. void init(void);
  10. void GSM_Call(unsigned char *num)
  11. void Delay_ms(unsigned int time);
  12. void CLR_Buf(void);//Çå3y»o′æ
  13. void Send_ASCII(unsigned char *b);
  14. void Send_Hex(unsigned char c);  
  15. void work_test(void);
  16. void ConfigTimer0(unsigned int ms);
  17. void ConfigUART(unsigned int baud);

  18.         
  19. char code num[]="xxxxxxxxxx";

  20. sbit key1=P1^1;
  21. sbit LED5=P1^5;

  22. void main(void)
  23. {
  24.         EA = 1;   
  25.         ConfigUART(9600);
  26.         ConfigTimer0(20);
  27.         CLR_Buf();   
  28.         Delay_ms(3000);
  29.         
  30.         while(1)
  31.         {                        
  32.                 if(key1==0)
  33.                 {
  34.                         Delay_ms(20)
  35.                         if(key1==0)
  36.                         {
  37.                                 GSM_Call(num);
  38.                                 Delay_ms(1000);
  39.                         }               
  40.                 }
  41.   }

  42. }
  43. void GSM_Call(unsigned char *num)
  44. {
  45.         Send_ASCII("ATD");        
  46.         Send_ASCII(num);
  47.         Send_ASCII(";");
  48.   Send_Hex(0x0d);
  49.         Send_Hex(0x0a);
  50.         Delay_ms(200)
  51. }
  52. //oáÃëÑóê±oˉêy
  53. void Delay_ms(unsigned int time)
  54. {
  55.         unsigned int i;
  56.         for(;time>0;time--)
  57.         {
  58.                 i=125;
  59.                 while(i--);
  60.         }

  61. }

  62. void CLR_Buf(void)
  63. {
  64.         unsigned char k;
  65.     for(k=0;k<Buf_Max;k++)
  66.             {
  67.                         Rec_Buf[k] = 0;
  68.                 }
  69.     i = 0;                 
  70. }

  71. void Send_Hex(unsigned char c)         
  72. {
  73.     ES = 0;           
  74.     SBUF = c;
  75.     while(TI!=1);     
  76.     TI = 0;            
  77.           ES = 1;            
  78. }

  79. void Send_ASCII(unsigned char *b)         
  80. {
  81.   ES = 0;                 
  82.     for (b; *b!='\0';b++)
  83.             {
  84.                 SBUF = *b;
  85.                 while(TI!=1);   
  86.                         TI = 0;         
  87.                 }           
  88.         ES = 1;               

  89. }

  90. void work_test(void)
  91. {

  92.                 Send_ASCII("AT")
  93.           Send_Hex(0x0d);
  94.           Send_Hex(0x0a);
  95.                 Delay_ms(2000);  
  96.         if(strstr(Rec_Buf,"OK")!=NULL)
  97.                
  98.         {
  99.                 CLR_Buf();
  100.         
  101.                 //LED2=0;
  102.         
  103.                 Send_ASCII("AT+CPIN?")
  104.                 Send_Hex(0x0d);
  105.                 Send_Hex(0x0a);
  106.                 Delay_ms(2000);        
  107.                 if(strstr(Rec_Buf,"+CPIN")!=NULL&&strstr(Rec_Buf,"OK")!=NULL)
  108.                 {                                
  109.                                 CLR_Buf();                        
  110.                         //        LED3=0;
  111.                                 
  112.                                 Send_ASCII("AT+CSQ")
  113.                                 Send_Hex(0x0d);
  114.                                 Send_Hex(0x0a);
  115.                                 Delay_ms(2000);
  116.                                 if(strstr(Rec_Buf,"OK")!=NULL)
  117.                                 {
  118.                                         CLR_Buf();
  119.                                 //        LED4=0;
  120.                                         Send_ASCII("AT+CREG?")
  121.                                         Send_Hex(0x0d);
  122.                                         Send_Hex(0x0a);
  123.                                         Delay_ms(2000);
  124.                                         if(strstr(Rec_Buf,"0")!=NULL&&strstr(Rec_Buf,"1")!=NULL&&strstr(Rec_Buf,"OK")!=NULL)
  125.                                         {
  126.                                                 
  127.                                                 CLR_Buf();
  128.                                                 Delay_ms(1000);               
  129.                                                 LED5 = 0;
  130.                                         }
  131.                                 }
  132.                 }
  133.         }else LED5 = 1;
  134. }
  135. void ConfigUART(unsigned int baud)
  136. {
  137.     SCON  = 0x50;
  138.     TMOD &= 0x0F
  139.     TMOD |= 0x20
  140.     TH1 = 256 - (11059200/12/32)/baud
  141.     TL1 = TH1;
  142.     ET1 = 0;     
  143.     ES  = 1;   
  144.     TR1 = 1;     
  145. }
  146. void ConfigTimer0(unsigned int ms)
  147. {
  148.     unsigned long tmp

  149.     tmp = 11059200 / 12;   
  150.     tmp = (tmp * ms) / 1000
  151.     tmp = 65536 - tmp;     
  152.     tmp = tmp + 18;         
  153.     T0RH = (unsigned char)(tmp>>8);
  154.     T0RL = (unsigned char)tmp;
  155.     TMOD &= 0xF0;
  156.     TMOD |= 0x01;
  157.     TH0 = T0RH;   
  158.     TL0 = T0RL;
  159.     ET0 = 1;      
  160.     TR0 = 1;     
  161. }
  162. void InterruptTimer0() interrupt 1
  163. {
  164. static unsigned int cnt = 0;
  165.         TH0 = T0RH;
  166.         TL0 = T0RL;
  167.         cnt++;
  168.         if(cnt ==50)
  169.         {
  170.                 work_test();
  171.         }
  172.         if(cnt ==800)
  173.         cnt =0;

  174. }
  175. void tinit() interrupt 4
  176. {        
  177.         ES = 0;
  178.         if(TI)
  179.                 {
  180.                         TI = 0
  181.                 }
  182.         if(RI)
  183.                 {
  184.                         RI = 0
  185.                         Rec_Buf[i] = SBUF
  186.                         i++;            
  187.                         if(i>90)      
  188.                                 {
  189.                                         i = 0;
  190.                                 }
  191.                 }
  192.         ES = 1;
  193. }
复制代码

评分

参与人数 1黑币 +1 收起 理由
5664645345 + 1 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:209822 发表于 2017-6-28 23:16 | 只看该作者
求大神指点  在线等
回复

使用道具 举报

板凳
ID:209822 发表于 2017-6-29 09:56 | 只看该作者
这么大的论坛有人懂的吗
回复

使用道具 举报

地板
ID:215758 发表于 2017-6-29 11:13 | 只看该作者
你就不能加点备注么?好难审阅啊
回复

使用道具 举报

5#
ID:123289 发表于 2017-7-1 01:27 | 只看该作者
1、达不到效果,已达到了什么程序呢?
2、串行数据丢失风险大,其中断优先级可以考虑设置为最高。
3、中断服务程序要尽可能“小”少用时间,以防妨碍其它低级别的中断。所以,中断事件尽可不要在中断服务程序中处理,而是做个“记号”,让事件在主程序中进行依“记号”处理。
回复

使用道具 举报

6#
ID:82765 发表于 2017-7-1 08:57 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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