3.15

本文介绍了一个基于51单片机的短信发送模块控制程序的设计与实现。该程序通过按键输入来编辑短信内容和电话号码,并利用AT指令进行短信的发送。程序还实现了LCD显示、键盘输入等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<reg52.h>
#include"./delay/delay.h"
#include"./lcd1602/lcd1602.h"
#include"./keyboard/keyboard.h"


#define Ubuf_Max 150   //´®¿Ú»º´æ³¤¶È


sbit Yellow_LED = P2^2; //LED1»ÆÉ«Ö¸Ê¾µÆ
sbit Green_LED  = P2^1; //LED2ÂÌɫָʾµÆ
sbit Red_LED    = P2^0; //LED3ºìɫָʾµÆ




xdata unsigned char Uart_Buf[Ubuf_Max];  //´®¿ÚÊý¾Ý»º³åÇø
unsigned char cnt = 0; //´®¿Ú½ÓÊÕ×Ö·û´®µÄÆðʼ´æ´¢Î»ÖÃ
unsigned char Message[16];   //¶ÌÐÅÄÚÈÝ
unsigned char Phone_Num[11];  //µç»°ºÅÂë




void Uart_init();
void Wait_CREG();
void Module_init();






/***************************************************************/
void Send_Hex(unsigned char c)   //·¢ËÍÊ®Áù½øÖÆ×Ö·û
{
     ES = 0;
  SBUF = c;
  while(TI != 1);   //µÈ´ý·¢ËÍÍê±Ï
  TI = 0;
ES = 1;
}


void Send_ASCII(unsigned char *b)   //·¢ËÍ×Ö·û£¨ASCII£©
{
  ES = 0;
  for(b;*b != '\0';b++)
  {
   SBUF = *b;
   while(TI != 1);
   TI = 0;
     }
ES = 1;
}




/********************************************************/
void Send_Enter()      //·¢ËÍ»»Ðлسµº¯Êý
{
     Send_Hex(0x0D);
  Send_Hex(0x0A);
}


void Clear_Ubuf()   //Çå³ý´®¿Ú»º´æÊý¾Ý
{
     unsigned int k;


  for(k = 0;k < Ubuf_Max;k++)
  {
      Uart_Buf[k] = 0x30;
  }
  cnt = 0;
}




void Send_Message()   //·¢ËͶÌÐÅ
{
  unsigned char i;
  Send_ASCII("AT+CMGS=\"+86");
  for(i = 0;i < 11;i++)
  {
   Send_Hex(Phone_Num[i]);
     }
Send_ASCII("\"");
  Send_Enter(); //·¢ËÍ»»Ðлسµ
  delay_ms(1000);
  Send_ASCII(Message); //·¢Ëͻظ´ÄÚÈÝ
//ÔÚÕâÀïÉèÖ÷¢ËÍÄÚÈÝ
  Send_Hex(0x1A); //·¢ËÍÊ®Áù½øÖÆÊý1A
  Send_Enter(); //·¢ËÍ»»Ðлسµ
  delay_ms(5000);
  Clear_Ubuf();
}


/********************************************************/
void main()
{
  unsigned char num,j;
  unsigned char i = 0,k = 0;
  unsigned char Mes_dat,Pho_dat;
  bit MOP_flag = 0;

     InitLcd1602(); 
     Uart_init();
  Wait_CREG();
  Module_init();

  Yellow_LED = 0;
  Green_LED = 0;
  Red_LED = 0;
 
  while(1)
{
   LcdShowStr(0,0,"Mes:");
   LcdShowStr(0,1,"Tel:");
   num = KeyPro();
   if(num != 0xff)
{
       if((num >= 0)&&(num <= 9))
{
  if(MOP_flag == 0)
{
      Message[i] = num + '0';
      Mes_dat = num + '0';
                       LcdShowDat(i+4,0,Mes_dat);
                       i++;
                   }
                   else 
{
  Phone_Num[k] = num + '0';
  Pho_dat = num + '0';
  LcdShowDat(k+4,1,Pho_dat);
                       k++;
                   }  
              }
else if(num == '+')
{
  if(MOP_flag == 0)
{
       MOP_flag = 1;
}
else
{
   MOP_flag = 0;
                   }
              }
else if(num == '=')
{
  Send_Message();
  MOP_flag = 0;
  delay_s(2);
                   LcdFullClear();
  LcdShowStr(0,0,"Send Succeed");   
  delay_s(2);
  LcdFullClear();
  LcdShowStr(0,0,"Mes:");
            LcdShowStr(0,1,"Tel:");
  i = 0;
  k = 0;
  for(j = 0;j < 16;j++)
  {
   Message[j] = '\0';
                   }
for(j = 0;j < 16;j++)
  {
   Phone_Num[j] = '\0';
                   }
              }
else if(num == '.')
{
  LcdFullClear();
  LcdShowStr(0,0,"Mes:");
            LcdShowStr(0,1,"Tel:");
  i = 0;
  k = 0;
  MOP_flag = 0;
  for(j = 0;j < 16;j++)
  {
   Message[j] = '\0';
                   }
for(j = 0;j < 16;j++)
  {
   Phone_Num[j] = '\0';
                   }
              }
else 
  break;
}
     }



/********************************************************/


void Uart_init() //´®¿Ú³õʼ»¯
{   
     SCON = 0x50;  //ÉèÖô®¿Ú¹¤×÷·½Ê½
  TMOD |= 0x20;
  TH1 = 0xFD;   //²¨ÌØÂÊ£º9600
  ET1 = 0;
  EA = 1;
  TR1 = 1;
  ES = 1;
}


void Wait_CREG() //µÈ´ýÄ£¿é×¢²á³É¹¦
{
     unsigned char i;
  unsigned int k;

  i = 0;
  Clear_Ubuf();
  while(i == 0)
{
   Clear_Ubuf();
   Send_ASCII("AT+CREG?");
   Send_Enter();
   delay_ms(1000);
   for(k = 0;k < Ubuf_Max;k++)
   {
  if(Uart_Buf[k] == ':')
{
   if((Uart_Buf[k+4] == '1')||(Uart_Buf[k+4] == '5'))
{
  i = 1;
  break;
                    }
               }
          }
     }
}


void Module_init()   // Ä£¿é³õʼ»¯
{
     Send_ASCII("ATE0");   //È¡Ïû»ØÏÔ
  Send_Enter();
     delay_ms(500);
  Send_ASCII("AT+CNMI=2,2");   //¶ÌÐŵ½À´Ê±Ö±½Óͨ¹ý´®¿ÚÊä³ö£¬²»×ö´æ´¢
  Send_Enter();
     delay_ms(500);
  Send_ASCII("AT+CMGF=1");    //TEXTģʽ
  Send_Enter();
     delay_ms(500);





/***************************************************************/
void  InterruptUART() interrupt 4
{
  ES = 0;       //¹Ø´®¿ÚÖжϣ¬·ÀÖ¹ÖжÏǶÌ×
  if(RI)
{
   RI = 0;
   Uart_Buf[cnt] = SBUF;

   cnt++;
   if(cnt > Ubuf_Max)
{
  cnt = 0;
          }
     }
if(TI)
{
   TI = 0;
     }
ES = 1;
}
资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 在 Linux 系统中,查找域名或主机名对应的 IP 地址是网络管理中的一项基础且关键任务,对于排查网络故障、调试网络问题以及监控网络服务是否正常运行等场景都非常重要。本文将介绍五种在 Linux 终端查询域名 IP 地址的方法。 首先,dig 命令(全称 Domain Information Groper)是一个功能强大的 DNS 查询工具,能够向 DNS 服务器发送查询请求并获取详细的响应信息。如果需要查询单个域名的 IP 地址,可以使用命令 dig 2daygeek.com +short 。此外,还可以通过编写 bash 脚本,将包含域名的文本文件中的域名逐个读取,然后利用 dig 命令进行查询,从而实现批量查询域名 IP 地址的功能。 其次,host 命令是一个简单易用的 DNS 查询工具,主要用于将域名解析为 IP 地址。要获取某个域名的 IP 地址,直接使用 host 2daygeek.com 即可。如果只想显示 IP 地址部分,可以通过管道结合 grep 和 sed 命令来实现,例如:host 2daygeek.com | grep "has address" | sed s/has address/-/g 。 再者,nslookup 命令也是一种常用的 DNS 查询工具,它支持交互式查询 DNS 信息。通过 nslookup 2daygeek.com 可以查询域名的 IP 地址。若要以非交互式的方式只显示 IP 地址,可以使用命令 nslookup 2daygeek.com | awk /^Address:/ {print $2} 。 另外,fping 命令与传统的 ping 命令不同,它不会直接进行 DNS 查询,而是通过发送 ICMP Echo Request(pi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值