單片機設(shè)計—波形發(fā)生器,波形可選擇、幅值周期可編輯、含有l(wèi)cd0832顯示屏、led數(shù)碼管、矩陣鍵盤輸入。通過lcd12864顯示屏顯示當(dāng)前狀態(tài),根據(jù)提示通過矩陣鍵盤輸入波形類型、波形幅值周期等參數(shù),通過led顯示屏顯示實時電壓,通過dac0832輸出波形。
仿真原理圖如下(proteus仿真工程文件和完整單片機C語言源碼可到本帖附件中下載)
波形發(fā)生器仿真文件和C源程序.zip
(816.98 KB, 售價: 5 E幣)
2021-4-21 22:48 上傳
點擊文件名下載附件
售價: 5 E幣 [記錄]
[ 購買]
1.png (61.57 KB)
下載附件
2021-4-21 22:45 上傳
2.png (21.46 KB)
下載附件
2021-4-21 22:45 上傳
3.png (33.71 KB)
下載附件
2021-4-21 22:46 上傳
1. 輸出矩形波、梯形波、三角波、鋸齒波、正弦波五種波形;
2. 每種波形的周期可更改;
3. 每種波形的幅值可更改;
4. 采用lcd12864中文顯示屏顯示波形輸入輸出信息;
5. 采用數(shù)碼管顯示實時電壓。
單片機源程序如下:
- /**************************************************************************************
- * 設(shè)計一個能產(chǎn)生正弦、方波、三角波、梯形波等波形的波形發(fā)生器,周期頻率可調(diào)。
- * 其他附加功能:
- *
- 總得看一下有沒有重復(fù)定義的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;//判斷輸入了幾個數(shù)
- 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()
- {
- //設(shè)置 INT0
- IT0=1;//跳變沿出發(fā)方式(下降沿)
- EX0=1;//打開 INT0 的中斷允許。
- EA=1;//打開總中斷
- }
- /*******************************************************************************
- * 函 數(shù) 名 : main
- * 函數(shù)功能 : 主函數(shù)
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- 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; //幅值換算結(jié)果 //鋸齒波
- 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; //幅值換算結(jié)果 //三角波
- time_loop=(zhouqi*1000/time_count-195)/20;
- while(flag)
- {P2=Triangle_wave(time_loop,time_count);}
- break;
- case (4):time_count=fuzhi*104; //幅值換算結(jié)果 //梯形波
- time_loop=(zhouqi*1000/time_count-195)/20;
- while(flag)
- {P2=Trapezoidal_wave(time_loop,time_count);}
- break;
- }
- }
- }
- void Int0() interrupt 0 //外部中斷 0 的中斷函數(shù)
- {
- 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();}
- ……………………
- …………限于本文篇幅 余下代碼請下載附件…………
復(fù)制代碼
【必讀】版權(quán)免責(zé)聲明
1、本主題所有言論和內(nèi)容純屬會員個人意見,與本論壇立場無關(guān)。2、本站對所發(fā)內(nèi)容真實性、客觀性、可用性不做任何保證也不負(fù)任何責(zé)任,網(wǎng)友之間僅出于學(xué)習(xí)目的進(jìn)行交流。3、對提供的數(shù)字內(nèi)容不擁有任何權(quán)利,其版權(quán)歸原著者擁有。請勿將該數(shù)字內(nèi)容進(jìn)行商業(yè)交易、轉(zhuǎn)載等行為,該內(nèi)容只為學(xué)習(xí)所提供,使用后發(fā)生的一切問題與本站無關(guān)。 4、本網(wǎng)站不保證本站提供的下載資源的準(zhǔn)確性、安全性和完整性;同時本網(wǎng)站也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網(wǎng)站所有軟件和資料均為網(wǎng)友推薦收集整理而來,僅供學(xué)習(xí)用途使用,請務(wù)必下載后兩小時內(nèi)刪除,禁止商用。6、如有侵犯你版權(quán)的,請及時聯(lián)系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|