久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
有關實現單片機串口監聽器的Proteus仿真+程序代碼
[打印本頁]
作者:
zhu11116666
時間:
2019-5-16 22:11
標題:
有關實現單片機串口監聽器的Proteus仿真+程序代碼
簡易單片機串行口數據監聽器實現,直接搭線即可獲取到數據,使用PROTEUS串口
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png
(9.62 KB, 下載次數: 61)
下載附件
2019-5-17 04:40 上傳
單片機源程序如下:
////////////////////////////////////////////////////////////////////////////////
// ICC-AVR
// 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);
if(StringCompare(RxBuf,SMSin,SMSinLen)) // 如果收到OK完成 +CMTI: "SM", 1
{
return (OK);
}
else
{
return (ERROR);
}
}
/*-----------------------------------------------------------------------*/
/////////////// 將設置號碼存入內存 /////////////////
/*-----------------------------------------------------------------------*/
void CheckSMS(void)
{
unsigned char i=0,j=0,index,numlen=0;
for(;i<12;i++)
{
PhoneNum[i] = 0;
}
/* do
{
i++;
j=i+1;
}
//while((Pdu[i] == 'G') && (Pdu[j] == 'H'));
index = j+1;
i = index;
while(Pdu[i++] == '+')numlen++;
j = 79; */
index = 79;
for(i=0;i<11;i++)
{
PhoneNum[i] = Pdu[index++];
PhoneNum_to_EEPROM();
}
}
unsigned char CheckPhoneNum(void)
{
unsigned char i;
for(i=0;i<12;i++)
{
if( PhoneNum != 0) return (FALSE);
}
return (TRUE);
}
/*-----------------------------------------------------------------------*/
////////////////////////// 接收處理短信息 ///////////////////////////
/*-----------------------------------------------------------------------*/
void RecSMS(void)
{
unsigned char count,i=0,j=0,x,y;
Put_AT_String("AT+CMGR=1",9);
while(RxBuf[i] != 0x0D)
{
i++;
}
i = 76;
j = i;
if((RxBuf[i] == 'G') && (RxBuf[j+1] == 'H'))
{
count = 0;
while(1)
{
Pdu[count] = RxBuf[count];
x = count;
y = count;
if((RxBuf[x-2] == 0x30) && (RxBuf[y-1] == 0x0D))
{
break;
}
count++;
}
CheckSMS();
Delete_SMS(1);
}
else
{
Delete_SMS(1);
}
}
unsigned char DetQEITING(void)
{
volatile unsigned char tmp;
if(!(DetQT()))
{
release = 0;
DelayMs(10);
if(!(DetQT())) {DettqFlag = 1;}
}
else
{
release = 1;
}
if(release && DettqFlag)
{
DettqFlag = 0;
CplLED();
return (TRUE);
}
return (FALSE);
}
void IGT(unsigned char n)
{
if(n)
{
PORTD &= ~(1<<PD6);
DDRD |= (1<<PD6);
}
else
{
DDRD &= ~(1<<PD6);
}
}
void work(void)
{
while(1)
{
if(CheckSMS_in())
{
RecSMS();
}
if(CallInFlag)
{
Put_AT_command(Ata,AtaLen);
CallInFlag = 0;
}
if((BusyFlag) || (NoCarrierFlag))
{
Put_AT_command(Ath,AthLen);
CallOut = 0;
BusyFlag = 0;
NoCarrierFlag = 0;
}
if(DetQEITING() && (!CallOut))
{
CallOut = 1;
DialNum();
}
}
}
/*-----------------------------------------------------------------------*/
///////////////////////////// 初始化MC55 //////////////////////////////
/*-----------------------------------------------------------------------*/
void InitMC55(void)
{
unsigned char tmp;
IGT(OFF);
DelayMs(500); // 置低MC55 IGT口 200mS ,啟動MC55模塊
IGT(ON);
DelayMs(500);
IGT(OFF);
// DelayMs(1000); // 等待模塊啟動
ClrRTS();
DelayMs(50); // 激活MC55串口
SetRTS();
DelayMs(50);
ClrRTS();
DelayMs(50); // 激活MC55串口
SetRTS();
// DelayMs(1000); // 激活MC55串口
TxIndex = 0;
RxIndex = 0;
while(!DetQEITING());
PutString("AT",2,0);
DelayMs(500);
PutString("AT",2,1);
PutString("ATV0",4,1);
PutString("ATE0",4,1);
PutString("AT+CNMI=2,1",11,1);
PutString("AT+CMGF=1",9,1);
Delete_SMS(ALL);
PhoneNum_to_EEPROM();
EEPROM_to_PhoneNum();
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
/*
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
//external interupt on INT0
DialNum();
}
#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
//external interupt on INT1
}
*/
////////////////////////////////////////////////////////////////////////////////
void port_init(void)
{
PORTB = 0x01;
DDRB = 0x01;
PORTC = 0x00; //m103 output only
DDRC = 0x02;
PORTD = 0x0C;
DDRD = 0x50;
}
//UART0 initialize
// desired baud rate: 19200
// actual: baud rate:19200 (0.0%)
// char size: 8 bit
// parity: Disabled
//#ifdef XTAL == 3.6864
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x0B; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0xD8;
}
//#endif
//#ifdef XTAL == 7.3728
/*void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x17; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0xD8;
}*/
//#endif
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
uart0_init();
MCUCR = 0x00;
GICR = 0x00; //0xC0;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
InitMC55();
}
//
void main(void)
{
DelayMs(1000);
init_devices();
work();
/*
while(1)
{
DetQEITING();
}*/
}
復制代碼
0.png
(10.8 KB, 下載次數: 45)
下載附件
2019-5-17 04:42 上傳
所有資料51hei提供下載:
竊聽器V1.0.zip
(125.97 KB, 下載次數: 9)
2019-5-16 22:11 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日韩欧美国产精品一区
|
欧美一区视频
|
国产精品久久精品
|
亚洲免费观看视频网站
|
精品久久久久久一区二区
|
一区二区三区四区日韩
|
亚洲国产精品一区二区第一页
|
亚洲免费网址
|
一区二区三区欧美
|
亚洲人成在线观看
|
91精品一区二区三区久久久久
|
国产高清自拍视频在线观看
|
久久国产欧美日韩精品
|
久久国产成人
|
美日韩精品
|
成人午夜精品
|
正在播放国产精品
|
亚洲一区亚洲二区
|
一级a性色生活片久久毛片波多野
|
精品久久久久久亚洲综合网
|
欧美精品乱码99久久影院
|
日韩电影在线
|
国产精品日日摸夜夜添夜夜av
|
久久综合狠狠综合久久综合88
|
成人一区在线观看
|
亚洲视频在线播放
|
欧美中文字幕在线
|
日韩一区精品
|
亚洲国产成人精品久久久国产成人一区
|
一级片网址
|
欧美日韩高清在线观看
|
看一级毛片视频
|
久久剧场
|
久久一二
|
亚洲精品国产成人
|
99免费视频
|
中文字幕在线一区二区三区
|
久久久久免费精品国产小说色大师
|
中文字幕第十五页
|
黄色片免费看
|
国产成人精品高清久久
|