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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
51单片机正弦波发生器(1~100KHZ) 用DAC0832+定时器中断实现/ E1 ]" T0 f. j; _
0 `: S" l3 `, ?4 r' T

, C9 l1 h3 ?1 E下面给出一个设计实例,在实例中通过定时器中断和DAC0832结合的方式来产生1~100KHZ的正弦波,幅度为0-Vcc/2。1 O8 M; i8 ?& ]  ]3 h* U
首先按照下面的公式建立一个正弦波样本表,样表中将一个正弦波周期分成128个点,每个点按7位量化(127对应最高幅度Vcc/2):. }8 f2 Q# g  U8 |5 \1 e
f(x) = 64 + 63 * sin(2πx/180) x∈[0…127]
- j. T( n9 j% E# `" A程序中使用16位定时器0产生取样中断,及定时器0的中断时间即为正弦波的采样周期。(T=1/(f*64))。本例中将正弦波分成64个采样点输出,及每隔两个点要从采样样本中取出一个数DAC0832的输入。" X7 F: P/ j* C6 s! T3 {3 I
单片机源程序:
. K" C  @, R2 o8 w/ [' R* G" W
#define SIN_GLOBAL 1
+ {) `6 P3 `  B! f#include "sin.h". |5 U) v1 u/ m. w% G
//正弦波128个采样点寄存数组
6 d: }% c& V& d4 _1 {% Wcode uchar Sin[128] = {/ w6 s" y2 l* t
                        64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,
% }* ]- A/ G) W: g" h4 r                                                109,111,113,115,117,118,120,121,123,124,125,126,126,
5 g7 e% s+ x  y1 s) ]# _                                                127,127,127,127,127,127,127,126,126,125,124,123,121,4 i* I; t8 \  N# i4 x0 {* u
                                                120,118,117,115,113,111,109,106,104,102,99,96,94,91," `5 h8 l" C- ]  f+ c: I
                                                88,85,82,79,76,73,70,67,64,60,57,54,51,48,45,42,39,
7 C4 _( ^# ^! n& Y; G7 s                                                36,33,31,28,25,23,21,18,16,14,12,10,9,7,6,4,3,2,1,. |$ G3 H% a9 D
                                                1,0,0,0,0,0,0,0,1,1,2,3,4,6,7,9,10,12,14,16,18,21,23,9 n# {- ^2 h. s* I
                                                25,28,31,33,36,39,42,45,48,51,54,57,60, W. ]/ Q/ m3 v* j) {- K3 i7 ]
                      };/ S- B7 `! D( Y; Y+ D
/**********************************************************
8 k* z& p- N; J2 H7 |*函数名称:Timer0_init(double timer0Delay)' ?1 h" S, w0 u" C8 W/ G
*函数功能:定时器0初始化
' R4 Q8 B* c& `, X7 A*函数入口:timer0Delay,定时器定时时间,单位为毫秒
* g' v0 [( B: ~% a. w, G*函数出口:无9 u( [; @4 h0 M  j
**********************************************************// b- R# Q6 \. d
void Timer0_init(double timer0Delay)
8 @( z* @4 D5 m( J{- x- y- [+ [: A8 w+ ]
   double time;( Z3 o1 i) Q5 [, w( e
   double timeTemp;
( E9 i2 \: `% u3 P. i1 \* E, U' T+ @   timer0TH0=0x00;
$ G' l& P( ?" |   timer0TL0=0x00;
( K- ]. T3 P& B; Z   timeTemp=0x00;# x7 e6 M* @" B
   time=(double)(((double)12)/((F_CPU)/1000000));
1 B- x* [4 ], h' t& {& Y7 t   if(((double)255)*time>timer0Delay)
, S: N( l; N4 e! e: w* a4 V8 E8 M( y    {
5 G3 w. D+ K/ ~: ~& }6 C( a       timer0TH0=0x00;
9 A9 R# e# K: J0 ~% o0 i) m           timer0TL0=(uchar)(256ul-timer0Delay/time);. y! [. b) b, v: O
    }
( P- N+ O: w/ z+ k) V0 J   else7 j6 p9 L3 C, a# T3 j
    {
9 n7 ~+ S9 l7 R! L4 Q* K' O          while(timeTemp>timer0Delay)
* b. y8 ^  m$ @' U* w! i( [          {+ F( p3 J& R! l/ L
           timeTemp+=time;, |0 _0 o$ U; N4 Z
           timer0TH0++;  : d" @6 k# ?6 _( N6 d+ W1 E
          }
* r, f5 P# ^3 Y) B5 A. }" ?          timer0TH0--;                                 0 U! n0 b0 i$ F. X7 w
          timeTemp=timeTemp-((double)timer0TH0)*time;
  e! l8 h" ~  Z; c          timer0TL0=(uchar)(256ul-timeTemp/time);* m; f" p2 K( g* X4 i
    }& _. G# m9 i( S5 n* o
   TMOD|=0x01;                               //GATE=0,TR=1运行;C/T=1,counter,0,timer;01十六进制 ' B, ~) A0 ?2 D  i7 n
   TH0=timer0TH0;
% K& s( k4 s: J- ]+ A# S   TL0=timer0TL0;5 K7 j% p! b  L$ h) P
   TR0=1;                                         //timer0 控制位,为1时启动timer0
( Q: X. h  @% X  F   ET0=1;                                    //timer0 中断使能
1 p. f& w9 x5 i# c}
  c2 t, P4 i2 z8 n/**********************************************************
5 z4 x. I4 r  h  {*函数名称:dac0832_init(void)        % H) A8 H9 [/ @* |- ?
*函数功能:D/A转换芯片dac0832初始化; N5 }  D! d6 p: ^
*函数入口:无
. M6 s7 v' h' S( c7 M*函数出口:无
8 o" A; Q! b1 i. d/ d**********************************************************/7 r, [7 T6 k+ r: o0 c0 N6 x
void dac0832_init(void)                            ! D7 x. [" _: \- \5 {
{
3 o' D6 B6 g& d6 C' \* X6 ^  sinCodeCount=0;
2 }% g1 L0 x% C: w  DAC0832=Sin[0];
9 Y5 {6 @+ z$ w+ {+ ^}0 N/ Q" A: [+ i# n( t
/**********************************************************
8 Q1 n5 v5 u0 D( i. P" A4 Y*函数名称:writeDAC0832(uchar dacDate)        
) ]- i, R6 A0 [*函数功能:向D/A转换芯片dac0832数据口写数据
( T& _" C. }1 h$ B5 x*函数入口:dacDate& I( L" g. u6 d) F8 S
*函数出口:无
7 I# I3 d7 H4 A; U**********************************************************// }* c; s- B# @* f; M
void writeDAC0832(uchar dacDate)            - m; t- ?3 Z6 F
{
, J! D3 e( y% a6 W( X& ^2 X- k  DAC0832=dacDate;) F- [; d# I. H' A
}
; `/ X) Q/ J9 i; e  W
, H2 n3 m: u$ W* {下载:. v* @$ [" O. r' ?% h
游客,如果您要查看本帖隐藏内容请回复
8 r+ Q( L! ^4 G) L$ x

; l& g# k: K6 F6 L
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-19 23:11 , Processed in 0.140625 second(s), 27 queries , Gzip On.

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

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

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