新闻中心

EEPW首页>嵌入式系统>设计应用> 玩转单片机,你我都是菜鸟(续3)

玩转单片机,你我都是菜鸟(续3)

作者: 时间:2016-11-25 来源:网络 收藏
好久没有更新博文了,由于晚上回家没有网所以很久没更新了,好不容易写的一篇突然断电没有保存,真够杯具的。电来了又重新写了。不知道最近还有没有人关注我。其实这我都不惦记了,希望群里的朋友迷茫的尽快找到方向,尽快都成为高手。如果你还关注我不知道是因为我的经历还是因为我前一篇的那些题目?前几篇写的一些我的经历可能有些人看了,可能还会有同感,如果愿意可以跟着我的思路走,先完成我上篇博文提到的几个题目。至于我的经历,如果你还感兴趣可以留言,我在后边再说说。。。。。。
下面开始第一个题目:流水灯
硬件前提:用51的P1口控制8个LED,1点亮,0熄灭。
(1)第1,3,5,7个灯半亮,其余的全亮。
(2)第1个亮1/8,第2个亮2/8,第3个亮3/8,第4个亮4/8,第5个亮5/8,第6个亮6/8, 第7个亮7/8,第8个全亮。
(3)所有的灯逐渐从暗到全亮,再由全亮到暗。
(4)8个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直 到 第一个。如此循环往复。这才是真正的流水灯。


单片机初学者几乎都做的一个实验就是流水灯实验,因为大家都做,所以就觉得很简单,很多人对这个实验几乎不屑。其实要彻底的玩转这个实验也是很不简单的事情,不信看看你能不能完成下面的实验题,如果你能拿下它,那么你已经一只脚稳稳地踏入了单片机门槛,并且你一定不想再回头了,此时已经有一部分人对你刮目相看了(包括我),因为就这几个题目算起来我想了有整整一天了,总算有个结果,而且还有一些问题,尤其是第(2)个题目效果很不明显。我把这几个题目的程序贴出来,希望大家给点意见,我们互相交流,互相学习,互相指导。
题目要求:第1,3,5,7个灯半亮,其余的全亮。
(1)程序:
#include
#define uchar unsigned char
# define led P1 //led接在P1口
# define Ton 40 //基准脉宽0.04ms
uchar LEDflag = 0; //全局变量,最大255,保存T0中断次数

void init();
void led_on();
void main()
{
init();
while(1)
{

led_on();

}
}
void init() //定时器初始化
{
TMOD = 0x02; //T0 方式2,8位自动载入
TH0 = 256 - Ton; //T0初始值
TL0 = 256 - Ton; //重载值
TR0 = 1; //启动T0
ET0 = 1; //开T0,T1中断
EA = 1; //全局中断允许
}

void time0_int() interrupt 1 using 3 //T0中断函数,中断1,使用工作组3
{
LEDflag++; //修改LEDflag
}

void led_on()
{

if(LEDflag == 0) // 点亮8个灯
{
led = 0x00;
}
if(LEDflag == 12) // 熄灭1,3,5,7灯
{
led = 0x55;
}
}
题目要求:第1个亮1/8,第2个亮2/8,第3个亮3/8,第4个亮4/8,第5个亮5/8,第6个亮 6/8, 第7个亮7/8,第8个全亮。
(2)程序:
# include
#define uchar unsigned char
# define led P1 //led接在P1口
# define Ton 40 //基准脉宽0.04ms
uchar i,LEDflag = 0; //全局变量,最大255,保存T0中断次数
//uchar code led_off[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
void init();
void led_on();
void main()
{
init();
while(1)
{

led_on();

}
}
void init() //定时器初始化
{
TMOD = 0x02; //T0 方式2,8位自动载入
TH0 = 256 - Ton; //T0初始值
TL0 = 256 - Ton; //重载值
TR0 = 1; //启动T0
ET0 = 1; //开T0,T1中断
EA = 1; //全局中断允许
}

void time0_int() interrupt 1 using 3 //T0中断函数,中断1,使用工作组3
{
LEDflag++; //修改LEDflag
}

void led_on()
{
switch (LEDflag)
{
case 32: led=0x00;
//为真时语句
break;
case 64: led=0x01;
//为真时语句
break;
case 96: led=0x03;
//为真时语句
break;
case 128: led=0x07;
//为真时语句
break;
case 160: led=0x0f;
//为真时语句
break;
case 192: led=0x1f;
//为真时语句
break;
case 224: led=0x3f;
//为真时语句
break;
case 255: led=0x7f;
//为真时语句
break;
default:
//冗余语句
break;
}

}
题目要求:所有的灯逐渐从暗到全亮,再由全亮到暗。
(3)程序:
# include
#define uchar unsigned char
# define led P1 //led接在P1口
# define Ton 40 //基准脉宽0.04ms
uchar LEDflag = 0; //全局变量,最大255,保存T0中断次数
void init();
void led_on_off();
void main()
{
init();
while(1)
{

led_on_off();

}
}

上一页 1 2 下一页

关键词:单片机流水

评论


技术专区

关闭