新手发个串口控制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); } bu cuo`~~~> 不错啊。。。。。。。 不错,不错... 记号 mark 这个不错,呵呵,我喜欢 看不到视频 要好好研究。。。。 楼主有时间 11 lz是否可以把这个也上传了 LP_COMM V1.22,我在网上找不到了,谢谢 回复【11楼】RScs 小郑
-----------------------------------------------------------------------
LP_COMM V1.22是CIKY朋友写的一个串口调试工具,
目前还不太稳定,
他正在编写最新版,
等他改好了我再贴到这里。。。 回复【12楼】ciky
-----------------------------------------------------------------------
谢谢LZ 很好啊,我最近也想学学串口呢 支持! CIKY常用串口调试工具,ourdev_531525.rar(文件大小:85K) (原文件名:LP-COMM 串口调试工具 V2.19.rar) 回复【16楼】ciky
-----------------------------------------------------------------------
收到了 谢谢LZ 不知道可否和LZ做朋友了这是我的QQ296954039 很好 嗯,不错,MARK一下吧!!! mark,标记
页:
[1]