附 录:程序
/*** 单片机接口:
PC0~7>>>>>>>>>>>>>>数码管段选 PA0~3>>>>>>>>>>>>>>数码管位选
PB6>>>>>>>>>>>>>>>>REC ISD1820开始录音 PB7>>>>>>>>>>>>>>>>PLAYL ISD1820开始播音
PD2>>>>>>>>>>>>>>>>INT0 从0开始计时,并开始录音 PD3>>>>>>>>>>>>>>>>INT1 保持录音时间,并开始播放录音 按下 RETEST 清零
********************************************************/
#include
#define uchar unsigned char #define uint unsigned int uchar num=0; //毫秒 uchar num1=0; //秒 uint i=0; uchar a=0;
//#pragma data:code 软件自身带有
uchar const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//*******************延时 us void delay_us(int t) { do t--;
while(t>1); }
//*******************延时 ms void delay_ms(uint t) {
while(t!=0) {
delay_us(1142);
t--; } }
void show(uint i,uint j)//显示函数 {
14
DDRA=0xff;// 1输出 0输入 DDRn DDRC=0xff;
PORTA=0x00;//1高电平 0低电平 PORTn PORTC=0x00; PORTC=table[i];
PORTA|=BIT(j);//BIT(2) 0000 0100 delay_us(1); }
#pragma interrupt_handler miao:9 void miao()//计时 每次溢出 10ms { a=1; num++;
if(num==100) {
num1++;
if(num1==20)//当到达20秒的时候,停止计时 {
while(a)
{
show(num1/10,0); show(num1,1); show(num/10,2);
show(num,3);
if(PIND==0XF7)//当有按下INT1的时候,开始播音 {a=0;} } }
num=0; }
TCNT1H=0XFE; TCNT1L=0XC7; }
#pragma interrupt_handler baochi:3
void baochi()//按下INT1的时候,保持秒数并开始播放录音 { if((i==1)) {
while(i) {
show(num1/10,0); show(num1,1); show(num/10,2);
show(num,3);
if(PIND==0XFB)//当有按下INT0的时候,结束INT1中断,返回主
15
函数
{i=0; }
} }
}
void main() {
//uchar a; DDRB=0XFF;
DDRD=0X00;//DDRD&=0xf3;//1111 0011 PORTD=0xFF; DDRC=0xff; PORTB=0x00; //TCCR1B=0X04; TCNT1H=0XFe; TCNT1L=0XC7; TIMSK|=BIT(2); SREG|=BIT(7); while(1) {
if(PIND==0xfb) {
num=0; num1=0;
TCCR1B=0X04;//8分频 PORTB&=0x00;
PORTB|=0x40;//开始录音 }
if(PIND==0XF7)//当有按下INT1的时候,启动中断函数 {
PORTB&=0x00; delay_us(10);
PORTB|=0x80;//开始播音 i++;
MCUCR=0X00;
GICR=0X80; PORTD=0xFF; }
show(num1/10,0);//秒 十位 show(num1,1);//秒 个位 show(num/10,2);//毫秒 十位 show(num,3);//毫秒 个位 } }
16