導航:首頁 > 操作系統 > 單片機函數信號發生器主流程圖

單片機函數信號發生器主流程圖

發布時間:2023-03-18 19:47:47

A. 求一個正確的基於51單片機的函數信號發生器的C程序

#include<reg51.h>
#include<absacc.h>
#include<MAX72191.h>
#defineDAC XBYTE[0x7fff] //P2.7接CS

sbitkey0 = P3^2;// 增減切換鍵
sbitkey1 = P3^3;//個位,十位,百位,千位的控制切換
sbitkey2 = P3^4;// 調整位
sbitkey3 = P3^5;// 波形選擇正弦、三角、矩形波,鋸齒波

unsignedchar i,j;
unsignedint counter,step,flag;
typedefunsigned int uint;
//定時器0初始化
voidInit_Timer0(void)
{
TMOD = (TMOD & 0XF0) | 0X01;//設置工作方式和定時初始值
TH0 = 0xff;
TL0 = 0x00;
TR0 =1; //啟動定時器
ET0 =1;
}
//定義輸出波形的代碼
unsignedchar code type[4][256]={
{ //正弦波代碼
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x1, 0x1, 0x2, 0x3, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
0x9, 0xb,0xc, 0xd, 0xf, 0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,
0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x39,0x3b,0x3e,0x41,0x43,0x46,0x49,0x4c,
0x4f,0x52,0x55,0x58,0x5b,0x5e,0x61,0x64,0x67,0x6a,0x6d,0x70,0x73,0x76,0x7a,0x7d,
0x80,0x83,0x86,0x89,0x8c,0x8f,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
0xb1,0xb4,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xeb,0xed,0xef,0xf0,0xf1,0xf3,0xf4,
0xf5,0xf6,0xf8,0xf9,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfd,0xfe,0xfe,0xfe,0xfe,0xfe,
0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf9,0xf8,0xf6,0xf5,
0xf4,0xf3,0xf1,0xf0,0xef,0xed,0xeb,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,0xda,
0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb4,0xb1,
0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,0x8f,0x8c,0x89,0x86,0x83,0x80,
0x7d,0x7a,0x76,0x73,0x70,0x6d,0x6a,0x67,0x64,0x61,0x5e,0x5b,0x58,0x55,0x52,0x4f,
0x4c,0x49,0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,0x25,
0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0xf,0xd, 0xc, 0xb, 0x9,
0x8,0x7, 0x6, 0x5, 0x4, 0x3, 0x3, 0x2, 0x1, 0x1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
},
{ //三角波代碼
0x2,0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x10,0x12,0x14, 0x16, 0x18, 0x1a,0x1c, 0x1e, 0x20,
0x22,0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30,0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, 0x40,
0x42,0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50,0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, 0x60,
0x62,0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70,0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, 0x80,
0x82,0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90,0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, 0xa0,
0xa2,0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0,0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc,0xbe, 0xc0,
0xc2,0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0,0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc,0xde, 0xe0,
0xe2,0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0,0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc,0xfe, 0xff,
0xfe,0xfc, 0xfa, 0xf8, 0xf6, 0xf4, 0xf2, 0xf0,0xee, 0xec, 0xea, 0xe8, 0xe6, 0xe4,0xe2, 0xe0,
0xde,0xdc, 0xda, 0xd8, 0xd6, 0xd4, 0xd2, 0xd0,0xce, 0xcc, 0xca, 0xc8, 0xc6, 0xc4,0xc2, 0xc0,
0xbe,0xbc, 0xba, 0xb8, 0xb6, 0xb4, 0xb2, 0xb0,0xae, 0xac, 0xaa, 0xa8, 0xa6, 0xa4,0xa2, 0xa0,
0x9e, 0x9c, 0x9a, 0x98, 0x96, 0x94, 0x92, 0x90,0x8e, 0x8c, 0x8a, 0x88, 0x86, 0x84, 0x82, 0x80,
0x7e, 0x7c, 0x7a, 0x78, 0x76, 0x74, 0x72, 0x70,0x6e, 0x6c, 0x6a, 0x68, 0x66, 0x64, 0x62, 0x60,
0x5e, 0x5c, 0x5a, 0x58, 0x56, 0x54, 0x52, 0x50,0x4e, 0x4c, 0x4a, 0x48, 0x46, 0x44, 0x42, 0x40,
0x3e, 0x3c, 0x3a, 0x38, 0x36, 0x34, 0x32, 0x30,0x2e, 0x2c, 0x2a, 0x28, 0x26, 0x24, 0x22, 0x20,
0x1e, 0x1c, 0x1a, 0x18, 0x16, 0x14, 0x12, 0x10,0xe, 0xc, 0xa, 0x8, 0x6, 0x4, 0x2, 0x00
},
{// 矩形脈沖波代碼
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
},
{//鋸齒波代碼
0x00,0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,0x08,0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10,0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,0x18,0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0x20,0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,0x28,0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0x30,0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,0x38,0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0x40,0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,0x48,0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0x50,0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,0x58,0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0x60,0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,0x68,0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0x70,0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,0x78,0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0x80,0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,0x88,0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0x90,0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,0x98,0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
0xa0,0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,0xa8,0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
0xb0,0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,0xb8,0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
0xc0,0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,0xc8,0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
0xd0,0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,0xd8,0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
0xe0,0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,0xe8,0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
0xf0,0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,0xf8,0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff}
};

//顯示子函數
Disp7219(unsignedlong dat)
{
unsigned char i;
unsigned char led[8];

led[7]=dat%10;
led[6]=dat/10%10;
led[5]=dat/100%10;
led[4]=dat/1000%10;
led[3]=dat/10000%10;
led[2]=dat/100000%10;
led[1]=dat/1000000%10;
led[0]=dat/10000000%10;

for(i=0;i<8;i++)
{
max_7219(i+1, led[i]);
}
}

//延時約1m秒
voiddelay_ms(uint n)
{
uchar j;
while(n--)
for(j=0;j<120;j++);
}

//主函數
main()
{
unsigned int f,n,j;
delay_ms(500);
Init_Max7219();//初始化7219
Disp7219(000);
Init_Timer0();
step=18;
EA = 1;
while(1)
{
if(key0 == 0) n=n+1;
if(n==2)n=0;
if(key1==0) j=j+1;
if(j==4) j=0;
if(n==0 && j == 0 &&key2 == 0) if(step<180) step+=18; //個位增
if(n==1 && j == 0 &&key2 == 0) if(step>18) step-=18; //個位減

if(n==0 && j == 1 &&key2 == 0) if(step<1800) step+=180;//十位增
if(n==1 && j == 1 &&key2 == 0) if(step>180) step-=180; //十位減

if(n==0 && j == 2 &&key2 == 0) if(step<18000) step+=1800;//百位增
if(n==1 && j == 2 &&key2 == 0) if(step>1800) step-=1800;//百位減

if(n==0 && j == 3 &&key2 == 0) if(step<54000) step+=18000;//千位增
if(n==1 && j == 3 &&key2 == 0) if(step>18000) step-=18000;//千位減

if(key3==0)flag=flag+1;if(flag==4)flag=0;

while((!key0)||(!key1)||(!key2)||(!key3));
f=step/18;
Disp7219(f);}//顯示頻率
}

// 定時中斷服務
voidTimer0(void) interrupt 1 using 2
{
TH0 = 0xff;
TL0 = 0x00;
counter = counter + step;
DAC=type[flag][(unsignedint)counter>>8];
}

B. 利用89C51單片機設計多功能低頻函數信號發生器,能產生方波、正弦波、三角波等信號波形,信號的頻率、幅度

這個不難吧。第一種方案:在單片機裡面構造各種波形的數據表,然後用數組來保碼悉帆存。單片機控制給DA的數據的時間間隔就可以控制輸出的頻率了,為了得到比較精確的頻率,可以用定時器控制數據的輸出頻率啦。幅度的調節可遲雹以用雙DA來做啊,也就是用另外一塊DA來控制數據轉換DA的基準電壓。第二種方案:用單陸液片機控制DDS晶元啊,比如用單片機控制AD9834,可以產生正弦波、方波、三角波,頻率的調節就更簡單了。幅度的調節也可以用雙DA來實現,也可以先用電阻衰減再用運放放大,這樣幅度就可以連續可調了。電路圖和程序你確定了方案就可以很容易搞定了,實在不行再聯系我吧

C. 求用單片機製作簡易信號發生器的程序以及電路圖

<p>運放選OP07就可以了,由於DAC0832是單電源供電的,只能產握喚生正記性波形,所以利用外部運放來段滑凱實讓余現負極性波形的產生</p>
<p></p>

D. 函數信號發生器(一定要有圖)

設計的要求如下
設計要求
1. 信號頻率范圍1HZ~100kHZ;
2. 輸出波形應有: 方波、三角形、正弦波;
3. 輸出信號幅值范圍0~10V;
4. 具有數字顯示輸出信號頻率和電壓幅值功能。

第一章 方案設計與論證
方案一:本方案直接採用凌陽SPCE061A作為波形發生器。波形的具體產生是通過兩路DAC來產生,凌陽SPCE061A在這方面的設計為我們提供了極大的方便,用它實現的好處在於,外圍電路極其簡單,另外在DAC的編程方面又提供及其便利的編程環境。外圍電路的設計包括三大部分,第一是鍵盤控制電路的設計,這里採用4*4鍵盤,由IOA的低八位進行控制,把鍵盤上的行和列分別接在IOA0~IOA3和IOA4~IOA7上,採用外部中斷二來中斷所顯示波形,以便進入下一波形的編輯和輸出,在波形輸出的同時利用外部中斷一來實現同步的頻率調節。第二是顯示電路的設計,這里為了在波形輸出依然有顯示,由於單片機的局限性這里採用通常的動態LED顯示行不通,因為波形輸出時要求CPU不停地為其服務而沒有空閑來為LED進行不停更新,解決方案是採用帶數據緩存器和驅動的LCD來提供顯示,這樣只佔用八個I/O口即可完成設計要求,也可放棄適時顯示功能採用LED顯示,這里將提供兩種顯示方案。第三是濾波和電壓轉換電路的櫻螞陸設計,濾波採用低通濾波器,濾除DAC轉換過程中形成的高頻小鋸齒波。另外由於凌陽SPCE061A單片機DAC輸出為電流輸出,為滿足達到5V的電壓輸出,外接OP07運算放大器進行放大,加1千歐姆電阻進行電流信號到電壓信號的轉換。本設計的特點是全面採用數字電路方脊頃案,因而工作穩定可靠。利用單片機控制管理,使頻率設置和占空比調整等操作可用鍵盤輸入,十分方便.由於方案中涉及到SPCE061A單片機現簡介如下:

SPCE061A單片機概述
SPCE061A是繼u'nSP系列產品SPCE500A等之後凌陽科技推出的又一個16位結構的微控制器。目前有兩種封裝形式:84引腳的PLCC84封裝和80引腳的LQFP80貼片封裝。主要性能如下:
16位m』nSP微處理器;
工作電壓:VDD為2.4~3.6V(cpu), VDDH為2.4~5.5V(I/O);
CPU時鍾:32768Hz~49.152MHz ;
內置2K字SRAM、內置32K FLASH;
可編程音頻處理;
32位通用可編程輸入/輸出埠;
32768Hz實時時鍾,鎖相環PLL振盪器提供系統時鍾信號;
2個16位可編程定時器/計數器(可自動預置初始計數值);
2個10位DAC(數-模轉換)輸出通道;
7通道10位電壓模-數轉換器(ADC)和單通道語音模-數轉換器;
聲音模-數轉換器輸入通道內置麥克風放大器自動增益控制(AGC)功能;
系統處於備用狀態下(時鍾處於停止狀態)耗電小於[email protected]
具備觸鍵喚醒的功能;
14個中斷源:定時器A / B,2個外部時鍾源輸入,時基,鍵喚醒等;
使用凌陽音頻編碼SACM_S240方式(2.4K位/秒),能容納210秒的語音數據;
具備非同步、同步串列設備介面;
具有低電壓復位(LVR)功能和低電壓監測(LVD)功能;
內置在線模擬電路介面ICE(In- Circuit Emulator);
具有保密能力;
具有WatchDog功能(由具體型號決定)

設計的要求如下
設計要求
1. 信號頻率范圍1HZ~100kHZ;
2. 輸出波形應有: 方波、三角形、正弦波;
3. 輸出信號幅值范圍0~10V;
4. 具有數字顯示輸出信號頻率和電壓幅值功能。

第一章 方案設計與論證
方案一:本方案直接採用凌陽SPCE061A作為波物悔形發生器。波形的具體產生是通過兩路DAC來產生,凌陽SPCE061A在這方面的設計為我們提供了極大的方便,用它實現的好處在於,外圍電路極其簡單,另外在DAC的編程方面又提供及其便利的編程環境。外圍電路的設計包括三大部分,第一是鍵盤控制電路的設計,這里採用4*4鍵盤,由IOA的低八位進行控制,把鍵盤上的行和列分別接在IOA0~IOA3和IOA4~IOA7上,採用外部中斷二來中斷所顯示波形,以便進入下一波形的編輯和輸出,在波形輸出的同時利用外部中斷一來實現同步的頻率調節。第二是顯示電路的設計,這里為了在波形輸出依然有顯示,由於單片機的局限性這里採用通常的動態LED顯示行不通,因為波形輸出時要求CPU不停地為其服務而沒有空閑來為LED進行不停更新,解決方案是採用帶數據緩存器和驅動的LCD來提供顯示,這樣只佔用八個I/O口即可完成設計要求,也可放棄適時顯示功能採用LED顯示,這里將提供兩種顯示方案。第三是濾波和電壓轉換電路的設計,濾波採用低通濾波器,濾除DAC轉換過程中形成的高頻小鋸齒波。另外由於凌陽SPCE061A單片機DAC輸出為電流輸出,為滿足達到5V的電壓輸出,外接OP07運算放大器進行放大,加1千歐姆電阻進行電流信號到電壓信號的轉換。本設計的特點是全面採用數字電路方案,因而工作穩定可靠。利用單片機控制管理,使頻率設置和占空比調整等操作可用鍵盤輸入,十分方便.由於方案中涉及到SPCE061A單片機現簡介如下:

SPCE061A單片機概述
SPCE061A是繼u'nSP系列產品SPCE500A等之後凌陽科技推出的又一個16位結構的微控制器。目前有兩種封裝形式:84引腳的PLCC84封裝和80引腳的LQFP80貼片封裝。主要性能如下:
16位m』nSP微處理器;
工作電壓:VDD為2.4~3.6V(cpu), VDDH為2.4~5.5V(I/O);
CPU時鍾:32768Hz~49.152MHz ;
內置2K字SRAM、內置32K FLASH;
可編程音頻處理;
32位通用可編程輸入/輸出埠;
32768Hz實時時鍾,鎖相環PLL振盪器提供系統時鍾信號;
2個16位可編程定時器/計數器(可自動預置初始計數值);
2個10位DAC(數-模轉換)輸出通道;
7通道10位電壓模-數轉換器(ADC)和單通道語音模-數轉換器;
聲音模-數轉換器輸入通道內置麥克風放大器自動增益控制(AGC)功能;
系統處於備用狀態下(時鍾處於停止狀態)耗電小於[email protected]
具備觸鍵喚醒的功能;
14個中斷源:定時器A / B,2個外部時鍾源輸入,時基,鍵喚醒等;
使用凌陽音頻編碼SACM_S240方式(2.4K位/秒),能容納210秒的語音數據;
具備非同步、同步串列設備介面;
具有低電壓復位(LVR)功能和低電壓監測(LVD)功能;
內置在線模擬電路介面ICE(In- Circuit Emulator);
具有保密能力;
具有WatchDog功能(由具體型號決定)

設計的要求如下
設計要求
1. 信號頻率范圍1HZ~100kHZ;
2. 輸出波形應有: 方波、三角形、正弦波;
3. 輸出信號幅值范圍0~10V;
4. 具有數字顯示輸出信號頻率和電壓幅值功能。

第一章 方案設計與論證
方案一:本方案直接採用凌陽SPCE061A作為波形發生器。波形的具體產生是通過兩路DAC來產生,凌陽SPCE061A在這方面的設計為我們提供了極大的方便,用它實現的好處在於,外圍電路極其簡單,另外在DAC的編程方面又提供及其便利的編程環境。外圍電路的設計包括三大部分,第一是鍵盤控制電路的設計,這里採用4*4鍵盤,由IOA的低八位進行控制,把鍵盤上的行和列分別接在IOA0~IOA3和IOA4~IOA7上,採用外部中斷二來中斷所顯示波形,以便進入下一波形的編輯和輸出,在波形輸出的同時利用外部中斷一來實現同步的頻率調節。第二是顯示電路的設計,這里為了在波形輸出依然有顯示,由於單片機的局限性這里採用通常的動態LED顯示行不通,因為波形輸出時要求CPU不停地為其服務而沒有空閑來為LED進行不停更新,解決方案是採用帶數據緩存器和驅動的LCD來提供顯示,這樣只佔用八個I/O口即可完成設計要求,也可放棄適時顯示功能採用LED顯示,這里將提供兩種顯示方案。第三是濾波和電壓轉換電路的設計,濾波採用低通濾波器,濾除DAC轉換過程中形成的高頻小鋸齒波。另外由於凌陽SPCE061A單片機DAC輸出為電流輸出,為滿足達到5V的電壓輸出,外接OP07運算放大器進行放大,加1千歐姆電阻進行電流信號到電壓信號的轉換。本設計的特點是全面採用數字電路方案,因而工作穩定可靠。利用單片機控制管理,使頻率設置和占空比調整等操作可用鍵盤輸入,十分方便.由於方案中涉及到SPCE061A單片機現簡介如下:

SPCE061A單片機概述
SPCE061A是繼u'nSP系列產品SPCE500A等之後凌陽科技推出的又一個16位結構的微控制器。目前有兩種封裝形式:84引腳的PLCC84封裝和80引腳的LQFP80貼片封裝。主要性能如下:
16位m』nSP微處理器;
工作電壓:VDD為2.4~3.6V(cpu), VDDH為2.4~5.5V(I/O);
CPU時鍾:32768Hz~49.152MHz ;
內置2K字SRAM、內置32K FLASH;
可編程音頻處理;
32位通用可編程輸入/輸出埠;
32768Hz實時時鍾,鎖相環PLL振盪器提供系統時鍾信號;
2個16位可編程定時器/計數器(可自動預置初始計數值);
2個10位DAC(數-模轉換)輸出通道;
7通道10位電壓模-數轉換器(ADC)和單通道語音模-數轉換器;
聲音模-數轉換器輸入通道內置麥克風放大器自動增益控制(AGC)功能;
系統處於備用狀態下(時鍾處於停止狀態)耗電小於[email protected]
具備觸鍵喚醒的功能;
14個中斷源:定時器A / B,2個外部時鍾源輸入,時基,鍵喚醒等;
使用凌陽音頻編碼SACM_S240方式(2.4K位/秒),能容納210秒的語音數據;
具備非同步、同步串列設備介面;
具有低電壓復位(LVR)功能和低電壓監測(LVD)功能;
內置在線模擬電路介面ICE(In- Circuit Emulator);
具有保密能力;
具有WatchDog功能(由具體型號決定)

設計的要求如下
設計要求
1. 信號頻率范圍1HZ~100kHZ;
2. 輸出波形應有: 方波、三角形、正弦波;
3. 輸出信號幅值范圍0~10V;
4. 具有數字顯示輸出信號頻率和電壓幅值功能。

第一章 方案設計與論證
方案一:本方案直接採用凌陽SPCE061A作為波形發生器。波形的具體產生是通過兩路DAC來產生,凌陽SPCE061A在這方面的設計為我們提供了極大的方便,用它實現的好處在於,外圍電路極其簡單,另外在DAC的編程方面又提供及其便利的編程環境。外圍電路的設計包括三大部分,第一是鍵盤控制電路的設計,這里採用4*4鍵盤,由IOA的低八位進行控制,把鍵盤上的行和列分別接在IOA0~IOA3和IOA4~IOA7上,採用外部中斷二來中斷所顯示波形,以便進入下一波形的編輯和輸出,在波形輸出的同時利用外部中斷一來實現同步的頻率調節。第二是顯示電路的設計,這里為了在波形輸出依然有顯示,由於單片機的局限性這里採用通常的動態LED顯示行不通,因為波形輸出時要求CPU不停地為其服務而沒有空閑來為LED進行不停更新,解決方案是採用帶數據緩存器和驅動的LCD來提供顯示,這樣只佔用八個I/O口即可完成設計要求,也可放棄適時顯示功能採用LED顯示,這里將提供兩種顯示方案。第三是濾波和電壓轉換電路的設計,濾波採用低通濾波器,濾除DAC轉換過程中形成的高頻小鋸齒波。另外由於凌陽SPCE061A單片機DAC輸出為電流輸出,為滿足達到5V的電壓輸出,外接OP07運算放大器進行放大,加1千歐姆電阻進行電流信號到電壓信號的轉換。本設計的特點是全面採用數字電路方案,因而工作穩定可靠。利用單片機控制管理,使頻率設置和占空比調整等操作可用鍵盤輸入,十分方便.由於方案中涉及到SPCE061A單片機現簡介如下:

SPCE061A單片機概述
SPCE061A是繼u'nSP系列產品SPCE500A等之後凌陽科技推出的又一個16位結構的微控制器。目前有兩種封裝形式:84引腳的PLCC84封裝和80引腳的LQFP80貼片封裝。主要性能如下:
16位m』nSP微處理器;
工作電壓:VDD為2.4~3.6V(cpu), VDDH為2.4~5.5V(I/O);
CPU時鍾:32768Hz~49.152MHz ;
內置2K字SRAM、內置32K FLASH;
可編程音頻處理;
32位通用可編程輸入/輸出埠;
32768Hz實時時鍾,鎖相環PLL振盪器提供系統時鍾信號;
2個16位可編程定時器/計數器(可自動預置初始計數值);
2個10位DAC(數-模轉換)輸出通道;
7通道10位電壓模-數轉換器(ADC)和單通道語音模-數轉換器;
聲音模-數轉換器輸入通道內置麥克風放大器自動增益控制(AGC)功能;
系統處於備用狀態下(時鍾處於停止狀態)耗電小於[email protected]
具備觸鍵喚醒的功能;
14個中斷源:定時器A / B,2個外部時鍾源輸入,時基,鍵喚醒等;
使用凌陽音頻編碼SACM_S240方式(2.4K位/秒),能容納210秒的語音數據;
具備非同步、同步串列設備介面;
具有低電壓復位(LVR)功能和低電壓監測(LVD)功能;
內置在線模擬電路介面ICE(In- Circuit Emulator);
具有保密能力;
具有WatchDog功能(由具體型號決定)

設計的要求如下
設計要求
1. 信號頻率范圍1HZ~100kHZ;
2. 輸出波形應有: 方波、三角形、正弦波;
3. 輸出信號幅值范圍0~10V;
4. 具有數字顯示輸出信號頻率和電壓幅值功能。

第一章 方案設計與論證
方案一:本方案直接採用凌陽SPCE061A作為波形發生器。波形的具體產生是通過兩路DAC來產生,凌陽SPCE061A在這方面的設計為我們提供了極大的方便,用它實現的好處在於,外圍電路極其簡單,另外在DAC的編程方面又提供及其便利的編程環境。外圍電路的設計包括三大部分,第一是鍵盤控制電路的設計,這里採用4*4鍵盤,由IOA的低八位進行控制,把鍵盤上的行和列分別接在IOA0~IOA3和IOA4~IOA7上,採用外部中斷二來中斷所顯示波形,以便進入下一波形的編輯和輸出,在波形輸出的同時利用外部中斷一來實現同步的頻率調節。第二是顯示電路的設計,這里為了在波形輸出依然有顯示,由於單片機的局限性這里採用通常的動態LED顯示行不通,因為波形輸出時要求CPU不停地為其服務而沒有空閑來為LED進行不停更新,解決方案是採用帶數據緩存器和驅動的LCD來提供顯示,這樣只佔用八個I/O口即可完成設計要求,也可放棄適時顯示功能採用LED顯示,這里將提供兩種顯示方案。第三是濾波和電壓轉換電路的設計,濾波採用低通濾波器,濾除DAC轉換過程中形成的高頻小鋸齒波。另外由於凌陽SPCE061A單片機DAC輸出為電流輸出,為滿足達到5V的電壓輸出,外接OP07運算放大器進行放大,加1千歐姆電阻進行電流信號到電壓信號的轉換。本設計的特點是全面採用數字電路方案,因而工作穩定可靠。利用單片機控制管理,使頻率設置和占空比調整等操作可用鍵盤輸入,十分方便.由於方案中涉及到SPCE061A單片機現簡介如下:

SPCE061A單片機概述
SPCE061A是繼u'nSP系列產品SPCE500A等之後凌陽科技推出的又一個16位結構的微控制器。目前有兩種封裝形式:84引腳的PLCC84封裝和80引腳的LQFP80貼片封裝。主要性能如下:
16位m』nSP微處理器;
工作電壓:VDD為2.4~3.6V(cpu), VDDH為2.4~5.5V(I/O);
CPU時鍾:32768Hz~49.152MHz ;
內置2K字SRAM、內置32K FLASH;
可編程音頻處理;
32位通用可編程輸入/輸出埠;
32768Hz實時時鍾,鎖相環PLL振盪器提供系統時鍾信號;
2個16位可編程定時器/計數器(可自動預置初始計數值);
2個10位DAC(數-模轉換)輸出通道;
7通道10位電壓模-數轉換器(ADC)和單通道語音模-數轉換器;
聲音模-數轉換器輸入通道內置麥克風放大器自動增益控制(AGC)功能;
系統處於備用狀態下(時鍾處於停止狀態)耗電小於[email protected]
具備觸鍵喚醒的功能;
14個中斷源:定時器A / B,2個外部時鍾源輸入,時基,鍵喚醒等;
使用凌陽音頻編碼SACM_S240方式(2.4K位/秒),能容納210秒的語音數據;
具備非同步、同步串列設備介面;
具有低電壓復位(LVR)功能和低電壓監測(LVD)功能;
內置在線模擬電路介面ICE(In- Circuit Emulator);
具有保密能力;
具有WatchDog功能(由具體型號決定)

E. 用89C51單片機設計多功能低頻函數信號發生器,能產生方波、正弦波、三角波等信號波形的硬體圖和主程序

波形發生器是一種常用的信號源,廣泛地應用於電子電路、自動控制系統和教學實驗等領域。本次課程設計使用的AT89S51 單片機構成的發生器可產生鋸齒波、三角波、正弦波等多種波形,波形的周期可以用程序改變,並可根據需要選擇單極性輸出或雙極性輸出,具有線路簡單、結構緊湊等優點。在本設計的基礎上,加上按鈕控制和LED顯示器,則可通過按鈕設定所需要的波形頻率,並在LED上顯示頻率、幅值電壓,波形可用示波器顯示。

二、系統設計

波形發生器原理方框圖如下所示。波形的產生是通過AT89S51 執行某一波形發生程序,向D/A轉換器的輸入端按一定的規律發生數據,從而在D/A轉換電路的輸出端得到相應的電壓波形。在AT89S51的P2口接5個按扭,通過軟體編程來選擇各種波形、幅值電壓和頻率,另有3個P2口管腳接TEC6122晶元,以驅動數碼管顯示電壓幅值和頻率,每種波形對應一個按鈕。此方案的有點是電路原理比較簡單,實現起來比較容易。缺點是,采樣頻率由單片機內部產生故使整個系統的頻率降低。

1、波形發生器技術指標

1)波形:方波、正弦波、鋸齒波;

2)幅值電壓:1V、2V、3V、4V、5V;

3)頻率:10HZ、20HZ、50HZ、100HZ、200HZ、500HZ、1KHZ;

2、操作設計

1)上電後,系統初始化,數碼顯示6個『-』,等待輸入設置命令

2)按鈕分別控制「幅值」、「頻率」、「方波」、「正弦波」、「鋸齒波」。

3)「幅值「鍵初始值是1V,隨後再次按下依次增長1V,到達5V後在按就回到1V。

4)「頻率「鍵初始值是10HZ,隨後在按下依次為20HZ、50HZ、100HZ、200HZ、500HZ、1000HZ循環。

三、硬體設計

本系統由單片機、顯示介面液消凳電路,波形轉換(D/A)電路和電源等四部分構成。電路圖2附在後

1、單片機電路

功能:形成掃描碼,鍵值識別、鍵處理、參數設置;形成顯示段碼;產生定時中斷;形成波形的數字編碼,並輸出到D/A介面電路和顯示驅動電路。

AT89S51外接12M晶振作為時鍾頻率。並採用電源復位設計。復位電路鬧旅採用上電復位,它的工作原理是,通電時,電容兩端相當於短路,於是RST引腳上為高電平,然後電源通過對電容充電。RST端電壓慢慢下降,降到一定程序,即為低電平,單片機開始工作。

AT89S51的P2口作為功能按鈕和TEC6122的介面。P1口做為D/A轉換晶元0832的介面。用定時/計數器作為中斷源。不同的頻率值對應不同的定時初值,允許定時器溢出中斷。定時器中斷的特殊功能寄存器設置如下:

定時控制寄存器TCON=20H;

工作方式選擇寄存器TMOD=01H;

中斷允許控制寄存器IE=82H。

2、顯示電路

功能:驅動6位數碼管顯示,掃描按鈕。

由集成驅動晶元TEC6122、6位共陰極數碼管和5個按鈕組成。當某一按鈕按下時,掃描程序掃描到之後,通過P2口將數字信號發送到 TEC6122晶元。TEC6122是一款數字集成晶元。它的外接電壓也是+5V,並且由於數碼管的載壓較小,為了保護數碼管,必須在兩者間接電阻,大約是560歐。

掃描利用軟體程序實現,當某一按鍵按下時,掃描程序立即檢測到,隨後調用子程序,執行相應的功能。

3、D/A電路

功能:將波形樣值的編碼轉換成模擬值,完成雙極性的波形輸出。

由一橋檔片0832和兩塊LM358運放組成。DAC0832是一個具有兩個輸入數據寄存器的8位DAC。目前生產的DAC晶元分為兩類,一類晶元內部設置有數據寄存器,不需要外加電路就可以直接與微型計算機介面。另一類晶元內部沒有數據寄存器,輸出信號隨數據輸入線的狀態變化而變化,因此不能直接與微型計算機介面,必須通過並行介面與微型計算機介面。DAC0832是具有20條引線的雙列直插式CMOS器件,它內部具有兩級數據寄存器,完成8位電流D/A轉換,故不需要外加電路。0832是電流輸出型,示波器上顯示波形,通常需要電壓信號,電流信號到電壓信號的轉換可以由運算放大器LM358實現,用兩片LM358可以實現雙極性輸出。

單片機向0832發送數字編碼,產生不同的輸出。先利用采樣定理對各波形進行抽樣,然後把各采樣值進行編碼,的到的數字量存入各個波形表,執行程序時通過查表方法依次取出,經過D/A轉換後輸出就可以得到波形。假如N個點構成波形的一個周期,則0832輸出N個樣值點後,樣值點形成運動軌跡,即一個周期。重復輸出N個點,成為第二個周期。利用單片機的晶振控制輸出周期的速度,也就是控制了輸出的波形的頻率。這樣就控制了輸出的波形及其幅值和頻率。

四、 軟體設計

主程序和子程序都存放在AT89S51單片機中。

主程序的功能是:開機以後負責查鍵,即做鍵盤掃描及顯示工作,然後根據用戶所按的鍵轉到相應的子程序進行處理,主程序框圖如圖1所示。

子程序的功能有:幅值輸入處理、頻率輸入處理、正弦波輸出、鋸齒波輸出、方波輸出、顯示等。

下面是程序

include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit LCP=P2^2;

sbit SCP=P2^1;

sbit SI=P2^0;

sbit S1=P2^3;

sbit S2=P2^4;

sbit S3=P2^5;

sbit S4=P2^6;

sbit S5=P2^7;

sbit DA0832=P3^3;

sbit DA0832_ON=P3^2;

uchar fun=0,b=0,c=0,d=0,tl,th;

uchar code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uchar code tosin[256]={0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5

,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5

,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd

,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda

,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99

,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51

,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16

,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00

,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15

,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e

,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80 };

void display(unsigned char command)

{

unsigned char i;

LCP=0;

for(i=8;i>0;i--)

{

SCP=0;

if((command & 0x80)==0)

{

SI=0;

}

else

{

SI=1;

}

command<<=1;

SCP=1;

}

LCP=1;

}

void key1(void)

{

fun++;

if(fun==4)

fun=0x00;

}

void key2(void)

{

tl++;

if(tl==0x1f)

th++;

}

void key3(void)

{

tl--;

if(tl==0x00)

th--;

}

void key4(void)

{

double t;

int f;

TR0=0;

t=(65535-th*256-tl)*0.4;

f=(int)(1000/t);

S3=tab[f%10];

f=f/10;

S2=tab[f%10];

f=f/10;

if(f==0)

S1=0;

else

S1=tab[f];

TR0=1;

}

void key5(void)

{

tl--;

if(tl==0x00)

th++;

}

void judge(void)

{

uchar line,row,de1,de2,keym;

P1=0x0f;

keym=P1;

if(keym==0x0f)return;

for(de1=0;de1<200;de1++)

for(de2=0;de2<125;de2++){;}

P1=0x0f;

keym=P1;

if(keym==0x0f)return;

P1=0x0f;

line=P1;

P1=0xf0;

row=P1;

line=line+row; /*存放特徵鍵值*/

if(line==0xde)key1();

if(line==0x7e)key2();

if(line==0xbd)key3();

if(line==0x7d)key4();

}

void time0_int(void) interrupt 1 //中斷服務程序

{

TR0=0;

if(fun==1)

{

DA0832=tosin[b]; //正弦波

b++;

}

else if(fun==2) //鋸齒波

{

if(c<128)

DA0832=c;

else

DA0832=255-c;

c++;

}

else if(fun==3) // 方波

{

d++;

if(d<=128)

DA0832=0x00;

else

DA0832=0xff;

}

TH0=th;

TL0=tl;

TR0=1;

}

void main(void)

{

TMOD=0X01;

TR0=1;

th=0xff;

tl=0xd0;

TH0=th;

TL0=tl;

ET0=1;

EA=1;

while(1)

{

display();

judge();

}

}

五、心得體會

開始的時候由於沒有經驗,不知如何下手,所以就去圖書管找了一些書看,盡管有許多的設計方案,可是總感覺自己還是有許多的東西弄不太清楚,於是就請教同學。他常做一些設計,有一些經驗。經過他的解釋分析各方案之後,決定用查表的方法來做。這樣可以降低一些硬體設計的難度,初次設計應切合自己的水平。用8031需要擴展ROM,這樣還要進行存儲器擴展。而且現在8031實際中已經基本上不再使用,實際用的AT89S51晶元有ROM,這樣把經過采樣得到的數值製成表,利用查表來做就簡單了。我認為程序應該不大,片內ROM應該夠用的。用LED顯示頻率和幅值,現有集成的介面驅動晶元,波形可通過示波器進行顯示,單片機接上D/A轉換晶元即可,這樣硬體很快就搭好了。

我以為這些做好了,構思也有了,寫程序應該是相對容易的。誰知道,寫起程序來,才想到功能鍵要有掃描程序才行呀,我真的感到很難。那時真的有點想放棄?於是就去請教了老師,老師幫忙分析了一下,自己又查閱了一些資料,終於明白了掃描程序怎麼寫。

於是在自己的努力下,程序很快就寫好了。這次是我的第一個設計器件,盡管經歷了不少的艱辛,但給我積累了一點設計的經驗,最後也有點小小的成就感。後面的路還很長,我還的努力!

參考文獻

[1] 童詩白,華成英.模擬電子技術基礎〔M〕.北京:高等教育出版社,2003.345-362

[2] 潘永雄,沙河,劉向陽.電子線路CAD實用教程〔M〕.西安:西安電子科技大學出版社,2001.13-118.

[3] 張毅剛,彭喜源,譚曉昀,曲春波.MCS-51單片機應用設計[M].哈爾濱:哈

爾濱工業大學出版社,1997.53-61.

更多電子問題請關注我!_ceo竭誠為您解答!

F. 指數函數衰減的信號發生器的電路,要詳細的電路圖!

基於DDS晶元AD9850的全數控函數信號發生器的設計與實現

信號源是電子產品測量與調試、部隊設備技術保障等領域的基本電子設備。隨著科學技術的發展和測量技術的進步,普通的信號發生器已無法滿足目前日益發展的電子技術領域的生產調試需要。而DDS技術是一種新興的直接數字頻率合成技術,具有頻率解析度高、頻率切換速度快、切換相位連續、輸出信號相位雜訊低、可編程、全數字化易於集成、體積小、重量輕等優點,因而在雷達及通信等領域具有廣泛的應用前景。

1系統設計方案

本文提出的採用DDS作為信號發生核心器件的全數控函數信號發生器設計方案,根據輸出信號波形類型可設置、輸出信號幅度和頻率可數控、輸出頻率寬等要求,選用了美國A/D公司的AD9850晶元,並通過單片機程序控制和處理AD9850的32位頻率控制字,再經放大後加至以數字電位器為核心的數字衰減網路,從而實現了信號幅度、頻率、類型以及輸出等選項的全數字控制。該函數信號發生器的結構如圖1所示。

本系統主要由單片機、DDS直接頻率信號合成器、數字衰減電路、真有效值轉換模塊、A/D轉換模塊、數字積分選擇電路等部分組成。
2 DDS的基本原理

直接數字頻率合成器(Derect Digital Synthesizer)是從相位概念出發直接合成所需波形的一種頻率合成技術。一個直接數字頻率合成器通常由相位累加器、加法器、波形存儲ROM、D/A轉換器和低通濾波器(LPF)組成。DDS的組成結構如圖2所示。其中,K為頻率控制字(也叫相位增量),P為相位控制字,W為波形控制字,fc為參考時鍾頻率,N為相位累加器的字長,D為ROM數據位及D/A轉換器的字長。相位累加器在時鍾fc的控制下以步長K累加,輸出的N位二進制碼與相位控制字P、波形控制字W相加後作為波形ROM的地址來對波形ROM進行定址,波形ROM輸出的D位幅度碼S(n)經D/A轉換變成階梯波S(t)後,再經過低通濾波器平滑,就可以得到合成的信號波形。由於合成的信號波形取決於波形ROM中存放的幅度碼,因此,用DDS可以合成任意波形。

3硬體電路設計

3.1 DDS信號產生電路

考慮到DDS具有頻率解析度較高、頻率切換速度快、切換相位連續、輸出信號相位雜訊低、可編程、全數字化、易於集成、體積小、重量輕等優點,該方案選用美國A/D公司的AD9850晶元,並採用單片機為核心控制器件來對DDS輸送頻率控制字,從而使DDS輸出相應頻率和類型的信號,其DDS信號產生電路如圖3所示。

3硬體電路設計
3.1 DDS信號產生電路

考慮到DDS具有頻率解析度較高、頻率切換速度快、切換相位連續、輸出信號相位雜訊低、可編程、全數字化、易於集成、體積小、重量輕等優點,該方案選用美國A/D公司的AD9850晶元,並採用單片機為核心控制器件來對DDS輸送頻率控制字,從而使DDS輸出相應頻率和類型的信號,其DDS信號產生電路如圖3所示。

單片機與AD9850的介面既可採用並行方式,也可採用串列方式。為了充分發揮晶元的高速性能和節約單片機資源,本設計選擇並行方式將AT89S52的P0口經74HC373鎖存器擴展後接至DDS的並行輸入控制端(D0~D7)。AD9850外接120 MHz的有源晶振,產生的正弦信號經低通濾波器(LPF)去掉高頻諧波後即可得到波形良好的模擬信號。這樣,將D/A轉換器的輸出信號經低通濾波後,接到AD9850內部的高速比較器上,即可直接輸出一個抖動很小的方波。再將方波信號加至積分電路,即可得到三角波信號。另外,也可通過鍵盤編輯任意波形的輸出信號。

3.2鍵盤輸入介面及LCD介面電路

本系統中的數字輸入設置電路採用2×8矩陣鍵盤。由於LCD具有顯示內容多,電路結構簡單,佔用單片機資源少等優點,本系統採用RT1602C型LCD液晶顯示屏來顯示信號的類型、頻率大小和正弦波的峰一峰值,圖4所示是鍵盤輸入及LCD介面電路圖。

同樣,考慮到AT89S52單片機的IO引腳資源有限,本系統的鍵盤輸入及LCD輸出均通過74HC245連接到AT89S52單片機的P0埠,從而實現埠擴展和復用。

3.3信號幅度數控預置電路

為了實現對輸出的正弦模擬信號幅度的數字控制和預置,本系統採用了AD811高速運放、數字電位器衰減、真有效值轉換、以及A/D轉換等電路,具體電路圖如圖5所示。

數字電位器X9C102是實現信號幅度數字可調的關鍵器件。真有效值轉換模塊AD637主要負責信號的TRMS/DC轉換,然後經TLC2453模數轉換向單片機輸送正比於正弦波信號幅度的數字量,以便單片機輸出合適的幅值控制指令。
3.4積分電容自動切換控制電路

三角波是常用信號之一,本系統採用RC積分電路將方波信號轉換成三角波。由於信號頻率很寬(低頻達1 Hz以下,高頻達60 MHz以上),為了完成不同頻段的線性積分,需要不同的積分電容(10pF、100pF、1 nF、10nF、100nF、1 μF、10 μF、100μF)。基於數控和自動切換的需要,本系統採用如圖6所示的CD4051八選一電路。

CD4051的八選一控制信號來源於AT89S52的P0~P3介面,74HC373P也是考慮復用P0埠而設置的。AD9850輸出的方波經積分電路轉換為三角波後,經AD811高速運放可提高其負載能力。
4系統軟體設計

4.1 主程序

主程序可控制整個系統,包括控制系統的初始化、顯示、運算、鍵盤掃描、頻率控制、幅度控制等子程序,其主程序流程如圖7所示。

初始化可將系統設定為默認工作狀態,然後通過掃描鍵盤來判斷是否有按鍵按下以確定用戶要執行的任務,同時通過判斷23H.4、20H.1、20H.0各功能標志位來確定應完成的功能。當23H.4=1時,計算頻率值系統工作在頻率計方式下;當20H.1=1時,檢測峰峰值系統將檢測輸出信號的峰峰值:而當20H.0=1時.則更新LCD顯示內容,當執行完後返回鍵盤掃描程序並以此循環。各功能標志位均由鍵盤、峰峰值檢測和定時程序等控制,從而實現各種功能。
4.2鍵盤掃描子程序

鍵盤掃描子程序如圖8所示。因按鍵較多。本系統採用2×8行列式鍵盤來節約I/O口,並用程序把8根列線全部拉低,再判斷2根行線是否有低電平,如果沒有,說明沒有按鍵被按下,系統則退出鍵盤掃描程序,否則,依次拉低列線,然後依次判斷行線是否有低電平並判斷鍵號,鍵號確定後再轉到鍵號相對應的功能程序去執行。鍵盤主要方便用戶設置頻率、幅度、選擇工作方式等功能。

4.3 信號頻率數字預置子程序
信號頻率的數字控製程序流程如圖9所示。該部分程序主要用於將鍵盤輸入值轉換成十六進制數據,然後產生相應的頻率控制字並送至DDS晶元,以改變DDS的相位增量,最終輸出相應頻率信號。

5 結束語
通過嚴格的實驗測試證明,本系統採用DDS完全可以實現輸出信號類型的選擇設置、信號頻率數字預置、信號幅度數字步進可調等功能,是一種輸出信號頻率覆蓋寬(0.023 Hz~40 MHz)、信號源解析度高、波形失真小、全數控型函數信號發生器。具有一定的實用開發價值。

G. 設計和製作一函數信號發生器

基於ICL8038函數信號發生器的設計本設計是以ICL8038 和AT89C2051 為核心設計的數控及掃頻函數信號發生器。ICL8038 作為函數信號源
結合外圍電路產生占空比和幅度可調的正弦波、方波、三角波; 該函數信號發生器的頻率可調范圍為1~100kHz, 步進為0.1kHz, 波形穩定, 無明顯失真。
1.系統設計框圖如圖1 為系統設計框圖。本設計是利用鍵盤設置相應的頻率值, 根據所設置頻率段選擇相應電容, 經計算獲得相應數字量送數字電位器實現D/A 轉換, 同時與參考電壓( 本例為5.5V) 相加後形成數控調壓去控制ICL8038 第8 腳, 這樣即可由ICL8038 實現對應頻率值的矩形波、三角波和正弦波。方波幅度經衰減後送單片機可測得信號源頻率並由數碼管顯示。
2.電路原理圖
圖2 為電路原理圖。其中AT89C2051 是8 位單片機, 其中: P1.4~P1.7、P1.2、P1.3、P3.0、P3.1 作為數
碼顯示; P3.3、P3.5 、P3.7 作為鍵盤輸入口; P3.4 作為計數口, 用於測量信號源頻率;P3.0~P3.2 作為數字電位器的SPI匯流排; P1.1、P1.0 可根據需要擴展繼電器或模擬開關選擇ICL8038第10 腳( CAP) 與第11 腳間的電容C。
MCP41010 是8 位字長的數字電位器, 採用三匯流排SPI 介面。/CS: 片選信號, 低電平有效; SCK:時鍾信號輸入端; SI: 串列數據輸入端, 用於寄存器的選擇及數據輸入。MCP41010 可作為數字電位器, 也可以作為D/A 轉換器, 本設計是將MCP41010 接成8 位字長的D/A 轉換器, MCP41010 根據輸入的串列數據, 對基準電壓進行分壓後由中間抽頭輸出模擬電壓, 即VPWO =DN/256VREF ( 式中VREF=5V) 。
函數發生電路ICL8038, 圖2所示是一個占空比和一個頻率連續可調的函數發生電路。ICL8038是一種函數發生器集成塊, 通過外圍電路的設計, 可以產生高精密度的正弦波、方波、三角波信號, 選擇不同參數的外電阻和電容等器件, 可以獲得頻率在0.01Hz~300kHz 范圍內的信號。通過調節RW2 可使占空比在2%~98%可調。第10 腳( CAP) 與第11 腳間的電容C 起到很重要的作用, 它的大小決定了輸出信號頻率的瞎搭大小, 當C 確定後, 調節ICL8038 第8 腳的電壓可改變信號源的輸出頻率。從ICL8038 引腳9(要接上拉電阻)輸出的波形經衰減後送單片機P3.4 進行頻率測量。
正弦函數信號由三角波函數信號經過非線性變換而獲得。利用二極體的非線性特性, 可以將三角波信號的上升和下降斜率逐次逼近正弦波的斜率。ICL8038 中的非線性網路是由4 級擊穿點的非線性逼近網路構成。一般說來, 逼近點越多得到的正弦波效果越好, 失真度也越小, 在本晶元中N= 4, 失真度可以小於1。在實測中得到正弦信號的失真度可達0.5 左右。其精度效果相當滿意。為了進一步減小正弦波的失真度, 可採用圖2 所示電路中兩個電位器RW3 和RW4 所組成的電路, 調整它們可使正弦波失真度減小。當然, 如果矩形波的占空比不是50% , 矩形波不再是方波, 引腳2 輸出也就不再是正弦波了。 圖2 電路原理圖
經實驗發現, 在電路設計中接10 腳和11 腳的電容值和性能是整個電路的關鍵器件, 電容值的確定也就確定電路能產生的頻率范圍啟銷, 電容性能的好壞直接影響信號頻率的穩定性、波形的失真度, 由於該晶元是通過恆流源
對悄神遊C 充放電來產生振盪的, 故振盪頻率的穩定性就受到外接電容及恆流源電流的影響, 若要使輸出頻率穩定, 必須採用以下措施:外接電阻、電容的溫度特性要好; 外部電源應穩定; 電容應選用漏電小、質量好的非極化電容器。3.實驗結果
當±12V 工作電源時, 輸出頻率如下表: 失真度情況, 實驗數據如下表: 4.軟體流程圖
圖3 為軟體流程圖。T0 設為計數器,T1 設為定時器(初值為5ms)。5ms 啟動主循環, 主要用於鍵盤掃描及掃描顯示, 圖2 中K0 作為控制鍵, K1 作為調整鍵, K2 作為增加鍵; 上電時程序進入頻率設置模式, 按一下K0 鍵程序進入數控模式, 按二下K0 鍵程序進入掃頻模式, 按三下K0 鍵程序進入頻率設置模式, 周而復始。在頻率設置模式, 由K1 鍵和K2 鍵完成頻率設置。 圖3 軟體流程圖基於ICL8038的函數發生器函數發生器是一種可以同時產生方波、三角波和正弦波的專用集成電路。當調節外部電路參數時,還可以獲得占空比可調的矩形波和鋸齒波。因此,廣泛用於儀表之中。一、電路結構函數發生器ICL8038的電路結構如圖虛線框內所示,共有五個組成部分。兩個電流源的電流分別為IS1和IS2,且IS1=I,IS2=2I;兩個電壓比較器Ⅰ和Ⅱ的閾值電壓分別為 和 ,它們的輸入電壓等於電容兩端的電壓uC,輸出電壓分別控制RS觸發器的S端和 端;RS觸發器的狀態輸出端Q和 用來控制開關S,實現對電容C的充、放電;兩個緩沖放大器用於隔離波形發生電路和負載,使三角波和矩形波輸出端的輸出電阻足夠低,以增強帶負載能力;三角波變正弦波電路用於獲得正弦波電壓。RS觸發器是數字電路中具有存儲功能的一種基本單元電路。Q和 是一對互補的狀態輸出端,當Q=1時, ;當Q=0時, 。S和 是兩個輸入端,當 時,Q=0時, ;反之,當 時,Q=1時, ;當S=0, 時,Q和 保持原狀態不變。兩個電壓比較器的電壓傳輸特性如下圖所示。二、工作原理★當給函數發生器ICL8038合閘通電時,電容C的電壓為0V,根據電壓比較器的電壓傳輸特性,電壓比較器Ⅰ和Ⅱ的輸出電壓均為低電平;因而RS觸發器的 ,輸出Q=0, ;★使開關S斷開,電流源IS1對電容充電,充電電流為IS1=I因充電電流是恆流,所以,電容上電壓uC隨時間的增長而線性上升。★當上升為VCC/3時,電壓比較器Ⅱ輸出為高電平,此時RS觸發器的 ,S=0時,Q和 保持原狀態不變。★一直到上升到2VCC/3時,使電壓比較器Ⅰ的輸出電壓躍變為高電平,此時RS觸發器的 時,Q=1時, ,導致開關S閉合,電容C開始放電,放電電流為IS2-IS1=I因放電電流是恆流,所以,電容上電壓uC隨時間的增長而線性下降。起初,uC的下降雖然使RS觸發的S端從高電平躍變為低電平,但 ,其輸出不變。★ 一直到uC下降到VCC/3時,使電壓比較器Ⅱ的輸出電壓躍變為低電平,此時 ,Q=0, ,使得開關S斷開,電容C又開始充電,重復上述過程,周而復始,電路產生了自激振盪。由於充電電流與放電電流數值相等,因而電容上電壓為三角波,Q和 為方波,經緩沖放大器輸出。三角波電壓通過三角波變正弦波電路輸出正弦波電壓。結論:改變電容充放電電流,可以輸出占空比可調的矩形波和鋸齒波。但是,當輸出不是方波時,輸出也得不到正弦波了。三、性能特點ICL8038是性能優良的集成函數發生器。可用單電源供電,即將引腳11接地,引腳6接+VCC,VCC為10~30V;也可雙電源供電,即將引腳11接-VEE,引腳6接+VCC,它們的值為±5~±15V。頻率的可調范圍為0.01Hz~300kHz。輸出矩形波的占空比可調范圍為2%~98%,上升時間為180ns,下降時間為40ns。輸出三角波(斜坡波)的非線性小於0.05%。輸出正弦波的失真小於1%。四、常用接法如圖所示為ICL8038的引腳圖,其中引腳8為頻率調節(簡稱為調頻)電壓輸入端,電路的振盪頻率與調頻電壓成正比。引腳7輸出調頻偏置電壓,數值是引腳7與電源+VCC之差,它可作為引腳8的輸入電壓。如圖所示為ICL8038最常見的兩種基本接法,矩形波輸出端為集電極開路形式,需外接電阻RL至+VCC。在圖(a)所示電路中,RA和RB可分別獨立調整。在圖(b)所示電路中,通過改變電位器RW滑動的位置來調整RA和RB的數值。當RA=RB時,各輸出端的波形如下圖(a)所示,矩形波的占空比為50%,因而為方波。當RA≠RB時,矩形波不再是方波,引腳2輸出也就不再是正弦波了,圖(b)所示為矩形波占空比是15%時各輸出端的波形圖。根據ICL8038內部電路和外接電阻可以推導出占空比的表達式為故RA<2RB。 為了進一步減小正弦波的失真度,可採用如下圖所示電路中兩個100kΩ的電位器和兩個10kΩ電阻所組成的電路,調整它們可使正弦波失真度減小到0.5%。在RA和RB不變的情況下,調整RW2可使電路振盪頻率最大值與最小值之比達到100:1。在引腳8與引腳6之間直接加輸入電壓調節振盪頻率,最高頻率與最低頻率之差可達1000:1。

H. 怎麼用單片機做一個信號發生器

如果要求頻率不是很高,可以採用PWM方式,優點是無需另外加DA,且輸出解析度可靈活調整。考慮到單片機的運算能力不強,你可以用EXCEL編制一個正弦信號在一個周期內的等間隔幅值表,比如說,將一個周期的正弦信號分為64個點,信號的峰值為1000,初始相位為0°,那麼,這個表格的第一個點是0,第n點為1000*sin(2πn/64),用EXCEL將64個點的幅值計算完畢,按照需要的格式編制為編程語言能夠接受的表格。利用單片機的一個定時器,定時器的溢出值設置為1000,溢出時,某個IO口輸出低電平,再用一個寄存器存儲輸出點序號,序號為n時,根據輸出點序號通過查表獲取1000*sin(2πn/64)的數值,將定時器的計數值與1000*sin(2πn/64)比較,相等時,IO口輸出高電平。不斷循環執行上述程序,IO將輸出占空比與正弦信號幅值成正比的方波信號,這就是常說的正弦調制PWM信號。設計一個增益可調的有源低通濾波器,PWM信號經過低通濾波器後,輸出就是正弦波,調節低通濾波器的增益,即可改變正弦信號的幅值。當然,在設置PWM占空比時,將查表結果先乘以一個設定數值(一般是0~1的小數),也可以調節輸出幅值。為了簡化運算,可以是先乘以一個整數M,再除以N(N為128、256等2的冪的數值),M取值范圍為0~N,因為這種除法可通過移位進行,程序簡單,且運算速度快。

I. 單片機函數信號發生器

DAC0832可以的,但是速度比較慢,如果信號頻率比好基較高的話友槐謹建議用高速DAC,另外DA出來的波形是「階梯」明滑狀的,所以後面建議加一個低通濾波器

J. 求一份51單片機的智能信號發生器的匯編程序及接線圖,要求

顯示頻率,幅度可調,可產生四種波形,正弦波,方波,鋸齒波,三角波,希望你能喜鎮悄歡,給你發了一張效果圖,喜歡的話別忘了採納我的回答啊,郵箱就不御悶渣給你發了
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define DAdata P0 //DA數據埠
sbit DA_S1= P2^0; // 控制DAC0832的8位輸入寄存器,僅當都為0時,可以輸出數據(處於直通狀態),否則,輸出將被鎖存
sbit DA_S2= P2^1; // 控制DAC0832的8位DAC寄存器,僅當都為0時,可以輸出數據(處於直通狀態),否則,輸出罩悉將被鎖存
sbit key= P3^2;
uchar wavecount; //'抽點'計數
uchar THtemp,TLtemp;//傳遞頻率的中間變數
uchar judge=1; //在方波輸出函數中用於簡單判別作用
uchar waveform; //當其為0、1、2時,分別代表三種波
uchar code freq_unit[3]={10,50,200}; //三種波的頻率單位
uchar idata wavefreq[3]={1,1,1}; //給每種波定義一個數組單元,用於存放單位頻率的個數
uchar code lcd_hang1[]={"Sine Wave " "Triangle Wave " "Square Wave " "Select Wave: " "press No.1 key! "};
uchar idata lcd_hang2[16]={"f= Hz "};
uchar code waveTH[]={
0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xec,0xf6,0xf9,0xfb,0xfc,0xfc,0xfd,0xfd,0xfd,0xfe};
uchar code waveTL[]={
0x06,0x8a,0x10,0x4e,0x78,0x93,0xa8,0xb3,0xbe,0xc6, //正弦波頻率調整中間值
0xac,0xde,0x48,0x7a,0x99,0xaf,0xbb,0xc8,0xd0,0xde, //三角波頻率調整中間值
0x88,0x50,0x90,0x32,0x34,0xbe,0x4a,0xa3,0xe5,0x2c};
/*************************************************************************************************/
uchar code triangle_tab[]={ //每隔數字8,採取一次
0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78,
0x80,0x88,0x90,0x98,0xa0,0xa8,0xb0,0xb8,0xc0,0xc8,0xd0,0xd8,0xe0,0xe8,0xf0,0xf8,0xff,
0xf8,0xf0,0xe8,0xe0,0xd8,0xd0,0xc8,0xc0,0xb8,0xb0,0xa8,0xa0,0x98,0x90,0x88,0x80,
0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x18,0x10,0x08,0x00};
uchar code sine_tab[256]={
//輸出電壓從0到最大值(正弦波1/4部分)
0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,
0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,
0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
//輸出電壓從最大值到0(正弦波1/4部分)
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,
0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,
0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,
//輸出電壓從0到最小值(正弦波1/4部分)
0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,
0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13,
0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
//輸出電壓從最小值到0(正弦波1/4部分)
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,
0x11,0x13,0x15 ,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,
0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};
void delay(uchar z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void triangle_out() //三角波輸出
{
DAdata=triangle_tab[wavecount++];
if(wavecount>64) wavecount=0;
DA_S1=0; //打開8位輸入寄存器
DA_S1=1; //關閉8位輸入寄存器
}
void sine_out() //正弦波輸出
{
DAdata=sine_tab[wavecount++];
DA_S1=0; //打開8位輸入寄存器
DA_S1=1; //關閉8位輸入寄存器
}
void square_out() //方波輸出
{
judge=~judge;
if(judge==1) DAdata=0xff;
else DAdata=0x00;
DA_S1=0; //打開8位輸入寄存器
DA_S1=1; //關閉8位輸入寄存器
}
/************1602液晶的相關函數*************/
#define lcd_ports P1
sbit rs=P2^2;
sbit rw=P2^3;
sbit lcden=P2^4;
void write_com(uchar com)
{
rs=0; //置零,表示寫指令
lcden=0;
lcd_ports=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
rs=1; //置1,表示寫數據(在指令所指的地方寫數據)
lcden=0;
lcd_ports=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void disp_lcd(uchar addr,uchar *temp1)
{
uchar num;
write_com(addr);
delay(1); //延時一會兒???
for(num=0;num<16;num++)
{
write_date(temp1[num]);//或者這樣寫write_date(*(temp1+num));
delay(1);
}
}
void init_lcd()
{
//uchar num;
lcden=0; //可有可無???
rw=0; //初始化一定要設置為零,表示寫數據
write_com(0x38); //使液晶顯示點陣,為下面做准備
write_com(0x0c); //初始設置
write_com(0x06); //初始設置
write_com(0x01); //清零
write_com(0x80); //使指針指向第一行第一格
disp_lcd(0x80,&lcd_hang1[3*16]); //在第一行顯示
disp_lcd(0xc0,&lcd_hang1[4*16]); //在第二行顯示
}
/********************1602液晶函數聲明結束*********************/
void main()
{
uchar i=0;
DA_S2=0; //使DAC寄存器處於直通狀態
DAdata=0;
DA_S1=1; //關閉8位輸入寄存器
init_lcd();
waveform=0;
TMOD=0x01; //設置定時器0為16位工作方式
IT0=1; //設置外部中斷0為下降沿觸發
ET0=1; //開定時器中斷
EX0=1;
EA=1;
while(1)
{
//DAout(0xff); //可輸出TTL波形
//DAout(0x80);
//T_temp=32;
}
}

void timer0() interrupt 1
{
TH0=THtemp;
TL0=TLtemp;
if(waveform==0) sine_out();
else if(waveform==1) triangle_out();
else if(waveform==2) square_out();
}
void key_int0() interrupt 0
{
uchar keytemp;
uint total_freq; //總頻率
EA=0; TR0=0; //關總中斷與定時器
delay(5); //延時夠嗎???
if(key==0) //確實有按鍵按下而引發中斷
{
keytemp=P3&0xf0; //獲取P3口高四位的值
switch(keytemp)
{
case 0xe0: //選擇波形
waveform++;
if(waveform>2) waveform=0;
break;
case 0xd0: //頻率按規定單位依次增加
wavefreq[waveform]++;
if(wavefreq[waveform]>10) wavefreq[waveform]=1; // /*這邊要用「>10」,因為它比「=11」可靠
break; // 性更高,使加數有個上限,不會一直加下去*/
case 0xb0: //頻率按規定單位依次衰減
wavefreq[waveform]--;
if(wavefreq[waveform]<1) wavefreq[waveform]=10; //這邊要用「<1」,因為它比「=0」可靠性更高
break;
case 0x70: //TTL輸出
DA_S2=1; //使DAC寄存器關閉
break;
}
THtemp=waveTH[waveform*10+(wavefreq[waveform]-1)]; //方括弧中選取第幾個數後,並把該值賦給T_temp
TLtemp=waveTL[waveform*10+(wavefreq[waveform]-1)];
total_freq= wavefreq[waveform] * freq_unit[waveform]; //求輸出頻率(個數*單位)
lcd_hang2[5]=total_freq%10+0x30; //在液晶中顯示個位,(0x30 在液晶顯示中表示數字0)
total_freq/=10; lcd_hang2[4]=total_freq%10+0x30; //在液晶中顯示時十位
total_freq/=10; lcd_hang2[3]=total_freq%10+0x30; //在液晶中顯示時百位
total_freq/=10; lcd_hang2[2]=total_freq%10+0x30; //在液晶中顯示時千位
disp_lcd(0x80,&lcd_hang1[waveform*16]); //在第一行顯示
disp_lcd(0xc0,lcd_hang2); //在第二行顯示
}
wavecount=0; //'抽點'計數清零
while(!key);
EA=1; TR0=1; //開啟總中斷與定時器
}

閱讀全文

與單片機函數信號發生器主流程圖相關的資料

熱點內容
一加7pro文件夾data 瀏覽:424
程序員淋雨 瀏覽:947
python輸出數字序列中的空格 瀏覽:78
怎麼將pdf文件大小 瀏覽:734
氧原子相對分子量演算法 瀏覽:988
加密機為什麼是安全的 瀏覽:451
單片機拼音輸入法 瀏覽:789
蘋果筆記本t2加密晶元怎麼打開 瀏覽:796
安卓如何把手機投屏至電視 瀏覽:739
方舟編譯器現在可提速哪些軟體 瀏覽:60
微信加密為什麼是黑屏 瀏覽:473
android去電狀態 瀏覽:604
蘋果13如何加密視頻 瀏覽:815
linuxweblogic緩存 瀏覽:69
雲伺服器不同地域 瀏覽:946
python鬧鍾怎麼打 瀏覽:686
虛擬主機伺服器有什麼區別 瀏覽:833
演算法與程序的奧秘章節檢測 瀏覽:378
找pdf 瀏覽:531
與伺服器連接斷開如何處理 瀏覽:834