|
最近用51单片机+DAC0832+UA741运放 做了个简易的波形发生器
LCD12864 显示 ,可以产生正弦波 三角波 方波 按键切换波形 调整频率和步进值(按键可长按)
有24C02掉电储存设置的数据
频率不高 10HZ~600HZ(频率高了有点误差)
由单片机定时器中断产生数字信号 DAC0832转换 运放调幅
能力有限 和大家分享一下~ ~
注意原理图 DA转换电路的芯片是DAC0832 画图的人写错了!!!
实物图:
实物图
原理图:
原理图
部分单片机源程序预览:
- /****************************************************************************************************************/
- /* 简易波形发生器 程序 */
- /* 编写者 :FHX */
- /* 可输出 正弦波 三角波 方波 按键控制波形、频率、步进值 */
- /* 由于是单片机定时器控制频率 经测试频率只能在10HZ ~ 700HZ 之间 */
- /* 有掉电储存功能 再次上电时 显示掉电前设置好的波形 频率 步进值 */
- /****************************************************************************************************************/
- #include "lcd12864.h"
- #include "key.h"
- #include "24c02.h"
- #include "function.h"
- uchar T1RH = 0; //定时器1重载值高位
- uchar T1RL = 0; //定时器1重载值低位
- uchar T0RH = 0; //定时器0重载值高位
- uchar T0RL = 0; //定时器0重载值低位
- uchar mode = 0;
- extern uchar Wave_Index; //声明 波形变量
- uchar code sin[32]={ //此数组内的数据为,DA输出对应电压值对应的数字量,0是0V,255是5V
- 127, 152, 176, 198, 217, 233, 245, 252,
- 255, 252, 245, 233, 217, 198, 176, 152,
- 127, 102, 78, 56, 37, 21, 9, 2,
- 0, 2, 9, 21, 37, 56, 78, 102
- }; //正弦波取码
- uchar code juxing[32]={ //一个周期是采样32个点, 所以数组内是32个数据
- 255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0
- }; //矩形波取码
- uchar code sanjiao[32]={
- 0, 16, 32, 48, 64, 80, 96, 112,
- 128, 144, 160, 176, 192, 208, 224, 240,
- 255, 240, 224, 208, 192, 176, 160, 144,
- 128, 112, 96, 80, 64, 48, 32, 16
- }; //三角波取码
- /*****************子函数声明*****************/
- void Timer1Init(uint ms);
- void SetWaveRate(uint num_2);
- void Control_Key();
- void Refresh_Out();
- /*****************************************************************************/
- /* 主函数 */
- /*****************************************************************************/
- void main()
- {
- Timer1Init(1); //初始化定时器1 定时1ms
- LcdInit(); //初始化12864
- Init_Display(); //显示固定内容
- Init_OutPut(); //初始化输出数据和显示
- while(1)
- {
- Refresh_Out(); //更新输出 mode=0:输出波形 独立按键关闭 mode!=0 :关闭波形输出 可用独立按键调整
- Control_Key(); //控制独立按键 调整模式mode
- KeyDrive(); //调整波形、频率及步进值
- }
- }
- /*****************************************************************************/
- /* 按键控制函数 */
- /* 按键KEY_1 :用延时函数判断按下 控制模式变换 */
- /*****************************************************************************/
- void Control_Key()
- {
- if(KEY_1==0) //按下按键1 mode+1
- {
- DelayMs(2);
- if(KEY_1==0)
- {
- while(!KEY_1);
- mode++;
- if(mode > 3)mode = 1;
- }
- }
- }
- /*****************************************************************************/
- /* 更新输出函数 */
- /* 根据不同的模式变量 打开或关闭波形输出 */
- /*****************************************************************************/
- void Refresh_Out()
- {
- if(mode == 0) //不显示箭头 输出波形 独立按键关闭
- {
- ET1=0;
- TR1=0;
- ET0=1;
- TR0=1;
- EA=1;
- Display_Arr(0);
- }
-
- else if(mode == 1) //箭头指向 "波形" 说明是在切换波形
- {
- ET1=1;
- TR1=1;
- ET0=0;
- TR0=0;
- EA=1;
- Display_Arr(1);
- }
-
- else if(mode == 2) //箭头指向 "频率" 说明是在加减频率
- {
- ET1=1;
- TR1=1;
- ET0=0;
- TR0=0;
- EA=1;
- Display_Arr(2);
- }
-
- else if(mode == 3) //箭头指向 "步进值" 说明在加减步进值
- {
- ET1=1;
- TR1=1;
- ET0=0;
- TR0=0;
- EA=1;
- Display_Arr(3);
- }
- }
- /*****************************************************************************/
- /* 按键动作函数 */
- /* 按键 KEY_2 ~ KEY_4 三个按键由定时器1中断扫描 有长按功能 */
- /*****************************************************************************/
- void KeyDown(uchar keycode)
- {
- /*********************************/
- /* "+"键 */
- /*********************************/
- if(keycode == 0x26)
- {
- if(mode == 1) //模式1 向右切换波形
- {
- Convert_Wave(1);
- }
-
- else if(mode == 2) //模式2 增加频率
- {
- Change_Rate(1);
- }
-
- else if(mode == 3) //模式3 增加步进值
- {
- Change_Step(1);
- }
- }
- /*********************************/
- /* "-"键 */
- /*********************************/
- else if(keycode == 0x28)
- {
- if(mode == 1) //模式1 向左切换波形
- {
- Convert_Wave(0);
- }
-
- else if(mode == 2) //模式2 减小频率
- {
- Change_Rate(0);
- }
-
- else if(mode == 3) //模式3 减小步进值
- {
- Change_Step(0);
- }
- }
- /*********************************/
- /* 模式清零键 */
- /*********************************/
- else if(keycode == 0x0D)
- {
- mode = 0;
- }
- }
- /**********频率设置函数****************/
- /************定时器0控制***************/
- void SetWaveRate(uint num_2)
- {
- ulong tmp;
- tmp=(12000000/12)/(num_2*32); //定时器计数频率 是波形频率的32倍
- tmp=65536-tmp; //计算定时器重载值
- tmp=tmp+18; //补偿
- T0RH=(uchar)(tmp>>8);
- T0RL=(uchar)tmp;
- TMOD&=0xF0;
- TMOD|=0x01;
- TH0=T0RH;
- TL0=T0RL;
- }
- /**********定时器1初始化函数***********/
- /**********用于三个独立按键扫
- …………限于本文篇幅 余下代码请从51hei下载附件…………
复制代码
所有制作资料下载:
15.12864简易波形发生器.rar
(86.24 KB, 下载次数: 318)
|
评分
-
查看全部评分
|