|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
我想用DA(PWM)来实现一个呼吸灯的效果,没看懂count在代码里起什么作用2 j4 i3 V. {* T& s4 [- \. \6 }
& q6 y1 B6 d3 j9 F3 C* @8 e
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 e4 O% @6 e$ w- A/ ^8 B, t) w
( y, ?* u6 _" etypedef unsigned int u16; //对数据类型进行声明定义
; p3 {- P1 t3 x. r7 ]# Btypedef unsigned char u8;
! R. k1 v# I5 z# V% {
0 q1 ]( G( p$ O* m) ?6 k//--定义使用的IO口--//5 g, o3 P6 b, Z4 V) j$ \
***it PWM=P2^1;# j" S9 l; J( @$ P# {
bit DIR;
) [9 `2 C- ?! Q: ?& M" j
$ X5 M5 e, P! @0 P' L6 G; ~0 ]//--定义一个全局变量--//
1 I$ G8 t& c4 B/ s/ `7 gu16 count,value,timer1;# M$ r, d+ i4 o" l7 w
; x2 {" N' Q5 ] s' _* E! V
/*******************************************************************************
% G. ?2 p1 F" W+ ~3 Z; p; ]* 函 数 名 : Timer1Init
, S" Y u4 }2 {$ E* 函数功能 : 定时器1初始化4 y( N& m3 q0 X) a( S
* 输 入 : 无
0 e5 K5 P1 s& y, Q0 F* 输 出 : 无2 `2 `1 G8 w0 K) J% E, a
*******************************************************************************/
6 U+ o' `9 b; D: B; w3 y1 F' Y5 qvoid Timer1Init()1 C K# L3 u! V2 }7 X
{
/ r1 K. _8 E6 d1 L TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。 C/ Z/ v& j2 S
+ q5 ?- j3 n; ?1 K3 u! U TH1 = 0xFF; 9 O5 X, z& K' P4 b3 p
TL1 = 0xff; //1us# t+ n/ k. Q+ [$ a
! `. O6 S# ~; I; I3 L% s8 O ET1=1;//打开定时器1中断允许8 z9 U O- {: `' M# q( c
EA=1;//打开总中断
Q% O3 W- Z6 r a/ n7 p' j TR1=1;//打开定时器
6 H# w: M# f" S, H}
( m2 b5 O0 L# ]7 y0 ]; r) J1 z/*******************************************************************************! c# O- [8 ^1 _4 J9 j2 M- X
* 函 数 名 : main& g4 S2 k8 \" N: J( p
* 函数功能 : 主函数: I% a# n8 G5 c
* 输 入 : 无
1 N! P; D: d9 e+ h7 H I( n* 输 出 : 无' k7 x. [ n8 i) K. I
*******************************************************************************/' K) C* v/ j8 ~9 q4 j, i' b- {
void main()9 R# n* ?9 P$ u# G6 ]" b0 H
{ ; R6 D/ ]9 l' C" O3 q( Y. [
Timer1Init(); //定时器1初始化3 h5 {- p, ]- l2 W
while(1)
; F1 C$ r6 R4 V" n: y {
9 n8 C3 _( Z8 h6 g) ` if(count>100) ! ~% n7 B' s0 `- t
{
* N" Q: b* q0 W I count=0;. h* z& g+ P. q# c; o1 n
if(DIR==1) //DIR控制增加或减小
' E' l4 K& ^. _7 q. M& f {7 d! u5 P5 _9 ]* u! M' G, ~+ S5 x
value++;
9 X1 r: j* x, G4 y) e- X }
) [: V( \- U) W; A" K+ ?+ h) s5 a if(DIR==0)( n# y( K! V7 E- O- ^8 S/ K
{( j2 m: z/ X, C8 K* p1 X: n
value--;
3 O8 G. D+ \6 v) W( B4 x* h6 [. J }5 ?3 d0 _& u x) A; `& A
0 ?3 n( G, F; S5 f; d( S
}# W' c5 v0 N! d2 }; L) J
% E$ g+ u& g& i# m8 L. [; b5 [ if(value==1000)
& x% g3 u9 O6 j; U, Y; s4 u {
- X9 P# F7 f& f6 V+ J DIR=0;. P( `/ m3 B- v: j
}- J4 @( \$ `; j, K8 D/ d
if(value==0)0 v m! ]1 w/ `' l9 A% _, ~' K" H7 @8 q, b
{; w8 z1 ^3 ^& O8 q( p9 u, }
DIR=1;6 p5 P% m5 k6 C+ J% p
}
! \4 T% m9 M" f4 R& Z
* h: M: |: J6 @' w if(timer1>1000) //PWM周期为1000*1us# r+ f! ^4 d/ F9 U) X, h
{ u/ A$ m, I0 V v, e" j
timer1=0;
) X, S9 w& ]2 E! q }
% ^) b9 E! Y6 q9 Y N/ ]% f) O; W if(timer1
5 H G3 i3 F( ]1 G& {+ Y% W {
, p8 e' r* ?) T PWM=1;
" q1 B6 K8 M* o }4 x6 J. ^! ]6 S; \" }
else* K' L+ I5 ]2 J2 K7 g
{
( v' h% ]2 d+ k+ X `8 l PWM=0;! O3 u% c* O' U; R+ b& Z; O1 S
}
( S, w8 k! Z9 R; _ } % Y# q- L/ q* m+ ?+ t- |% j: K: y
}9 W& x, L& r7 N$ l( T. `5 `+ [
/*******************************************************************************
+ a& s8 i1 x; L- {% r( ~* 函 数 名 : Time1
& x( H3 X5 x0 C9 c, d9 j$ X) d* 函数功能 : 定时器1的中断函数
1 m: u3 U' V( @0 H# m( K* 输 入 : 无
3 l8 A0 g( D! D. I* 输 出 : 无1 i u( a, f2 t4 b
*******************************************************************************/% g& z7 H/ [% J! D; p8 Y v
void Time1(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断. W% w7 m, v8 R
{
: Z; v2 K- H6 D2 B0 O; I TH1 = 0xFF;
9 p7 i0 T$ S1 V4 T4 d+ N TL1 = 0xff; //1us" Q7 o! Y" _" a4 q# i/ s
timer1++; 6 _* ^' u4 ?1 R }
count++;
6 N& H3 V, @$ o( s}! X& q4 X8 U6 v6 ^7 G' u
|
|