本帖最后由 格格巫0 于 2021-3-16 15:02 編輯
1、 能夠產生方波、鋸齒波、三角波、正弦波信號的波形發生器 2、 按鍵選擇波形。按鍵控制單片機輸出方波、鋸齒波、三角波或者正弦波信號。按鍵K1,K2,K3,K4改變波形類型,K5,K6控制頻率的加減。 3、 波形參數顯示。通過液晶屏顯示單片機當前輸出波形的頻率、幅度。 4、 頻率調節。通過外部按鍵,調節單片機輸出波形信號的頻率。
功能簡介:利用89C51單片機和數模轉換器件DAC0832產生所需不同信號的低頻信號源,其信號幅度和頻率都是可以按要求控制的。設計思路:采用51單片機作為控制器;波形選擇通過四個按鍵來選擇,通過四個按鈕可選擇對應波形,波形通過DAC0832。單片機作為數據處理及控制核心,由單片機完成人機界面、系統控制、信號的采集分析以及信號的處理和變換,采用按鍵輸入,利用虛擬示波器顯示波形的方案。D/A轉換器簡介:DAC0832是雙列直插式8位D/A轉換器。能完成數字量輸入到模擬量(電流)輸出的轉換。其主要參數如下:分辨率為8位,轉換時間為1μs,滿量程誤差為±1LSB,參考電壓(+10/span>-10)V,供電電源為(+5~+15)V,邏輯電平輸入與TTL兼容。在DAC0832中有兩級鎖存器,第一級鎖存器稱為輸入寄存器,它的允許鎖存信號為ILE,第二級鎖存器稱為DAC寄存器,它的鎖存信號也稱為通道控制信.
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載) 1.電路圖 2.液晶顯示電路 3.按鈕 4.數模轉換電路 5.單片機
6.仿真示例
部分單片機源程序如下:- #include "reg51.h"
- #include <data.h>
- #include <LCD1602.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define key P1
- #define dataout P3
- uchar fre[5] ="001Hz"; //初始顯示
- uint data THHL=65536-3906;
- uchar data keyword,n=0;
- uchar data Signal_chose = 0;
- uchar data div = 1;
- void keyscan() //鍵盤掃描函數
- {
- keyword=key&0x3f;
- if(keyword!=0x3f)
- {
- while((key&0x3f)!=0x3f); //等待按鍵松開
- switch(keyword)
- {
- case 62: {
- if(div>=100) THHL=65536-39; else {div++;THHL=65536-3906/div;}//頻率up
- fre[0]=div/100 + '0';fre[1]=div/10%10 + '0';fre[2]=div%10 + '0';
- TR1=0;LCD_send(2,11,fre,5);TR1=1; break;
- }
- case 61: {
- if(div<=1) THHL=65536-3906; else {div--;THHL=65536-3906/div;}//頻率down
- fre[0]=div/100 + '0';fre[1]=div/10%10 + '0';fre[2]=div%10 + '0';
- TR1=0;LCD_send(2,11,fre,5);TR1=1; break;
- }
-
- case 59: {Signal_chose=0;TR1=0;LCD_send(1,5,"Sin ",10);TR1=1; break;} //正弦波
- case 55: {Signal_chose=1;TR1=0;LCD_send(1,5,"Triangular",10);TR1=1; break;} //三角波
- case 47: {Signal_chose=2;TR1=0;LCD_send(1,5,"Square ",10);TR1=1; break;} //方波
- case 31: {Signal_chose=3;TR1=0;LCD_send(1,5,"Sawtooth ",10);TR1=1; break;} //鋸齒波
- default:{break;}
- }
- }
- }
-
- void init() //初始化
- {
- key=0x3f;P2=0x00;dataout=0x00;THHL=65536-3906; ///初始頻率為1Hz
- TH1=THHL/256;TL1=THHL%256;
- TMOD=0x11;ET1=1;TR1=1;EA=1;
- }
-
- void main()
- {
- LCD_init();
- LCD_send(1,0,"Type:Sin",8);
- LCD_send(2,0,"frequency:",10);
- LCD_send(2,11,fre,5);
- init();
- while(1)
- {
- keyscan();
- switch(Signal_chose)
- {
- case 0: {dataout=sin_tab[n]; break;} //正弦波
- case 1: {dataout=thr_tab[n]; break;} //三角波
- case 2: {dataout=squ_tab[n]; break;} //方波
- case 3: {dataout=255-n;break;} //鋸齒波
- default:{break;}
- }
- }
- }
-
- void time_intt1(void) interrupt 3
- {
- TL1=THHL%256;TH1=THHL/256;
- // if(n>=255) {n=0;} else {n++;}
- n++;
- }
- sbit RS = P2^6;
- sbit RW = P2^5;
- sbit EN = P2^7;
-
- void LCD_send(unsigned char i,unsigned char j,unsigned char str[],unsigned char n)
- {
- //輸入:顯示行數i,列數j,輸出字符,輸出字符長度n
- unsigned char x=0;
- if(i==1)
- {write_com(0x80+j);}
- else
- {write_com(0x80+0x40+j);}
- for(x=0;x<n;x++)
- {
- write_date(str[x]);
- delay(150);
- }
- }
-
- int LCD_init()//初始化函數體
- {
- EN = 0;
- write_com(0X38);//設置16*2顯示,5*7點陣,8位數據接口
- write_com(0X0C);//設置開顯示,不顯示光標
- write_com(0X06);//寫一個字符時,整屏右移
- write_com(0X01);//顯示清零
- return 0;
- }
- int write_com(unsigned char com)//寫命令的函數體
- {
- RS = 0;
- RW = 0;
- P0 = com;
- delay(5);
- EN = 1;
- delay(5);
- EN = 0;
- return 0;
- }
復制代碼
以上資料51hei下載地址:
51黑論壇-波形發生器.rar
(95.07 KB, 下載次數: 413)
2021-3-15 20:55 上傳
點擊文件名下載附件
|