|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机串口控制16位流水灯 仿真及源程序! L7 p4 w2 X9 H- c) ], q
9 y% R5 V- V i H' g" U- k, `- F
51单片机串口控制16位流水灯的仿真原理图如下:7 Y5 @2 r% f, L# `* e
: B, L6 \- `; c" t* ?9 A
2 W/ Z% Z( L1 r* O% u2 k$ l
2 \8 N2 _3 Y, }单片机源程序:' k% A3 Q( j2 l5 m# V6 K
#include "reg51.h"
U$ `: O; G8 q3 Q/ Q#include "intrins.h"! ]2 Z, B0 w. w/ n$ T- p
8 F, W6 |: L' Z* n( U6 r#define FOSC 11059200L //System frequency- ?) O' W0 E* M
#define BAUD 9600 //UART baudrate
! B% p) G" O3 K, `* [& r6 p
0 h% [- V" O- s. U. S#define Level_1 10
$ O [1 O0 \! V#define Level_2 20
( R8 {# P5 c# f#define Level_3 30
. s7 ^3 B. L# w#define Level_4 40
3 b! ^8 S8 E) B
# y4 c7 N$ g; ^' x! vunsigned char count = 0;
, C1 l5 |: _, o0 c1 aunsigned char count_max = Level_1;
/ B( D$ O0 ]1 u& L% l- V* Ochar Current_LED = 1;1 x: P1 `+ p+ z' J5 a
$ M5 W% c1 y ^
bit busy;, o w+ C" |5 G( i) ~* Y
bit DIR = 0;0 s1 P% ?, P! e4 x: e
bit Start_Stop = 0; //0开始 ,1停止
h6 ?) @6 o; E% ~* A- i- L8 g, [3 T1 I& h5 i; u* @4 h6 [5 V
, g" y5 P' ^$ a2 ]& L. D9 bvoid UARTInit(void);4 J Y: _8 J- h
void SendData(unsigned char dat);
* Y# V% v6 [( p9 H: ~void SendString(char *s);4 o' }3 `2 K1 I i4 b
void Timer0Init(void);. n5 T8 T+ ]) X* L0 s4 a, B4 Q
void Light_Current_LED(void);% m3 h2 c' o9 e/ [# e$ B) L- O
; T/ w0 b; q5 K( u& @
* `3 u$ W0 t' p% ^void main()
0 E1 q9 m3 U" s- R{4 I, h& f/ F- M* z Q& e. r
UARTInit();3 V, G( T! a( q8 n
Timer0Init();# I/ o$ U: C. q! C o) h
while(1)
+ j! @5 F9 q5 ]# L& Z$ b+ X {
( {& v: L9 Q c- f# H9 c* a// SendString("STC89");2 o3 c/ \1 e+ t7 i# w+ B; P: {
Light_Current_LED();9 H6 Z3 r' _! T, U
}
, ]- @: s8 s9 V% ^6 c8 y$ R}0 L# V' c3 {& F) W
3 e, Q* e+ v* O5 r' X2 u: i7 Z/*----------------------------
8 j, }/ {$ c0 w" ?8 @3 j7 IUART interrupt service routine
1 }- p3 P9 B! Q----------------------------*/
, |8 H- M: {0 U! ~, Avoid Uart_Isr() interrupt 4 using 1
1 L4 P7 H+ l+ U6 p- f5 u, k{9 X5 N' v& k ^( E+ a
unsigned char temp,command;
2 ^8 \9 x0 `6 Z) `+ P p3 Q& M# ]; W' R! I
if (RI)
! M; D# j6 g" f+ o5 r8 ^" l {) d* Y0 Q0 f- d0 T4 P5 \2 t
RI = 0; //Clear receive interrupt flag
" h. W6 X/ E& C9 C8 o$ s7 w temp = SBUF; //P0 show UART data
/ L Z( W. b( o4 z4 v- ]8 ~ command = temp & 0XF0;
) R5 f4 C2 n, }5 i0 m3 `7 B! z- u switch(command)$ R" P2 c5 g- l- O/ Q, @" X/ e6 ^' |
{5 N1 J1 U2 u A1 ]* S+ M
case 0x10 : Start_Stop = 0;break;
6 Q8 u0 r4 l! h; \; G case 0x20 : Start_Stop = 1;break;
0 {! n% s" m, J3 z7 t8 Y a case 0x30 : if(DIR) Current_LED =1;else Current_LED =16;break;8 e& G; V4 n3 s; N6 P8 J( p
case 0x40 : temp &= 0x0f; if(temp>0) count_max = Level_1 * temp;break;
+ E9 G! i8 r3 z case 0x50 : if(DIR) DIR = 0; else DIR = 1; break;
+ t1 Z8 h/ }; @ }/ B' V0 u |2 U3 V& g
; l9 t2 t) u) N* D }
8 K( Q! s& v. q) f1 Z1 ?5 l9 O if (TI)- A- T$ q7 f" X1 e7 }$ W1 h: b% ^
{4 j/ [' w1 r- k( L% b
TI = 0; //Clear transmit interrupt flag
! Q- U- E* m6 q& G" [ busy = 0; //Clear transmit busy flag
6 {9 h! T2 j U3 U9 f) v0 A }+ E" z1 T. I" I4 h0 K5 h$ _
}
' J1 k" V5 O' z# D' qvoid Timer0_Isr() interrupt 1 using 1. E' u0 H. T3 c( p* J$ U
{5 Q# e; a2 C1 o1 L# f7 O
TL0 = 0x00; //设置定时初值' A: N& y8 ^1 [+ a& G2 b* C
TH0 = 0xA6; //设置定时初值
, u- b4 o: k# {8 G count++;
" x; y! W f$ l8 ` x( i if(count >= count_max)! q6 N$ ~4 P$ w% T
{" m# A+ Y1 H7 G; j* n* @
count = 0;
3 ` g) m7 z( @- l if(Start_Stop == 1)' y, e7 V1 x5 a. |
{
4 y1 _4 ~! ^. S" V2 t3 a+ p* f return ;
) v% M& Q3 }+ l h/ Z }
$ V1 R! ^4 b2 {- L if(DIR == 0) //顺时针 右移* L; V/ P1 F4 y4 s& U: `9 b4 u
{/ S! j9 Z2 E& J8 f; b% v e
Current_LED ++;: q3 R3 w% J8 @: c' _9 y# _
if(Current_LED>16)
; _4 U# Q5 S, L) k {
8 S* t: }$ {+ u/ _1 p9 G Current_LED = 1;; c0 ~! Z# { ?) J
}8 u; Q/ s8 o$ L7 v9 r5 R y
}$ @& o4 I2 R: H# Y
else //逆时针 左移
% D3 ?9 o* u! K( Q {
" @$ k9 T7 p. _2 B) }' m, C Current_LED --;
3 K: T' M9 p3 t0 W' M3 G! v if(Current_LED<0)+ A1 C1 M& F2 X6 i/ h3 G
{# x( E, G8 G! L
Current_LED = 16;
8 G1 |$ v$ k; k! l: a, P }0 l1 X5 G* `0 y% C5 d* |4 |4 p! p: |
}
) V8 c' L1 H- I8 c }" [; I0 h4 ~" s
}) t. S$ x! e) s7 z) F
/*----------------------------
; T. u3 v' J+ z! j. J. tSend a byte data to UART7 m& K" p2 }7 O, H0 S2 h7 {( X
Input: dat (data to be sent)) {8 Z: r8 x/ G/ z
Output:None
% _$ x6 N' i7 h! P8 f+ T----------------------------*/
+ }2 n) U: v/ g& cvoid SendData(unsigned char dat)) i4 c) y) T5 N8 a1 V; n% j" f' P9 a
{
8 J! ^; H) C: ^. T( A: m while (busy); //Wait for the completion of the previous data is sent
6 S7 F' E+ R I( D+ S ACC = dat; //Calculate the even parity bit P (PSW.0)- b/ u; F' `4 E- l7 H5 u8 F% t
busy = 1;; L+ W: [/ U9 m: s& F
SBUF = ACC; //Send data to UART buffer! a2 R; a) T W; C( j) ^
}
; [7 l3 J3 Q- |7 r; G/*----------------------------6 r" s" h* `' P4 u/ e: E
Send a string to UART
: b. t; I6 N6 h v) _9 aInput: s (address of string)
' e; P/ B+ O& h7 f' uOutput:None. S) u3 Z: q" k2 ]$ Q5 ^# {' N
----------------------------*/- _( {, J! Q5 U* m' W* {9 ~; z6 s
void SendString(char *s)
, i: ~ P) W2 L: V7 H( `' ^! q{
6 c b. h# {. ? while (*s) //Check the end of the string
( o0 G/ ^& f. M# z* y. ? {+ y& y& z2 Q$ ]* q- u! \" _0 J
SendData(*s++); //Send current char and increment string ptr
# o/ R" H% ^( O7 D }6 K! V) s& I4 [# H- J- R$ r
}& i3 B U. c- A. O) U
' ?: L' _6 s% C* a4 x" O- kvoid UARTInit()2 ]0 M8 t5 y; J
{3 i0 N5 |, z+ c
SCON = 0x50; //8-bit variable UART
' G" e; |5 \ P9 m4 v$ L; n* J6 e" R5 ~. q }& S
TMOD = 0x20; //Set Timer1 as 8-bit auto reload mode x( n4 n+ c& B: z, t! q
TH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vaule9 n# E$ x1 J) b* t' `% X. ] a
TR1 = 1; //Timer1 start run& O+ b4 c9 |9 x6 R% t
ES = 1; //Enable UART interrupt
* Q5 t; p2 J0 P V6 f( O- f9 e EA = 1;
- Z; c: {8 u1 F+ u8 d6 ^0 K0 ]}
* r' W, ]* Y) ?: H' F% S1 ~- x3 x+ N: a% n) J
void Timer0Init(void) //25毫秒@11.0592MHz
6 i, o, }1 K+ D7 N4 C{
) l6 J7 s& y9 B( k1 D w// AUXR &= 0x7F; //定时器时钟12T模式5 y8 a+ M& w; n- B5 k' L3 L! x% X1 m
TMOD &= 0xF0; //设置定时器模式
, Z: ~) E* N7 W) ^ TMOD |= 0x01; //设置定时器模式+ o' m. _+ D! Q% v0 O2 Y# c/ w$ l
TL0 = 0x00; //设置定时初值% s4 ^8 x; \& O1 P4 S6 W( [
TH0 = 0xA6; //设置定时初值& v5 T9 W4 C! b9 ], B) w; f# t$ W/ @
TF0 = 0; //清除TF0标志; ?+ }+ e6 z; }( A4 g2 d
TR0 = 1; //定时器0开始计时
/ @. u! g: T4 w4 n ET0 = 1;
) Y7 `1 ~2 v( E& Y [: z0 P}
( a& Q6 z; e1 `% Q4 C4 N1 Q" P, Q. t# R
2 t) A$ `& p2 @4 f0 Mvoid Light_Current_LED()* ^1 t- g( ^; y# D; V1 R1 a/ p
{6 ]! d) J; m3 M, \
switch(Current_LED)8 e* z2 N6 G- y" F7 q
{$ ~9 K% r/ b# [# D% ?
case 1 : P1 = ~0X01 2 = ~0X00; break;
0 p6 I/ |: |; }0 S- a& ^7 Q# T7 f case 2 : P1 = ~0X02 2 = ~0X00; break;
~1 \+ h0 D' ~- i case 3 : P1 = ~0X04 2 = ~0X00; break;
0 K' @/ [+ Z; ~6 h \# ~ case 4 : P1 = ~0X08;P2 = ~0X00; break;
3 {4 N3 O( K+ [ case 5 : P1 = ~0X10;P2 = ~0X00; break;2 ~; m6 o* a8 {8 i( K$ `2 N _
case 6 : P1 = ~0X20;P2 = ~0X00; break;
6 D* y4 U3 c: X case 7 : P1 = ~0X40;P2 = ~0X00; break;
" i+ S( a1 A, \4 | case 8 : P1 = ~0X80;P2 = ~0X00; break;
- ?9 W4 B0 Q# O9 o3 G) O% X case 9 : P1 = ~0X00;P2 = ~0X01; break;
& g& `0 D( } D; N9 k, N* w, r case 10 : P1 = ~0X00;P2 = ~0X02; break;
X- Z1 H5 P7 v( T case 11 : P1 = ~0X00;P2 = ~0X04; break;0 x8 n* z4 K" `2 N" Q4 @6 ]1 L
case 12 : P1 = ~0X00;P2 = ~0X08; break;; E0 X, ?( H" j# J3 A
case 13 : P1 = ~0X00;P2 = ~0X10; break; ! j6 R& k3 L: d H( w
case 14 : P1 = ~0X00;P2 = ~0X20; break;) [% {( ^$ s8 o0 q$ k
case 15 : P1 = ~0X00;P2 = ~0X40; break;
+ A6 @: ?. [. i/ J) B; ~$ G case 16 : P1 = ~0X00;P2 = ~0X80; break;7 L8 Y; f+ ]; i% ]
% n9 j" q1 W# c( q5 {% y
! D+ [5 Z+ W+ z C
8 `& v: V, v, T* E1 ? }
/ s) }* [. l# N# i* L9 K
" D) n) Q& k0 B% r) W# e}
4 t3 e9 T. Z7 s6 o, Q/ P0 g( k z, N1 ~8 w. c
下载:6 p) [/ }3 X: |, U k
- } L: v9 Z( I. {
+ T; }) N* ^) t# l |
|