基本信息
源码名称:AS3933唤醒例程
源码大小:0.06M
文件格式:.zip
开发语言:C/C++
更新时间:2020-10-12
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
详细注释-解决唤醒死机
#include"system.h"
sfr P1M0=0X92; //定义P1口配置寄存器
sfr P1M1=0X91; //定义P1口配置寄存器
sfr P3M0=0XB2; //定义P3口配置寄存器
sfr P3M1=0XB1; //定义P3口配置寄存器
unsigned char receive_flag=0; //唤醒中断标志位,1:唤醒到来 0:无唤醒信号
unsigned int AS3933_data1;//AS3933_data1:AS3933接收到的数据高8位
unsigned int AS3933_data2;//AS3933_data1:AS3933接收到的数据低8位
unsigned int run_count;//主程序大循环计数标志,主要用来延时
unsigned int i;//AS3933接收数据16次循环计数
unsigned int temp1,temp2,temp3;//AS3933接收数据校验寄存
void delay(unsigned int k)//延时函数
{
int i,j;
for(i=0;i<k;i )
for(j=0;j<100;j );
}
void main(void)
{
unsigned int dead_count1,dead_count2;//唤醒死机计数
Init_Com(); //初始化串口
AS3933_SET ();//配置AS39933各项寄存器
IT1=1; //打开外部中断1
EX1=1; //打开外部中断允许位
EA=1; //开总中断
P1M0|=0X80;//配置P1口输入输出状态
P3M1=0X98; //配置P2口输入输出状态
P3M0=0X00; //配置P2口输入输出状态
P0=0xFF; //初始化P0口
P1=0xFF; //初始化P1口
P2=0xFF; //初始化P2口
P3=0xFF; //初始化P3口
while(1)
{
/*********************************处理AS3933接收到的数据**********************/
if(P3_3==1&&receive_flag==1)//接收到唤醒信号和正确的数据时序
{
P1_7=1;//点亮LED指示灯
AS3933_data1=0;//清零AS3933接收数据高8位
dead_count1=0;
dead_count2=0;
for(i=0;i<16;i )//曼彻斯特解码
{
if(CL_DAT==1)//P3_7接AS3933 CL_DATA(数据时钟)引脚
{
if(DAT==0)//P3_4接AS3933 DAT(数据)引脚
AS3933_data1=AS3933_data1|0x01;//如果时钟高电平,数据引脚是低电平,则接收的数据为1
while(CL_DAT==1)//等待时钟跳变
{
dead_count1 ;
if(dead_count1>=1000)
{
dead_count1=0;
dead_count2 ;
if(dead_count2>=1000)
{
dead_count2=0;
break;//跳出循环
}
}
}
}
dead_count1=0;
dead_count2=0;
while(CL_DAT==0) //如果时钟低电平,则认为数据为0
{
dead_count1 ;
if(dead_count1>=1000)
{
dead_count1=0;
dead_count2 ;
if(dead_count2>=1000)
{
dead_count2=0;
break;//跳出循环
}
}
}
dead_count1=0;
dead_count2=0;
AS3933_data1=AS3933_data1<<1;
}
receive_flag=0;//接收完数据,清零AS3933唤醒标志位
if(receive_flag==0) //接受完数据后进行数据校验
{
AS3933_data2=AS3933_data1&0xff00;//将接收到的数据高8位赋值给 AS3933_data2 高8位
AS3933_data2=AS3933_data2>>8;//将AS3933_data2高八位数据移至低8位
AS3933_data1=AS3933_data1&0x00ff;//将将AS3933_data1高八位数据清零
temp1=AS3933_data2>>1<<1;//将AS3933_data2低8位数据赋值给temp1,并将最后一位清零
temp2=AS3933_data1;//将AS3933_data1低8位数据赋值给temp2
temp2=~temp2>>1<<1;//将TEMP2数据取反,并将最后一位清零。
(unsigned char)temp3=temp1-temp2;//对比TEMP1、TEMP2
if(temp3==0)//如果TMP1等于TEMP2 则数据校验正确
{
SendASC(255-AS3933_data2); //串口发送接收到的数据
}
receive_flag=2;//唤醒标志位赋值成2,避免重复解调数据
}
}
/************************************************************************/
P1_7=0; //关闭LED指示灯
run_count ; //大循环计数
if(run_count>=60000)//大循环60000次后睡眠
{
run_count=0;
//SendASC(0xbb);
go_sleep(); //睡眠,降低功耗
}
}
}