找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17040|回复: 0
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
51单片机串口控制16位流水灯的仿真原理图如下:


单片机源程序:
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. #define FOSC 11059200L      //System frequency
  4. #define BAUD 9600           //UART baudrate

  5. #define Level_1   10
  6. #define Level_2   20
  7. #define Level_3   30
  8. #define Level_4   40

  9. unsigned char count = 0;
  10. unsigned char count_max = Level_1;
  11. char  Current_LED = 1;

  12. bit busy;
  13. bit DIR  = 0;
  14. bit Start_Stop = 0;          //0开始 ,1停止


  15. void UARTInit(void);
  16. void SendData(unsigned char dat);
  17. void SendString(char *s);
  18. void Timer0Init(void);
  19. void Light_Current_LED(void);


  20. void main()
  21. {
  22.         UARTInit();
  23.         Timer0Init();
  24.     while(1)
  25.         {
  26. //                  SendString("STC89");
  27.                   Light_Current_LED();
  28.         }
  29. }

  30. /*----------------------------
  31. UART interrupt service routine
  32. ----------------------------*/
  33. void Uart_Isr() interrupt 4 using 1
  34. {
  35.         unsigned char temp,command;
  36.         
  37.     if (RI)
  38.     {
  39.         RI = 0;             //Clear receive interrupt flag
  40.         temp = SBUF;          //P0 show UART data
  41.                 command =  temp & 0XF0;
  42.                 switch(command)
  43.                 {
  44.                    case 0x10 :         Start_Stop = 0;break;
  45.                    case 0x20 :        Start_Stop = 1;break;
  46.                    case 0x30 :        if(DIR) Current_LED =1;else Current_LED =16;break;
  47.                    case 0x40 :        temp &= 0x0f;  if(temp>0) count_max = Level_1 * temp;break;
  48.                    case 0x50 :        if(DIR)         DIR = 0; else DIR = 1;        break;
  49.                 }

  50.     }
  51.     if (TI)
  52.     {
  53.         TI = 0;             //Clear transmit interrupt flag
  54.         busy = 0;           //Clear transmit busy flag
  55.     }
  56. }
  57. void Timer0_Isr() interrupt 1 using 1
  58. {
  59.         TL0 = 0x00;                //设置定时初值
  60.         TH0 = 0xA6;                //设置定时初值
  61.    count++;
  62.    if(count >= count_max)
  63.    {
  64.              count = 0;
  65.              if(Start_Stop == 1)
  66.           {
  67.                    return        ;
  68.           }
  69.           if(DIR == 0)         //顺时针        右移
  70.           {
  71.                     Current_LED ++;
  72.                  if(Current_LED>16)
  73.                  {
  74.                  Current_LED = 1;
  75.                  }
  76.           }
  77.           else           //逆时针                   左移
  78.           {
  79.               Current_LED --;
  80.                  if(Current_LED<0)
  81.                  {
  82.                  Current_LED = 16;
  83.                  }
  84.           }
  85.    }
  86. }
  87. /*----------------------------
  88. Send a byte data to UART
  89. Input: dat (data to be sent)
  90. Output:None
  91. ----------------------------*/
  92. void SendData(unsigned char dat)
  93. {
  94.     while (busy);           //Wait for the completion of the previous data is sent
  95.     ACC = dat;              //Calculate the even parity bit P (PSW.0)
  96.     busy = 1;
  97.     SBUF = ACC;             //Send data to UART buffer
  98. }
  99. /*----------------------------
  100. Send a string to UART
  101. Input: s (address of string)
  102. Output:None
  103. ----------------------------*/
  104. void SendString(char *s)
  105. {
  106.     while (*s)              //Check the end of the string
  107.     {
  108.         SendData(*s++);     //Send current char and increment string ptr
  109.     }
  110. }

  111. void UARTInit()
  112. {
  113.     SCON = 0x50;            //8-bit variable UART

  114.     TMOD = 0x20;            //Set Timer1 as 8-bit auto reload mode
  115.     TH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vaule
  116.     TR1 = 1;                //Timer1 start run
  117.     ES = 1;                 //Enable UART interrupt
  118.     EA = 1;  
  119. }

  120. void Timer0Init(void)                //25毫秒@11.0592MHz
  121. {
  122. //        AUXR &= 0x7F;                //定时器时钟12T模式
  123.         TMOD &= 0xF0;                //设置定时器模式
  124.         TMOD |= 0x01;                //设置定时器模式
  125.         TL0 = 0x00;                //设置定时初值
  126.         TH0 = 0xA6;                //设置定时初值
  127.         TF0 = 0;                //清除TF0标志
  128.         TR0 = 1;                //定时器0开始计时
  129.         ET0 = 1;
  130. }

  131. void Light_Current_LED()
  132. {
  133.   switch(Current_LED)
  134.   {
  135.   case 1 : P1 = ~0X01;P2 = ~0X00;        break;
  136.         case 2 : P1 = ~0X02;P2 = ~0X00;        break;
  137.          case 3 : P1 = ~0X04;P2 = ~0X00;        break;         
  138.         case 4 : P1 = ~0X08;P2 = ~0X00;        break;
  139.         case 5 : P1 = ~0X10;P2 = ~0X00;        break;
  140.         case 6 : P1 = ~0X20;P2 = ~0X00;        break;
  141.         case 7 : P1 = ~0X40;P2 = ~0X00;        break;
  142.         case 8 : P1 = ~0X80;P2 = ~0X00;        break;         
  143.         case 9 : P1 = ~0X00;P2 = ~0X01;        break;
  144.         case 10 : P1 = ~0X00;P2 = ~0X02;        break;
  145.         case 11 : P1 = ~0X00;P2 = ~0X04;        break;
  146.         case 12 : P1 = ~0X00;P2 = ~0X08;        break;
  147.          case 13 : P1 = ~0X00;P2 = ~0X10;        break;         
  148.         case 14 : P1 = ~0X00;P2 = ~0X20;        break;
  149.         case 15 : P1 = ~0X00;P2 = ~0X40;        break;
  150.         case 16 : P1 = ~0X00;P2 = ~0X80;        break;

  151.   
  152.   
  153.   }

  154. }
复制代码




仿真和源码下载:
串口控制流水灯.rar (61.82 KB, 下载次数: 55)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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