📄 能动.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,17};//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 led_flag=0;
uchar count1,count2;
uchar j;
uchar led1[2];
uchar led2[2];
uchar TABLE[ ] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*LED 字形表*/
//*******************************************************//
/* 语音芯片的控制函数*/
//*******************************************************//
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();
}
}
//*******************************************************//
/* 转换函数*/
//*******************************************************//
void conv1(void) //数值转换
{
led1[1]=count1/10;
led1[0]=count1%10;
}
void conv2(void) //数值转换
{
led2[1]=count2/10;
led2[0]=count2%10;
}
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
TCCR1A=0X00;
TCCR1B=0X01;//
TCNT1H=61536/256;
TCNT1L=61536%256;
if(!led_flag) //显示上行
{
conv1();
PORTB=~(0x01<<j);
PORTA=TABLE[led1[j++]];
if(j==2)
j=0;
}
if(led_flag) //显示下行
{
conv2();
PORTB=~(0x01<<j);
PORTA=TABLE[led2[j++]];
if(j==2)
j=0;
}
}
#pragma interrupt_handler check_EOM:3
void check_EOM(void)
{
MCUCR=0x08; //INT1的下降沿产生异步中断请求
GICR&=~0x80;//关中断
delay_ms(1);
EOM_flag=0;
GICR|=0x80;
}
//**************************************************/
/*主函数*/
//**************************************************//
main()
{
DDRA=0XFF;
PORTA=0XFF;
DDRB=0X0F;
PORTB=0XFF;
DDRC=0XFF;
PORTC=0XEF;
DDRD=0X00;
PORTD=0XF0;
TCCR1A=0X00;
TCCR1B=0X01;//
TCNT1H=61536/256;
TCNT1L=61536%256;
SREG|=0X80;//使能全局中段
TIMSK=0X04;
MCUCR=0x08;//INT1的下降沿产生异步中断请求
GICR|=0x80;
while(1)
{
if(!(PIND&0X80)) //按PD7 上行键
{
delay_ms(10);
if(!(PIND&0X80))
{
while(!(PIND&0X80));
direct_flag=0;
led_flag=0;
count1++;
inform(count1);
}
}
//********************************************************//
/* 上行键 预 报 站*/
//********************************************************//
if(!(PIND&0X40))//按PD6
{
delay_ms(10);
if(!(PIND&0X40))
{
while(!(PIND&0X40));
direct_flag=0;
led_flag=0;
count1++;
pre_inform(count1);
count1=count1-1;
}
}
//********************************************************//
/* 上行键 上一个站*/
//********************************************************//
if(!(PIND&0X20))//按PD5
{
delay_ms(10);
if(!(PIND&0X20))
{
while(!(PIND&0X20));
led_flag=0;
count1--;
inform(count1);
}
}
//********************************************************//
/* 下行键 */
//********************************************************//
if(!(PIND&0X10))//按PD4
{
delay_ms(10);
if(!(PIND&0X10))
{
while(!(PIND&0X10));
direct_flag=1;
led_flag=1;
count2++;
inform(count2);
}
}
//********************************************************//
/* 下行键 预 报 站*/
//********************************************************//
if(!(PIND&0X04))//按PD2
{
delay_ms(10);
if(!(PIND&0X04))
{
while(!(PIND&0X04));
led_flag=1;
count2++;
pre_inform(count2);
count2=count2-1;
}
}
//********************************************************//
/* 下行键 上一个站*/
//********************************************************//
if(!(PIND&0X02))//按PD1
{
delay_ms(10);
if(!(PIND&0X02))
{
while(!(PIND&0X02));
led_flag=1;
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 + -