📄 main.c
字号:
////////////////////////////////////////////////////////////////////////////////
// ICC-AVR application builder : 2006-6-25 下午 06:02:39
// Target : M8
// Crystal: 3.6864Mhz
// Author: Anwarye
// Title: Detcetaphone
////////////////////////////////////////////////////////////////////////////////
#include <iom8v.h>
#include <macros.h>
#include "var.h"
#define XTAL == 3.6864M
////////////////////////////////////////////////////////////////////////////////
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
unsigned char i,j;
if(UDR == 0x0A)
{
return; // 收到0x0A直接丢弃
}
i = RxIndex;
j = RxIndex-1;
if((RxBuf[0] == 0x30) && (RxBuf[1] == 0x0D))
{
RxIndexTail = RxIndex; // 保存接收缓冲指针尾
RxIndex = 0; // 接收缓冲指针归零
RxStatus = 1; // 接收完成标志置位
OkFlag = 1;
error = 0;
return;
}
if((RxBuf[0] == 0x32) && (RxBuf[1] == 0x0D)) // 收到来电信号,来电标志置位
{
CallInFlag = 1; // 置电话呼入标志
RxIndex = 0;
RxStatus = 1;
OkFlag = 1;
return;
}
else if((RxBuf[0] == 0x33) && (RxBuf[1] == 0x0D)) // 被叫号码忙 或者挂机 主叫挂机
{
BusyFlag = 1; // 置电话呼入标志
RxIndex = 0;
RxStatus = 1;
OkFlag = 1;
return;
}
else if((RxBuf[0] == 0x37) && (RxBuf[1] == 0x0D)) // 收到来电信号,来电标志置位
{
NoCarrierFlag = 1; // 置电话呼入标志 NO CARRIER
RxIndex = 0;
RxStatus = 1;
OkFlag = 1;
return;
}
else if((RxBuf[0] == 0x34) && (RxBuf[1] == 0x0D)) // 收到来电信号,来电标志置位
{
RxIndex = 0;
RxStatus = 1;
OkFlag = 1;
error = 1;
return;
}
else
{
RxBuf[RxIndex++] = UDR; // 继续接收数据放入接收缓冲
RxStatus = 0; // 串口接收中
// return; // 结束接收,直接跳出
}
}
////////////////////////////////////////////////////////////////////////////////
#pragma interrupt_handler uart0_tx_isr:14
void uart0_tx_isr(void)
{
if(!TxStatus) // 本帧数据未发完,则继续发送
{
//while ( !(UCSRA & (1<<UDRE)) ); // 等待UDR空
UDR = TxBuf[TxIndex];
}
if((TxBuf[TxIndex] == 0x0D) || (TxBuf[TxIndex] == 0x1A)) // 本帧数据发送结束
{
TxStatus = 1; // 发送完成状态标志置位
TxIndex = 0; // 发送缓冲区指针归零
UCSRB &= ~((1<<TXCIE));//|(1<<TXEN)); // 关发送中断
return;
}
TxIndex++;
}
unsigned char CheckRx(void)
{
unsigned char i,j;
i = RxIndex;
j = RxIndex - 1;
if(( RxBuf[j] == 0x30) && (RxBuf[i] == 0x0D))
{
RxIndex = 0;
return (1);
}
else
{
return (0);
}
}
/*-----------------------------------------------------------------------*/
/////////////////////////// 清除接收缓冲 ////////////////////////////////
/*-----------------------------------------------------------------------*/
void ClearRxBuf(void)
{
unsigned char i;
for(i=0;i<128;i++)
{
RxBuf[i] = 0;
}
}
/*-----------------------------------------------------------------------*/
/////////////////////////// 串口发送使能 ////////////////////////////////
/*-----------------------------------------------------------------------*/
void TxEnable(void)
{
//RxIndex = 0;
UDR = TxBuf[0]; // 发送缓冲头送入串口发送寄存器,激活开始发送
UCSRB |= ((1<<TXCIE));//|(1<<TXEN));
}
/*-----------------------------------------------------------------------*/
///////////////////////////// 发送AT命令 /////////////////////////////////
/*-----------------------------------------------------------------------*/
void Put_AT_command(const unsigned char *atc, unsigned char atlen)
{
unsigned char count;
for(count = 0;count < atlen;count++) // AT命令窜移入发送缓冲
{
TxBuf[count] = atc[count];
}
TxBuf[atlen] = 0x0D; // 发送缓冲窜结尾加“回车”
TxBuf[atlen + 1] = 0x00; // 发送缓冲窜结束符号
OkFlag = 0;
TxStatus = 0;
TxIndex = 1; // 发送指针偏移1
TxEnable(); // 激活发送
while(!TxStatus); // 等代发送结束,发送缓冲指针为零则可以发送
DelayMs(20);
while(!OkFlag); // 收到模块返回OK,命令结束
OkFlag = 0;
}
/*-----------------------------------------------------------------------*/
///////////////////////// 从内存发送AT命令串 ////////////////////////////
/*-----------------------------------------------------------------------*/
void Put_AT_String(unsigned char *atc, unsigned char atlen)
{
unsigned char count;
for(count = 0;count < atlen;count++)
{
TxBuf[count] = *(atc+count);
}
TxBuf[atlen] = 0x0D; // 发送缓冲窜结尾加“回车”
TxBuf[atlen + 1] = 0x00; // 发送缓冲窜结束符号
OkFlag = 0;
TxStatus = 0;
TxIndex = 1; // 发送指针偏移1
TxEnable(); // 激活发送
while(!TxStatus); // 等代发送结束,发送缓冲指针为零则可以发送
DelayMs(20);
while(!OkFlag); // 收到模块返回OK,命令结束
OkFlag = 0;
}
/*-----------------------------------------------------------------------*/
///////////////////////// 向串口发送一串数据 ////////////////////////////
/*-----------------------------------------------------------------------*/
void PutString(unsigned char *str, unsigned char length,unsigned char retflag)
{
unsigned char count;
for(count = 0;count < length;count++)
{
TxBuf[count] = *(str+count);
}
TxBuf[length] = 0x0D; // 发送缓冲窜结尾加“回车”
TxBuf[length+ 1] = 0x00; // 发送缓冲窜结束符号
TxStatus = 0;
TxIndex = 1; // 发送指针偏移1
OkFlag = 0;
TxEnable();
// 激活发送
while(!TxStatus); // 等代发送结束,发送缓冲指针为零则可以发送
DelayMs(20);
if(retflag)
{
while(!OkFlag); // 收到模块返回OK,命令结束
OkFlag = 0;
}
else
{
DelayMs(200);
OkFlag = 0;
}
}
////////////////////////////////////////////////////////////////////////////////
/*-----------------------------------------------------------------------*/
////////////////////////// 拨号 ///////////////////////////
/*-----------------------------------------------------------------------*/
void DialNum(void)
{
unsigned char i,count=0,length=0;
while ((PhoneNum[count++] != 0)) // 计算电话号码长度
{
length++;
}
TxBuf[0] = 'A';
TxBuf[1] = 'T';
TxBuf[2] = 'D';
i = 3;
for(count=0;count<length;count++)
{
TxBuf[i++] = PhoneNum[count];
}
TxBuf[length+3] = ';';
TxBuf[length+4] = 0x0D;
OkFlag = 0;
TxStatus = 0;
TxIndex = 1; // 发送指针偏移1
TxEnable(); // 激活发送
while(!TxStatus); // 等代发送结束,发送缓冲指针为零则可以发送
DelayMs(20);
//while(!OkFlag); // 收到模块返回OK,命令结束
OkFlag = 0;
}
/*-----------------------------------------------------------------------*/
///////////////////////////// 比较两个串 /////////////////////////////////
/*-----------------------------------------------------------------------*/
unsigned char StringCompare(volatile unsigned char *str1,const unsigned char *str2,unsigned char strlen)
{
while(strlen--)
{
if(*str1++ != *str2++) return(FALSE); // 两个串不相等返回假
}
return(TRUE);
}
/*-----------------------------------------------------------------------*/
///////////////////////////// 删除短信 //////////////////////////////
/*-----------------------------------------------------------------------*/
void Delete_SMS(unsigned char num) // 删除SMS,=0删除所有SMS
{
unsigned char count;
for(count = 0;count < AtcmgdLen;count++) // AT命令窜移入发送缓冲
{
TmpBuf[count] = Atcmgd[count];
}
if(num == ALL)
{
for(count = 1; count < 10; count++)
{
TmpBuf[AtcmgdLen] = count + 0x30;
Put_AT_String((unsigned char*)TmpBuf,(AtcmgdLen+1));
}
TmpBuf[AtcmgdLen] = 0x31;
for(count = 0; count < 10; count++)
{
TmpBuf[AtcmgdLen+1] = count + 0x30;
Put_AT_String((unsigned char*)TmpBuf,(AtcmgdLen+2));
}
}
else
{
TmpBuf[AtcmgdLen] = num + 0x30;
Put_AT_String((unsigned char*)TmpBuf,(AtcmgdLen+1));
}
}
/*-----------------------------------------------------------------------*/
/////////////////////////// 检查SMS返回 //////////////////////////////
/*-----------------------------------------------------------------------*/
unsigned char CheckSMS_in(void)
{
while(!RxStatus); // 等待接收完成
DelayMs(100);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -