|
最近用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)
2017-4-24 15:08 上傳
點擊文件名下載附件
程序
|
評分
-
查看全部評分
|