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

单片机串口控制16位流水灯 仿真及源程序

[复制链接]

该用户从未签到

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

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 = ~0X012 = ~0X00;        break;
; K0 {7 C4 s2 @+ Y# Z6 x5 g8 s/ }        case 2 : P1 = ~0X022 = ~0X00;        break;
$ Z! r5 m, @4 o         case 3 : P1 = ~0X042 = ~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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-22 03:30 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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