基于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文件可将文件合并)
谢谢楼主,真全面。初中时买过一个会报时的钟,那时觉得真神奇。。顶一下,这个没人支持??好奇怪啊 手艺不错{:titter:} 是啊,手工不错,没有用AVR好多年了 好东西 支持一下,这个非常不错! 相当不错,合理的设计有详细资料和解释. 感谢.
这个不错 这个不错 这个不错 很不错,请问一下楼主,你的这个是先要把程序写到下载器里,再由下载器写到CPU和SPI Flash里面去的吗? 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.
由于本人比较懒,未将二者整合到一起,其实二者大多数代码是相同的.
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)
{ YF_Wang 发表于 2013-11-26 10:46
请教楼主:
我用的Flash是25Q16,单片机用的是STC12C40052、11.0592M晶振,通过串口读写 ...
您好,请把你的程序一起发上来。
我这试了下,串口通信没问题。
所用单片机为STC12C4052AD,程序中仅改了一处:#define FOSC 11059200
lcw_swust 发表于 2013-11-26 11:29
您好,请把你的程序一起发上来。
我这试了下,串口通信没问题。
所用单片机为STC12C4052AD,程序中仅改了 ...
楼主您好:
请帮忙看看,谢谢! YF_Wang 发表于 2013-11-26 12:10
楼主您好:
请帮忙看看,谢谢!
问题找到,应该是头文件的问题。
把
#include"STC12C4052AD.H"
改为
#include"STC12C2052AD.H"
就行了。
由于你给我的程序没有这个文件STC12C4052AD.H,你可以自己对比一下二者的区别,再结合单片机手册来看。
(我用的Keil2,生成文件为LCW-ISP.hex)
lcw_swust 发表于 2013-11-26 13:23
问题找到,应该是头文件的问题。
把
#include"STC12C4052AD.H"
楼主您好:
首先非常感谢楼主的认真指导!谢谢!
我把我这边编译的Hex文件和你发给我的对比了一下(我用KEIL2编译的也一样),有好多不一样,应该还是程序有一些地方不同,下载你的那个文件(LCW-ISP.hex)通信正常,但好像还是不能下载语音文件,每次都是“下位机数据区容量:74”。我截了两张图片,您帮忙看看!谢谢! YF_Wang 发表于 2013-11-26 18:38
楼主您好:
首先非常感谢楼主的认真指导!谢谢!
这样吧,把你用KEIL编的工程发过来,再把编译器也一起发过来.
lcw_swust 发表于 2013-11-26 20:01
这样吧,把你用KEIL编的工程发过来,再把编译器也一起发过来.
楼主您好:
这个是我这边编译的KEIL工程,请帮忙看看,谢谢! 本帖最后由 lcw_swust 于 2013-11-27 09:48 编辑
YF_Wang 发表于 2013-11-27 08:12
楼主您好:
这个是我这边编译的KEIL工程,请帮忙看看,谢谢!
你的工程与我的有两点不同:
1、你的Target是STC单片机,我的是AT89S53。(这一点不重要,我的编译器安装时没添加STC,只是在源代码文件夹内添加STC的头文件)
2、下图里红圈内打个勾。
(刚刚回复时竟然要邮箱验证,而且邮件收不到,点“重新接收”才收到) lcw_swust 发表于 2013-11-27 09:46
你的工程与我的有两点不同:
1、你的Target是STC单片机,我的是AT89S53。(这一点不重要,我的编译器安装 ...
楼主您好:
我按照你说的勾上了,编译后上位机通信设置波特率是可以了,但就只到了“下位机数据区容量:74”这里,这个是哪里出了问题呢?谢谢!
顶好贴,顶楼主。
好奇下楼主做了多久做出这个东西。 不错的东东,这个语音播放,声音大吗? YF_Wang 发表于 2013-11-27 21:13
楼主您好:
我按照你说的勾上了,编译后上位机通信设置波特率是可以了,但就只到了“下位机数据 ...
加我Q,449630071 leicai05 发表于 2013-11-28 08:53
不错的东东,这个语音播放,声音大吗?
至少我觉得做闹钟足够了,修改程序中的PWM周期调节音量,声音可以更大。 顶一下,楼主好人................ 这东东最大亮点就是语音啦,嗯,下载来看看是怎么弄的 mark clock 嘿嘿 我也做了个不过是51的
richards 发表于 2013-11-28 10:36
嘿嘿 我也做了个不过是51的
哦,看看呗。有链接吗? 不错,比较有特色。 skynet 发表于 2013-11-28 09:52
这东东最大亮点就是语音啦,嗯,下载来看看是怎么弄的
是啊,盲人也可以用的。
小时候用过一个语音报时的手表,拆开看里面用的压电陶磁,还有一个电感一样的东东,不知它的声音怎么做得那么大。 lcw_swust 发表于 2013-11-28 11:54
哦,看看呗。有链接吗?
比较早做的这个东西了,等哪天我回去翻出来,也传上来。 写的真好,留个记号 非常好!支持下!{:victory:} 呵呵, 不错,支持一下 支持啊!太好了! 这么无私奉献肯定要支持下拉 楼主,时钟是4M的吧 本帖最后由 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
关注楼主很久了,楼主的作品很多都是精品,支持一下!
{:lol:} 最近正在做四轴哦,敬请关注。
前两天还把二轮平衡车改了下。 lcw_swust 发表于 2015-2-2 09:07
我看手册上说它的内部RC振荡器频率就是8MHZ啊,你觉得是4M?
通过CLKPR寄存器可修改时钟的分频,这倒是可 ...
我主要是看了这个定时器的初始化,要是在8兆的时钟下,能得到这些值么,另外问下,
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里的值是误导大家了。
你“另外问下”要问什么? 太谢谢了,你下面说的就是我要问的,{:handshake:} 全手工打造啊 原来也做过类似的,但没有语音,学学习 make,搞一个1寸的出来 学习,谢谢楼主分享 楼主,真棒, 不知为何,尝试了种种方法,楼主的视频文件打不开…… 进口小开关 发表于 2015-2-8 00:23
不知为何,尝试了种种方法,楼主的视频文件打不开……
将两个附件放到一个文件夹里,解压后就得到 下面这些文件,再运行“Unite_语音报时钟操作视频.bat”即可得到一个3GP文件
手工不错,不用AVR好多年 全手工打造,还有详细资料,虽然没时间做,但确实学到了。 老牛逼了 楼主牛人啊.做的东西都不错 好强大能做个 STM8的不 STC 和 M88 都好贵了 ayumi8 发表于 2015-12-11 09:29
好强大能做个 STM8的不 STC 和 M88 都好贵了
STM8,我没用过 楼主 动手能力很棒那会儿也自己搞过这方面的 确实不错 时钟走时精度如何? 我看楼主 秒计数(秒钟处理)中断中有一些其他操作,会不会很影响走时精度? sunplus 发表于 2016-3-27 23:54
时钟走时精度如何? 我看楼主 秒计数(秒钟处理)中断中有一些其他操作,会不会很影响走时精度? ...
精度还行吧,如果不准,可以调节晶振旁的电容,或者程序里加修正。
中断里的操作不会影响走时,因为定时器相当于是“自动重装”模式。 照着做了一个,成功了.不错,程序很多地方值得学习,多谢分享! BS_good200xy 发表于 2019-8-1 21:02
照着做了一个,成功了.不错,程序很多地方值得学习,多谢分享!
恭喜 点个赞,回忆杀来一波,很久就知道用PWM做语音播报,新项目应用还是可以考虑玩下的,用维创之类专用IC也是麻烦
页:
[1]