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

📄 main.c

📁 proteus实例集锦
💻 C
📖 第 1 页 / 共 2 页
字号:
////////////////////////////////////////////////////////////////////////////////
// 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 + -