51单片机,C语言编程,控制指示灯闪烁的频率

发布者:技术旅人最新更新时间:2018-05-08 来源: eefocus关键字:51单片机  C语言编程  控制指示灯 手机看文章 扫描二维码
随时随地手机看文章

c51单片机,c语言编程,关于指示灯定时闪烁的。
P1.0 P1.1 P1.2 P1.3上面各接有一个指示灯,P2.0接一个外接按键。
要求:
按一下按键P1.0以1Hz的频率闪烁    半周期为500ms
第二次按下按键P1.1以2Hz的频率闪烁    半周期为250ms
第三次按下按键P1.2以3Hz的频率闪烁    半周期为165ms
第四次按下按键P1.3以4Hz的频率闪烁    半周期为125ms
第五次按下按键P1.0以1Hz的频率闪烁    半周期为500ms
如此循环。
单片机外接6MHz晶振,如何写这个程序?
悬赏分:30

本程序有实用价值,在不同的工作状态,以不同的速度闪烁,可表现出不同的紧急程度。
系统的晶振是6MHz,则机器周期是2us;
可以选择基本定时时间5ms,当定时中断100次、50次...即可令指定的输出端取反,即可达到目的。
实验采用PROTEUS软件仿真,在图中增加了一个频率计和一个数码显示器。
仿真实验效果截图如下:

51单片机,C语言编程,控制指示灯闪烁的频率 - 非著名博主 - 电子信息角落

C语言程序如下:

#include
#define uchar unsigned char
#define uint unsigned int
uchar aa = 1, bb = 100, cc = 0;
bit  flash = 0;
sbit KEY0 = P2^0;
sbit LED0 = P1^0;
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit LED3 = P1^3;
//------------------------------------------
void delay(uint z)
{
  uchar x, y;
  for(x = z; x > 0; x--) for(y = 110; y > 0; y--);

//------------------------------------------
uchar Key_in(void)                  //检测按键
{
    if (KEY0 == 0) {
      delay(20);                    //延时
      if (KEY0 == 0) {              //消抖
        while (KEY0 == 0);          //等待释放
        return 1;                   //有键按下:1
    } }
    return 0;                       //返回0

//------------------------------------------
void main()

    TMOD = 0x01;
    TH0 = (65536 - 2500) / 256;     //5ms@6MHz
    TL0 = (65536 - 2500) % 256;     //2.5ms@12MHz
    while (!Key_in());              //等待按键后,再启动
    TR0 = 1;
    ET0 = 1;
    EA = 1;
    P0 = aa;
    while(1)  {
      if (Key_in()) {
        aa++;               
        if (aa == 5) aa = 1;        //按键次数1234
        P0 = aa;                    //显示按键次数
        cc = 0;
        switch (aa) {
          case  1:  bb = 100; break;//设置中断次数值
          case  2:  bb = 50; break;
          case  3:  bb = 33; break;
          case  4:  bb = 25;
        }
        P3 = bb;                    //显示当前值
}   } }  
//------------------------------------------
void time0() interrupt 1
{
    TH0 = (65536 - 2500) / 256;     //5ms@6MHz
    TL0 = (65536 - 2500) % 256;     //2.5ms@12MHz
    cc++;
    if(cc == bb)  {                 //如果达到了预定次数
      cc = 0;
      flash = ~flash;
      P1 = 255;                     //关闭显示
      switch (aa) {                 //选择当前输出端
        case  1:  LED0 = flash; break;
        case  2:  LED1 = flash; break;
        case  3:  LED2 = flash; break;
        case  4:  LED3 = flash;
}   } }
//-------------------------------------------


关键字:51单片机  C语言编程  控制指示灯 引用地址:51单片机,C语言编程,控制指示灯闪烁的频率

上一篇:利用74HC595在串行口扩充8位的并行输出接口
下一篇:用51单片机做信号发生器,同时输出四种频率的方波

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

浅析51单片机学习过程中的四大误区
51单片机的辉煌过去 51单片机指MCS-51系列单片机,CICS指令集。由Intel公司开发,其结构增加了如乘(MUL)、除(DIV)、减(SUBB)、比较(CMP)、16位数据指针、布尔代数运算等指令,以及串行通信能力和5个中断源,内有128个RAM单元及4K的ROM。其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。目前国内的51单片机市场主要为国产宏晶的产品STC系列其号称低功耗,稳定与廉价的特点。 学习51单片机的误区 误区1:51单片机是学习的基础 “51单片机是学习的基础”这句话本身并没有错。在我读本科的时候,当时它无疑是学习的基础——毕竟那时没有更高级的单片机可以供使用,
[单片机]
8051单片机指令系统剖析详解
MCS- 51系列单片机的指令系统是一种简明高效的指令系统,其基本指令共有111条,其中单字节指令49条,双字节指令4'5条,三字节指令17条。如果按功能可以讲这些指令分为五类:数据传送类(29条)、算术操作类(24条)、逻辑操作类(24条)、控制转移类(17条)以及位变量操作类(17条)。对于反向设计而言,我们关心的不是它的各种具体指令的多少而是指令的寻址方式。所谓的寻址方式就是寻找确定参与操作的数的真正地址。MCS-51系列单片机的111条指令一共只采用了5种寻址方式。5种寻址方式以及它们的寻址空间如表1所示。 1.寄存器寻址 寄存器寻址方式可用于访问选定寄存器区的8个工作寄存器RO-R7。由指令操作码的低三位指示所用
[单片机]
80<font color='red'>51单片机</font>指令系统剖析详解
8051单片机实战分析(以STC89C52RC为例) | 06 - 动态数码管驱动
1 动态扫描 那什么是动态扫描呢? 举个例子:有 2 个数码管,我们要显示“12”这个数字,可以先让高位的位选三极管导通,然后控制段选让其显示“1”,延时一定时间后再让低位的位选三极管导通,然后控制段选让其显示“2”。把这个流程以一定的速度循环运行就可以让数码管显示出“12”,由于交替速度非常快,人眼识别到的就是“12”这两位数字同时亮了。 在多个数码管显示数字的时候,我们可以轮流点亮数码管(一个时刻内只有一个数码管是亮的),利用人眼的视觉暂留现象(也叫余辉效应),就可以做到看起来是所有数码管都同时亮了,这就是动态显示,也叫做动态扫描。 那么一个数码管需要点亮多长时间呢?也就是说要多长时间完成一次全部数码管的扫描呢(很
[单片机]
80<font color='red'>51单片机</font>实战分析(以STC89C52RC为例) | 06 - 动态数码管驱动
51单片机」红外接收、发射模块代码
一、简介 红外发射模块:电源3.3V或5V,通过发射管发射38KHz的红外信号,高电平驱动 红外接收模块:电源3.3V或5V,可接收红外信号,并解调成逻辑电平,低电平有效 二、电路图 红外发射电路图 红外接收电路图 三、红外发射模块代码 #include reg51.h #include intrins.h #define uchar unsigned char #define uint unsigned int //管脚定义 sbit key = P2^0; sbit out = P2^1; //函数声明 void delay
[单片机]
「<font color='red'>51单片机</font>」红外接收、发射模块代码
基于51单片机的光驱激光雕刻机源程序电路图+上位机
根据他人DIY 激光雕刻机 手绘原理图 画得不好勿怪,实验操中 电路原理图如下: 单片机源程序如下: /*z地址定义 50 1=x+,2=x-,3=y+,4=y- 51 前进后退步数高 52 前进后退步数低 53 54/55 字宽 56 57 弱光开关 58/59 激光强度 60 x轴速度 61 y轴速度 62 开始打印0,57 63 暂停 64 停止标志 65 66 左右标记 100开始时灰度图数据 */ #include reg52.h #define uint unsigned int #define uchar unsigned char #define N z //X速度 #define
[单片机]
基于<font color='red'>51单片机</font>的光驱激光雕刻机源程序电路图+上位机
基于51单片机的8个LED流水灯的设计
本设计旨在实现8个LED流水灯的设计。 原理图: 参考代码: #include reg52.h #include intrins.h #define uint unsigned int uint temp; void Delay500ms() //延时0.5秒函数 //@11.0592MHz { unsigned char i, j, k; _nop_(); i = 4; j = 129; k = 119; do { do { while (--k); } while (--j); } while (--i); } void main() { P1=0xfe;
[单片机]
基于<font color='red'>51单片机</font>的8个LED流水灯的设计
51单片机定时器的应用以及计数初值的计算
#include reg51.h #define uchar unsigned char #define uint unsigned int sbit LED=P0^0; uchar t_count=0; int main(void) { TMOD=0x00; TH0=(8192-5000)/32; TL0=(8192-5000)%32; IE=0x82; TR0=1; while(1); } void LED_FLASH() interrupt 1 { TH0=(8192-5000)/32; TL0=(8192-5000)%32; if(++t_count==100) { LED=~
[单片机]
基于AT89C2051单片机的大气温度采集和记录系统
1 引 言 大气温度的测量具有重要意义, 一般是采用各种温度计进行人工测量, 并定时记录测量结果, 这种方法费时费工, 十分不便。本文提出了一种非常小巧的大气温度测量和记录装置, 能对范围为- 55 ℃ ~ + 125 ℃ 的温度进行定时自动测量, 同时记录测量结果, 精度最高可达0. 0625℃ 。 2 系统原理 系统结构如图1所示。系统主要由AT89C2051单片机和外围电路构成。其基本思想是由串行时钟芯片DS1306 提供时间基准, 由温度传感器DS18B20进行温度测量, 温度数据存储在DS2433中。AT89C2051单片机负责整个系统的协调控制。 AT89C2051是一款低电压, 高性能的CMOS 8位单片机, 片内含2
[单片机]
基于AT89C20<font color='red'>51单片机</font>的大气温度采集和记录系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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