搜索
bottom↓
回复: 20

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

[复制链接]

出0入0汤圆

发表于 2010-1-5 14:02:49 | 显示全部楼层 |阅读模式
之前做了个用按键控制简单灯效实验,这几天恶补了串口,中断知识,将按键模式改用串口实现,实验效果视频点击查看:
串口控制闪灯实验效果视频


硬件:

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[4] = {0xe7,0xc3,0x81,0x00};

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



uchar LEDShineC[14] = {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[m];

}



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

void fun_LEDShineC()

{

      m=++m%14;

      P1=LEDShineC[m];

}



//////////////////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[0]=0xe7;

                    LEDVal='c';

                    break;

             case 'D':

             case 'd':

                m=0;

                    n = 100;

                    LEDShineC[0]=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); }

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-1-5 19:29:05 | 显示全部楼层
bu cuo  `~~~>

出0入0汤圆

发表于 2010-1-5 20:10:42 | 显示全部楼层
不错啊。。。。。。。

出0入0汤圆

发表于 2010-1-5 21:48:06 | 显示全部楼层
不错,不错...

出0入0汤圆

发表于 2010-1-9 23:30:13 | 显示全部楼层
记号

出0入4汤圆

发表于 2010-1-10 14:10:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-23 14:59:12 | 显示全部楼层
这个不错,呵呵,我喜欢

出0入0汤圆

发表于 2010-1-24 09:06:24 | 显示全部楼层
看不到视频

出0入0汤圆

发表于 2010-1-26 08:56:36 | 显示全部楼层
要好好研究。。。。

出0入0汤圆

发表于 2010-1-26 19:53:13 | 显示全部楼层
楼主有时间

出0入0汤圆

发表于 2010-1-27 15:55:48 | 显示全部楼层
11

出0入0汤圆

发表于 2010-1-28 16:26:12 | 显示全部楼层
lz是否可以把这个也上传了 LP_COMM V1.22,我在网上找不到了,谢谢

出0入0汤圆

 楼主| 发表于 2010-1-29 17:17:36 | 显示全部楼层
回复【11楼】RScs 小郑
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2010-1-30 01:11:00 | 显示全部楼层
回复【12楼】ciky
-----------------------------------------------------------------------

谢谢LZ

出0入0汤圆

发表于 2010-1-30 02:58:14 | 显示全部楼层
很好啊,我最近也想学学串口呢

出0入0汤圆

发表于 2010-1-30 08:34:16 | 显示全部楼层
支持!

出0入0汤圆

 楼主| 发表于 2010-2-1 18:21:44 | 显示全部楼层
CIKY常用串口调试工具,ourdev_531525.rar(文件大小:85K) (原文件名:LP-COMM 串口调试工具 V2.19.rar)

出0入0汤圆

发表于 2010-4-26 13:59:48 | 显示全部楼层
回复【16楼】ciky
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2010-8-20 09:08:27 | 显示全部楼层
很好

出0入0汤圆

发表于 2014-4-17 11:28:26 | 显示全部楼层
嗯,不错,MARK一下吧!!!

出0入0汤圆

发表于 2014-4-17 16:00:34 | 显示全部楼层
mark,标记
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 12:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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