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

发布者:hfy13567003617最新更新时间:2015-10-22 来源: eefocus关键字:单片机  流水灯 手机看文章 扫描二维码
随时随地手机看文章
好久没有更新博文了,由于晚上回家没有网所以很久没更新了,好不容易写的一篇突然断电没有保存,真够杯具的。电来了又重新写了。不知道最近还有没有人关注我。其实这我都不惦记了,希望群里的朋友迷茫的尽快找到方向,尽快都成为高手。如果你还关注我不知道是因为我的经历还是因为我前一篇的那些题目?前几篇写的一些我的经历可能有些人看了,可能还会有同感,如果愿意可以跟着我的思路走,先完成我上篇博文提到的几个题目。至于我的经历,如果你还感兴趣可以留言,我在后边再说说。。。。。。
下面开始第一个题目:流水灯
硬件前提:用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 using  //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 using  //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();
 
 }
}[page]
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 using  //T0中断函数,中断1,使用工作组3
 {
  LEDflag++;      //修改LEDflag
 }

void led_on_off()
{
  uchar  // i初始化
 0;       // i初始化
 while(i!=255)     // 由暗变亮
 {
if(LEDflag == 0)  // 点亮
 {
   led 0x00;
 }
if(LEDflag == i)  // 熄灭
 {
  led 0xff;
 }
if(LEDflag == 255)    //修改变量
   {
    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 using  //T0中断函数,中断1,使用工作组3
 {
  LEDflag++;      //修改LEDflag
 }

void led_on_off()
{
 uchar 0,j 0;  // i初始化
 for(j 0;j<8;j++)
 {
 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--)
 {
 0;       // i初始化
 while(i!=255)     // 由暗变亮
 {
  if(LEDflag == 0)  // 点亮
  {
   led 0xff;
   }
  if(LEDflag == i)  // 熄灭
   {
   led led_off[j-1];
   }
  if(LEDflag == 255)    //修改变量
  {
    i++;     
     }


}
}


}

     上面是这几个题目的程序,全部是我自己写的或是参考别人程序写的,全部通过调试都能完成题目要求,只是第二个题目不是很完美,效果不是很明显。我这个人很追求完美,但是第二个题目想了很久也没想到更好的思路,也许是思维受到别人程序的限制了,希望能得到你们的指导,也许你会有不一样的思路。其实流水灯的控制很多,但是只要能掌握其原理,变来变去也就那么几种,控制总在你的掌握之中。无论控制什么,个人看法还是掌握原理,只要原理明白,就完全在你的控制之中,俗话说“万变不离其中”吗!就是这个道理。
关键字:单片机  流水灯 引用地址:玩转单片机,你我都是菜鸟(续3)

上一篇:玩转单片机,没有谁是菜鸟
下一篇:单片机各种IO口的类型详细分析

推荐阅读最新更新时间:2024-03-16 14:36

基于单片机实现的无线遥控技术
引言    无线遥控 器由于控制距离远,抗干扰性强,已越来越多的出现在生活的各个方面。本文介绍了一款通用的无线遥控器,采用AT89C5l作为控制核心并采用专用编码解码电路,由于其体积小、价格低廉因此可非常方便的移植到遥控机器人、遥控小车上等,实现远距离控制。   1 工作原理   当无线遥控器的某个按键按下时,由单片机判断是否有按键发生并检测出键值。单片机根据检测到的键值发出相应的码值,无线发射器负责将按键信号以编码的形式在315MHz的频率上发射出去。无线接收器接收并放大发射信号同时解调出TTL电平信号送至单片机进行处理,单片机通过比较和识别接收来的无线遥控编码便可执行相应的遥控功能。   2 设计方案   无线遥
[单片机]
基于<font color='red'>单片机</font>实现的无线遥控技术
瑞萨电子推出16位通用RL78/G23扩充低功耗MCU RL78产品家族
新款RL78/G23针对物联网终端应用进行优化,扩展外设与安全功能,提升功耗性能 2021 年 4 月 13 日,日本东京讯 - 全球半导体解决方案供应商瑞萨电子集团今日宣布,推出16位通用型RL78/G23微控制器(MCU)并开始量产,此举将进一步增强瑞萨面向广泛应用的8位和16位RL78 MCU的竞争力。RL78/G23可兼容瑞萨当前通用RL78 MCU(如RL78/G13),同时改善功耗性能,满足电池供电应用的需求。此外,为应对市场需求,其片上闪存容量增加至768KB,并大幅扩展片上外设功能,从而在增加功能的同时提升安全性并降低物料清单(BOM)成本。凭借以上功能,全新RL78/G23非常适用于需要兼顾功耗和成本的
[单片机]
瑞萨电子推出16位通用RL78/G23扩充低功耗<font color='red'>MCU</font> RL78产品家族
51单片机烧写芯片无法工作的故障分析
故障现象: 做了一个单片机温度监测系统,仿真机上一切正常,烧写芯片无法工作。 相关电路框图: 用51做处理器,外围电路如图,一片双积分转换芯片ICL7135做AD,它的时钟需要125K,用51的ALE经过一片CD4024分频得到。1403提供基准源。另外,一片7660提供7135工作所需要的负压。 为了省电,把所有模拟电路部分电源用一个晶体管管理起来,由P1.0来控制。(上图为示意图,省去了电阻没画)P1.0为地的时候,模拟系统才上电 现在怪现象如下: 仿真机正常运行,烧写芯片后无反应。 仿真正常,说明外围芯片完全正常,电路也没有错误。 经过检查,晶体正常,复位可靠,EA高,程序堆栈都没有溢出,并排除其它一切低级错
[单片机]
51<font color='red'>单片机</font>烧写芯片无法工作的故障分析
51单片机SRF寄存器
1、21个寄存器介绍 51系列单片机内部主要有四大功能模块,分别是I/O口模块、中断模块、定时器模块和串口通信模块(串行I/O口),如其结构和功能如下图: iframe id="iframe_0.2188624832779169" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://www.51hei.com/UploadFiles/2013-12/huqin/psb(108).png?_=5106258%22%20style=%22border:none;max-width:1432px%22%3E%3Cscript%3Ewin
[单片机]
51<font color='red'>单片机</font>SRF寄存器
C52单片机定时器2介绍
定时器2是一个16位定时器/计数器,通过设置特殊功能寄存器T2CON中的C/T2位可将其设置为定时器或是计数器;通过设置T2CON中的工作模式选择位可将定时器2设置为三种工作模式,分别为捕获、自动重新装载(递增或是递减计数)和波特率发生器。 知识点一、定时器2的控制寄存器T2CON(可按位寻址)* D7位--TF2:定时器2溢出标志位。用于请求中断(必须由软件清0) D6位--EXF2:定时器外部标志位。当外部信号使能时,发生外部负跳变时置位请求中断(必须由软件清0) D5位--RCLK:接受时钟标志位。默认情况下串行口中模式1和模式3的时钟是由定时器1的溢出率提供,若该位置位,则由定时器2提供。 D4位--TCLK:发送时钟
[单片机]
飞思卡尔超薄MEMS传感器问世,可简化微处理器和微控制器集成
飞思卡尔半导体公司已经开始推出市场上最薄的具有3轴数字输出的加速计的微机电系统(MEMS)传感器MMA7450L的样品,并将于第3季度量产。该加速器能够简化微处理器和微控制器的集成,目标市场为移动电话和便携式媒体播放器。 该产品为0.8毫米接点栅格阵列(land grid array, LGA),能够与I2C和SPI接口总线通信,无需专用模数转换器,是传感器能够与其它器件的总线一起共享借口。 MMA7450L具有多种运动功能,如游戏控制、点击静音、硬盘自由落体保护等。 飞思卡尔公司传感器与制动器解决方案部门副总裁及总经理Demetre Kondylis表示,该产品的封装尺寸减少了77%,数字输出免除了模数转换器和外部存储器。
[焦点新闻]
基于89S51单片机的微型热敏打印机软件设计
1引言 由于常用的微型针式打印机的速度慢,噪声大,无法满足某些场合的需要。微型热敏打印机具有打印速度快、噪音低、可靠性高、字迹清晰、机头小而轻等优点,可满足各种场合的打印要求,因此得到广泛应用。笔者在汽车行驶记录仪的开发过程中,根据厂家要求,选用较为先进的热敏打印机作为打印设备。但微型热敏打印头对打印时序和温度要求较高,一旦控制不当极易造成打印头烧毁。因此,在有合理的硬件设计的基础上,软件设计也十分重要。本文使用某些软件设计替代了部分硬件电路,使打印机的控制电路得到了简化。 2 打印原理 选用的FTP-628作为热敏打印头。该热敏打印头点结构384点/行,水平方向点密度:8点/mm,垂直方向行间距:8点/mm。有效打印宽度4
[单片机]
基于89S51<font color='red'>单片机</font>的微型热敏打印机软件设计
基于C8051F060单片机和K9F2808UOC存储器实现数据采集系统的设计
从上个世纪九十年代起,电子技术在钻井井下得到应用。但井下钻具的振动会给很多传感器带来不利影响。 特别是对测量井下钻头姿态的惯性导航传感器影响巨大,在随钻振动环境中,如果对信号不作处理,根本就不能测量出正确的井斜角和方位角,也就无法实现井眼轨迹随钻控制的要求。本文介绍应用SoC芯片中的DMA技术对振动的高速采集和存储功能的实现方法,并给出了钻井环境中测试的结果。 1 方法的提出 传统的数据采集方法采用CPU直接控制的方式进行数据采集,数据传送需要经过CPU的中转才能存入存储器,传送速度慢且采集速率受到CPU的限制,极大影响了系统的采样频率,不能满足对振动信号高速采集的要求。而在DMA传送方式下,数据传送不经过CPU,由DMA
[单片机]
基于C8051F060<font color='red'>单片机</font>和K9F2808UOC存储器实现数据采集系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved