语音提示型药盒由CH554开发板、DS1302计时模块、MP3语音播放模块、OLED 屏及步进电机组成。在使用中发现P3.6和P3.7与其它引脚是有差异,无法供DS1302或电机驱动模块使用,在没有其它引脚可用的情况下,只能将步进电机舍去。具体如图所示。
实际构成情况
由于DS1302计时模块既能自行计时,又配有后备电池,所以在断电后也可维持时钟的运行。
MP3语音播放模块则能够在指定的时间自动地提示使用者,OLED 屏则是用于时钟的显示及使用量的显示。
在设计中,对引脚资源的使用情况如下:
OLED屏: scl --- P1.0 sda--- P1.1
触摸键: K1--- P1.4 K2---P1.5 K3---P1.6 K4---P1.7
串行通讯:RXD--- P3.0 TXD --- P3.1
DS1302: RST---P3.2 IO---P1.3; SCK1---P1.2
步进电机:MA---P3.2 MB--- P3.3 MC--- P3.4 MD--- P3.5(可正常使用,但与DS1302有部分冲突。)
在软件设计中,DS1302的主要程序如下:
- void ds1302_init(void)
- {
- Port3Cfg(1,2);
- Port1Cfg(1,2);
- Port1Cfg(1,3);
- RST=0;
- SCK1=0;
- }
- void ds1302_write_byte(uchar addr, uchar d)
- {
- uchar i;
- RST=1;
- addr = addr & 0xFE;
- for (i = 0; i < 8; i ++)
- {
- if (addr & 0x01)
- {
- IO=1;
- }
- else
- {
- IO=0;
- }
- SCK1=1;
- SCK1=0;
- addr = addr >> 1;
- }
- for (i = 0; i < 8; i ++)
- {
- if (d & 0x01)
- {
- IO=1;
- }
- else
- {
- IO=0;
- }
- SCK1=1;
- SCK1=0;
- d = d >> 1;
- }
- RST=0;
- }
- uchar ds1302_read_byte(uchar addr)
- {
- uchar i,temp;
- RST=1;
- addr = addr | 0x01;
- for (i = 0; i < 8; i ++) {
- if (addr & 0x01) {
- IO=1;
- }
- else {
- IO=0;
- }
- SCK1=1;
- SCK1=0;
- addr = addr >> 1;
- }
- for (i = 0; i < 8; i ++) {
- temp = temp >> 1;
- if (IO) {
- temp |= 0x80;
- }
- else {
- temp &= 0x7F;
- }
- SCK1=1;
- SCK1=0;
- }
- RST=0;
- return temp;
- }
- void ds1302_write_time(void)
- {
- ds1302_write_byte(ds1302_control_add,0x00);
- ds1302_write_byte(ds1302_sec_add,0x80);
- ds1302_write_byte(ds1302_year_add,time_buf[1]);
- ds1302_write_byte(ds1302_month_add,time_buf[2]);
- ds1302_write_byte(ds1302_date_add,time_buf[3]);
- ds1302_write_byte(ds1302_hr_add,time_buf[4]);
- ds1302_write_byte(ds1302_min_add,time_buf[5]);
- ds1302_write_byte(ds1302_sec_add,time_buf[6]);
- ds1302_write_byte(ds1302_day_add,time_buf[7]);
- ds1302_write_byte(ds1302_control_add,0x80);
- }
- void ds1302_read_time(void)
- {
- time_buf[1]=ds1302_read_byte(ds1302_year_add);
- time_buf[2]=ds1302_read_byte(ds1302_month_add);
- time_buf[3]=ds1302_read_byte(ds1302_date_add);
- time_buf[4]=ds1302_read_byte(ds1302_hr_add);
- time_buf[5]=ds1302_read_byte(ds1302_min_add);
- time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;
- time_buf[7]=ds1302_read_byte(ds1302_day_add);
- }
复制代码
MP3语音模块的播放程序为:
void playn(UINT16I index)
{
UINT8 checksum = 0,i;
pmd[5] = (UINT8)(index >> 8);
pmd[6] = (UINT8)(index);
for (i=2; i<8; i++)
{
checksum += pmd;
}
pmd[8] = (UINT8)~checksum;
}
void playi(void)
{
UINT8 i;
for(i=0; i<10; i++)
{
CH554UART0SendByte(pmd);
}
}
在主函数中,进行时间判别及语音提示的程序如下:
- if((time_buf[4]==8)&&(time_buf[5]==0)&&(time_buf[6]==0))
- {
- playn(1);
- playi();
- }
-
- if((time_buf[4]==10)&&(time_buf[5]==10)&&(time_buf[6]==0))
- {
- playn(2);
- playi();
- }
-
- if((time_buf[4]==18)&&(time_buf[5]==30)&&(time_buf[6]==0))
- {
- playn(3);
- playi();
- }
复制代码
至此,CH554开发板测评及DIY制作结束。
此内容由EEWORLD论坛网友jinglixixi原创,如需转载或用于商业用途需征得作者同意并注明出处