|
給大家分享一個由模擬電子和數(shù)字電子技術(shù)組成的函數(shù)發(fā)生器proteus仿真,還帶單片機測量電路和源程序。適合電氣課程設(shè)計,有論文、proteus仿真、LED顯示波形頻率.
電路能輸出正弦波、方波和三角波等三種波形,并可由單片機來測試準確性.
模數(shù)電函數(shù)發(fā)生器仿真原理圖如下(proteus工程文件可到本帖附件中下載):
0.png (21.73 KB, 下載次數(shù): 141)
下載附件
2017-6-17 19:17 上傳
單片機測量電路仿真原理圖:
0.png (24.64 KB, 下載次數(shù): 124)
下載附件
2017-6-17 19:09 上傳
0.png (21.61 KB, 下載次數(shù): 128)
下載附件
2017-6-17 19:10 上傳
包含c語言和匯編語言的單片機測量波形的程序源碼:
0.png (23.29 KB, 下載次數(shù): 118)
下載附件
2017-6-17 19:11 上傳
課設(shè)論文 仿真等都有 資料很全:
0.png (67.24 KB, 下載次數(shù): 119)
下載附件
2017-6-17 19:12 上傳
單片機源程序如下:
- #include <AT89x52.h>
- #include <stdio.h>
- #include <math.h>
- #include <intrins.h>
- float f; //頻率
- float p; //周期
- float sj; //閘門時間
- char idata buff[20];
- char flag=0; //頻率\周期選擇標(biāo)志位
- char xs=0; //設(shè)置閘門時間結(jié)束后是否顯示結(jié)果的標(biāo)志位
- unsigned char m=0,n=0,yichu=0,fenpin; //m定時中斷次數(shù) n計數(shù)中斷次數(shù) yichu判斷是定時器還是計數(shù)器溢出
- #define Key_Set P1
- #define K1 0xbf
- #define K2 0x7f
- #define NO_Set 0xff
- #define Freq 0
- #define Peri 1
- sbit B153=P2^4;
- sbit A153=P2^3;
- sbit P17=P1^7;
- sbit P16=P1^6;
- sbit P35=P3^5;
- sbit Set=P3^2;
- unsigned char LCD_Wait(void);
- void LCD_Write(bit style, unsigned char input);
- void LCD_SetDisplay(unsigned char DisplayMode);
- void LCD_SetInput(unsigned char InputMode);
- void LCD_Initial();
- void GotoXY(unsigned char x, unsigned char y);
- void Print(unsigned char *str);
- void C52_Initial();
- void Delay(unsigned int t);
- void display(float f);
- void cepin();
- void panduan();
- void timedisplay(float sj);
- void Time_Set1();
- void Time_Set2();
- void t0();
- void t1();
- /***************************************************************************
- * *
- * 模塊名稱: LCD1602顯示程序 *
- * *
- * Author: SSP *
- * Created: 2015/12/15 *
- ***************************************************************************/
- /***********************Port Definitions***********************************/
- sbit LcdRs= P2^0;
- sbit LcdRw= P2^1;
- sbit LcdEn= P2^2;
- sfr DBPort= 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數(shù)據(jù)端口
- /************************內(nèi)部等待函數(shù)***************************************/
- unsigned char LCD_Wait(void)
- {
- LcdRs=0; //寄存器選擇輸入端 1:數(shù)據(jù) 0:指令
- LcdRw=1; _nop_(); //RW:為0:寫狀態(tài);為1:讀狀態(tài);
- LcdEn=1; _nop_(); //使能輸入端,讀狀態(tài),高電平有效;寫狀態(tài),下降沿有效
- LcdEn=0;
- return DBPort;
- }
- /***********************向LCD寫入命令或數(shù)據(jù)*********************************/
- #define LCD_COMMAND 0 // Command
- #define LCD_DATA 1 // Data
- #define LCD_CLEAR_SCREEN 0x01 // 清屏
- #define LCD_HOMING 0x02 // 光標(biāo)返回原點
- void LCD_Write(bit style, unsigned char input)
- {
- LcdEn=0;
- LcdRs=style;
- LcdRw=0; _nop_();
- DBPort=input; _nop_();//注意順序
- LcdEn=1; _nop_();//注意順序
- LcdEn=0; _nop_();
- LCD_Wait();
- }
- /********************設(shè)置顯示模式****************************************/
- #define LCD_SHOW 0x04 //顯示開
- #define LCD_HIDE 0x00 //顯示關(guān)
- #define LCD_CURSOR 0x02 //顯示光標(biāo)
- #define LCD_NO_CURSOR 0x00 //無光標(biāo)
- #define LCD_FLASH 0x01 //光標(biāo)閃動
- #define LCD_NO_FLASH 0x00 //光標(biāo)不閃動
- void LCD_SetDisplay(unsigned char DisplayMode)
- {
- LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
- }
- /*********************設(shè)置輸入模式***************************************/
- #define LCD_AC_UP 0x02
- #define LCD_AC_DOWN 0x00 // default
- #define LCD_MOVE 0x01 // 畫面可平移
- #define LCD_NO_MOVE 0x00 //default
- void LCD_SetInput(unsigned char InputMode)
- {
- LCD_Write(LCD_COMMAND, 0x04|InputMode);
- }
- /******************初始化LCD******************************************/
- void LCD_Initial()
- {
- LcdEn=0;
- LCD_Write(LCD_COMMAND,0x38); //8位數(shù)據(jù)端口,2行顯示,5*7點陣
- LCD_Write(LCD_COMMAND,0x38);
- LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //開啟顯示, 無光標(biāo)
- LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
- LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫面不動
- }
- /************************************************************************/
- void GotoXY(unsigned char x, unsigned char y)
- {
- if(y==0)
- LCD_Write(LCD_COMMAND,0x80|x);
- if(y==1)
- LCD_Write(LCD_COMMAND,0x80|(x-0x40));
- }
- void Print(unsigned char *str)
- {
- while(*str!='\0')
- {
- LCD_Write(LCD_DATA,*str);
- str++;
- }
- }
- /**************************************************************************/
- /***************************************************************************
- * *
- * 模塊名稱: 頻率測量程序 *
- * 主要技術(shù)指標(biāo): 測量范圍:0.1Hz~4MHz,閘門時間:0.05s~10s可調(diào)。 *
- * Author: SSP *
- * Created: 2015/12/15 *
- ***************************************************************************/
- /***************************89c52初始化************************************/
- void C52_Initial()
- {
- sj=1000000.00;
- Key_Set=0xff;
- TMOD=0x51; // 01010001 T1為計數(shù)器,T0為定時器
- EA=1;
- ET0=1;
- ET1=1;
- EX0=1;
- PX0=1; //外部中斷0設(shè)置為高優(yōu)先級
- IT0=0; //電平觸發(fā)方式
- }
- /**************************ms延時子程序*******************************************/
- void Delay(unsigned int t) //t隨著數(shù)值越大,誤差趨于平衡.
- {
- unsigned char i;
- while(t--)
- {
- for(i=0;i<123;i++){;}
- }
- }
- /*************************計數(shù)中斷************************************************/
- void t1(void) interrupt 3 //計數(shù)器1溢出,yichu=1
- {n++;
- yichu=1;
- TH1=0;
- TL1=0;
- }
- /*************************定時中斷************************************************/
- void t0(void) interrupt 1
- {
- m++;
- yichu=2; //定時器0溢出,yichu=2
- TH0=0x3c; //定時50ms
- TL0=0xb0;
- }
- /*************************頻率顯示************************************************/
- void Fdisplay(float f)
- {
- if(f>999400.00)
- {
- if(f<4000400.00)
- {sprintf(buff," Freq:%2.4fmHz ",(f/1000000.00));}
- }
- else
- {
- if(f>1040.00)
- {sprintf(buff," Freq:%4.2fkHz ",(f/1000.00));}
- else
- {
- if(f>0.06)
- {sprintf(buff," Freq:%3.2fHz ",f);}
- }
-
- }
- GotoXY(0,1);
- Print(buff);
- }
- /*************************周期顯示************************************************/
- void Pdisplay(float p)
- {
- if(p>999400.00)
- {
- if(p<10004000.00)
- {sprintf(buff," Cycle:%2.4fs ",(p/1000000.00));}
- else
- {sprintf(buff,"error(Time or F)",p);}
- }
- else
- {
- if(p>9950.00)
- {sprintf(buff," Cycle:%4.2fms ",(p/1000.00));}
- else
- {
- if(p>0.248)
- {sprintf(buff," Cycle:%3.3fus ",p);}
- else
- {sprintf(buff,"error(Time or F)",p);}
- }
- }
- GotoXY(0,1);
- Print(buff);
- }
- /*************************測試頻率*************************************************/
- void cepin()
- {
- unsigned char a;
- unsigned long js;
- m=0;
- n=0;
- TMOD=0x51;
- TH0=0x3c; //定時50ms
- TL0=0xb0;
- TH1=0;
- TL1=0;
- a=sj/50000.00;
- TCON=0x50; //啟動定時器和計數(shù)器
- while(m!=a);
- TCON=0;
- js=TH1*256+n*65536+TL1;
- f=(js/(sj/1000000.00))*fenpin;
- p=sj/(js*fenpin);
- if(xs==0) //設(shè)置結(jié)束后第一次不顯示結(jié)果
- {
- if(flag==Freq) Fdisplay(f);
- else Pdisplay(p);
- }
- }
- /************************判斷頻率**************************************************/
- void panduan()
- {
- xs=0; //設(shè)置結(jié)束后第二次循環(huán)顯示結(jié)果
- B153=1; //選擇16分頻
- A153=0;
- yichu=0;
- TMOD=0x51;
- TH0=0xff; //定時器0 200us
- TL0=0x38;
- TH1=0xff; //計數(shù)器1 100脈沖
- TL1=0x9c;
- TR0=1; //啟動定時器0和計數(shù)器1
- TR1=1;
- while(yichu==0); //如果沒有溢出一直循環(huán)
- TR0=0; //已經(jīng)溢出關(guān)閉定時器0和計數(shù)器1
- TR1=0;
- if(yichu==1) //計數(shù)器先溢出:在200ms內(nèi)測得的脈沖過多,說明頻率較高(f>500khz)
- {fenpin=16; //轉(zhuǎn)為測16分頻后的頻率 16
- cepin();}
- else //定時器先溢出:100個脈沖的時間比較短,即頻率較低,可以減少分頻數(shù)
- {
- yichu=0;
- B153=0;
- A153=1;
- TH0=0xfc; //定時器0 1ms
- TL0=0x18;
- TH1=0xff; //計數(shù)器1 100個脈沖
- TL1=0x9c;
- TR0=1; //啟動定時器0和計數(shù)器1
- TR1=1;
- while(yichu==0); //如果沒溢出一直循環(huán)
- TR0=0; //已經(jīng)溢出關(guān)閉定時器0和計數(shù)器1
- TR1=0;
- if(yichu==1) //計數(shù)器先溢出:在1ms內(nèi)測得的脈沖過多,說明頻率較高(1khz<f<500khz)
- {fenpin=4; //轉(zhuǎn)為測4分頻后的頻率 4
- cepin();}
- else //定時器先溢出:100個脈沖的時間比較短,即頻率較低
- { fenpin=1;
- B153=0;
- A153=0;
- cepin();}
- }
- }
- /*************************顯示閘門時間************************************************/
- void timedisplay(float GTime)
- {
- sprintf(buff,"GTime=%7.0fus ",GTime);
- GotoXY(0,1);
- Print(buff);
- Delay(50);
- }
- /***************************減按鍵***********************************************/
- void Time_Set2()
- {
- Delay(1000);
- if(P17==1)
- { sj=sj-50000.00;
- if(sj>50000.00) timedisplay(sj);
- else
- {sj=50000.00;
- timedisplay(sj); }
- }
- else
- {while(P17==0)
- { Delay(500);
- sj=sj-500000.00;
- if(sj>50000.00) timedisplay(sj);
- else
- {sj=50000.00;
- timedisplay(sj); }
- }
- }
- }
- /***************************加按鍵***********************************************/
- void Time_Set1()
- {
- Delay(1000);
- if(P16==1)
- {
- sj=sj+50000.00;
- if(sj<10000000.00) timedisplay(sj);
- else
- {sj=10000000.00;
- timedisplay(sj);}
- }
- else
- {while(P16==0)
- { Delay(500);
- sj=sj+500000.00;
- if(sj<10000000.00) timedisplay(sj);
- else
- {sj=10000000.00;
- timedisplay(sj);} //按住1s快加0.5s
- }
- }
- }
- /***************************閘門時間設(shè)置*******************************************/
- void Time_Set() interrupt 0
- {
- EA=0; //防止無限中斷
- Delay(100);
- if(Set==0)
- {
- Delay(1000); //判斷處于哪種設(shè)置狀態(tài)
- if(Set==1)
- {
- GotoXY(0,1);
- Print(" Press Button...");
- GotoXY(0,0);
- Print(" T Settings ");
- while(Set==1)
- {
- switch(Key_Set)
- {
- case K1: Time_Set1();break;
- case K2: Time_Set2();break;
- default: break;
- }
- }
- }
- else //選擇測試頻率或周期
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
模數(shù)電函數(shù)發(fā)生器.zip
(1.77 MB, 下載次數(shù): 192)
2017-6-17 18:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|