📄 初步成功.txt
字号:
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
uchar EOM_flag=1;
unsigned int second=0;
uchar count=0;
uchar snd_info[]={11,0,20};//17存放"到了,请上车的乘客往车厢内走,11存放"叮咚"
uchar sndpre_info[]={12,0,13};//12存放"前方到站",13放"请要下车的乘客作好准备"
uchar sndwarn_info=14;//14存放"特殊消息"
uchar sndbegin_info=15;//欢迎起点
uchar sndend_info=16;//欢迎终点
uchar direct_flag=0;
uchar count1,count2;
//*******************************************************//
/* 语音芯片的控制函数*/
//*******************************************************//
void delay2560(int t)
{while(t--);}
void set_CE(uchar level) //PC0用于芯片使能,低有效
{
if(level==1) PORTC|=0X01;
else PORTC&=~0X01;
}
void set_PD(uchar level) //PC1用于录放停止和复位键
{
if(level==1) PORTC|=0X02;
else PORTC&=~0X02;
}
void set_PR(uchar level) //PC2低电平录音,高电平放音
{
if(level==1) PORTC|=0X04;
else PORTC&=~0X04;
}
void set_A6(uchar level) //选择M6模式
{
if(level) PORTC|=0X08;
else PORTC&=~0X08;
}
void set_A0(uchar level) //选择M0模式
{
if(level) PORTC|=0X10;
else PORTC&=~0X10;
}
//*******************************************************//
/* 语音搜索*/
//*******************************************************//
void seek_duan(uchar s)
{
set_PD(1);
delay2560(20000);
set_PD(0); //芯片复位
set_PR(1); //放音模式
set_A0(1);//M0模式
while(s--)
{
set_CE(0);
set_CE(1);
do
NOP();
while(EOM_flag);
EOM_flag=1;
}
set_A0(0);//M6模式
}
//*******************************************************//
/* 语音播放*/
//*******************************************************//
void play()
{
set_CE(0);
set_CE(1);
do
NOP();
while(EOM_flag);
EOM_flag=1;
}
//*******************************************************//
/*录 音*/
//*******************************************************//
void receive()
{
set_PR(0);
set_CE(1);
set_CE(0);
delay_ms(5);//开始录音
}
//*******************************************************//
/*报 站*/
//*******************************************************//
void inform(uchar m)
{
uchar i;
if(!direct_flag)
snd_info[1]=m;
else
snd_info[1]=11-m;
set_PD(1);
delay2560(20000);
set_PD(0); //芯片复位
for(i=0;i<3;i++)
{
seek_duan(snd_info[i]);
play();
}
}
//*******************************************************//
/* 预 报 站*/
//*******************************************************//
void pre_inform(uchar m)
{
uchar i;
if(!direct_flag) { sndpre_info[1]=m;}
else sndpre_info[1]=11-m;
set_PD(1);
delay2560(20000);
set_PD(0); //芯片复位
for(i=0;i<3;i++)
{
seek_duan(sndpre_info[i]);
play();
}
}
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
TCCR1A=0X00;
TCCR1B=0X05;
TCNT1H=0XFb;
TCNT1L=0Xbe;
second=second+1;
if(second==60)
{ second=0;}
}
#pragma interrupt_handler check_EOM:3
void check_EOM(void)
{
MCUCR=0x08; //INT1的下降沿产生异步中断请求
GICR&=~0x80;//关中断
delay_ms(1);
// set_PD(1);
// delay2560(20000);
//set_PD(0); //芯片复位
EOM_flag=0;
GICR|=0x80;
}
//**************************************************//
/*主函数*/
//**************************************************//
main()
{
DDRC=0XFF;
PORTC=0XEF;
DDRD=0X00;
PORTD=0XF0;
TCCR1A=0X00;
TCCR1B=0X05;
TCNT1H=0XFb;
TCNT1L=0Xbe;
SREG|=0X80;//使能全局中段
MCUCR=0x08;//INT1的下降沿产生异步中断请求
GICR|=0x80;
while(1)
{
if(!(PIND&0X80)) //按PD7 上行键
{
delay_ms(10);
if(!(PIND&0X80))
{
while(!(PIND&0X80));
direct_flag=0;
count1++;
inform(count1);
}
}
//********************************************************//
/* 上行键 预 报 站*/
//********************************************************//
if(!(PIND&0X40))//按PD6
{
delay_ms(10);
if(!(PIND&0X40))
{
while(!(PIND&0X40));
direct_flag=0;
count1++;
pre_inform(count1);
}
}
//********************************************************//
/* 上行键 上一个站*/
//********************************************************//
if(!(PIND&0X20))//按PD5
{
delay_ms(10);
if(!(PIND&0X20))
{
while(!(PIND&0X20));
count1--;
// display1();
inform(count1);
}
}
//********************************************************//
/* 下行键 */
//********************************************************//
if(!(PIND&0X10))//按PD4
{
delay_ms(10);
if(!(PIND&0X10))
{
while(!(PIND&0X10));
direct_flag=1;
count2++;
// display2();
inform(count2);
}
}
//********************************************************//
/* 下行键 预 报 站*/
//********************************************************//
if(!(PIND&0X04))//按PD2
{
delay_ms(10);
if(!(PIND&0X04))
{
while(!(PIND&0X04));
count2++;
pre_inform(count2);
}
}
//********************************************************//
/* 下行键 上一个站*/
//********************************************************//
if(!(PIND&0X02))//按PD1
{
delay_ms(10);
if(!(PIND&0X02))
{
while(!(PIND&0X02));
count2--;
// display2();
inform(count2);
}
}
//********************************************************//
/* 欢迎信息(起点)*/
//********************************************************//
if(!(PIND&0X01))//按PD0
{
delay_ms(10);
if(!(PIND&0X01))
{
while(!(PIND&0X01));
seek_duan(sndbegin_info);
play();
}
}
//********************************************************//
/* 欢迎信息(终点) */
//********************************************************//
if(!(PINB&0X80))//按PB7
{
delay_ms(10);
if(!(PINB&0X80))
{
while(!(PINB&0X80));
seek_duan(sndend_info);
play();
}
}
//********************************************************//
/* 特殊情况 */
//********************************************************//
if(!(PINB&0X40))//按PB6
{
delay_ms(10);
if(!(PINB&0X40))
{
while(!(PINB&0X40));
seek_duan(sndwarn_info);
play();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -