标题:
超声波模块跟GSM模块冲突了,怎么改单片机程序?
[打印本页]
作者:
2248373991
时间:
2022-5-3 18:50
标题:
超声波模块跟GSM模块冲突了,怎么改单片机程序?
先谢谢大家
void Init_Timer()
{
PCON=0x00;
SCON=0x50;
TMOD=0x21;
TL0 =0x00;
TH0 =0x4C;
TL1 =0xfd;
TH1 =0xfd;
TR0 =1;
TR1 =1;
ET0 =1;
ES =1;
EA =1;
}
void inter() interrupt 4
{
date = SBUF;
if(RI)
RI = 0;
}
//外部中断0
void initex()
{
TMOD=0x09; //定时器T0工作方式1 GATE0=1
IT0=1; //设置为下降沿中断方式
EX0=1; //开外部中断
}
void int0() interrupt 0
{
t=(TH0*256+TL0);//计算高电平持续的时间,上升沿到来时候开始计时,下降沿到来进入外部中断,关闭计时器,停止计时
TH0=0;
TL0=0;
}
/*主函数*/
uchar global_state = 0;
uchar count_num = 0; //输入的数字个数
void main()
{
uchar i;
uchar passwd;
uchar key_value = 0;
uchar temp_key_value = 0xff;
Lock = 1; //刚上电 锁是需要保持闭合
Init_Timer();
initex();
lcd_init(); //LCD1602初始化
while(1) //进入不断循环
{
temp_key_value = Calkey_scan(); //读取矩阵按键的键值
if(temp_key_value != 0xff)
{
key_value = temp_key_value;
}
switch(global_state)
{
case 0: //初始化状态
display1(); //显示欢迎语句 -- "welcome"
zyx = 1; //紫外线
zm = 0;
display5(); //显示Current T=
Read_Temperature(); //读取温度值
display7(); //显示温度
Alarm(); //报警
wenk(); //温控
HC05_Init(); //超声波
if(SetKey==0) //设置键
{
clear(); //清屏
global_state = 3; //切换运行状态
}
if(key_value == 13) //存餐按键被按下
{
key_value = 0xff; //将按键值清除
if(distance>300)
{
TMOD=0x21;
global_state = 4;
}
else
{
clear(); //清屏,准备下一屏的显示
display10();
delay(1000);
clear(); //清屏,准备下一屏的显示
global_state = 0; //返回到初始界面
}
}
if(key_value == 14) //取餐按键被按下
{
key_value = 0xff; //将按键值清除
clear(); //清屏,准备下一屏的显示
global_state = 2; //切换运行状态
count_num = 0; //清除数字按键变量
for(i = 0;i < 4;i++) //清空输入的密码数组
inpPasswd[i] = ' '-0x30;
}
break;
case 1: //密码生成状态
display2(); //显示密码生成界面
GSM_PDU();
GSM_PDU_SMS();
global_state = 0; //返回到初始界面
clear(); //清屏,准备下一屏的显示
break;
case 2: //输入密码状态
display4(); //显示输入密码界面
if((key_value >= 0) && (key_value <= 9)) //如果按下的为0-9的数字按键
{
if(count_num <= 3) //如果按键次数小于4次
{
inpPasswd[count_num] = key_value; //将按键值存入数组,并显示
count_num++;
}
key_value = 0xff; //将按键值清除
}
if(key_value == 15) //清除按键被按下
{
key_value = 0xff; //将按键值清除
for(i = 0;i < 4;i++)
inpPasswd[i] = ' '-0x30; //清除刚刚输入的密码
count_num=0;
}
if(key_value == 16) //确认按键被按下
{
key_value = 0xff; //将按键值清除
for(i = 0;i < 4;i++)
{
if(inpPasswd[i] != genPasswd[i])
break;
}
if(i == 4) //密码输入正确
{
Lock = 0; //开锁
zm = 1; //照明
zyx = 0;
clear(); //清屏,准备下一屏的显示
display3(); //显示关门提示语 -- "close door!"
delay(1900); //等待关门 大约3秒
clear(); //清屏,准备下一屏的显示
Lock = 1; //关锁
zyx = 1; //紫外线
zm = 0;
}
else //密码输入错误 报警
{
clear(); //清屏,准备下一屏的显示
Lock = 1; //关锁
BEEP=0;
display9();
delay(1000);
BEEP=1;
display9();
}
clear(); //清屏,准备下一屏的显示
global_state = 0; //返回到初始界面
}
break;
case 3:
display5(); //显示Current T=
display6(); //显示上下限
Read_Temperature(); //读取温度值
display7(); //显示温度
display8(); //显示上下限温度
SetFun(); //指针>
Alarm();
wenk();
if(key_value == 16) //确认按键被按下
{
key_value = 0xff; //将按键值清除
clear(); //清屏,准备下一屏的显示
global_state = 0; //返回到初始界面
}
break;
case 4:
Lock = 0; //开锁
zm = 1;
zyx = 0;
clear(); //清屏,准备下一屏的显示
display3(); //显示关门提示语 -- "close door!"
delay(1900); //等待关门 大约3秒
clear(); //清屏,准备下一屏的显示
Lock = 1; //关锁
zyx = 1; //紫外线
zm = 0;
clear(); //清屏,准备下一屏的显示
global_state = 1; //切换运行状态
passwd = TL0; //采用定时器寄存器的值作为密码
genPasswd[0] = passwd/100; //存储密码
genPasswd[1] = passwd%100/10;
genPasswd[2] = passwd%10;
genPasswd[3] = (genPasswd[1]+genPasswd[2])%10;
break;
}
}
}
复制代码
作者:
188610329
时间:
2022-5-3 22:04
方法1:
//外部中断0
void initex()
{
TMOD |=0x09;
//定时器T0工作方式1 GATE0=1
IT0=1; //设置为下降沿中断方式
EX0=1; //开外部中断
}
方法2:
void Init_Timer()
{
PCON=0x00;
SCON=0x50;
TMOD=0x29;
TL0 =0x00;
TH0 =0x4C;
TL1 =0xfd;
TH1 =0xfd;
TR0 =1;
TR1 =1;
ET0 =1;
ES =1;
EA =1;
}
//外部中断0
void initex()
{
// TMOD=0x09;
//定时器T0工作方式1 GATE0=1
IT0=1; //设置为下降沿中断方式
EX0=1; //开外部中断
}
作者:
lkc8210
时间:
2022-5-3 23:00
有啥冲突?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1