单片机设计—波形发生器,波形可选择、幅值周期可编辑、含有lcd0832显示屏、led数码管、矩阵键盘输入。通过lcd12864显示屏显示当前状态,根据提示通过矩阵键盘输入波形类型、波形幅值周期等参数,通过led显示屏显示实时电压,通过dac0832输出波形。
仿真原理图如下(proteus仿真工程文件和完整单片机C语言源码可到本帖附件中下载)
波形发生器仿真文件和C源程序.zip
(816.98 KB, 售价: 5 E币)
1. 输出矩形波、梯形波、三角波、锯齿波、正弦波五种波形;
2. 每种波形的周期可更改;
3. 每种波形的幅值可更改;
4. 采用lcd12864中文显示屏显示波形输入输出信息;
5. 采用数码管显示实时电压。
单片机源程序如下:
- /**************************************************************************************
- * 设计一个能产生正弦、方波、三角波、梯形波等波形的波形发生器,周期频率可调。
- * 其他附加功能:
- *
- 总得看一下有没有重复定义的io口
- ***************************************************************************************/
- #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
- #include "DAC0832.h"
- #include "lcd12864.h"
- #include "key.h"
- sbit test_led=P3^0;
- sbit test_led1=P3^1;
- sbit seg_k1=P3^3;
- sbit seg_k2=P3^4;
- int boxing=0;
- int zhouqi=0;
- float fuzhi=0;
- char code Hz_0[]=
- {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
- 0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,};
- char code Hz_1[]=
- {0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,
- 0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,};
- char code Hz_2[]=
- {0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,
- 0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
- };
- char code Hz_3[]=
- {0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,
- 0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00,
- };
- char code Hz_4[]=
- {0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,
- 0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24,
- };
- char code Hz_5[]=
- {0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,
- 0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00,
- };
- char code Hz_6[]=
- {0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,
- 0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,
- };
- char code Hz_7[]=
- {0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,
- 0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00,
- };
- char code Hz_8[]=
- {0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
- 0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
- };
- char code Hz_9[]=
- {0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,
- 0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00,
- };
- char code Hz_dian[]=
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,
- };
- extern u8 KeyValue;
- int flag=1;//推出while
- unsigned int key_time;//判断输入了几个数
- unsigned int time_count=0;//幅值换算
- unsigned int time_loop=0; //周期换算
- unsigned int time_count_h=0; //周期换算H
- unsigned int time_count_l=0; //周期换算L
- void main_delay(int x)
- {while(x--);}
- void Int0Init()
- {
- //设置 INT0
- IT0=1;//跳变沿出发方式(下降沿)
- EX0=1;//打开 INT0 的中断允许。
- EA=1;//打开总中断
- }
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void main()
- {
- Int0Init();
- output_xinxi();//显示姓名信息
-
- while(flag);
- test_led=1;
- test_led1=1;
- while(1)
- {
- flag=1;
- switch (boxing)
- {case (0): //矩形波
- time_loop=zhouqi*100/65;
- time_count_l=(int)(fuzhi*10)%10;
- time_count_h=fuzhi;
- time_count=(51*time_count_h+5*time_count_l);
- while (flag)
- {P2=Rectangular_wave(time_loop,time_count_h,time_count_l,time_count);}
- break;//
- case (1):time_count=fuzhi*52; //幅值换算结果 //锯齿波
- time_loop=(zhouqi*1000/time_count-195)/20;
- while(flag)
- {P2=Sawtooth_wave(time_loop,time_count);}
- break;
-
- case (2):time_count=zhouqi*10/30;
- test_led=0;
- while(flag)
- {P2=Sine_wave(time_count,fuzhi);}
- break;
- case (3):time_count=fuzhi*52; //幅值换算结果 //三角波
- time_loop=(zhouqi*1000/time_count-195)/20;
- while(flag)
- {P2=Triangle_wave(time_loop,time_count);}
- break;
- case (4):time_count=fuzhi*104; //幅值换算结果 //梯形波
- time_loop=(zhouqi*1000/time_count-195)/20;
- while(flag)
- {P2=Trapezoidal_wave(time_loop,time_count);}
- break;
- }
- }
- }
- void Int0() interrupt 0 //外部中断 0 的中断函数
- {
- main_delay(1000); //延时消抖
- Clr_Scr();
- seg_k1=1;
- seg_k2=1;
- boxing=0;
- zhouqi=0;
- fuzhi=0;
- main_delay(1000);
- KeyValue=0;
-
- output_shuru();
- main_delay(100000);
-
- //检测波形
- while((KeyValue!=11))
- {KeyDown();}
- output_boxing();
- main_delay(100000);
- KeyValue=0;
- key_time=0;
- while((KeyValue!=11))
- {
- KeyValue=15;
- while(KeyValue==15)
- {KeyDown();}
- main_delay(100000);
- LCDMcs=1; //右屏开显示
- LCDScs=0;
- switch(KeyValue)
- {
- case(0):hz_LCDDisp8(2,key_time+0,Hz_0);key_time=key_time+8;break;
- case(1):hz_LCDDisp8(2,key_time+0,Hz_1);key_time=key_time+8;break;
- case(2):hz_LCDDisp8(2,key_time+0,Hz_2);key_time=key_time+8;break;
- case(3):hz_LCDDisp8(2,key_time+0,Hz_3);key_time=key_time+8;break;
- case(4):hz_LCDDisp8(2,key_time+0,Hz_4);key_time=key_time+8;break;
- case(5):hz_LCDDisp8(2,key_time+0,Hz_5);key_time=key_time+8;break;
- case(6):hz_LCDDisp8(2,key_time+0,Hz_6);key_time=key_time+8;break;
- case(7):hz_LCDDisp8(2,key_time+0,Hz_7);key_time=key_time+8;break;
- case(8):hz_LCDDisp8(2,key_time+0,Hz_8);key_time=key_time+8;break;
- case(9):hz_LCDDisp8(2,key_time+0,Hz_9);key_time=key_time+8;break;
- case(10):hz_LCDDisp8(2,key_time+0,Hz_dian);key_time=key_time+8;break;
- default:break;
- }
- if (KeyValue!=11)
- boxing=KeyValue;
- }
- //检测周期
- while((KeyValue!=11))
- {KeyDown();}
- output_zhouqi();
- KeyValue=0;
- key_time=0;
- while((KeyValue!=11))
- {
- KeyValue=15;
- while(KeyValue==15)
- {KeyDown();}
- main_delay(100000);
- LCDMcs=1; //右屏开显示
- LCDScs=0;
- switch(KeyValue)
- {
- case(0):hz_LCDDisp8(4,key_time+0,Hz_0);key_time=key_time+8;break;
- case(1):hz_LCDDisp8(4,key_time+0,Hz_1);key_time=key_time+8;break;
- case(2):hz_LCDDisp8(4,key_time+0,Hz_2);key_time=key_time+8;break;
- case(3):hz_LCDDisp8(4,key_time+0,Hz_3);key_time=key_time+8;break;
- case(4):hz_LCDDisp8(4,key_time+0,Hz_4);key_time=key_time+8;break;
- case(5):hz_LCDDisp8(4,key_time+0,Hz_5);key_time=key_time+8;break;
- case(6):hz_LCDDisp8(4,key_time+0,Hz_6);key_time=key_time+8;break;
- case(7):hz_LCDDisp8(4,key_time+0,Hz_7);key_time=key_time+8;break;
- case(8):hz_LCDDisp8(4,key_time+0,Hz_8);key_time=key_time+8;break;
- case(9):hz_LCDDisp8(4,key_time+0,Hz_9);key_time=key_time+8;break;
- case(10):hz_LCDDisp8(4,key_time+0,Hz_dian);key_time=key_time+8;break;
- default:break;
- }
- if (KeyValue!=11)
- zhouqi=KeyValue+zhouqi*10;
- }
-
- //检测幅值
- while((KeyValue!=11))
- {KeyDown();}
- output_fuzhi();
- KeyValue=0;
- key_time=0;
- while((KeyValue!=11))
- {
- KeyValue=15;
- while(KeyValue==15)
- {KeyDown();}
- ……………………
- …………限于本文篇幅 余下代码请下载附件…………
复制代码
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|
|