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

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

[复制链接]

该用户从未签到

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

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 = ~0X012 = ~0X00;        break;
. X& f# L# Y  c# A7 _3 c# j        case 2 : P1 = ~0X022 = ~0X00;        break;
. G3 [% K! c( m' j1 C         case 3 : P1 = ~0X042 = ~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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-17 21:38 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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