找回密码
 注册会员
img_loading
智能检测中
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

大家帮我看看这个程序哪里出错了

[复制链接]
admin 发表于 2012-9-2 04:44:44 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar LCD_ID_1[16] = {"PASS WORD"};
uchar LCD_ID_2[16] = {""};
uchar LCD_ID_3[16] = {"QD"};
uchar LCD_ID_4[16] = {"QX"};
uint KEY_num=0,m=0,b,n,r,p,t;
uchar password[]="000000";
sbit LED=P3^4;
sbit E=P2^7; //1602使能引脚
sbit RW=P2^6; //1602读写引脚
sbit RS=P2^5; //1602数据/命令选择引脚
void delay(uchar x); //x*0.14MS
void delay1(int ms);
sbit IRIN = P3^3; //红外接收器数据线
uchar IRCOM[7];
sbit FMQ=P3^6; //蜂鸣器
sbit QZ=P1^0;
uchar code at[]="AT\r";
uchar code tele[]="ATD15385093977;\r"; //目标手机号
uchar code tab1[]="AT+CMGF=0\r"; //0=PDU,1=TEXT
uchar code tab2[]="AT+CMGS=25\r";
uchar code tab3qh[]="0891683108901305F0"; //短息中心号码
uchar code tab4hm[]="11000D91688157910709F50008AA";
//11000D91固定+电话号奇偶换位+0008AA固定
/*发送短信内容,前两位为所发内容的长度/2+发送内容的unicode码 每个汉字为4位*/
uchar code tab5nr[]="0A5BB667097A838D3CFF01"; //家有窃贼!
/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间大概为1毫秒
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)
{
uint x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
void delay2(unsigned char x) //x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
void Delay2()
{
int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++)
;
}
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为140US。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void fengmingqi() //蜂鸣器
{ uint b,r;
for (b=0;b<50;b++)
{
FMQ=0;
for(r=50;r>0;r--);
FMQ=1;
for(r=50;r>0;r--);
}
}
void fengmingqi1() //警笛声子程序
{
/*------------------声音音调逐渐升高--------------*/
for(n=100;n>60;n--)
{
for (b=0;b<20;b++) //改变b的值可以改变发声时长
{
FMQ=0; //开蜂鸣器
for(r=n;r>0;r--); //改变r的值可以改变发声频率
FMQ=1; //关蜂鸣器
for(r=n;r>0;r--); //改变r的值可以改变发声频率
}
}
/*------------------声音音调逐渐降低--------------*/
for(n=60;n<100;n++)
{
for (b=0;b<20;b++) //改变b的值可以改变发声时长
{
FMQ=0; //开蜂鸣器
for(r=n;r>0;r--); //改变r的值可以改变发声频率
FMQ=1; //关蜂鸣器
for(r=n;r>0;r--); //改变r的值可以改变发声频率
}
}
}
void enable(uchar del)
{
P0 = del;
RS = 0;
RW = 0;
E = 0;
Delay2();
E = 1;
Delay2();
}
void write(uchar del)
{
P0 = del;
RS = 1;
RW = 0;
E = 0;
Delay2();
E = 1;
Delay2();
}
/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602初始化,请参考1602的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void L1602_init(void)
{
enable(0x38);
Delay_1ms(5);
enable(0x38);
Delay_1ms(5);
enable(0x38);
Delay_1ms(5);
enable(0x38);
enable(0x08);
enable(0x0c);
enable(0x04);
enable(0x01);
}
/********************************************************************
* 名称 : L1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
L1602_char(1,5,'b')
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
write(sign);
}
/********************************************************************
* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
L1602_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
while(1)
{
if(*p == '\0') break;
write(*p);
p++;
}
}
/*******************************************************************/
void send(uchar *tab)
{
while((*tab)!='\0')
{
SBUF=*tab;
while(TI==0);
TI=0;
tab++;
ES=1; //开串口中断
}
}
/********** 串口初始化 ***********/
void uart_int(void)
{
SCON=0x50;//UART方式1:8位UART;
REN =1; //允许串行口接收数据;
PCON=0x00;//SMOD=0:波特率不加倍;
TMOD=0x20;//T1方式2,用于UART波特率;
TH1 =0xFD; //装初值;
TL1 =0xFD; //装初值
TR1 =1; //启动定时器1
EA=1; //打开全局中断控制
ES=1; //打开串行口中断
}
/*******************************************************************/
void main(void)
{ IE = 0x84; //允许总中断中断,使能 INT1 外部中断
TCON = 0x10;
//触发方式为脉冲负边沿触发
IRIN=1; //I/O口初始化

delay1(10); //延时
L1602_init(); //初始化LCD
L1602_string(1, 1, LCD_ID_1);
L1602_string(2, 1, LCD_ID_2);
uart_int();
send(at); //发送AT
delay(500);
if(m==0)
{
LED=1;
}
if(m==1)
{
LED=0;
}
if(QZ==1)
{
if(m==0)
{
send(tele);
delay(20000);
send(tab1);
delay(500);
send(tab2);
delay(500);
send(tab3qh);
send(tab4hm);
send(tab5nr); //发送“家有窃贼!
SBUF=0x1A; //16进制发送1A
while(TI==0);
TI=0;
delay(60000);
delay(60000);
delay(60000);

}

}//end for if (QZ==1)
while(1);
}


/**********************************************************/
void IR_IN() interrupt 2 using 0 //红外 外部中断服务函数
{
unsigned char j,k,N=0;
EX0 = 0;
delay2(15);
if (IRIN==1)
{
EX1 =1;
return;
}
//确认IR信号出现
while (!IRIN){delay2(1);} //等IR变为高电平,跳过9ms的前导低电平信号。

for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN){delay2(1);} //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
while (!IRIN){delay2(1);}//等 IR 变为高电平
while (IRIN) //计算IR高电平时长
{
delay2(1);
N++;
if (N>=30)
{
EX0=1;
return;
} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3])
{
EX0=1;
return;
}
IRCOM[5]=IRCOM[2] & 0x0F; //取键码的低四位
IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位变为低四位
if(IRCOM[5]>9)
{
IRCOM[5]=IRCOM[5]+0x37;
}
else IRCOM[5]=IRCOM[5]+0x30;
if(IRCOM[6]>9)
{
IRCOM[6]=IRCOM[6]+0x37;
}
else IRCOM[6]=IRCOM[6]+0x30;
if(IRCOM[6]==49&&IRCOM[5]==57) //检测到“确定”键按下
{
KEY_num=0;
L1602_string(2, 1, LCD_ID_3);
for(t=0;t<3;t++)
fengmingqi();
}
if(IRCOM[6]==49&&IRCOM[5]==54) //检测到“0”键按下
{
password[KEY_num]='0';
L1602_char(2,KEY_num,password[KEY_num]);
KEY_num++;
fengmingqi();
}
if(IRCOM[6]==48&&IRCOM[5]==67) //检测到“1”键按下
{
password[KEY_num]='1';
L1602_char(2,KEY_num,password[KEY_num]);
KEY_num++;
fengmingqi();
}
if(IRCOM[6]==49&&IRCOM[5]==56) //检测到“2”键按下
{
password[KEY_num]='2';
L1602_char(2,KEY_num,password[KEY_num]);
KEY_num++;
fengmingqi();
}
if(IRCOM[6]==53&&IRCOM[5]==69) //检测到“3”键按下
{
password[KEY_num]='3';
L1602_char(2,KEY_num,password[KEY_num]);
KEY_num++;
fengmingqi();
}
if(IRCOM[6]==48&&IRCOM[5]==56) //检测到“4”键按下
{
password[KEY_num]='4';
L1602_char(2,KEY_num,password[KEY_num]);
KEY_num++;
fengmingqi();
}
if(IRCOM[6]==49&&IRCOM[5]==67) //检测到“5”键按下
{
password[KEY_num]='5';
L1602_char(2,KEY_num,password[KEY_num]);
KEY_num++;
fengmingqi();
}
if(IRCOM[6]==53&&IRCOM[5]==65) //检测到“6”键按下
{
password[KEY_num]='6';
L1602_char(2,KEY_num,password[KEY_num]);
KEY_num++;
fengmingqi();
}
if(IRCOM[6]==52&&IRCOM[5]==50) //检测到“7”键按下
{
password[KEY_num]='7';
L1602_char(2,KEY_num,password[KEY_num]);
KEY_num++;
fengmingqi();
}
if(IRCOM[6]==53&&IRCOM[5]==50) //检测到“8”键按下
{
password[KEY_num]='8';
L1602_char(2,KEY_num,password[KEY_num]);
KEY_num++;
fengmingqi();
}
if(IRCOM[6]==52&&IRCOM[5]==65) //检测到“9”键按下
{
password[KEY_num]='9';
L1602_char(2,KEY_num,password[KEY_num]);
KEY_num++;
fengmingqi();
}
 楼主| admin 发表于 2012-9-2 04:44:48 | 显示全部楼层
if(IRCOM[6]==48&&IRCOM[5]==68) //检测到“取消”键按下
{ L1602_string(2, 1, LCD_ID_4);
if ((password[0]=='0')&&(password[1]=='1')
&&(password[2]=='2')&&(password[3]=='3')
&&(password[4]=='4')&&(password[5]=='5'))
{
uint b,r;
m=1;
for (b=0;b<1000;b++)
{
FMQ=0;
for(r=50;r>0;r--);
FMQ=1;
for(r=50;r>0;r--);
}
password[0]='0';
password[1]='0';
password[2]='0';
password[3]='0';
password[4]='0';
password[5]='0';
}
else
{

fengmingqi();
delay(100);
fengmingqi();
delay(100);
fengmingqi();
delay(100);
fengmingqi();

}
}
EX1= 1;
}
void delay1(int ms)
{
unsigned char y;
while(ms--)
{
for(y = 0; y<250; y++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
您需要登录后才可以回帖 登录 | 注册会员

*滑块验证:
loading...
logo
验证成功
验证未通过
加载失败,请点击重试
本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2025-7-25 20:46 , Processed in 0.051678 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表