/****************************** 工程名 :手机呼叫SIM900A,门禁解锁 1 先用USB转TTL模块测试模块好用,发送AT,波特率到9600同步 2 51单片机晶振 11.0592MHz,12M不可以用 手机呼叫SIM900A的号码,LED亮500MS; *******************************/ #include "string.h" #include "STC12C2052AD.h" #define cache_max 100 //串口接收缓存长度 xdata unsigned char uart_cache[cache_max]; // xdata 把变量存在flash中,而不存在RAM中 //code 定义的数据要放在ROM里面,写入后就不能再更改 bdata unsigned char Flag; //定时器标志位 bdata 把变量定义为可拆成8位寻址 sbit RUNING = P3^7; //SIM900A运行指示灯,1秒闪烁一次 sbit beep = P1^7; //蜂鸣器 sbit action = P1^5; //解锁控制 unsigned char code *ring="CLIP"; //来电标记 unsigned char code *phone1="1395804****"; //管理员1的手机号 unsigned char code *phone2="1358812****"; //管理员2的手机号 sbit Timer_start =Flag^0; //计时器,功能开关 unsigned char Times=0; // 定时计数器 unsigned char First_Int = 0; // 串口数组字符索引 unsigned char delay=0; //中断定时器,实际数据delay*50次 void SendData(unsigned char dat){ // 发一个英文8位数据到串口SBUF ES=0; SBUF=dat; while(TI!=1); TI=0; ES=1; } void SendString(unsigned char *s){ // 发英文字符到串口SBUF while(*s) SendData(*s++); } void SendLR(void) { // 发回车换行 SendString("\r\n"); } void DELAY_MS (unsigned int a){ // 延时 unsigned int i; while ( --a != 0 ) for (i=0;i<=600;i++); } void Unlock(void) {//发出嘀的一声 beep = action=0; DELAY_MS(500); beep = action=1; } void Warning(void) {//发出嘀嘀警告声 beep = 0; DELAY_MS(100); beep = 1; DELAY_MS(50); beep = 0; DELAY_MS(100); beep = 1; DELAY_MS(50); } void Uart1Init(void) { //[email protected] PCON &= 0x7F; //波特率不倍速 SCON = 0x50; //8位数据,可变波特率 AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //清除定时器1模式位 TMOD |= 0x20; //设定定时器1为8位自动重装方式 TL1 = 0xFD; //设定定时初值 TH1 = 0xFD; //设定定时器重装值 ET1 = 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 ES=1; //开串口中断 } void Uart1() interrupt 4{ uart_cache[First_Int] = SBUF; //将接收到的字符串存到缓存中 First_Int++; //缓存指针向后移动 if(First_Int > cache_max) //如果缓存满,将缓存指针指向缓存的首地址 First_Int = 0; //数组索引,归位 RI = 0; //清除RI位 } void Timer0Init(void) { //20毫秒@11.0592MHz AUXR &= 0x7F; //定时器时钟12T模式 TMOD &= 0xF0; TMOD |= 0x01; //设置定时器模式,16位定时器 TL0 = 0x00; //设置定时器初值 TH0 = 0xB8; //设置定时器初值 TF0 = 0; //清TF0标志 TR0 = 1; //定时器0开始计时 ET0 = 1; //使能定时器0中断 EA=1; //开总中断 } void Timer0_ISR() interrupt 1{ //最高级别中断服务程序 static unsigned char Time_count=0; // 定时器计数器 static全局生命周期 TR0=0; //关定时器 TL0 = 0x00; //重设定时器初值 TH0 = 0xB8; //重设定时器初值 Time_count++; if(Time_count>=50) { Time_count = 0; RUNING =~RUNING; //SIM900A运行指示灯,1秒闪烁一次 } if(Timer_start) Times++; //如果收到允许定时,开始计时 if(Times > (50*delay)){ //如果Times 到达设定时间 Timer_start = 0; // 完成定时,自己关闭定时功能Timer_start=0 Times = 0; // 完成定时,清空定时计数器 } TR0=1; //开定时器 } void CLR_Buf1(void){ unsigned int k; for(k=0;k<cache_max;k++) //将缓存内容清零 uart_cache[k] = 0x00; First_Int = 0; //接收字符串的起始存储位置 } void Send_Command(unsigned char *command,unsigned char *ack,unsigned char wait_time){ unsigned char *pointer; pointer = command; //保存字符串command的首地址到c CLR_Buf1(); while(1) { if(!strstr(uart_cache,ack)) { //查找需要应答的字符 if(Timer_start == 0){ command = pointer; //将字符串地址给b for (command; *command!=‘\0‘;command++) SendData(*command); SendLR(); Times = 0; delay = wait_time; Timer_start = 1; // 开启定时器, } } else{ Timer_start = 0; Warning(); //与SIM900A连接成功提示音 break; } } CLR_Buf1(); } void Wait_CREG(void) { //等待模块注册成功 unsigned char i; unsigned char k; i = 0; CLR_Buf1(); while(i == 0) { CLR_Buf1(); SendString("AT+CREG?"); //查询模块网络注册状态 SendLR(); DELAY_MS(1000); for(k=0;k<cache_max;k++) { if(uart_cache[k] == ‘:‘) { if((uart_cache[k+4] == ‘1‘)||(uart_cache[k+4] == ‘5‘)){ //表明网络注册成功 i = 1; break; } } } } } void Check_Ring(void) { if(strstr(uart_cache,ring)!=NULL) { //检测是否有来电标记 DELAY_MS(100); //等待数据全部接收完成 if((strstr(uart_cache,phone1))||(strstr(uart_cache,phone2))) Unlock(); //如果管理员来电,就解锁 else Warning(); //如果不是来电,就发警告提示音 CLR_Buf1(); // 清空SBUF缓存 } } void main(void){ Timer0Init(); //初始化定时器0 Uart1Init(); //初始化串口9600 Send_Command("AT","OK",3); //波特率同步 Send_Command("ATE0","OK",3); //取消AT回显 Send_Command("AT+CLIP=1","OK",3); //开启来电显示 Wait_CREG(); //查询等待模块注册成功 while(1){ Check_Ring(); } }
编译结果:
Rebuild target ‘Target 1‘ compiling MyC51.C... linking... Program Size: data=42.0 xdata=100 code=1064 creating hex file from "Myproject"... "Myproject" - 0 Error(s), 0 Warning(s).
时间: 2024-08-27 13:19:26