⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gsm.c

📁 这是一个完整的工程文件:简易手机模型
💻 C
📖 第 1 页 / 共 3 页
字号:

/*
;**************************************************************
;*				   北京达盛科技有限公司
;*                    研    发    部
;*
;*             	http://www.techshine.com
;*************************************************************/
/*----------------------- 文件信息 ----------------------------                                      
;*  
;* 文件名称 : GSM.C  	(AT命令试验文件)
;* 适用平台 : DSP(ARM)CPU挂箱、接口挂箱(用三条扁平电缆连接);
;*(注意:DSP(ARM)CPU挂箱上CPU模块上方的开关SW3有且只有最左侧的一位在"ON"位置);
;* CPU类型  : DSP320VC5409 
;* 软件环境 : CCS2.20 (5000系列)
;* 扩展模块 : E-LAB:GSM模块(正确安装在接口挂箱上)
;* 试验接线 : 1、用短路帽短接GSM模块上的片选CS50的CS0
;*            2、GSM模块上的FLY8用跳线帽短接MCU端
;*            3、GSM模块上安装好有效的SIM卡 
;* 试验现象 : 模拟手机功能,完成电话接听、呼叫、通话、收发短信等功能
;* 备注:开机上电,按GSM模块上的复位键,等待模块上的发光二极管开始闪烁后
;* 打开CCS运行软件,编译、运行本程序。可在CPU挂箱上的液晶屏上显示
;* GSM 模块信息,包括生产厂家、型号,及回显测试,最后检查是否插入SIM卡
;* 当检测到有效地SIM卡时,清屏,显示当前SIM卡的运营商(移动或联通)
;* 当前日期、当前时间及当前的信号质量,至此完成了系统的初始化。用户可发短信、   
;* 拨打电话或接收短信、接听电话了,也可以进入电话本菜单进行操作(未完善)
;* 此时按'A'键,进入时钟设置菜单;按'B'键,进入铃音设置菜单;
;*     按'C'键,进入通话记录菜单;按'D'键,进入手机设置菜单;
;*     按'E'键,进入短信菜单;  按'F'键,进入电话本菜单;
;*     按任一数字键,进入拨号呼叫状态
;* 1、拨打电话:通过键盘直接键入要拨打的电话号码,完成拨号后,按‘F’键
;*    开始不叫,当对方摘机后就可以通话了,在此过程中可随时按‘E’键结童话
;* 2、发送短信:进入短信菜单后,按'A'键,进入编写短信界面,可通过键盘输入端新内容
;*    结束后,按'F'键,提示输入接收方的手机号,完成后再按'F'键,开始发送。
;* 3、接听电话:当有电话打进来时,液晶屏上会提示‘有电话啦!’,   
;*    按'F'键接听,按'E'键挂断。
;* 4、阅读短信:当有接收到短信时,液晶屏上会提示‘有短信啦’   
;*    按'F'键可阅读短信内容。
:* 修改日期:2006、5、20(长春展会)
:* 修改内容:1、每次从M22中读出时间和日期是要进行检验,避免读入无效数据,引起时间、日期的显示乱码
:*          2、增加连续拨号功能,以增加拨号的成功率。
;* 编写时间:2006、1、20
;* 审核时间:
*/
//------------------头文件--------------------------------------
#include "system.h"   //包括CPU寄存器的定义、编译环境定义、试验系统定义
//----------------------------------------------------------
#define     SRTHR    CS0      //接收、发送缓冲器
#define     SIER     port0801 //中断允许寄存器
#define     SLCR     port0803 //线路控制寄存器
#define     SRLSR    port0805 //线路状态寄存器
#define     SLSB     CS0      //波特率除数锁存器低位
#define     SMSB     port0801 //波特率除数锁存器高位
/*******************************************
			 函数声明 
*********************************************/
void CLEAR_BUFF(uchar *buff);
void CLEAR_STAT(void);
/*******************************************
			 变量定义 
*********************************************/
   uchar rdata[200],phone[20],netsev[10];
   uchar modeinfo[] = "GSM 模块信息";
   uchar  ch_moid[] = "\"CHINA  MOBILE\"";
   uchar    ch_mo[] = "中国移动";
   uchar  ch_cuid[] = "\"CHN-CUGSM\"";
   uchar    ch_cu[] = "中国联通";
   uchar    ready[] = "READY";
   uchar    nosim[] = "请插入SIM 卡!";
   uchar   income[] = "来电话啦!";
   uchar   newmsg[] = "收到短信啦!";
   uchar newmsghint[] = "阅读(F) 跳过(E)";
   uchar newmsgpro[] = "删除(F) 跳过(E)";
   uchar       at[] = "AT:";
   uchar     cgmi[] = "Manu:";
   uchar     cgmm[] = "Mode:";
   uchar     find[] = "Searching for...";
   uchar    ddate[] = "日期:";
   uchar    dtime[] = "时间:";
   uchar   signal[] = "信号强度:";
   uchar     retu[] = "返回(F):";
   uchar     msgall[] = "ALL";
   uchar     msgread[] = "REC READ";
   uchar     msgunread[] = "REC UNREAD";
   uchar    incomeflag[] = "CLIP:";
   uchar msgindex[20],incomenum[12],status=0;
//-------------------------------------------------------------------
/*******************************************
			 函数定义 
*********************************************/
/*********************************************************
- 函数名称 : void SEND(uchar udata)
- 函数说明 : 发送数据
- 输入参数 : 无
- 输出参数 : 无
**********************************************************/
void SEND(uchar udata)
   {
    while((SRLSR & 0x20)==0); //等待450发送缓冲器空
    SRTHR = udata;
   }
/****************************************
- 函数名称 : Init_16c450(void)
- 函数说明 : 初始化16c450
- 输入参数 : 无
- 输出参数 : 无
*********************************************/
void Init_16c450(void)
   {
    uchar tempd;
    SLCR = 0x80;  //设置波特率控制位 使能
    SLSB = 0x0C;
    SMSB = 0x00;  //设置波特率96000
    SLCR = 0x03;  //8个数据位,2个停止位,无奇偶校验
    SIER = 0x01;  //允许接收器数据就绪中断
    tempd = SRLSR; //清除线路状态寄存器
    tempd = SRTHR; //清除16C450中的接收数据
    tempd = tempd;
   }
/****************************************************
- 函数名称 : void RECV(void *prdata)
- 函数说明 : 接收数据,且有超时退出功能
- 输入参数 : 保存接收到的数据的指针
- 输出参数 : 接收到的字节数
******************************************************/

uchar RECV(uchar *prdata)
  {
   uchar num = 0,tmp;
   uint16 cnt=0x8ff;
   CLEAR_BUFF(prdata);
   /*
   while(((SRLSR & 0x01)==0)&&(cnt>0))
    {
     cnt--;
    }
    */
   while(cnt>0)
    {
     while((SRLSR & 0x01)!=0)//等待450接收缓冲器有数
       {
        tmp = SRTHR;
        if((tmp!='\r')&&(tmp!='\n'))
        *prdata++ = tmp;
        else *prdata++ = ' ';
        num++;
        cnt = 0x8ff;
       }
     cnt--;
   }
  CLEAR_STAT();
  return num; 
 }

int RECV1(uchar *prdata)
  {
   uint16 cnt=0x8ff,tmp,num=0;
   CLEAR_STAT();
   while((SRLSR & 0x01)==0);//等待450接收缓冲器有数
   goto rec;
   while(1)
      {
       while((SRLSR & 0x01)==0)
         {//等待450接收缓冲器有数,且有超时退出功能
           cnt--; 
           if(cnt==0)
             { 
              *prdata = 0x00; //接受完数据后使最后一个数为零。
              goto back;
             }  
         }
       rec:
       tmp = SRTHR;
       if((tmp!='\r')&&(tmp!='\n'))
         *prdata++ = tmp;
         else *prdata++ = ' ';
         cnt = 0x8ff;
         num++;
      } 
   back:   
   return num;      
  }
                      
/************************************************
- 函数名称 : char str_comp(uchar *str1,uchar start1,uchar *str2,uchar start2,uchar num)
- 函数说明 : 字符串中一段字符的比较
- 输入参数 : 两个比较字符串的起始指针、比较的起始位置、比较的字节数
- 输出参数 : 比较结果中的不相同的字节数
*************************************************/
uchar str_comp(uchar *str1,uchar start1,uchar *str2,uchar start2,uchar num)
{
 uchar i,error=0;
 str1 +=start1;
 str2 +=start2;
 for(i=0;i<num;i++)
   {
    if(*str1++ != *str2++) error++;
   }
 return error;  
}
/************************************************
- 函数名称 : char str_search(uchar *source,uchar start,uchar *dest)
- 函数说明 : 在源字符串中搜索与目标字符串相同部分的位置
- 输入参数 : 被搜索的源字符串的首指针、目标字符串的首指针
- 输出参数 : 目标字符串在源字符串的首位置
*************************************************/
uchar str_search(uchar *source,uchar start,uchar *dest)
{
 uchar i,j=0,destlenth=0,sourcestart=0xff;
 i=start;
 while(dest[destlenth]!='\0') destlenth++; //计算出目标字符串的长度
 while((j<destlenth)&&(source[i]!='\0'))
   {
    while((source[i]!=dest[j])&&(source[i]!='\0')) i++;
    if((j==0)&&(source[i]!='\0')) sourcestart = i;
    if((i!=(sourcestart+j))||(source[i]=='\0'))
      {
       //i=sourcestart+1;
       i=i-j;
       sourcestart=0xff;
       j=0;
      } 
    else j++;
   }
 //if(i != (sourcestart+destlenth-1)) sourcestart=0xff; 
 return sourcestart;  
}
/************************************************
- 函数名称 : void str_copy(uchar *dest,uchar start1,uchar *source,uchar start2,uchar num)
- 函数说明 : 字符串复制
- 输入参数 : 源和目的字符串的起始指针、复制源的起始位置、复制目标的起始位置,复制的字节数
- 输出参数 : 无
*************************************************/
void str_copy(uchar *dest,uchar start1,uchar *source,uchar start2,uchar num)
  {
   uchar i;
   dest +=start1;
   source +=start2;
   for(i=0;i<num;i++) *dest++ = *source++;
  }
/************************************************
- 函数名称 : void CLEAR_STAT(void)
- 函数说明 : 清除线路状态寄存器和接受缓冲器
- 输入参数 : 无
- 输出参数 : 无
*************************************************/
void CLEAR_STAT(void)
{
 uchar utemp;
 utemp = SRLSR; //清除线路状态寄存器
 utemp = SRTHR; //清除16C450中的接收数据
 utemp = utemp;
}

/*************************************************
- 函数名称 : void CLEAR_BUFF(uchar *buff)
- 函数说明 : 清除缓冲区的数据
- 输入参数 : 缓冲区的首地址
- 输出参数 : 无
**********************************************/
void CLEAR_BUFF(uchar *buff)
 {
  uchar i;
  for(i=0;i<100;i++) buff[i] = 0;
 }
/*************************************************
- 函数名称 : void lcdclean(uchar st,uchar end)
- 函数说明 : 清除液晶屏的显示
- 输入参数 : 液晶屏的开始清除行和结束行
- 输出参数 : 无
**********************************************/
void lcdclean(uchar st,uchar end)
 {
  uchar null[] = "                ",i,mode;
  for(i=st;i<=end;i++)
    {
     switch (i)
       {
        case 1:
          mode=0x80;
          break;
        case 2:
          mode=0x90;
          break; 
        case 3:
          mode=0x88;
          break;
        case 4:
          mode=0x98;
          break;     
       }
     Display(null,mode,0,16);
    }
 } 
/*************************************************
- 函数名称 : void callsend(uchar *buff)
- 函数说明 : 发出呼叫
- 输入参数 : 呼叫方号码的首地址
- 输出参数 : 无
**********************************************/
void callsend(uchar *buff)
 {
  uchar i,temp,calling[]="正在呼叫:请稍侯...挂机(E)";
  lcdclean(1,1);
  Display(calling,0x80,0,9);
  lcdclean(3,4);
  Display(calling,0x8b,9,18);
  Display(calling,0x9a,18,27);
  SEND('A');
  SEND('T');
  SEND('D');
  i=0;
  temp = *(buff++);
  while((temp!='\0')&&(i<13))
    {
     SEND(temp);
     temp = *(buff++);
     i++;
    }
  SEND(0x0d);
  //while(RECV1(rdata)==0);  
 } 
/*************************************************
- 函数名称 : void phonebookmenu(void)
- 函数说明 : 电话本菜单
- 输入参数 : 无
- 输出参数 : 无
**********************************************/
void phonebookmenu(void)
 {
  uchar phonebook[] = "电话本(F):";
  uchar phonebookadd[] = "添加记录(A):";
  uchar phonebookmodefy[] = "修改记录(B):";
  Display(phonebook,0x80,0,10);
  Display(phonebookadd,0x91,0,14);
  Display(phonebookmodefy,0x89,0,12);
  Display(retu,0x99,0,8);
  key7279 = 0xff;
  while((key7279 != 0xa)&&(key7279 != 0xb)&&(key7279 != 0xf));
  lcdclean(1,4);
  switch (key7279)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -