如題,內容包括protuce仿真及源程序兩部分
一、 作品簡介:可以通過按鍵控制STC89C52單片機輸出[url=]不同波形[/url][z1] 信號。通過usb給pcb板通5v的電壓可以發出方波,三角波,鋸齒波,正弦波并在LCD顯示屏上顯示波形類別,頻率和幅值。通過按鍵可調波形類別,可調節頻率步進值有1Hz,10Hz和50Hz。最低頻率為10Hz最高頻率為800Hz。
二、設計原理:將各種波形的每個周期平均分成255份,把每份的值依次發給P0口,每份的時間間隔通過開啟定時器0來控制,當定時時間到時單片機就產生中斷,在中斷服務程序里面通過P0口將每份的值發出去,這個值通過向D/A換器的輸入端按一定的規律發生數據,從而在轉換電路的輸出端得到相應的電壓波形。
三、 功能說明:能夠產生方波、鋸齒波、三角波、正弦波信號的波形發生器
(1) 按鍵選擇波形。按鍵控制單片機輸出方波、鋸齒波、三角波或者正弦波信號。按鍵K1,K2,K3,K4改變波形類型,K5,K6控制頻率的加減。
(2) 波形參數顯示。通過液晶屏顯示單片機當前輸出波形的頻率、幅度。
(3) 頻率調節。通過外部按鍵,調節單片機輸出波形信號的頻率。
0.png (32 KB, 下載次數: 68)
下載附件
2019-9-13 02:57 上傳
單片機源程序如下:
- /****************************************************************************************************************/
- /* 簡易波形發生器 程序 */
- /* 編寫者 :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;
- sbit led=P2^4;
- sbit led1=P2^7;
- 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
- }; //三角波取碼
- uchar code jvchi[32]={
- 0, 16, 32, 48, 64, 80, 96, 112,
- 128, 144, 160, 176, 192, 208, 224, 240,
- 255, 0, 16, 32, 48, 64, 80, 96, 112,
- 128, 144, 160, 176, 192, 208, 224
- }; //鋸齒波取碼
- /*****************子函數聲明*****************/
- void Timer1Init(uint ms);
- void SetWaveRate(uint num_2);
- void Control_Key();
- void Refresh_Out();
- /*****************************************************************************/
- /* 主函數 */
- /*****************************************************************************/
- void main()
- { led=1;
- led1=1;
- 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初始化函數***********/
- /**********用于三個獨立按鍵掃描********/
- void Timer1Init(uint ms)
- {
- ulong tmp; //16位長整型變量tmp
- tmp=12000000/12; //用晶振頻率除以12得到定時器計數頻率
- tmp=(tmp*ms)/1000; //計算出需要多少個機器周期
- tmp=65536-tmp; //定時器的重載值
- tmp=tmp+28; //補償中斷延時響應造成的誤差
- T1RH=(uchar)(tmp>>8); //將tmp高8位右移8位 賦值給T1RH
- T1RL=(uchar)tmp; //將tmp低8位賦值給T0RL
- TMOD&=0x0F; //清零T1控制位
- TMOD|=0x10; //選擇模式1
- }
- /**********定時器0中斷函數**********/
- /*******輸出相應頻率的波形數據******/
- void InterruptTimer0() interrupt 1
- {
- static uchar cnt; //變量 用于輸出波形采樣點
- TH0=T0RH;
- TL0=T0RL;
- switch(Wave_Index)
- {
- case 0:DAC_OUT=sin[cnt];break;
- case 1:DAC_OUT=sanjiao[cnt];break;
- case 2:DAC_OUT=juxing[cnt];break;
- }
- cnt++;
- if(cnt>=32)cnt=0;
- }
- void InterruptTimer1() interrupt 3
- {
- TH1=T1RH; //重載初值
- TL1=T1RL;
- KeyScan(); //按鍵掃描
- }
復制代碼
所有資料51hei提供下載:
仿真及程序.rar
(98.29 KB, 下載次數: 214)
2019-9-12 16:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
程序代碼.rar
(100.73 KB, 下載次數: 128)
2019-9-12 16:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|