|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机串口控制16位流水灯 仿真及源程序
; }/ o, g9 X+ L, H+ ~+ U2 v3 e+ L% n8 g! b
7 h" ]* O( C2 Z: z+ h51单片机串口控制16位流水灯的仿真原理图如下:& a, f; l8 ]! Y+ [( I* G. X
! V8 K: z( O3 h% v# J
) S' \& j4 X# \
" ~- ]) V( e0 v- r/ l) b' \单片机源程序:
: i3 D- ^; G, Z w#include "reg51.h"
# n# [5 I. `4 [#include "intrins.h"
; ^3 z( l& R/ N) c' L) b6 g. ^
1 ]9 k6 ~) _1 B" u5 R7 L3 \) h#define FOSC 11059200L //System frequency- f1 j: W) C% n8 j- S, r
#define BAUD 9600 //UART baudrate' F! o* ^5 P- |" r7 \7 I' [
# A1 y1 e& C3 V#define Level_1 103 W% Z' W9 J9 M. u. `) ?
#define Level_2 20' }" S* c9 f. f$ w o: _7 \
#define Level_3 30: @0 L) v. {8 S6 B0 }% o
#define Level_4 40
4 I/ j+ @6 a w3 m
" @; C& y; z3 y" C+ H5 iunsigned char count = 0;
) M" h v( P6 j; B" Y: Xunsigned char count_max = Level_1;* H9 e5 g0 q z# m" ~. W9 a
char Current_LED = 1;
6 K z# M$ w! V0 y0 n" }4 A7 y* s4 [" _
bit busy;
( F- {4 F( }5 \0 G6 vbit DIR = 0;# X5 K3 g9 H& A
bit Start_Stop = 0; //0开始 ,1停止
5 d4 W- y! L# B2 m" L& ^3 C/ K: f1 a$ @0 D* [! g+ J8 o
7 v" ~2 Y; m& s3 B3 P0 `# }
void UARTInit(void);
4 I( @7 j$ h2 n( Dvoid SendData(unsigned char dat);( p- f4 g; H! q+ u# r! ~+ `/ E% m3 ^
void SendString(char *s);; m: G* ~3 `9 e
void Timer0Init(void);
; B5 m& C$ o( ^" K% svoid Light_Current_LED(void);0 u: W1 U, K1 @
; s3 m1 B" b+ j+ k- z( N- n2 O: x
6 D& [7 Z8 s/ O/ ~void main()4 R9 F/ U2 ^; F2 P1 M
{- z: D* N9 L2 ]5 i1 U
UARTInit();
+ W" I P2 D- Q! I: l/ ~6 P7 A4 `# k Timer0Init();3 {# ?4 z) q% g& }
while(1)
5 E( k9 u( I8 l+ T {% C6 t( x i$ Z6 r* z8 N
// SendString("STC89");
; t$ K0 B" k' s; ^ Light_Current_LED();8 C$ H D( a* d/ y
}1 X: g9 A: l6 w0 Y
}6 _; s% w/ a$ n
* f$ B8 C, }% R& I/ p3 C
/*----------------------------0 t$ ]5 F% J1 x7 P
UART interrupt service routine: R0 ~; d, n/ W+ n6 |+ m. c4 N( h
----------------------------*/
2 U8 E" b9 M3 ]9 evoid Uart_Isr() interrupt 4 using 1
( V A1 f" \1 ^{
9 V. X4 D0 T" L unsigned char temp,command;$ y4 g. J% i/ y1 \ w
2 d- `) A3 O( Y$ s if (RI)8 p1 O/ m2 U& C
{
+ a$ N0 z+ C0 G) n6 I RI = 0; //Clear receive interrupt flag1 h6 Q s0 |% e
temp = SBUF; //P0 show UART data7 }3 {& z, c! L+ E5 Q: @
command = temp & 0XF0;% t* U9 D: P1 v, I Q, x8 Y
switch(command)6 ~" @! ]# M6 S8 n( d3 l, }
{2 Q. z: H$ @, f3 g
case 0x10 : Start_Stop = 0;break;% T. e9 g5 B+ t* {/ V. [% J' O, g+ p9 `
case 0x20 : Start_Stop = 1;break;+ k) W& |4 w! G' s$ ~* \
case 0x30 : if(DIR) Current_LED =1;else Current_LED =16;break;
) r2 P9 B A5 ?# h, g( U case 0x40 : temp &= 0x0f; if(temp>0) count_max = Level_1 * temp;break;
# p5 y& I H' r, v: x4 k case 0x50 : if(DIR) DIR = 0; else DIR = 1; break;
# B+ h2 |& e0 J6 V& U9 W% m0 R }
& A0 Q5 {) y3 `1 T9 K8 @. I# U+ R
- ~5 Y( i2 S6 ?" u# q1 Y; {# F }% o: I; A* U1 j0 \/ n! K
if (TI)1 b1 H: p! C0 z
{
" r/ Y7 Y8 I6 W8 V! ~ TI = 0; //Clear transmit interrupt flag
: E% k$ b4 _$ N busy = 0; //Clear transmit busy flag, O) A+ ]9 [; C! n" v4 G
}
/ ]5 p; L# d' s, n" k}
* m" W' V0 A3 U* D3 Zvoid Timer0_Isr() interrupt 1 using 1/ |2 n! Z- j1 d. I% S
{
, O: t6 Y9 l* r/ z/ G4 c TL0 = 0x00; //设置定时初值3 N: m* C/ N: u3 O
TH0 = 0xA6; //设置定时初值% |& P: P/ k4 e. B* Y3 J
count++;
" D$ t7 a0 T' [; n6 ? if(count >= count_max)
, e6 S2 h; q/ k0 b6 w5 O {* d+ I. @! o* A. P; U6 |6 g2 d
count = 0;
: d4 K! C8 J2 D. d4 l if(Start_Stop == 1)
1 w9 ?2 C) b- q: W4 b* V2 P+ _$ @ {
5 |4 E# ^; V( e2 U! R& h return ;
5 S6 e" ]! Y! l }
! z! `" j9 S- \' X- m2 C if(DIR == 0) //顺时针 右移
( b O/ l. S w1 q L, L, k {
s. y$ @0 w5 Z Current_LED ++;
/ k' U" @. b: d" @$ L ?) { if(Current_LED>16)3 N/ N5 o, ^; S7 H
{
- ]& v, }$ |. g, a$ X) c" z Current_LED = 1;
* `, U( K& Z* O# @- \* g4 N }
/ v5 Q, r1 K( o/ F$ g }
* Q/ T3 ?$ C2 d, q' ~$ S# o else //逆时针 左移
$ O" ?1 P5 W5 ^4 r& j {
8 ~( R: r* N8 T0 E Current_LED --;
3 T5 q5 ]( U' f! [: {9 p4 M8 F if(Current_LED<0)% S; c# {: P% Z8 g9 E5 \
{
, J- t1 y. {8 c9 P; `: s, q6 o6 w Current_LED = 16;
z* L% v% o# g8 o. ` }+ |2 F; O4 k4 B0 I: @2 G( `7 a0 M
}1 y1 Q2 s. ]8 f3 u- I- S) y/ q
}# m) S% I, \/ Z1 P" p8 P
}
8 i/ w) Q( q- Q6 E4 y0 v: u" z/*----------------------------0 q- ]! C* K+ w7 O; J/ o4 p
Send a byte data to UART
1 {$ y( M/ g7 t; d+ _- l5 rInput: dat (data to be sent)
) _- U- w8 N* q! eOutput:None
& m, Q! F# y$ y$ p) E----------------------------*/! a# ~+ {( D3 T" o1 w2 }! i
void SendData(unsigned char dat)4 F9 c/ T8 L9 \
{: j- e; k# L+ T% a7 S3 r7 @
while (busy); //Wait for the completion of the previous data is sent
0 B) ^# z) U! b& x4 } r ACC = dat; //Calculate the even parity bit P (PSW.0)
8 R" y9 Y8 p* Y5 t7 a, O) C busy = 1;; z2 \3 d& j+ p
SBUF = ACC; //Send data to UART buffer( F% C4 q8 B0 L$ k& Y% y$ ]2 f/ B3 g
}
" s7 L9 Q& W' P6 ^" x: C6 K6 T/*----------------------------
0 ]4 v: W2 E6 r" L4 _3 TSend a string to UART
( W! m# m- W# GInput: s (address of string)
3 U1 X# a$ I* ?) v& s( KOutput:None
; h5 N! c6 ^$ Z3 E4 \----------------------------*/
' Y! c- }% Q$ K dvoid SendString(char *s)4 j, z3 N6 V7 x5 A2 b6 @5 H' S
{
) h0 f: B- w+ ^# \' L" ^ while (*s) //Check the end of the string
- c* i$ m9 z; ~! Y& I% V5 g& V {$ m5 e! M2 o) W" v
SendData(*s++); //Send current char and increment string ptr* o/ m* Q2 K$ B1 q. M. `6 \7 G$ \
}" M1 V" M! q d( L }
}$ m5 P* a7 K4 J6 _
# \; D* w3 k& L6 ]3 E1 K
void UARTInit()$ F; Y6 s% M* G: y0 E
{' f7 Y! b, k0 V
SCON = 0x50; //8-bit variable UART& {) q0 G! L2 o9 \( E. z/ G" ^& {
& R9 _" E9 G- e6 V) k% y1 s! l% y
TMOD = 0x20; //Set Timer1 as 8-bit auto reload mode
9 `' p- @: ?7 o s TH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vaule
5 j- ]9 @) Y X/ x- h TR1 = 1; //Timer1 start run
v; I# x( G8 m0 x& K8 Q8 }! x A ES = 1; //Enable UART interrupt( P9 O5 [! |0 Q! O& P
EA = 1; 8 g- T6 I6 H" }- n# t# w
}
# A9 Z) L2 p) E* g- G( m8 C! q ?7 l6 J6 [3 i" N
void Timer0Init(void) //25毫秒@11.0592MHz" D% Q% S8 m) {
{# _7 B5 Z# |0 o; R$ x: `
// AUXR &= 0x7F; //定时器时钟12T模式/ D# M# t# z& i8 p' h
TMOD &= 0xF0; //设置定时器模式
* b: j1 {* G0 w% Y7 s1 h TMOD |= 0x01; //设置定时器模式
( S$ Z! L$ g; e8 T" c% m TL0 = 0x00; //设置定时初值
8 r; h% l7 d' _$ Y TH0 = 0xA6; //设置定时初值
: x6 ^9 w2 o7 u8 J. N. H* a TF0 = 0; //清除TF0标志
3 m' }. _3 i! l! }- j/ `$ {( Y TR0 = 1; //定时器0开始计时* ~0 |( x- [; P1 d
ET0 = 1;5 y% S1 z8 P' E- P' s j: \( {
}3 |/ h3 b R% e7 m4 M' {+ f* s: \* q( B
1 a6 ]0 c7 c+ }) Z1 L& l2 H1 b% ^* vvoid Light_Current_LED()
. {2 g& P8 x* v; h( O5 e{
- S/ x3 E3 q# |4 Z switch(Current_LED)
% M/ B+ Z5 D$ I {
, x) R, Y9 O+ ^8 M case 1 : P1 = ~0X01 2 = ~0X00; break;
; K0 {7 C4 s2 @+ Y# Z6 x5 g8 s/ } case 2 : P1 = ~0X02 2 = ~0X00; break;
$ Z! r5 m, @4 o case 3 : P1 = ~0X04 2 = ~0X00; break;
6 y" `' v x5 s- Z# o5 ]1 ] case 4 : P1 = ~0X08;P2 = ~0X00; break;
O# o8 Q5 U; [1 n) `9 B+ P2 H case 5 : P1 = ~0X10;P2 = ~0X00; break;
' j5 t# g3 L" b+ A case 6 : P1 = ~0X20;P2 = ~0X00; break;
" p5 M' c" V, \) @, b" M2 s8 K case 7 : P1 = ~0X40;P2 = ~0X00; break;
7 t1 q; k; `* V case 8 : P1 = ~0X80;P2 = ~0X00; break; % ]* H4 a& @# r1 W2 Z" ]) D7 Q% U; Z
case 9 : P1 = ~0X00;P2 = ~0X01; break;! }' d9 R6 }; Y" P i' }# ?
case 10 : P1 = ~0X00;P2 = ~0X02; break;- n3 ]6 S) N3 A$ l
case 11 : P1 = ~0X00;P2 = ~0X04; break;. b3 M/ L* g3 \- h) p
case 12 : P1 = ~0X00;P2 = ~0X08; break;2 V" j' B3 P9 o* r0 e9 K4 M- Z( g: B
case 13 : P1 = ~0X00;P2 = ~0X10; break; - ]9 I7 D6 m/ J5 p1 w7 p
case 14 : P1 = ~0X00;P2 = ~0X20; break;
5 g8 K" p" R+ S6 t6 ~+ F case 15 : P1 = ~0X00;P2 = ~0X40; break;
4 b" j9 w; {3 y+ e0 M9 s case 16 : P1 = ~0X00;P2 = ~0X80; break;
Q% e+ v0 `4 ~ c8 l) X' R. [: Y" n2 M
: w4 c& t- E+ |; H- n
# d, P4 S" s+ m2 y }* E4 O* s. v; P u' T
0 ]0 V7 ?- d, q" g8 m! h, \
}
0 R! E5 f6 g4 i2 s# f
; ]0 l) l; r( @% J下载:/ p4 X X, `6 O
8 g3 m9 u6 v9 y4 _2 ? t0 v2 G
4 U2 U/ a8 |. ~) S2 y% f |
|