最近在做毕设,又遇到了很多问题不懂为什么。
p20-p24是语音模块的io口,对地触发播放语音。我按下按键P12后,灯P11亮起来。只要语音模块一触发灯就灭了,如果不加语音模块就很正常
#include "STC15.h"
#include "STC15F2K60S2.h"
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Trig=P0^6; //控制端
sbit Echo=P0^5; //接收端
sbit Beep=P1^7; //单片机开发板上的蜂鸣器
P1M0 = 0x00;
P1M1 = 0xFF;
sbit p00=P0^0;
sbit p01=P0^1;
sbit p02=P0^2;
sbit p03=P0^3;
sbit p07=P0^7;//灯
sbit p10=P1^0;//BUZZ
sbit p11=P1^1;//灯
sbit p12=P1^2;//开关
sbit p20=P2^0;//语音:左方有障碍物
sbit p21=P2^1;//语音:右方有障碍物
sbit p22=P2^2;//语音:前方有障碍物
sbit p23=P2^3;//语音:警示灯已打开
sbit p24=P2^4;//语音:警示灯已关闭
void delay_ms(uchar xms);
unsigned char T0RH=0;
unsigned char T0RL=0;
void time_init()
{
EA=1;
TMOD=0x11;
TH0 = 0;
TL0 = 0;
} //初始化定时器
void Delay_us(unsigned char t)
{
while(--t);
} //大约延时t*2+5us 超声波模块用
void delay_ms(uchar xms)
{
uchar i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void timer0()interrupt 1
{
TH0 = 0;
TL0 = 0;
} //中断程序 初始化赋值 重新计数 超声波模块用 计算时间
void main()
{
unsigned int time,distance;
int key=0;
Trig=0;
Echo=1;
time_init();
p20=1;p21=1;p22=1;
p12=0;
while(1)
{
Trig=1;
Delay_us(10);
Trig=0;
while(Echo==0);
TR0=1;
while(Echo);
TR0=0;
time=TH0*256+TL0;
distance=(int)(time*0.0187); //计算路程 单位为cm
TH0=0;
TL0=0;
if(p12==1&key==0)//开灯
{delay_ms(1000);if(p12==1&key==0)
{p11=0;key=1;while(p12);}}
if(p12==1&key==1) //关灯
{delay_ms(1000);if(p12==1&key==1)
{p11=1;p24=0;key=0;while(p12);}}
if(p02==0) //光电开关
{p10=0;p20=0;delay_ms(1000);}
if(p03==0) //光电开关
{p10=0;p21=0;delay_ms(1000);}
if(distance<40) //如果距离小于30cm 蜂鸣器响
{
p10=0;
p22=0;
Delay_us(1000);
}
}
我的解答思路和尝试过的方法
我把语音模块拔掉 就互不影响
我想要达到的结果
有物体触发光电开关和超声波模块时,语音会播报,按键可以控制灯的亮灭,切播报语音,开灯和关灯的语音