|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机串口控制16位流水灯 仿真及源程序+ f4 K" y+ l0 I/ L" w+ z
+ l) j9 d& W g5 f( |- _, S1 F9 f/ |: a* R
51单片机串口控制16位流水灯的仿真原理图如下:
! I: _% ^1 t( U) X, G d+ _; H y3 u, V; w8 ^& h- B4 f. Z
6 x" l0 {- G! a. l1 Y% l- H @6 X7 C1 P% b" l# ~
单片机源程序:
: _7 c' E9 T' K#include "reg51.h"
; d; S9 X! b+ V6 V$ O b7 m9 T#include "intrins.h"6 O! n8 D# k, P. U! g2 ]1 k7 @/ A# s
' g& z- a- v$ @& I8 H R- w
#define FOSC 11059200L //System frequency. M0 m6 ]. F& T9 B# T! B# k
#define BAUD 9600 //UART baudrate; h6 W+ m# H" {/ R R
6 U, w; X. T% V' M: J m( _#define Level_1 10
2 X( Z* ] P+ y, d5 ?0 O3 ^. K#define Level_2 20
( h* _! N& o9 o' b, p; ?0 U3 |" i' Z#define Level_3 308 a3 D5 n6 ~4 q6 c! s q( l
#define Level_4 40
; m; H) W$ T) \! D: Q3 z! ^
, j, i" y( r1 A; Q2 I% F8 a U; u1 aunsigned char count = 0;! S# \' Q& B" M& H8 X0 O: o6 s
unsigned char count_max = Level_1;
+ y& k1 ~6 i- ~% i% F0 ]: lchar Current_LED = 1;
0 t0 H! z0 V5 F: @+ \# s+ @: m/ X9 ?) ?6 [ v" A7 v' ?5 v0 ?
bit busy;0 E4 t" ]9 F$ P8 _9 u- u
bit DIR = 0;
* M2 {# }( g1 s% Q0 i, `# K3 Wbit Start_Stop = 0; //0开始 ,1停止8 b+ @6 A9 N6 P6 D$ H: ]
+ O7 [+ Z! E2 p+ S2 e
. ^: `* l& b* o" ~5 P" Avoid UARTInit(void);' M7 y+ s, V( M( g( v+ w
void SendData(unsigned char dat);
" a. I! r4 i V5 _9 f5 t8 s" d! yvoid SendString(char *s);
2 a* M- h( W1 z, Q; }void Timer0Init(void);- m& B- [+ I1 y( [
void Light_Current_LED(void);
9 b% l q7 v/ K" |( `% a- W) D% B+ q' U0 f* p2 f# e/ G
" r" ~3 l6 t v/ J$ c Z! a# pvoid main()
: W; Q; h; _4 d3 D{0 h% u! c7 Q: L8 l5 N/ A/ y
UARTInit();
3 r( ^; |. {7 B3 I) g3 V Timer0Init(); G4 e1 o0 ~" J( q
while(1)
1 h D! T# P: z; c {
! O G; h, ~% G$ ?; e// SendString("STC89");
$ b- c# V5 M& G" w" D* s Light_Current_LED();
: @4 O6 s5 Z- U: K. I. n }; a% B3 b/ Z2 [
}
% \4 W' P& ?2 J4 }5 d% D- h3 ?5 F' D/ H1 `7 z( b
/*----------------------------
$ S1 c) c! d3 W0 y. T5 W0 M% BUART interrupt service routine
( D) Z! ~; C, t0 `+ [----------------------------*/
7 u# Q/ U) q! x: }void Uart_Isr() interrupt 4 using 1
) R% P: w6 o, i( H }* [. ~{
1 [3 \% u5 `" |7 D0 ]3 R6 D5 J unsigned char temp,command;
4 {+ Y3 N! H" C" K3 n
9 j! H5 `. N! [7 u9 q" b( ] if (RI)) D z) y: P. T1 Y8 x1 @
{
7 W. j8 E5 ^7 |) f RI = 0; //Clear receive interrupt flag/ [6 }8 q1 a1 L( Y( G( j
temp = SBUF; //P0 show UART data
9 K$ F9 f) x$ r0 _7 C: _ command = temp & 0XF0;! @, @. O3 C2 Y% w
switch(command)
# Q, @% S' L' R: H2 K+ G2 m, s- b4 q {
6 k% D: k8 C8 ~8 C case 0x10 : Start_Stop = 0;break;
1 n1 Q7 b% Y: O case 0x20 : Start_Stop = 1;break;
# I4 ]! L0 i5 r! b- h case 0x30 : if(DIR) Current_LED =1;else Current_LED =16;break;
% z1 L, D4 F; ]' s- V case 0x40 : temp &= 0x0f; if(temp>0) count_max = Level_1 * temp;break;
( T v6 n5 v, E' X( d case 0x50 : if(DIR) DIR = 0; else DIR = 1; break;
" y3 o6 N% n* }8 v4 _1 i# h }( C3 V1 u$ }% q+ ]8 T3 I6 ~
! V9 ` O: P2 S8 L* p5 w2 Z }
; ^; U) ?7 C, |* z if (TI) G% H% U% Y- N$ Y; Z0 K
{
. F$ a7 `5 p" O" M% @& V TI = 0; //Clear transmit interrupt flag
) M5 k" F5 }: p0 D- y& U0 Z, ` busy = 0; //Clear transmit busy flag7 }: \; {! V& @, y
}2 b, {: X% `7 y# d6 B* `% q; o
}/ F! Q$ c1 V( C6 ]
void Timer0_Isr() interrupt 1 using 1" P0 y% N1 W+ h8 m8 s! A$ m# |, F) G
{2 ^2 y$ h: r, f
TL0 = 0x00; //设置定时初值6 h4 ^8 |( h7 ] Q! @
TH0 = 0xA6; //设置定时初值" } J7 s Y! R; @2 W. N
count++;
: j8 K9 \# V* H- t; V# l3 u if(count >= count_max)
1 W1 |3 l! d4 R% x1 D* T2 D; t {
8 n9 K5 S) D8 m9 `+ N' _& ]; `' H count = 0;
# L" u$ q0 Q/ Q2 O; w1 V( K( ~ if(Start_Stop == 1)7 g6 }7 z% {0 ?" A
{
0 U9 ^- i3 ?( t! B$ X return ;0 e2 Y. k, H! Y) y+ r5 L! p ]0 [
}
% r& o, _7 M3 \9 h$ i if(DIR == 0) //顺时针 右移
+ Q+ O: D: C- X+ p2 q {; Q' ^( Q* Q& S1 j+ `6 q% \
Current_LED ++;
4 `' R9 P' p! f. E if(Current_LED>16)0 r7 @% {7 j7 S2 _ a* @% k: L$ B
{
6 \) f1 x& `0 `+ V6 y Current_LED = 1;
6 n/ @' u) q* ?, h: d$ D$ } }; U- V0 l5 b, }! B: i0 n5 y% g+ x
}" V- b* ^: d3 s: a
else //逆时针 左移
9 @1 ^# x [+ B {
- A! g: T4 F/ k Current_LED --;
# g8 A7 k) H: L( v if(Current_LED<0)
8 Y- ~$ m* `2 r {
) Q+ C9 H* T. W# ?7 | Current_LED = 16;. O* m! k, [" [5 X, h f( d; b9 \1 a
}8 D5 l- E A+ p. h
}: a, B/ X9 V4 q. |4 V
}! c: Q" ^# L8 z$ K
}
: Y+ z0 N: c- Q2 ~7 _3 `/*----------------------------5 G' X) B) j" Q
Send a byte data to UART
; X& B# n7 r' b* ~; D) [Input: dat (data to be sent)5 X% E, ? O! P7 ^, Y
Output:None
! Z/ J% ^- V% g# n4 A----------------------------*/
$ c+ J4 [/ J1 J3 F) b& T" g! ?void SendData(unsigned char dat) p- D) K/ O, d7 l7 }. z9 b
{5 J8 N$ u6 D2 w- V0 x1 ?, s
while (busy); //Wait for the completion of the previous data is sent
" L' P# n7 r8 G; v3 P, n( y7 I ACC = dat; //Calculate the even parity bit P (PSW.0)4 X3 [. K. y- z% q+ a0 @
busy = 1;
& X& e( x' {8 s6 b SBUF = ACC; //Send data to UART buffer
5 y% @' K2 o; J% o}! j: L/ E7 g* R& `3 a
/*----------------------------
$ t2 C3 K/ F) k; r6 X( {Send a string to UART( I& c' { y; j. V# b) w; e8 X
Input: s (address of string)
& u- g1 W; f1 q+ eOutput:None1 \7 \ }, r c( r1 |- e- j
----------------------------*/& H" T' X4 h7 }& E7 y$ }
void SendString(char *s)& m9 M7 F) n& q
{! `2 K9 T" h1 \) s
while (*s) //Check the end of the string
9 B8 Z, e) ]: }4 Y& W2 P: `3 U$ v: g( E {. ~, W# j1 W" x* ^, h' d
SendData(*s++); //Send current char and increment string ptr7 O, S* k8 [/ K5 A
}
& @9 I+ i7 a5 `; D' I+ Z}2 |- J K e. |8 @, Z9 |
A2 L: o5 z, ^- K' O- i; q
void UARTInit()
1 J3 D( m. x) v8 R- U6 ?{+ ]: q3 ]" w7 P, ]0 L
SCON = 0x50; //8-bit variable UART" `* H9 h4 B- `; C% s- I
! j+ w0 j+ d5 e1 N4 P TMOD = 0x20; //Set Timer1 as 8-bit auto reload mode
1 k/ ^, i) |% u) l7 M, z: N. O TH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vaule
# Y( n5 w7 W, p d# A6 i TR1 = 1; //Timer1 start run! Y) ?4 R0 [$ o: r, |
ES = 1; //Enable UART interrupt6 o. \9 O* ]& J# [3 }" \' i
EA = 1; 6 J/ K, v2 ?2 Y+ c" V7 V, d2 ?2 Y
}
$ P2 Y- l/ Z# F; ^* T
) j0 S' [3 n: o# ]% n( a+ Lvoid Timer0Init(void) //25毫秒@11.0592MHz% q0 N* H a: \2 I4 j$ b& s5 y
{
' n5 c% v% ^/ E& e6 W+ D' F) c// AUXR &= 0x7F; //定时器时钟12T模式/ c2 n$ Z# {' U/ l3 m
TMOD &= 0xF0; //设置定时器模式 O0 ]8 O' y* r0 ~- ]6 O( i, n; D
TMOD |= 0x01; //设置定时器模式
4 T. h1 F$ u# O TL0 = 0x00; //设置定时初值0 S8 s7 y8 p6 _5 j& O
TH0 = 0xA6; //设置定时初值, T; S2 g& {! e4 T4 _5 }' K: Y! u# w
TF0 = 0; //清除TF0标志8 ~& ^1 }# T! J# w; e9 w
TR0 = 1; //定时器0开始计时/ g( F, X( l# ~$ Q r1 M
ET0 = 1;0 \1 i/ j5 D% }- C
}/ p8 `4 j" r1 S" Y" L5 v/ s1 m( R5 ~
0 z& }4 A h! P# ]7 k
void Light_Current_LED()% Z. F$ Z5 _& g# S, n- p
{" y' J4 G8 u9 q
switch(Current_LED)" G' Q+ ^; _) h
{
# }; x: I) V; W- j. E6 x$ i case 1 : P1 = ~0X01 2 = ~0X00; break;
. X& f# L# Y c# A7 _3 c# j case 2 : P1 = ~0X02 2 = ~0X00; break;
. G3 [% K! c( m' j1 C case 3 : P1 = ~0X04 2 = ~0X00; break; ' {* ~; e; B. k" p/ A$ R/ g" \4 g
case 4 : P1 = ~0X08;P2 = ~0X00; break;, j9 C9 N9 Z: c1 N
case 5 : P1 = ~0X10;P2 = ~0X00; break;
- u+ R$ z' e) A ?1 j% T2 `) T case 6 : P1 = ~0X20;P2 = ~0X00; break;" L% D) Q% e! V/ a& M t
case 7 : P1 = ~0X40;P2 = ~0X00; break;8 ]& D+ x' y, d
case 8 : P1 = ~0X80;P2 = ~0X00; break;
$ ?, q* n' G& f$ N4 X4 z- s case 9 : P1 = ~0X00;P2 = ~0X01; break;6 c! |( n9 i/ M3 K9 D4 Z
case 10 : P1 = ~0X00;P2 = ~0X02; break;) h" }+ f1 m0 w
case 11 : P1 = ~0X00;P2 = ~0X04; break;
5 }( j& \5 {+ l7 P) }1 f/ G case 12 : P1 = ~0X00;P2 = ~0X08; break;
% y% l! A5 A0 l: g& n" C. S case 13 : P1 = ~0X00;P2 = ~0X10; break; ; S9 e# x2 Y+ U) W
case 14 : P1 = ~0X00;P2 = ~0X20; break;& }; Z# a3 }# T/ P5 _1 M' Z) ^
case 15 : P1 = ~0X00;P2 = ~0X40; break;7 k* K5 {* C2 V4 T5 j/ t2 K
case 16 : P1 = ~0X00;P2 = ~0X80; break;
1 W" ]' ?: q, o( ?4 h
/ L# [$ T3 \5 x9 {+ _' i- D: e3 V4 i5 @: I" n7 B/ \0 d
7 X6 s& r4 g0 c- l }; {: g; x% n; X, S
! O6 i# } r( Y5 t, A: ^}
+ [0 m- Y7 [0 I5 e+ V
5 j/ ?& _% T8 b7 N/ X下载:
4 l8 D2 _+ k1 r, v \8 C" ?4 d$ |0 V% F
6 t+ Y& @5 T: x0 T5 I |
|