本帖最后由 xjx51 于 2021-7-8 08:20 编辑
我又又又来了,上次按键失灵的原因找到了,是我的单片机IO口设置成了高阻状态。改成准双向模式就行了。
测试了一下时钟芯片和改时间的功能,全部正常,OK!
下面开始驱动喇叭,PWM功能暂时先不做,我先做了语音功能,但单片机8K的容量却给我用完了,只能单独写个子程序测试了。
原本是准备用NVC080C的,但是搞半天驱动不了,只能先用老的语音芯片了,但是老的语音芯片只能说些象棋的字,重新定制又太麻烦,只好重搞,
后来发现不能驱动是因为时序不对,搞了一晚上才搞明白,第二天开工,我按照厂家给的时序图重新编写了程序,
终于,我听到了世间最美妙的声音——“将”!
哈哈哈,搞半天是时序出了问题,后来试了下,也可以连说了,屏幕显示与喇叭说话已经可以同步了!
上程序:
- #include <intrins.h>
- #define uint unsigned int //宏定义变量
- #define uchar unsigned char //宏定义变量
- sbit busy=P5^4; //定义语音芯片忙信号输入单片机脚
- sbit dat=P1^5; //定义单片机输出数据脚
- uchar temp1,t;
- uchar code table[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,//语音信号数组
- // 将4 将1 帅 士 象 车 马
- 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
- // 炮 兵 卒 0 1 2 3 4
- 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
- // 5 6 7 8 9 时 分 抽签
- 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
- // 开始 加油 结束 休息 暂停 超时 退出 犯规
- 0x20,0x21,0x22,0x23, 0x24, 0x25,0x26,0x27,
- // 迟到 弃权 继续 悔棋 时间到 红 黑 方
- 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
- // 胜 负 和 平 前 后 左 右
- 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
- // 吃 进 退 十 第 章 页 节
- 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f};
- // 例 图 届 局 回 抽签 名
- void delay_us(uint x) //
- {
- uint a;
- for(a=x;a>0;a--)
- {
- _nop_() ;
- _nop_() ;
- _nop_() ;
- _nop_() ;
- _nop_() ;
- }
- }
- void delay_ms(uint x) //X=毫秒数*10
- {
- uint a,b;
- for(a=0;a<x;a++)
- for(b=0;b<300;b++);
- //for(c=0;c<25~;c++);
- }
- void NVC080C_8BITS() //声明语音发音子函数
- {
- dat=0;
- delay_ms(50); //5毫秒低电平同步头
- for(t=0;t<8;t++)
- {
- if(temp1&1) //1010 1010
- {
- dat=1;
- delay_us(1200); //400US
- dat=0;
- delay_us(400);
- }
- else
- {
- dat=1;
- delay_us(400);
- dat=0;
- delay_us(1200);
- }
- temp1>>=1;
- }
- dat=1;
- }
- void yuyin(uchar y)
- {
- temp1 = y;
- delay_ms(1000);
- NVC080C_8BITS();
- }
- void main()
- {
- yuyin(0X19);//对应语音表的“分”
- while(1) ;
- }
-
复制代码 至此,语音程序已完成,下期完善闹钟功能!
|