找回密码
 注册
关于网站域名变更的通知
查看: 502|回复: 1
打印 上一主题 下一主题

51单片机正弦波发生器(1~100KHZ) 用DAC0832+定时器中断实现

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-17 10:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-9 00:05 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表