|
最近用51單片機(jī)+DAC0832+UA741運(yùn)放 做了個(gè)簡易的波形發(fā)生器
LCD12864 顯示 ,可以產(chǎn)生正弦波 三角波 方波 按鍵切換波形 調(diào)整頻率和步進(jìn)值(按鍵可長按)
有24C02掉電儲(chǔ)存設(shè)置的數(shù)據(jù)
頻率不高 10HZ~600HZ(頻率高了有點(diǎn)誤差)
由單片機(jī)定時(shí)器中斷產(chǎn)生數(shù)字信號(hào) DAC0832轉(zhuǎn)換 運(yùn)放調(diào)幅
能力有限 和大家分享一下~ ~
注意原理圖 DA轉(zhuǎn)換電路的芯片是DAC0832 畫圖的人寫錯(cuò)了!。
實(shí)物圖:
實(shí)物圖
原理圖:
原理圖
部分單片機(jī)源程序預(yù)覽:
- /****************************************************************************************************************/
- /* 簡易波形發(fā)生器 程序 */
- /* 編寫者 :FHX */
- /* 可輸出 正弦波 三角波 方波 按鍵控制波形、頻率、步進(jìn)值 */
- /* 由于是單片機(jī)定時(shí)器控制頻率 經(jīng)測(cè)試頻率只能在10HZ ~ 700HZ 之間 */
- /* 有掉電儲(chǔ)存功能 再次上電時(shí) 顯示掉電前設(shè)置好的波形 頻率 步進(jìn)值 */
- /****************************************************************************************************************/
- #include "lcd12864.h"
- #include "key.h"
- #include "24c02.h"
- #include "function.h"
- uchar T1RH = 0; //定時(shí)器1重載值高位
- uchar T1RL = 0; //定時(shí)器1重載值低位
- uchar T0RH = 0; //定時(shí)器0重載值高位
- uchar T0RL = 0; //定時(shí)器0重載值低位
- uchar mode = 0;
- extern uchar Wave_Index; //聲明 波形變量
- uchar code sin[32]={ //此數(shù)組內(nèi)的數(shù)據(jù)為,DA輸出對(duì)應(yīng)電壓值對(duì)應(yīng)的數(shù)字量,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]={ //一個(gè)周期是采樣32個(gè)點(diǎn), 所以數(shù)組內(nèi)是32個(gè)數(shù)據(jù)
- 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
- }; //三角波取碼
- /*****************子函數(shù)聲明*****************/
- void Timer1Init(uint ms);
- void SetWaveRate(uint num_2);
- void Control_Key();
- void Refresh_Out();
- /*****************************************************************************/
- /* 主函數(shù) */
- /*****************************************************************************/
- void main()
- {
- Timer1Init(1); //初始化定時(shí)器1 定時(shí)1ms
- LcdInit(); //初始化12864
- Init_Display(); //顯示固定內(nèi)容
- Init_OutPut(); //初始化輸出數(shù)據(jù)和顯示
- while(1)
- {
- Refresh_Out(); //更新輸出 mode=0:輸出波形 獨(dú)立按鍵關(guān)閉 mode!=0 :關(guān)閉波形輸出 可用獨(dú)立按鍵調(diào)整
- Control_Key(); //控制獨(dú)立按鍵 調(diào)整模式mode
- KeyDrive(); //調(diào)整波形、頻率及步進(jìn)值
- }
- }
- /*****************************************************************************/
- /* 按鍵控制函數(shù) */
- /* 按鍵KEY_1 :用延時(shí)函數(shù)判斷按下 控制模式變換 */
- /*****************************************************************************/
- 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;
- }
- }
- }
- /*****************************************************************************/
- /* 更新輸出函數(shù) */
- /* 根據(jù)不同的模式變量 打開或關(guān)閉波形輸出 */
- /*****************************************************************************/
- void Refresh_Out()
- {
- if(mode == 0) //不顯示箭頭 輸出波形 獨(dú)立按鍵關(guān)閉
- {
- 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) //箭頭指向 "步進(jìn)值" 說明在加減步進(jìn)值
- {
- ET1=1;
- TR1=1;
- ET0=0;
- TR0=0;
- EA=1;
- Display_Arr(3);
- }
- }
- /*****************************************************************************/
- /* 按鍵動(dòng)作函數(shù) */
- /* 按鍵 KEY_2 ~ KEY_4 三個(gè)按鍵由定時(shí)器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 增加步進(jìn)值
- {
- 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 減小步進(jìn)值
- {
- Change_Step(0);
- }
- }
- /*********************************/
- /* 模式清零鍵 */
- /*********************************/
- else if(keycode == 0x0D)
- {
- mode = 0;
- }
- }
- /**********頻率設(shè)置函數(shù)****************/
- /************定時(shí)器0控制***************/
- void SetWaveRate(uint num_2)
- {
- ulong tmp;
- tmp=(12000000/12)/(num_2*32); //定時(shí)器計(jì)數(shù)頻率 是波形頻率的32倍
- tmp=65536-tmp; //計(jì)算定時(shí)器重載值
- tmp=tmp+18; //補(bǔ)償
- T0RH=(uchar)(tmp>>8);
- T0RL=(uchar)tmp;
- TMOD&=0xF0;
- TMOD|=0x01;
- TH0=T0RH;
- TL0=T0RL;
- }
- /**********定時(shí)器1初始化函數(shù)***********/
- /**********用于三個(gè)獨(dú)立按鍵掃
- …………限于本文篇幅 余下代碼請(qǐng)從51hei下載附件…………
復(fù)制代碼
所有制作資料下載:
15.12864簡易波形發(fā)生器.rar
(86.24 KB, 下載次數(shù): 318)
2017-4-24 15:08 上傳
點(diǎn)擊文件名下載附件
程序
|
評(píng)分
-
查看全部評(píng)分
|