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

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

[复制链接]

该用户从未签到

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

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 = ~0X012 = ~0X00;        break;
0 p6 I/ |: |; }0 S- a& ^7 Q# T7 f        case 2 : P1 = ~0X022 = ~0X00;        break;
  ~1 \+ h0 D' ~- i         case 3 : P1 = ~0X042 = ~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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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