玩转单片机,你我都是菜鸟(续3)
时间: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();
}
}
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_off()
{
uchar i ; // i初始化
i = 0; // i初始化
while(i!=255) // 由暗变亮
{
if(LEDflag == 0) // 点亮
{
led = 0x00;
}
if(LEDflag == i) // 熄灭
{
led = 0xff;
}
if(LEDflag == 255) //修改变量
{
i++;
}
}
i = 0; // i初始化
while(i!=255) // 由暗变亮
{
if(LEDflag == 0) // 点亮
{
led = 0xff;
}
if(LEDflag == i) // 熄灭
{
led = 0x00;
}
if(LEDflag == 255) //修改变量
{
i++;
}
}
}
题目要求:8个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直到第一个。如此循环往复。这才是真正的流水灯。
(4)程序:
# include
#define uchar unsigned char
# define led P1 //led接在P1口
# define Ton 40 //基准脉宽0.04ms
uchar LEDflag = 0; //全局变量,最大255,保存T0中断次数
uchar code led_off[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void init();
void led_on_off();
void main()
{
init();
while(1)
{
led_on_off();
}
}
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_off()
{
uchar i = 0,j = 0; // i初始化
for(j = 0;j<8;j++)
{
i = 0; // i初始化
while(i!=255) // 由暗变亮
{
if(LEDflag == 0) // 点亮
{
led = led_off[j];
}
if(LEDflag == i) // 熄灭
{
led = 0xff;
}
if(LEDflag == 255) //修改变量
{
i++;
}
}
}
for(j = 8;j>0;j--)
{
i = 0; // i初始化
while(i!=255) // 由暗变亮
{
if(LEDflag == 0) // 点亮
{
led = 0xff;
}
if(LEDflag == i) // 熄灭
{
led = led_off[j-1];
}
if(LEDflag == 255) //修改变量
{
i++;
}
}
}
}
上面是这几个题目的程序,全部是我自己写的或是参考别人程序写的,全部通过调试都能完成题目要求,只是第二个题目不是很完美,效果不是很明显。我这个人很追求完美,但是第二个题目想了很久也没想到更好的思路,也许是思维受到别人程序的限制了,希望能得到你们的指导,也许你会有不一样的思路。其实流水灯的控制很多,但是只要能掌握其原理,变来变去也就那么几种,控制总在你的掌握之中。无论控制什么,个人看法还是掌握原理,只要原理明白,就完全在你的控制之中,俗话说“万变不离其中”吗!就是这个道理。
下面开始第一个题目:流水灯
硬件前提:用51的P1口控制8个LED,1
单片机初学者几乎都做的一个实验就是流水灯实验,因为大家都做,所以就觉得很简单,很多人对这个实验几乎不屑。其实要彻底的玩转这个实验也是很不简单的事情,不信看看你能不能完成下面的实验题,如果你能拿下它,那么你已经一只脚稳稳地踏入了单片机门槛,并且你一定不想再回头了,此时已经有一部分人对你刮目相看了(包括我),因为就这几个题目算起来我想了有整整一天了,总算有个结果,而且还有一些问题,尤其是第(2)个题目效果很不明显。我把这几个题目的程序贴出来,希望大家给点意见,我们互相交流,互相学习,互相指导。
题目要求:第1,3,5,7个灯半亮,其余的全亮。
(1)程序:
#
#define
#
#
uchar
void
void
void
{
}
void
{
}
void
void
{
if(LEDflag
{
}
{
题目要求:第1个亮1/8,第2个亮2/8,第3个亮3/8,第4个亮4/8,第5个亮5/8,第6个亮 6/8, 第7个亮7/8,第8个全亮。
(2)程序:
#
#define
#
#
uchar
//uchar
void
void
void
{
}
void
{
}
void
void
{
switch
{
case
//为真时语句
break;
case
//为真时语句
break;
case
//为真时语句
break;
case
//为真时语句
break;
case
//为真时语句
break;
case
//为真时语句
break;
case
//为真时语句
break;
case
//为真时语句
break;
default:
//冗余语句
break;
}
}
题目要求:所有的灯逐渐从暗到全亮,再由全亮到暗。
(3)程序:
#
#define
#
#
uchar
void
void
void
{
}
void
{
}
void
void
{
if(LEDflag
if(LEDflag
if(LEDflag
}
i
while(i!=255)
{
if(LEDflag
}
}
题目要求:8个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直到第一个。如此循环往复。这才是真正的流水灯。
(4)程序:
#
#define
#
#
uchar
uchar
void
void
void
{
}
void
{
}
void
void
{
}
}
for(j
}
}
}
单片机流水 相关文章:
- avr单片机流水灯汇编程序及电路图(12-02)
- 单片机左右流水灯与数码管动态显示C程序(12-02)
- 51单片机流水灯左移 右移控制程序(12-02)
- STC单片机流水灯新花样程序(12-01)
- 单片机流水线计数器设计(12-01)
- 单片机流水灯实验程序(11-30)