|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机正弦波发生器(1~100KHZ) 用DAC0832+定时器中断实现' f. q2 t& T8 T
( d7 _ M: \& I; ^9 ^1 y6 w2 ?8 l0 b5 w
下面给出一个设计实例,在实例中通过定时器中断和DAC0832结合的方式来产生1~100KHZ的正弦波,幅度为0-Vcc/2。$ A8 O' X& o) ^: B4 |
首先按照下面的公式建立一个正弦波样本表,样表中将一个正弦波周期分成128个点,每个点按7位量化(127对应最高幅度Vcc/2): i" @- F2 |. i$ @, J
f(x) = 64 + 63 * sin(2πx/180) x∈[0…127]
! A: V; P. b c: A } q$ G程序中使用16位定时器0产生取样中断,及定时器0的中断时间即为正弦波的采样周期。(T=1/(f*64))。本例中将正弦波分成64个采样点输出,及每隔两个点要从采样样本中取出一个数DAC0832的输入。. }/ C. F) S% _. B" B
单片机源程序:( D- e% ^( g# H% U
#define SIN_GLOBAL 1" ]5 M/ r, S0 p" i
#include "sin.h"
4 w' }# g5 d! d8 o+ Z4 H% O//正弦波128个采样点寄存数组
2 {+ [2 t' k% u0 ]5 X3 T# v" ]code uchar Sin[128] = {) a; J! j, ]# W' B5 }* r: h
64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,
6 q+ a2 F3 g! H 109,111,113,115,117,118,120,121,123,124,125,126,126,
4 M8 m% Z# g3 |5 j5 V6 t 127,127,127,127,127,127,127,126,126,125,124,123,121,
) j! [% k% }6 x4 v" {2 B3 K! } 120,118,117,115,113,111,109,106,104,102,99,96,94,91,
4 A* i# M% i$ I) l8 c& R: a- F' i7 [ 88,85,82,79,76,73,70,67,64,60,57,54,51,48,45,42,39,
7 _" Q7 q; P+ }. H& R& i 36,33,31,28,25,23,21,18,16,14,12,10,9,7,6,4,3,2,1,; M8 {1 V) a2 r0 w
1,0,0,0,0,0,0,0,1,1,2,3,4,6,7,9,10,12,14,16,18,21,23,
6 O; j. N6 D3 \ 25,28,31,33,36,39,42,45,48,51,54,57,60
% B4 k; a4 w8 o9 x+ Z2 Q };
% {, q, \2 M1 Y$ a' C6 i) s# G/**********************************************************
7 l, x, k2 U: m1 M( }6 i*函数名称:Timer0_init(double timer0Delay)! b- q6 A0 p9 T/ Q0 Q* B" }2 O
*函数功能:定时器0初始化6 @1 W% w7 y0 o. W
*函数入口:timer0Delay,定时器定时时间,单位为毫秒
5 ?. u; M& ~- S- O- ~, ~*函数出口:无
! A5 x; i: _- o$ x- W8 P% ~" k+ L/ g**********************************************************/4 T( o, U% E/ S, d* ~* l2 i, U9 c
void Timer0_init(double timer0Delay)" i; a W; `8 L0 ]
{" r) k' l0 x% G# |# X8 y9 N# b0 x
double time;
& u( n7 t9 i2 F0 d A double timeTemp;+ C3 t) p8 i) A
timer0TH0=0x00;9 t ]$ Y* Q$ w6 |, N- b, b) }
timer0TL0=0x00;
' H4 h: j# N: y7 c8 R5 N timeTemp=0x00;
# s7 Q% E5 Z: k time=(double)(((double)12)/((F_CPU)/1000000)); 6 A- B5 H; I6 J$ _
if(((double)255)*time>timer0Delay)
3 D3 p0 F& ]# l% N! G7 H! Q {
$ M7 z& b X4 l+ i0 y1 H timer0TH0=0x00;7 `" A3 U# M, o+ Q+ ]/ ^
timer0TL0=(uchar)(256ul-timer0Delay/time);+ q/ ]* o! q a) k9 m
}; U- _5 U7 ?. s/ @6 Q
else
4 v$ ?, b. ~ B0 i" _; O. K0 j {
; {$ K) i4 S5 F% R* { while(timeTemp>timer0Delay)
# N8 D0 Z: _* z1 }5 c" j& |3 b {" W/ V6 y `$ G
timeTemp+=time;
. F: G' Y- f4 {: Z' d6 G+ v timer0TH0++;
: s* I: Z; p: f9 [ }" G) f1 a+ W: i
timer0TH0--;
9 i, \0 c' _3 A+ I5 H timeTemp=timeTemp-((double)timer0TH0)*time;( {: C: O V7 `% }( x# C
timer0TL0=(uchar)(256ul-timeTemp/time);6 H/ L; ~( A# @; K2 _) O
}- Q6 {( u4 [+ z
TMOD|=0x01; //GATE=0,TR=1运行;C/T=1,counter,0,timer;01十六进制 6 a& H. c" X' b3 V- w. ` f
TH0=timer0TH0;; s% R% K, N8 m z! {6 q- h- u# U
TL0=timer0TL0;" B6 h' l: _+ f, q+ W$ d
TR0=1; //timer0 控制位,为1时启动timer0 S: a- [6 _1 v6 L& m) }
ET0=1; //timer0 中断使能
* z. q. ` I% r! i& F* ~}1 K5 c' v6 X( Z
/**********************************************************6 r+ X8 R7 o/ P h1 {
*函数名称:dac0832_init(void) " W- e$ n1 M+ B1 V/ q
*函数功能:D/A转换芯片dac0832初始化
! N% f" p( \. R$ Y*函数入口:无8 m: ?& _6 V4 q
*函数出口:无
8 b' h+ p+ D6 k% {- @6 ~**********************************************************/: v6 d" T, N l* |: O/ S9 Y
void dac0832_init(void)
" T5 n" g1 }+ t4 ~$ I{, J3 E1 z4 Q: [4 q2 i0 f
sinCodeCount=0;) P" G2 u1 `$ L1 r: m( \( I ?+ u
DAC0832=Sin[0];
2 g* B0 e1 z9 c$ Q$ c0 q: X: X}0 c) g, @6 n! e0 \$ J3 G! P
/********************************************************** c( L% p6 [1 w- H+ ]; c6 D
*函数名称:writeDAC0832(uchar dacDate)
, V# Z# T3 |$ f+ C* C8 i5 T*函数功能:向D/A转换芯片dac0832数据口写数据
$ a1 H+ U, M. p6 s5 F*函数入口:dacDate' A+ Z7 g+ `' F- ]0 _, Q
*函数出口:无7 k3 d% N3 b# I3 l. m( H# a& @: v
**********************************************************/1 e: c3 F; @8 s4 z: ~3 O
void writeDAC0832(uchar dacDate)
( [5 A* `1 ?8 i" ~3 N{( i" T; @, T1 d, A2 H
DAC0832=dacDate;, N1 x% b: j6 L; \9 g6 Q
}
+ t3 |- [3 V& p: \3 o+ I; W& k& M3 g2 j' Q- B; P. Q- R
下载: N, D) F5 T3 s5 x! A2 X
2 d( P$ S9 F6 U
% F% D2 d' `2 n5 I6 C" H- N0 t n0 E |
|