lcw_swust 发表于 2013-10-12 13:40:57

基于M88与SPIFLASH的语音报时闹钟

本帖最后由 lcw_swust 于 2013-10-12 14:43 编辑

功能:
语音报时(16KHz,8位),一个闹钟,4位数码管显示,温度显示,手电筒。
(在暗处,工作电流在0.5mA左右,论功耗,还是贴片LED做成点阵比数码管更低些)
*原理:单片机外接32.768KHz晶振用于计时,4位共阴数码管显示,
5mm高亮LED做手电筒,MF58-100K热敏电阻测温,
外接SPIFLASH存储WAV文件, 用PWM驱动喇叭发出声音。
*所用单片机为ATmega88V (MEGA88PA-AU),SPIFLASH为SST25VF080B
*熔丝设置为出厂默认值DF62,使用片内8MHz的RC振荡器
*外接32.768KHz作为T2的异步时钟源
*由数码管内的LED(反向偏置)测量环境亮度,热敏电阻(MF58,100K)测量温度
*使用4位共阴极数码管
*MCU平时工作于"省电模式",由T2唤醒后,动态扫描LED,且处理计时,
*T0:16KHz中断,用于播放WAV
T1:产生PWM,代替DAC,等效于开关功放
*按键与LED的段复用
键1:SET,设置,相应参数闪烁,再按选择下一个参数,
        此键长按为手电筒开关
键2:INC,增加,让闪烁的参数增加,长按此键连续增加
        待机状态按下键2,显示闹钟时间,播报闹钟时间\闹钟开关以及整点报时开关
键3:RD,报时,播报时间与温度
*按键若在10秒内无操作,将回到待机状态
*平时显示时间4秒\显示温度2秒
显示时间时,若闹钟打开,则最右方的小数点亮起
显示温度时,若整点报时开启,则最右方的小数点亮起
*当检测到电池电压低于3.2V时只显示小数点
注意:由于数码管LED测光时放电较慢,在COM4与SEGD间接入了一个20M欧的电阻用于加快放电。









(将PART1与PART2解压到同一文件夹内,双击运行BAT文件可将文件合并)














dexidz 发表于 2013-10-14 12:39:29

谢谢楼主,真全面。初中时买过一个会报时的钟,那时觉得真神奇。。顶一下,这个没人支持??好奇怪啊

mcuzone 发表于 2013-10-14 13:39:49

手艺不错{:titter:}

lee345 发表于 2013-10-14 13:52:32

是啊,手工不错,没有用AVR好多年了

二进制 发表于 2013-10-15 19:24:00

好东西

Alexi2008 发表于 2013-10-15 21:23:06

支持一下,这个非常不错!

jt6245 发表于 2013-10-17 20:14:30

相当不错,合理的设计有详细资料和解释. 感谢.

wsm80828 发表于 2013-10-17 21:44:05

这个不错

wsm80828 发表于 2013-10-17 21:44:45

这个不错

wsm80828 发表于 2013-10-17 21:45:05

这个不错

YF_Wang 发表于 2013-11-13 20:27:29

很不错,请问一下楼主,你的这个是先要把程序写到下载器里,再由下载器写到CPU和SPI Flash里面去的吗?

lcw_swust 发表于 2013-11-13 22:05:27

YF_Wang 发表于 2013-11-13 20:27 static/image/common/back.gif
很不错,请问一下楼主,你的这个是先要把程序写到下载器里,再由下载器写到CPU和SPI Flash里面去的吗? ...

下载器是由USB转串口芯片和一个STC单片机做的(类似STK500),
但是,烧写AVR单片机与烧写SPIFLASH的STC单片机运行的程序是不同的,(上位机也不同)
将LCW-ISP V1.6(STC)内的HEX烧入STC单片机,这个东东可称之为"AVR下载器"
此时上位机需要打开AVR单片机的HEX文件,通过串口发送到STC单片机,再写入AVR.
将LCW-FLASH V1.6(STC)内的HEX烧入STC单片机,这个东东可称之为"SPIFLASH下载器"
此时上位机需要打开需要写入到SPIFLASH的BIN文件,通过串口发送到STC单片机,再写入SPIFLASH.
由于本人比较懒,未将二者整合到一起,其实二者大多数代码是相同的.

YF_Wang 发表于 2013-11-26 10:46:08

lcw_swust 发表于 2013-11-13 22:05
下载器是由USB转串口芯片和一个STC单片机做的(类似STK500),
但是,烧写AVR单片机与烧写SPIFLASH的STC单片 ...

请教楼主:
      
         我用的Flash是25Q16,单片机用的是STC12C40052、11.0592M晶振,通过串口读写可以操作正常(IO模拟的SPI通信),看到楼主的制作非常不错,也想一些语音文件到Flash里,用了楼主的程序,但是不成功,通过上位机操作时:
点击”检测芯片“,一直显示
设置波特率
重发数据
重发数据
重发数据
串口通信不正常
单片机的程序里也把相应的修改了一下(楼主用的是20M晶振,我已经改成了#define FOSC 11059200,然后有一些地方的运算比例也按11.0592M来修改了)

请问楼主,是哪里不对吗,谢谢!

另外,我用串口监视工具看到信息为

1       IRP_MJ_CREATE                   Port Opened - LCW-FLASH V1.5.exe
2       IOCTL_SERIAL_SET_BAUD_RATE      Baud Rate: 312500
3       IOCTL_SERIAL_SET_LINE_CONTROL   StopBits: 1, Parity: No, DataBits: 8
4       IOCTL_SERIAL_SET_BAUD_RATE      Baud Rate: 2400
5       IOCTL_SERIAL_SET_LINE_CONTROL   StopBits: 1, Parity: No, DataBits: 8
6       IRP_MJ_WRITE                  Length: 0009, Data: AA 1E 00 04 01 04 C4 B4 49
7       IRP_MJ_READ                     Length: 0001, Data: AA
8       IRP_MJ_READ                     Length: 0004, Data: 1E 00 04 01
9       IRP_MJ_READ                     Length: 0003, Data: 04 C4 B4
10      IRP_MJ_READ                     Length: 0001, Data: 49
11      IOCTL_SERIAL_SET_BAUD_RATE      Baud Rate: 312500
12      IOCTL_SERIAL_SET_LINE_CONTROL   StopBits: 1, Parity: No, DataBits: 8
13      IRP_MJ_WRITE                  Length: 0008, Data: AA 1F 00 03 06 01 01 D4
14      IRP_MJ_READ                     Length: 0001, Data: 00
15      IRP_MJ_WRITE                  Length: 0008, Data: AA 1F 00 03 06 01 01 D4
16      IRP_MJ_READ                     Length: 0001, Data: 00
17      IRP_MJ_WRITE                  Length: 0008, Data: AA 1F 00 03 06 01 01 D4
18      IRP_MJ_READ                     Length: 0001, Data: 00
19      IRP_MJ_WRITE                  Length: 0008, Data: AA 1F 00 03 06 01 01 D4
20      IRP_MJ_READ                     Length: 0001, Data: 00
21      IRP_MJ_CLOSE                  Port Closed

好像没有执行到switch里面,我添加了下面红色的一行代码调试。

void uart1_mint(U8 ud)
{
        uartsendbyte(ud);        // 调试,看程序执行到这里没有

        switch(uartstate)//enum state{HEAD,LEN,TYPE,DATA,CHECK};
        {
                //~ uartsendbyte('P');        // 调试,看程序执行到这里没有
          
                case HEAD:
                        if(ud==START)
                        {

lcw_swust 发表于 2013-11-26 11:29:03

YF_Wang 发表于 2013-11-26 10:46
请教楼主:
      
         我用的Flash是25Q16,单片机用的是STC12C40052、11.0592M晶振,通过串口读写 ...

您好,请把你的程序一起发上来。
我这试了下,串口通信没问题。
所用单片机为STC12C4052AD,程序中仅改了一处:#define FOSC 11059200

YF_Wang 发表于 2013-11-26 12:10:40

lcw_swust 发表于 2013-11-26 11:29
您好,请把你的程序一起发上来。
我这试了下,串口通信没问题。
所用单片机为STC12C4052AD,程序中仅改了 ...

楼主您好:

      请帮忙看看,谢谢!

lcw_swust 发表于 2013-11-26 13:23:11

YF_Wang 发表于 2013-11-26 12:10
楼主您好:

      请帮忙看看,谢谢!

问题找到,应该是头文件的问题。

#include"STC12C4052AD.H"
改为
#include"STC12C2052AD.H"
就行了。
由于你给我的程序没有这个文件STC12C4052AD.H,你可以自己对比一下二者的区别,再结合单片机手册来看。
(我用的Keil2,生成文件为LCW-ISP.hex)

YF_Wang 发表于 2013-11-26 18:38:57

lcw_swust 发表于 2013-11-26 13:23
问题找到,应该是头文件的问题。

#include"STC12C4052AD.H"


楼主您好:

          首先非常感谢楼主的认真指导!谢谢!
         我把我这边编译的Hex文件和你发给我的对比了一下(我用KEIL2编译的也一样),有好多不一样,应该还是程序有一些地方不同,下载你的那个文件(LCW-ISP.hex)通信正常,但好像还是不能下载语音文件,每次都是“下位机数据区容量:74”。我截了两张图片,您帮忙看看!谢谢!

lcw_swust 发表于 2013-11-26 20:01:06

YF_Wang 发表于 2013-11-26 18:38
楼主您好:

          首先非常感谢楼主的认真指导!谢谢!


这样吧,把你用KEIL编的工程发过来,再把编译器也一起发过来.

YF_Wang 发表于 2013-11-27 08:12:53

lcw_swust 发表于 2013-11-26 20:01
这样吧,把你用KEIL编的工程发过来,再把编译器也一起发过来.

楼主您好:

          这个是我这边编译的KEIL工程,请帮忙看看,谢谢!

lcw_swust 发表于 2013-11-27 09:46:12

本帖最后由 lcw_swust 于 2013-11-27 09:48 编辑

YF_Wang 发表于 2013-11-27 08:12
楼主您好:

          这个是我这边编译的KEIL工程,请帮忙看看,谢谢!

你的工程与我的有两点不同:
1、你的Target是STC单片机,我的是AT89S53。(这一点不重要,我的编译器安装时没添加STC,只是在源代码文件夹内添加STC的头文件)
2、下图里红圈内打个勾。

(刚刚回复时竟然要邮箱验证,而且邮件收不到,点“重新接收”才收到)

YF_Wang 发表于 2013-11-27 21:13:38

lcw_swust 发表于 2013-11-27 09:46
你的工程与我的有两点不同:
1、你的Target是STC单片机,我的是AT89S53。(这一点不重要,我的编译器安装 ...

楼主您好:

       我按照你说的勾上了,编译后上位机通信设置波特率是可以了,但就只到了“下位机数据区容量:74”这里,这个是哪里出了问题呢?谢谢!

HYLG 发表于 2013-11-27 22:34:45

顶好贴,顶楼主。
好奇下楼主做了多久做出这个东西。

leicai05 发表于 2013-11-28 08:53:54

不错的东东,这个语音播放,声音大吗?

lcw_swust 发表于 2013-11-28 08:55:53

YF_Wang 发表于 2013-11-27 21:13
楼主您好:

       我按照你说的勾上了,编译后上位机通信设置波特率是可以了,但就只到了“下位机数据 ...

加我Q,449630071

lcw_swust 发表于 2013-11-28 08:58:59

leicai05 发表于 2013-11-28 08:53
不错的东东,这个语音播放,声音大吗?

至少我觉得做闹钟足够了,修改程序中的PWM周期调节音量,声音可以更大。

chenshichao541 发表于 2013-11-28 09:07:18

顶一下,楼主好人................

skynet 发表于 2013-11-28 09:52:01

这东东最大亮点就是语音啦,嗯,下载来看看是怎么弄的

liuzhen526 发表于 2013-11-28 09:59:37

mark clock

richards 发表于 2013-11-28 10:36:34

嘿嘿 我也做了个不过是51的

lcw_swust 发表于 2013-11-28 11:54:24

richards 发表于 2013-11-28 10:36
嘿嘿 我也做了个不过是51的

哦,看看呗。有链接吗?

Rapido 发表于 2013-11-28 11:56:18

不错,比较有特色。

lcw_swust 发表于 2013-11-28 11:58:03

skynet 发表于 2013-11-28 09:52
这东东最大亮点就是语音啦,嗯,下载来看看是怎么弄的

是啊,盲人也可以用的。
小时候用过一个语音报时的手表,拆开看里面用的压电陶磁,还有一个电感一样的东东,不知它的声音怎么做得那么大。

richards 发表于 2013-11-28 13:00:52

lcw_swust 发表于 2013-11-28 11:54
哦,看看呗。有链接吗?

比较早做的这个东西了,等哪天我回去翻出来,也传上来。

宇宙浪子 发表于 2013-11-28 21:29:54

写的真好,留个记号

tozxq 发表于 2013-12-31 16:59:27

非常好!支持下!{:victory:}

foxpro2005 发表于 2014-3-13 19:09:39

呵呵, 不错,支持一下

tt98 发表于 2014-3-13 19:25:31

支持啊!太好了!

Smartist 发表于 2014-3-13 19:55:40

这么无私奉献肯定要支持下拉

a_y_ang 发表于 2015-2-2 00:09:21

楼主,时钟是4M的吧

lcw_swust 发表于 2015-2-2 09:07:17

本帖最后由 lcw_swust 于 2015-2-2 09:12 编辑

a_y_ang 发表于 2015-2-2 00:09
楼主,时钟是4M的吧

我看手册上说它的内部RC振荡器频率就是8MHZ啊,你觉得是4M?
通过CLKPR寄存器可修改时钟的分频,这倒是可以让单片机工作于4M的时钟。
但是我的程序里写的是CLKPR=0X00;即时钟分频因子为1,时钟就等于RC振荡器的频率。

哦,我明白了,你是把它当作ATmega8了。
ATmega88PA相对于ATmega8来说,是有一些改进的,寄存器略有不同,低功耗性能更好。

hygs 发表于 2015-2-2 10:22:05

关注楼主很久了,楼主的作品很多都是精品,支持一下!

lcw_swust 发表于 2015-2-2 10:27:28

hygs 发表于 2015-2-2 10:22
关注楼主很久了,楼主的作品很多都是精品,支持一下!

{:lol:} 最近正在做四轴哦,敬请关注。
前两天还把二轮平衡车改了下。

a_y_ang 发表于 2015-2-3 10:44:08

lcw_swust 发表于 2015-2-2 09:07
我看手册上说它的内部RC振荡器频率就是8MHZ啊,你觉得是4M?
通过CLKPR寄存器可修改时钟的分频,这倒是可 ...


我主要是看了这个定时器的初始化,要是在8兆的时钟下,能得到这些值么,另外问下,

lcw_swust 发表于 2015-2-3 11:08:38

a_y_ang 发表于 2015-2-3 10:44
我主要是看了这个定时器的初始化,要是在8兆的时钟下,能得到这些值么,另外问下,
...

以T0为例,启动T0是在这里:

这是8分频,T0中断里TCNT0 = 200;这样算下来定时中断频率为:
F=8M/8分频/(256-200)=约17.9KHz,加上进入中断占用的时间,大约就是16KHz了。

所以timer0_init里的值是误导大家了。
你“另外问下”要问什么?

a_y_ang 发表于 2015-2-3 12:04:31

太谢谢了,你下面说的就是我要问的,{:handshake:}

dsew027 发表于 2015-2-3 12:37:48

全手工打造啊

31535wadz 发表于 2015-2-5 09:41:58

原来也做过类似的,但没有语音,学学习

lnso 发表于 2015-2-5 16:48:43

make,搞一个1寸的出来

zhzj2007 发表于 2015-2-5 17:15:50

学习,谢谢楼主分享

starsun 发表于 2015-2-7 23:09:38

楼主,真棒,

进口小开关 发表于 2015-2-8 00:23:18

不知为何,尝试了种种方法,楼主的视频文件打不开……

lcw_swust 发表于 2015-2-8 10:22:27

进口小开关 发表于 2015-2-8 00:23
不知为何,尝试了种种方法,楼主的视频文件打不开……

将两个附件放到一个文件夹里,解压后就得到 下面这些文件,再运行“Unite_语音报时钟操作视频.bat”即可得到一个3GP文件

jymt 发表于 2015-2-8 10:54:59

手工不错,不用AVR好多年

adzjeff1 发表于 2015-2-27 22:36:38

全手工打造,还有详细资料,虽然没时间做,但确实学到了。

tonyone 发表于 2015-6-5 22:34:48

老牛逼了            

chestert 发表于 2015-7-26 23:01:58

楼主牛人啊.做的东西都不错

ayumi8 发表于 2015-12-11 09:29:59

好强大能做个 STM8的不    STC 和 M88 都好贵了

lcw_swust 发表于 2015-12-11 10:22:46

ayumi8 发表于 2015-12-11 09:29
好强大能做个 STM8的不    STC 和 M88 都好贵了

STM8,我没用过

njjh1718 发表于 2016-1-6 12:55:40

楼主 动手能力很棒那会儿也自己搞过这方面的 确实不错

sunplus 发表于 2016-3-27 23:54:54

时钟走时精度如何? 我看楼主 秒计数(秒钟处理)中断中有一些其他操作,会不会很影响走时精度?

lcw_swust 发表于 2016-3-29 16:29:43

sunplus 发表于 2016-3-27 23:54
时钟走时精度如何? 我看楼主 秒计数(秒钟处理)中断中有一些其他操作,会不会很影响走时精度? ...

精度还行吧,如果不准,可以调节晶振旁的电容,或者程序里加修正。
中断里的操作不会影响走时,因为定时器相当于是“自动重装”模式。

BS_good200xy 发表于 2019-8-1 21:02:26

照着做了一个,成功了.不错,程序很多地方值得学习,多谢分享!

lcw_swust 发表于 2019-8-2 08:43:41

BS_good200xy 发表于 2019-8-1 21:02
照着做了一个,成功了.不错,程序很多地方值得学习,多谢分享!

恭喜            

duxingkei 发表于 2023-8-2 11:46:15

点个赞,回忆杀来一波,很久就知道用PWM做语音播报,新项目应用还是可以考虑玩下的,用维创之类专用IC也是麻烦
页: [1]
查看完整版本: 基于M88与SPIFLASH的语音报时闹钟