單片機設計—波形發生器,波形可選擇、幅值周期可編輯、含有lcd0832顯示屏、led數碼管、矩陣鍵盤輸入。通過lcd12864顯示屏顯示當前狀態,根據提示通過矩陣鍵盤輸入波形類型、波形幅值周期等參數,通過led顯示屏顯示實時電壓,通過dac0832輸出波形。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
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();}
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
Keil代碼與Proteus8.8版本仿真下載:
波形發生器.7z
(1.18 MB, 下載次數: 170)
2021-4-21 21:22 上傳
點擊文件名下載附件
|