(1)DA轉(zhuǎn)換
單片機(jī)作為一個(gè)數(shù)字電路系統(tǒng),當(dāng)需要采集外界模擬量的使用需要進(jìn)行AD轉(zhuǎn)換,將模擬量轉(zhuǎn)換成數(shù)字量,供單片機(jī)使用。51單片機(jī)需要外部配置一個(gè)AD轉(zhuǎn)換芯片來進(jìn)行模擬量的采集,如我之前寫了一篇ADC0832的使用。高級(jí)的單片機(jī)如STC12和STM32已經(jīng)集成了AD轉(zhuǎn)換功能,只需簡單配置一下,便可以采集到AD轉(zhuǎn)換后的數(shù)據(jù)。
AD轉(zhuǎn)換(Analog to Digital)是模擬量轉(zhuǎn)換數(shù)字量,那么DA轉(zhuǎn)換(Digital to Analog)便是數(shù)字量轉(zhuǎn)換成模擬量。
使用DAC0832進(jìn)行數(shù)字到模擬的轉(zhuǎn)換,再使用定時(shí)器控制輸出波形的頻率便可以制作一個(gè)函數(shù)信號(hào)發(fā)生器。
(2)DAC0832簡介
CS:低電平有效,片選輸入線
WR1:低電平大于500ms有效,輸入鎖存器
WR2:高電平有效,與XFER結(jié)合可將輸入鎖存器的8位數(shù)據(jù)傳輸?shù)紻AC寄存器中
XFER:低電平有效,數(shù)據(jù)傳輸控制輸入線
DI0~DI7:8位數(shù)據(jù)位并行輸入,有效時(shí)間大于90ns有效
VCC:電源輸入5V-15V
VERF:基準(zhǔn)電壓輸入線-10V~10V
RFB:反饋信號(hào)輸入,可以看成一個(gè)反饋監(jiān)測
IOUT1:電流輸出1,其值隨著輸入線性變化
IOUT2:電流輸出2,與OUT1值之和為一個(gè)常數(shù)
(3)電路設(shè)計(jì)
單片機(jī)最小系統(tǒng)
波形切換控制
(這里由于博主時(shí)間有限,例程代碼的LED顯示功能就沒有寫了)
(4)參考例程
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define DI P0 //8位數(shù)據(jù)輸入線
//sbit sine_wave_LED1 = P1^0; //正弦波指示燈
//sbit square_wave_LED2 = P1^1; //方波指示燈
//sbit triangular_wave_LED3 = P1^2; //三角波指示燈
//sbit sawtooth_wave_LED4 = P1^3; //鋸齒波指示燈
sbit change_wave_Key = P1^4; //更換波形
uint freq = 3906; //定時(shí)數(shù)值×16^(-6)×256 = 波形頻率 例程使用1KHZ
uint number=1,n=0,THHL,i;
//正弦波段碼
unsigned code sin[256]={
0x80,0x83,0x85,0x88,0x8A,0x8D,0x8F,0x92,
0x94,0x97,0x99,0x9B,0x9E,0xA0,0xA3,0xA5,
0xA7,0xAA,0xAC,0xAE,0xB1,0xB3,0xB5,0xB7,
0xB9,0xBB,0xBD,0xBF,0xC1,0xC3,0xC5,0xC7,
0xC9,0xCB,0xCC,0xCE,0xD0,0xD1,0xD3,0xD4,
0xD6,0xD7,0xD8,0xDA,0xDB,0xDC,0xDD,0xDE,
0xDF,0xE0,0xE1,0xE2,0xE3,0xE3,0xE4,0xE4,
0xE5,0xE5,0xE6,0xE6,0xE7,0xE7,0xE7,0xE7,
0xE7,0xE7,0xE7,0xE7,0xE6,0xE6,0xE5,0xE5,
0xE4,0xE4,0xE3,0xE3,0xE2,0xE1,0xE0,0xDF,
0xDE,0xDD,0xDC,0xDB,0xDA,0xD8,0xD7,0xD6,
0xD4,0xD3,0xD1,0xD0,0xCE,0xCC,0xCB,0xC9,
0xC7,0xC5,0xC3,0xC1,0xBF,0xBD,0xBB,0xB9,
0xB7,0xB5,0xB3,0xB1,0xAE,0xAC,0xAA,0xA7,
0xA5,0xA3,0xA0,0x9E,0x9B,0x99,0x97,0x94,
0x92,0x8F,0x8D,0x8A,0x88,0x85,0x83,0x80,
0x7D,0x7B,0x78,0x76,0x73,0x71,0x6E,0x6C,
0x69,0x67,0x65,0x62,0x60,0x5D,0x5B,0x59,
0x56,0x54,0x52,0x4F,0x4D,0x4B,0x49,0x47,
0x45,0x43,0x41,0x3F,0x3D,0x3B,0x39,0x37,
0x35,0x34,0x32,0x30,0x2E,0x2D,0x2C,0x2A,
0x29,0x28,0x26,0x25,0x24,0x23,0x22,0x21,
0x20,0x1F,0x1E,0x1D,0x1D,0x1C,0x1C,0x1B,
0x1B,0x1A,0x1A,0x1A,0x19,0x19,0x19,0x19,
0x19,0x19,0x19,0x19,0x1A,0x1A,0x1A,0x1B,
0x1B,0x1C,0x1C,0x1D,0x1D,0x1E,0x1F,0x20,
0x21,0x22,0x23,0x24,0x25,0x26,0x28,0x29,
0x2A,0x2C,0x2D,0x2F,0x30,0x32,0x34,0x35,
0x37,0x39,0x3B,0x3D,0x3F,0x41,0x43,0x45,
0x47,0x49,0x4B,0x4D,0x4F,0x52,0x54,0x56,
0x59,0x5B,0x5D,0x60,0x62,0x65,0x67,0x69,
0x6C,0x6E,0x71,0x73,0x76,0x78,0x7B,0x7D
};
//三角波段碼
unsigned code thr[256]={
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,
0xBF,0xBE,0xBD,0xBC,0xBB,0xBA,0xB9,0xB8,
0xB7,0xB6,0xB5,0xB4,0xB3,0xB2,0xB1,0xB0,
0xAF,0xAE,0xAD,0xAC,0xAB,0xAA,0xA9,0xA8,
0xA7,0xA6,0xA5,0xA4,0xA3,0xA2,0xA1,0xA0,
0x9F,0x9E,0x9D,0x9C,0x9B,0x9A,0x99,0x98,
0x97,0x96,0x95,0x94,0x93,0x92,0x91,0x90,
0x8F,0x8E,0x8D,0x8C,0x8B,0x8A,0x89,0x88,
0x87,0x86,0x85,0x84,0x83,0x82,0x81,0x80,
0x7F,0x7E,0x7D,0x7C,0x7B,0x7A,0x79,0x78,
0x77,0x76,0x75,0x74,0x73,0x72,0x71,0x70,
0x6F,0x6E,0x6D,0x6C,0x6B,0x6A,0x69,0x68,
0x67,0x66,0x65,0x64,0x63,0x62,0x61,0x60,
0x5F,0x5E,0x5D,0x5C,0x5B,0x5A,0x59,0x58,
0x57,0x56,0x55,0x54,0x53,0x52,0x51,0x50,
0x4F,0x4E,0x4D,0x4C,0x4B,0x4A,0x49,0x48,
0x47,0x46,0x45,0x44,0x43,0x42,0x41,0x40,
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
};
//方波段碼
unsigned code squ[256]={
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,
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
};
//10ms延時(shí)函數(shù)
void delay_10ms(uchar i)
{
//毫秒級(jí)延時(shí)函數(shù)
//在12MHZ下晶振下,大約延時(shí)10ms/次
uchar a,b,c;
for(c = i; c > 0; --c)
for(b = 129; b > 0; b--)
for(a = 38; a > 0; a--);
}
//定時(shí)器0初始化
void Timer0Init(void)
{
unsigned int THHL;
TMOD &= 0xF0; //定時(shí)器1失效
TMOD |= 0x01; //定時(shí)器0,16位計(jì)數(shù)
THHL=65536-freq;
TL0 =THHL%256; //設(shè)置定時(shí)初值
TH0 =THHL/256; //設(shè)置定時(shí)初值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
ET0=1; //開定時(shí)器0中斷
EA=1; //開總中斷
PT0=0; //定時(shí)器0中斷最優(yōu)
}
void main()
{
/*指示燈初始化,全部熄滅*/
// triangular_wave_LED3 = 1;
// square_wave_LED2 = 1;
// sine_wave_LED1 = 1;
Timer0Init();//初始化定時(shí)器0
while(1)
{
if(change_wave_Key == 0)
{
delay_10ms(1);//延時(shí)消抖
if(change_wave_Key == 0)
{
while(!change_wave_Key);//松手檢測
number++;
if(number == 5)
{
number = 0;
}
}
}
switch(number)
{
case 1: {DI=sin[n]; break;}//正弦波
case 2: {DI=thr[n]; break;}//三角波
case 3: {for(i=0;i<256;i++){DI=squ[i];} break;}//方波
case 4: {DI=256-n; break;}//鋸齒波
default:{break;}
}
}
}
//定時(shí)器0中斷處理函數(shù)
void Timer0_Routine() interrupt 1
{
THHL=65536-freq;
TL0=THHL%256;
TH0=THHL/256;
if(n>=255)
{n=0;}
else
{n++;}
}
電路仿真及代碼例程
鏈接:https://share.weiyun.com/ALLrnKTu 密碼:cchvph
(5)參考文獻(xiàn)
基于51單片機(jī)的DAC0832波形發(fā)生器文章來源:http://www.zghlxwxcb.cn/news/detail-713824.html
由于作者水平有限,如有錯(cuò)誤望指摘。文章來源地址http://www.zghlxwxcb.cn/news/detail-713824.html
到了這里,關(guān)于【單片機(jī)基礎(chǔ)】使用51單片機(jī)制作函數(shù)信號(hào)發(fā)生器(DAC0832使用仿真)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!