ciky 发表于 2010-1-5 14:02:49

新手发个串口控制LED(含源代码)

之前做了个用按键控制简单灯效实验,这几天恶补了串口,中断知识,将按键模式改用串口实现,实验效果视频点击查看:
串口控制闪灯实验效果视频


硬件:

a.51最小系统板

b.RS232串行口

软件:

a.       Keil uVision3.0;

b.      Easy 51Pro v2.0;

c.       LP_COMM V1.22;


以下为测试成功的源代码:

/****************************************************

* 声明:      此制作为CIKY单片机学习过程,欢迎爱好者

*            一起学习和探讨,共同进步。

* Title:       串口控制闪灯

* Description: 通过AT89S51单片机控制LED点亮方式,依次

*            为单灯循环轮流点亮、两点循环轮流点亮、

*               LED从中心向两边逐个点亮和从中心渐亮渐灭

*               四种方式,还可以给亮灯速度进行加减速。

* @author      CIKY

* Date:      Jan. 01, 2010

****************************************************/

#include <reg51.h>



#define uchar unsigned char
                        
uchar LEDT1 = 0x01;//保存循环轮流点亮左移时LED状态;

uchar LEDT2 =0x80;   //保存循环轮流点亮右移时LED状态;

uchar m = 0;         //控制方向



uchar LEDShine = {0xe7,0xc3,0x81,0x00};

                                  //LED灯从中心向两边逐个点亮;



uchar LEDShineC = {0xef,0xcf,0x8f,0x0f,0x8f,0xcf,0xef,0xf7,0xf3,0xf1,0xf0,0xf1,0xf3,0xf7};

                  //LED从中心向单边逐个点亮熄灭过程;



uchar n = 50;       //延时时间



uchar LEDVal ='a'; //保存串行接收数据,0为单灯循环轮流点亮,

                              //1为两灯循环轮流点亮,2为LED从中心

                   //向两边逐个点亮方式;   



//////////////////延时函数//////////////////////

void Delay(uchar x)

{

      while(x--)

      {

             uchar j;

      

             for(j=0;j<=125;j++);

      }

}



///////////////////加减速/////////////////////////////////////

//减速

void fun_LEDSub()

{

      if(n<240)

             n+=10;

}



//加速

void fun_LEDAdd()

{

      if(n>=10)

             n-=10;   

}



//////////////////1灯循环轮流点亮子程序/////////////////////



//循环左移

void fun_LEDTurnA()

{

      LEDT1<<=1;

      if(LEDT1==0)

             LEDT1=1;

}



//循环右移

void fun_LEDTurnB()

{

      LEDT2>>=1;

      if(LEDT2==0)

             LEDT2=0x80;

}



//1灯循环轮流点亮

void fun_LEDTurn()

{

      fun_LEDTurnA();

      fun_LEDTurnB();



      m=++m%16;

      if(m<8)

       P1=~LEDT2;

      else

       P1=~LEDT1;

}



//////////////////两灯循环轮流点亮方式子程序////////////////

void fun_LEDTurn2()

{

      fun_LEDTurnB();

      fun_LEDTurnA();

      P1=~(LEDT1|LEDT2);

}



//////////////////LED从中心向两边逐个点亮子程序/////////////////////

void fun_LEDShine()

{

      m=++m%4;

      P1=LEDShine;

}



//////////////////LED从中心逐步单边点亮子程序/////////////////////

void fun_LEDShineC()

{

      m=++m%14;

      P1=LEDShineC;

}



//////////////////LED模式////////////////////////////

void fun_LEDMode(uchar RcvVal)

{

      switch(RcvVal)

      {

             case 'A':

             case 'a':

                  m=0;

                  n=50;

                  LEDT1=0x01;

                  LEDT2=0x80;

                  LEDVal='a';

                  break;

             case 'B':

             case 'b':

                  n=50;

                  LEDT1=0x01;

                  LEDT2=0x80;

                  LEDVal='b';

                  break;

             case 'C':

             case 'c':

                  m=0;

                  n=50;

                  LEDShine=0xe7;

                  LEDVal='c';

                  break;

             case 'D':

             case 'd':

                m=0;

                  n = 100;

                  LEDShineC=0xef;

                  LEDVal='d';

                  break;

             case '+':

                  fun_LEDAdd();

                  break;

             case '-':

                  fun_LEDSub();

                  break;



             default:

                  LEDVal='a';

      }



}



///////////////////LED选择模式/////////////////////

//*

void fun_LEDSelectMode(uchar mode)

{

      switch (mode)

      {

             case 'a':

               fun_LEDTurn();

                  break;

             case 'b':

                  fun_LEDTurn2();

                  break;

             case 'c':

                  fun_LEDShine();

                  break;

             case 'd':

                  fun_LEDShineC();

                  break;

             default:

               fun_LEDTurn();

      }

      Delay(n);

}

//*/

///////////////////初始化串口//////////////////////

void fun_InitComm()

{   

      TMOD=0x20;    //在11.0592MHz下,设置串行口波特率为9600,方式3

      TH1=0xfd;

      TL1=0xfd;

      SCON=0xd8;

      PCON=0x00;

      ES=1;

      TR1=1;

      EA=1;   

}





/////////////////主程序入口/////////////////////////

void main(void)

{





      P1=0xff;

      P1=0xf0;



      fun_InitComm();



      while(1)

    {            

         fun_LEDSelectMode(LEDVal);

   }

}



/////////////////串行口中断///////////////////////////////////

void fun_Uart() interrupt 4 using 1

{

      uchar RcvVal;



      while(RI==0);

      RI=0;

      RcvVal=SBUF;

      

      SBUF=RcvVal;

      while(TI==0);

      TI=0;



    fun_LEDMode(RcvVal); }

hepday 发表于 2010-1-5 19:29:05

bu cuo`~~~>

yjllong 发表于 2010-1-5 20:10:42

不错啊。。。。。。。

ccdavid 发表于 2010-1-5 21:48:06

不错,不错...

xdpj 发表于 2010-1-9 23:30:13

记号

D.lovers 发表于 2010-1-10 14:10:15

mark

cxjnet 发表于 2010-1-23 14:59:12

这个不错,呵呵,我喜欢

yqldt 发表于 2010-1-24 09:06:24

看不到视频

wuqihuihaoo 发表于 2010-1-26 08:56:36

要好好研究。。。。

sw821025 发表于 2010-1-26 19:53:13

楼主有时间

RScs 发表于 2010-1-27 15:55:48

11

RScs 发表于 2010-1-28 16:26:12

lz是否可以把这个也上传了 LP_COMM V1.22,我在网上找不到了,谢谢

ciky 发表于 2010-1-29 17:17:36

回复【11楼】RScs 小郑
-----------------------------------------------------------------------

LP_COMM V1.22是CIKY朋友写的一个串口调试工具,
目前还不太稳定,
他正在编写最新版,
等他改好了我再贴到这里。。。

RScs 发表于 2010-1-30 01:11:00

回复【12楼】ciky
-----------------------------------------------------------------------

谢谢LZ

cdutcl 发表于 2010-1-30 02:58:14

很好啊,我最近也想学学串口呢

lv998127 发表于 2010-1-30 08:34:16

支持!

ciky 发表于 2010-2-1 18:21:44

CIKY常用串口调试工具,ourdev_531525.rar(文件大小:85K) (原文件名:LP-COMM 串口调试工具 V2.19.rar)

RScs 发表于 2010-4-26 13:59:48

回复【16楼】ciky
-----------------------------------------------------------------------

收到了 谢谢LZ 不知道可否和LZ做朋友了这是我的QQ296954039

fshunj 发表于 2010-8-20 09:08:27

很好

baojian510 发表于 2014-4-17 11:28:26

嗯,不错,MARK一下吧!!!

zjk 发表于 2014-4-17 16:00:34

mark,标记
页: [1]
查看完整版本: 新手发个串口控制LED(含源代码)