gai6102.c
来自「本科毕业设计做的一个小玩意。设计的语音播报记事器系统使用AT89S52单片机为微」· C语言 代码 · 共 1,109 行 · 第 1/2 页
C
1,109 行
_sclk=0;
_sclk=1;
}
for(i=0;i<8;i++)
{
m=_cror_(m,1);
j=m<<1;
_mosi=CY;
_sclk=0;
_sclk=1;
}
_cs=1;
_sclk=0;
m=0xb0;
_cs=0;
for(i=0;i<8;i++) /*发REC指令*/
{
m=_cror_(m,1);
j=m<<1;
_mosi=CY;
_sclk=0;
_sclk=1;
}
_cs=1;
P1=0xff;
}
void Recording(uint address)
{
uchar i=0;
uchar j=0;
uchar hour,minute,second; /*用来保存td[9]中的时、分、秒、数据*/
bit flag=0; /*录音满标志位*/
save=1;
{
IRcvStr(PCF8563,RDADDR,rd,0x07); /*读pcf8563*/
hour=rd[2]; /*保存时分秒*/
minute=rd[1];
second=rd[0];
td[4]=td[3]=td[2]=0;
ISendStr(PCF8563,WRADDR,td,0x09); /*重写pcf8563,录音时pcf8563计时*/
}
while(kbscan()!=0x77&&flag!=1)
{
if(address==2400) /*如果rac到了2400行,就将flag置1,并将T1清0,退出循环*/
{
flag=1;
}
IRcvStr(PCF8563,RDADDR,rd,0x07); /*读pcf8563*/
Ledsave(0);
Display(led); /*显示*/
}
Stopmode(); /*停止录音*/
{
IRcvStr(PCF8563,RDADDR,rd,0x07); /*读pcf8563*/
secondsave=rd[0]; /*保存录音秒长*/
minutesave=rd[1]; /*保存录音分长*/
}
{
second+=rd[0]; //pcf8563读出来的都是bcd数
j=second&0x0f;
if(j>0x09)
second+=6;
if(second>=0x60)
{
i=1;
second-=0x60;
}
minute+=rd[1]+i;
i=0;
j=minute&0x0f;
if(j>0x09)
minute+=6;
if(minute>=0x60)
{
i=1;
minute-=0x60;
}
hour+=rd[2]+i;
i=0;
}
{
td[4]=hour;
td[3]=minute;
td[2]=second;
ISendStr(PCF8563,WRADDR,td,0x09); /*重写pcf8563*/
}
if(flag==1) /*如果录音录满了led全亮3s作为提示*/
{
Ledcheck();
}
}
void Audioout(uint address) /*放音程序*/
{
uchar i,m,j;
unsigned int datasoute;
Powerup();
Delay1ms(50);//上电延时
_cs=1;
_sclk=0;
_cs=0;
m=0xe0;
for(i=0;i<16;i++)
{
address=_iror_(address,1);
datasoute=address<<1;
_sclk=0;
_mosi=CY;
_sclk=1;
}
for(i=0;i<8;i++)
{
m=_cror_(m,1);
j=m<<1;
_sclk=0;
_mosi=CY;
_sclk=1;
}
_cs=1;
_sclk=0;
m=0xf0;
_cs=0;
for(i=0;i<8;i++)
{
m=_cror_(m,1);
j=m<<1;
_sclk=0;
_mosi=CY;
_sclk=1;
}
_cs=1;
P1=0xff;
}
void Playing(uchar segment,bit tag)
{
uchar i=0;
uchar j=0;
uchar hour,minute,second; /*用来保存td[9]中的时、分、秒、数据*/
{
IRcvStr(PCF8563,RDADDR,rd,0x07); /*读pcf8563*/
hour=rd[2]; /*保存时分秒*/
minute=rd[1];
second=rd[0];
td[4]=td[3]=td[2]=0;
ISendStr(PCF8563,WRADDR,td,0x09); /*重写pcf8563,放音时pcf8563计时*/
}
while(_int==1)
{
IRcvStr(PCF8563,RDADDR,rd,0x07); /*读pcf8563*/
Ledplay(segment,tag);
Display(led); /*显示*/
}
{
second+=rd[0]; //pcf8563读出来的都是bcd数
j=second&0x0f;
if(j>0x09)
second+=6;
if(second>=0x60)
{
i=1;
second-=0x60;
}
minute+=rd[1]+i;
i=0;
j=minute&0x0f;
if(j>0x09)
minute+=6;
if(minute>=0x60)
{
i=1;
minute-=0x60;
}
hour+=rd[2]+i;
i=0;
}
{
td[4]=hour;
td[3]=minute;
td[2]=second;
ISendStr(PCF8563,WRADDR,td,0x09); /*重写pcf8563*/
}
}
/**************************************************************************************
按键转化为相应的数字
**************************************************************************************/
uchar Key_number(uchar keycode)
{
uchar number;
if(keycode==0xee)
number=0;
if(keycode==0xde)
number=1;
if(keycode==0xbe)
number=2;
if(keycode==0x7e)
number=3;
if(keycode==0xed)
number=4;
if(keycode==0xdd)
number=5;
if(keycode==0xbd)
number=6;
if(keycode==0x7d)
number=7;
if(keycode==0xeb)
number=8;
if(keycode==0xdb)
number=9;
if(keycode==0xbb)
number=10;
if(keycode==0x7b)
number=11;
if(keycode==0xe7)
number=12;
if(keycode==0xd7)
number=13;
if(keycode==0xb7)
number=14;
if(keycode==0x77)
number=15;
if(keycode==0xff)
number=16;
return(number);
}
/**************************************************************************************
时间设置函数
**************************************************************************************/
void Settime()
{
uchar keycode,keynumber;
uchar i=2;
while(kbscan()!=0x77)
{
keycode=kbscan();
keynumber=Key_number(keycode);
do
{
Display(led);
}while(keycode==kbscan());
Delay1ms(5);
if(keynumber!=10&&keynumber!=11&&keynumber!=12&&keynumber!=13&&keynumber!=14&&keynumber!=15&&keynumber!=16)
{
led[i]=keynumber;
i++;
}
if(i==15)
{
i=2;
}
Display(led);
}
}
/**************************************************************************************
合成
**************************************************************************************/
void Led_change()
{
uchar i;
i=led[2];
i<<=4;
td[8]=i+led[3]; /*年*/
i=led[4];
i<<=4;
td[7]=i+led[5]; /*月*/
i=led[6];
i<<=4;
td[5]=i+led[7]; /*日*/
td[6]=led[8]; /*星期*/
i=led[9];
i<<=4;
td[4]=i+led[10]; /*时*/
i=led[11];
i<<=4;
td[3]=i+led[12]; /*分*/
i=led[13];
i<<=4;
td[2]=i+led[14]; /*秒*/
}
/**************************************************************************************
播放时间设置
**************************************************************************************/
void Led_change1()
{
uchar i;
i=led[2];
i<<=4;
playtime[6]=i+led[3]; /*年*/
i=led[4];
i<<=4;
playtime[5]=i+led[5]; /*月*/
i=led[6];
i<<=4;
playtime[3]=i+led[7]; /*日*/
playtime[4]=led[8]; /*星期*/
i=led[9];
i<<=4;
playtime[2]=i+led[10]; /*时*/
i=led[11];
i<<=4;
playtime[1]=i+led[12]; /*分*/
i=led[13];
i<<=4;
playtime[0]=i+led[14]; /*秒*/
}
/*************************************************************************************/
void Recording_30s(uint address,uchar segment)
{
uchar i=0;
uchar j=0;
uchar hour,minute,second; /*用来保存td[9]中的时、分、秒、数据*/
{
IRcvStr(PCF8563,RDADDR,rd,0x07); /*读pcf8563*/
hour=rd[2]; /*保存时分秒*/
minute=rd[1];
second=rd[0];
td[4]=td[3]=td[2]=0;
ISendStr(PCF8563,WRADDR,td,0x09); /*重写pcf8563,录音时pcf8563计时*/
}
IRcvStr(PCF8563,RDADDR,rd,0x07); /*读pcf8563*/
while(rd[0]!=0x30)
{
IRcvStr(PCF8563,RDADDR,rd,0x07); /*读pcf8563*/
Ledsave(segment);
Display(led); /*显示*/
}
Stopmode(); /*停止录音*/
{
IRcvStr(PCF8563,RDADDR,rd,0x07); /*读pcf8563*/
secondsave_30s=0x30; /*保存录音秒长*/
minutesave_30s=0x00; /*保存录音分长*/
}
{
second+=rd[0]; //pcf8563读出来的都是bcd数
j=second&0x0f;
if(j>0x09)
second+=6;
if(second>=0x60)
{
i=1;
second-=0x60;
}
minute+=rd[1]+i;
i=0;
j=minute&0x0f;
if(j>0x09)
minute+=6;
if(minute>=0x60)
{
i=1;
minute-=0x60;
}
hour+=rd[2]+i;
i=0;
}
{
td[4]=hour;
td[3]=minute;
td[2]=second;
ISendStr(PCF8563,WRADDR,td,0x09); /*重写pcf8563*/
}
}
void Playing_30s(uchar segment,bit tag)
{
uchar i=0;
uchar j=0;
uchar hour,minute,second; /*用来保存td[9]中的时、分、秒、数据*/
{
IRcvStr(PCF8563,RDADDR,rd,0x07); /*读pcf8563*/
hour=rd[2]; /*保存时分秒*/
minute=rd[1];
second=rd[0];
td[4]=td[3]=td[2]=0;
ISendStr(PCF8563,WRADDR,td,0x09); /*重写pcf8563,放音时pcf8563计时*/
}
while(_int==1)
{
IRcvStr(PCF8563,RDADDR,rd,0x07); /*读pcf8563*/
Ledplay(segment,tag);
Display(led); /*显示*/
}
{
second+=rd[0]; //pcf8563读出来的都是bcd数
j=second&0x0f;
if(j>0x09)
second+=6;
if(second>=0x60)
{
i=1;
second-=0x60;
}
minute+=rd[1]+i;
i=0;
j=minute&0x0f;
if(j>0x09)
minute+=6;
if(minute>=0x60)
{
i=1;
minute-=0x60;
}
hour+=rd[2]+i;
i=0;
}
{
td[4]=hour;
td[3]=minute;
td[2]=second;
ISendStr(PCF8563,WRADDR,td,0x09); /*重写pcf8563*/
}
}
/*************************************主程序******************************************/
void main()
{
uchar key;
Ledcheck(); /*开机后LED全亮3秒*/
{
Record4004(0); /*录音*/
Delay1ms(400);
Stopmode(); /*停止录音*/
}
ISendStr(PCF8563,WRADDR,td,0x09); /*初始化PCF8563*/
while(1)
{
{
IRcvStr(PCF8563,RDADDR,rd,0x07);
Change_Led();
Display(led);
} /*LED显示时间*/
{
key=kbscan(); /*扫描键盘*/
do
{
{
IRcvStr(PCF8563,RDADDR,rd,0x07); /*读PCF8563*/
rd[0]&=0x7f; /*屏蔽秒无效位*/
rd[1]&=0x7f; /*屏蔽分无效位*/
rd[2]&=0x3f; /*屏蔽时无效位*/
rd[3]&=0x3f; /*屏蔽日无效位*/
rd[5]&=0x1f; /*屏蔽月无效位*/
if(playtime[0]==rd[0]&&playtime[1]==rd[1]&&playtime[2]==rd[2]&&playtime[3]==rd[3]&&playtime[5]==rd[5]&&playtime[6]==rd[6]&&save==1)
{
Audioout(rac_address);
Playing(0,0);
}
}
IRcvStr(PCF8563,RDADDR,rd,0x07);
Change_Led();
Display(led);
}while(key==kbscan()); /*当按键弹起来的时候再转向各功能*/
}
switch(key)
{
case 0xe7: /*如果设置键按下就可以设置时间*/
{
Settime(); /*设置时间*/
Led_change(); /*重写td*/
ISendStr(PCF8563,WRADDR,td,0x09); /*写pcf8563*/
}break;
case 0xbb: /*如果录音键按下就可以录音*/
{
if(rac_address==2400)
{
rac_address=0; /*如果录满了从头开始录音*/
}
{
Record4004(rac_address); /*录音*/
Recording(rac_address);
}
}break;
case 0x7b: /*如果播放键按下就可以放音*/
{
if(save==1)
{
Audioout(rac_address);
Playing(0,0);
}
}break;
case 0xd7: /*播放时间设置*/
{
Settime();
Led_change1();
}break;
case 0xb7: /*录音1到4*/
{
do
{
key=kbscan();
IRcvStr(PCF8563,RDADDR,rd,0x07);
Change_Led();
Display(led);
}while(key!=0xde&&key!=0xbe&&key!=0x7e&&key!=0xed); /*当按下的键不是1,2,3,4时*/
switch(key)
{
case 0xde:/*录音1*/
{
Record4004(10);
Recording_30s(10,1);
}break;
case 0xbe:/*录音2*/
{
Record4004(90);
Recording_30s(90,2);
}break;
case 0x7e:/*录音3*/
{
Record4004(170);
Recording_30s(170,3);
}break;
case 0xed:/*录音4*/
{
Record4004(250);
Recording_30s(250,4);
}break;
}
}break;
case 0xde:
{
Audioout(10);
Playing_30s(1,1);
}break;/*播放1*/
case 0xbe:
{
Audioout(90);
Playing_30s(2,2);
}break;/*播放2*/
case 0x7e:
{
Audioout(170);
Playing_30s(3,3);
}break;/*播放3*/
case 0xed:
{
Audioout(250);
Playing_30s(4,4);
}break;/*播放4*/
}//switch结束
}//while结束
}//main函数结束
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?