4352|0

1460

帖子

1

TA的资源

五彩晶圆(初级)

楼主
 

【新版CH554评测】 DIY语音提示型药盒 [复制链接]

语音提示型药盒由CH554开发板、DS1302计时模块、MP3语音播放模块、OLED 屏及步进电机组成。在使用中发现P3.6P3.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的主要程序如下:
  1. void ds1302_init(void)
  2. {
  3.         Port3Cfg(1,2);
  4.         Port1Cfg(1,2);
  5.         Port1Cfg(1,3);       
  6.         RST=0;                       
  7.         SCK1=0;                       
  8. }

  9. void ds1302_write_byte(uchar addr, uchar d)
  10. {
  11.         uchar i;
  12.         RST=1;       
  13.         addr = addr & 0xFE;   
  14.         for (i = 0; i < 8; i ++)
  15.         {
  16.                 if (addr & 0x01)
  17.                 {
  18.                         IO=1;
  19.                 }
  20.                 else
  21.                 {
  22.                         IO=0;
  23.                 }
  24.                 SCK1=1;      
  25.                 SCK1=0;
  26.                 addr = addr >> 1;
  27.                 }       
  28.           for (i = 0; i < 8; i ++)
  29.           {
  30.                 if (d & 0x01)
  31.                 {
  32.                         IO=1;
  33.                 }
  34.                 else
  35.                 {
  36.                         IO=0;
  37.                 }
  38.                 SCK1=1;   
  39.                 SCK1=0;
  40.                 d = d >> 1;
  41.          }
  42.          RST=0;               
  43. }

  44. uchar ds1302_read_byte(uchar addr)
  45. {

  46.         uchar i,temp;       
  47.         RST=1;                                       
  48.         addr = addr | 0x01;   
  49.         for (i = 0; i < 8; i ++) {
  50.                 if (addr & 0x01) {
  51.                         IO=1;
  52.                         }
  53.                 else {
  54.                         IO=0;
  55.                         }
  56.                 SCK1=1;
  57.                 SCK1=0;
  58.                 addr = addr >> 1;
  59.                 }       
  60. for (i = 0; i < 8; i ++) {
  61.                 temp = temp >> 1;
  62.                 if (IO) {
  63.                         temp |= 0x80;
  64.                         }
  65.                 else {
  66.                         temp &= 0x7F;
  67.                         }
  68.                 SCK1=1;
  69.                 SCK1=0;
  70.                 }       
  71.         RST=0;                                       
  72.         return temp;
  73. }

  74. void ds1302_write_time(void)
  75. {
  76.         ds1302_write_byte(ds1302_control_add,0x00);                         
  77.         ds1302_write_byte(ds1302_sec_add,0x80);                                 
  78.         ds1302_write_byte(ds1302_year_add,time_buf[1]);                 
  79.         ds1302_write_byte(ds1302_month_add,time_buf[2]);         
  80.         ds1302_write_byte(ds1302_date_add,time_buf[3]);                 
  81.         ds1302_write_byte(ds1302_hr_add,time_buf[4]);                 
  82.         ds1302_write_byte(ds1302_min_add,time_buf[5]);               
  83.         ds1302_write_byte(ds1302_sec_add,time_buf[6]);               
  84.         ds1302_write_byte(ds1302_day_add,time_buf[7]);                 
  85.         ds1302_write_byte(ds1302_control_add,0x80);                             
  86. }

  87. void ds1302_read_time(void)  
  88. {
  89.         time_buf[1]=ds1302_read_byte(ds1302_year_add);                 
  90.         time_buf[2]=ds1302_read_byte(ds1302_month_add);                 
  91.         time_buf[3]=ds1302_read_byte(ds1302_date_add);                 
  92.         time_buf[4]=ds1302_read_byte(ds1302_hr_add);                 
  93.         time_buf[5]=ds1302_read_byte(ds1302_min_add);               
  94.         time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;
  95.         time_buf[7]=ds1302_read_byte(ds1302_day_add);                        
  96. }
复制代码


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);
        }
}

在主函数中,进行时间判别及语音提示的程序如下:
  1. if((time_buf[4]==8)&&(time_buf[5]==0)&&(time_buf[6]==0))       
  2.         {
  3.      playn(1);
  4.                  playi();       
  5.   }
  6.        
  7.         if((time_buf[4]==10)&&(time_buf[5]==10)&&(time_buf[6]==0))       
  8.         {
  9.      playn(2);
  10.                  playi();       
  11.   }
  12.        
  13.         if((time_buf[4]==18)&&(time_buf[5]==30)&&(time_buf[6]==0))       
  14.         {
  15.          playn(3);
  16.                  playi();       
  17.   }
复制代码


至此,CH554开发板测评及DIY制作结束。

此内容由EEWORLD论坛网友jinglixixi原创,如需转载或用于商业用途需征得作者同意并注明出处

此帖出自单片机论坛
点赞 关注(1)
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表