精华内容
下载资源
问答
  • 基于51单片机电子时钟
  • keil做的51单片机时钟代码,有万年历,秒表功能,按键控制
  • 51单片机时钟程序

    2014-08-08 10:49:15
    51单片机自制时钟程序,51入门学习开发不可多得的程序
  • 51单片机驱动DS1302时钟芯片keil工程文件C源文件,DS1302实时时钟数码管显示,时间和日期切换显示
  • 51单片机1602LCD时钟实验keil工程文件C源文件,//按K1按键进入设定状态 //按K2,依次进入闹钟功能是否启用,闹钟时,分秒,年,月,日及时间时,分,秒的设置,直到退出设置状态 //按K3,调整是否起用闹钟和调节闹钟时,分,秒,...
  • 51单片机 时钟程序

    2013-11-27 19:12:09
    可以通过51单片机 利用数码管显示时钟 利用了switch 选择段 利用 for选择位 通过定时器0定时准确的时间
  • 标准的时钟文件单片机用1602直接实现 其实就是一个单片机学习班上装一个液晶然后 下载程序就行了
  • 单片机数字时钟程序

    2014-04-19 20:43:51
    单片机数字时钟程序,用Keil编写的程序。已经经过了软件和硬件的调试。
  • 在51单片机上实现数码管时钟程序程序的开发环境是keil软件。
  • 单片机电子时钟完整版(基于at89c51电子时钟论文,keil程序编写,professional仿真,pcb原理图) 目录 摘要 1 第一章 系统设计要求 2 1.1 基本功能 2 1.2 扩展功能 2 第二章 硬件总体设计方案 3 2.1系统功能实现总体...
  • 51单片机定时做普通可调时钟keil工程文件C源文件,定时器时钟数码管显示,时间和日期切换显示,按下按键调整时间
  • 单片机电子时钟完整版(基于at89c51电子时钟论文,keil程序编写,professional仿真,pcb原理图) 目录 摘要 1 第一章 系统设计要求 2 1.1 基本功能 2 1.2 扩展功能 2 第二章 硬件总体设计方案 3 2.1系统功能...
  • 51单片机驱动DS1302设计可调时钟keil工程文件C源文件,DS1302实时时钟数码管显示,只显示时间,并通过4个按键加减小时,分钟,
  • 本人华师三年级本科生,此为本人学习51单片机时编写的时钟程序,用的型号是12c5a40s2 设置的年月日,星期,时分秒,并可预置,用1602液晶显示,对初学者来说应该比较有参考价值。
  • 基于单片机的电子时钟设计,要求: (1)实时显示当前时间; (2)能够对时间进行设置; (3)包括年月日,小时,分钟,秒. (4)整点提醒功能. 经过一周的时间已实现上述功能,故在此分享一下; 所选用器材 ...

       本学期单片机课程要求做课程设计,我选取的课题如下:
    基于单片机的电子时钟设计,要求:
    (1)实时显示当前时间;
    (2)能够对时间进行设置;
    (3)包括年月日,小时,分钟,秒.
    (4)整点提醒功能.
    经过一周的时间已实现上述功能,故在此分享一下;

    所选用器材
    单片机最小系统(这就不用细说了吧,这里我选用AT89C51),排阻,四个按钮开关,8位共阴数码管,蜂鸣器;

    protues仿真电路原理图
    在这里插入图片描述
    注:P1^1引脚接的是蜂鸣器,但是因为单片机的引脚输出太低,不能驱动蜂鸣器,所以需通过三极管放大电流从而驱动蜂鸣器正常工作,当引脚输出为低电平时分蜂鸣器响,同时对元件参数做些设置——蜂鸣器工作电压设置为2V即可,三极管前电阻阻值通常设置为1K即可

    接下来直接放代码,注释写的也很清楚了,就不描述了

    #include<reg51.h>
    #define uChar unsigned char
    #define uInt unsigned int
    uChar a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; 
    uChar b[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; 
    uChar second=50,minute=59,hour=12,year=18,month=07,day=21,count;
    sbit Key1 = P3^0; //计时停止
    sbit Key2 = P3^1; //调位
    sbit Key3 = P3^2; //加一 
    sbit Key4 = P3^3; //切换  
    sbit Buzzer=P1^1;
    /*********************延迟函数********************/
    void Delay(uInt t)
    {
    while(t)
    {
    t--;
    }
    }
    /*********************时分秒显示函数*******************/ 
    void Dispaly1(uChar second,uChar minute,uChar hour)
    {
    /*********************第一位数码管*********************/
    P2=b[0];
    P0=a[hour/10];
    Delay(10);
    /*********************第二位数码管*********************/
    P2=b[1];
    P0=a[hour%10];
    Delay(10);
    /*********************第三位数码管*********************/
    P2=b[2]; 
    P0=0x40; 
    Delay(10);
    /*********************第四位数码管*********************/
    P2=b[3]; 
    P0=a[minute/10]; 
    Delay(10);
    /*********************第五位数码管*********************/
    P2=b[4];
    P0=a[minute%10]; 
    Delay(10);
    /*********************第六位数码管*********************/
    P2=b[5]; 
    P0=0x40; 
    Delay(10);
    /*********************第七位数码管*********************/
    P2=b[6]; 
    P0=a[second/10]; 
    Delay(10);
    /*********************第八位数码管*********************/
    P2=b[7];; 
    P0=a[second%10]; 
    Delay(10);
    }
    /*********************年月日显示函数********************/
    void Dispaly2(uChar day,uChar month,uChar year)
    {
    P2=b[0];
    P0=a[day/10];
    Delay(10);
    
    P2=b[1];
    P0=a[day%10];
    Delay(10);
    
    P2=b[2]; 
    P0=0x40; 
    Delay(10);
    
    P2=b[3]; 
    P0=a[month/10]; 
    Delay(10);
    
    P2=b[4]; 
    P0=a[month%10]; 
    Delay(10);
    
    P2=b[5]; 
    P0=0x40; 
    Delay(10);
    
    P2=b[6]; 
    P0=a[year/10]; 
    Delay(10);
    
    P2=b[7]; 
    P0=a[year%10]; 
    Delay(10);
    }
    /*********************时钟按键扫描函数*********************/
    void Keyscan1()
    {
    static uChar i=0,j=0; 
    if(Key1==0) 
    {
    Delay(10); //消抖 
    if(Key1==0) 
    while(!Key1); //等待按键弹
    i++;
    }
    /*时钟暂停功能*/
    if(i%2==1) 
    {
    TR0=0;/*如果是奇数次按键自然关闭定时器0*/
    }
    if(i%2==0)
    {
    TR0=1;/*如果是偶数次按键则打开定时器0*/ 
    }
    /*时钟调位和数值加一功能*/
    if(Key2==0) 
    {
    Delay(10); 
    if(Key2==0)
    while(!Key2);
    j++; 
    }
    if(j%4==1)
    {
    if(Key3==0)
    {
    Delay(10); 
    if(Key3==0)
    while(!Key3);
    second++;
    if(second==60)
    second=0;
    }
    }
    if(j%4==2)
    {
    if(Key3==0)
    {
    Delay(10); 
    if(Key3==0)
    while(!Key3);
    minute++;
    if(minute==60)
    minute=0; 
    }
    }
    if(j%4==3)
    {
    if(Key3==0)
    { 
    Delay(10); 
    if(Key3==0)
    while(!Key3);
    hour++;
    if(hour==24)
    hour=0; 
    }
    }
    }
    /*日期按键扫描函数*/
    void Keyscan2()
    {
    static uChar m=0,n=0; 
    if(Key1==0) 
    {
    Delay(10); 
    if(Key1==0)
    while(!Key3);
    m++;
    }
    if(m%2==1) 
    {
    TR0=0;/*奇数次按键则关闭定时器0*/
    }
    
    if(m%2==0)
    {
    TR0=1;/*偶数次按键则打开定时器0*/ 
    }
    if(Key2==0) 
    {
    Delay(10); 
    if(Key2==0)
    while(!Key2);
    n++; 
    }
    /*日期调位和日期加一功能*/
    if(n%4==1)
    {
    if(Key3==0)
    {
    Delay(10); 
    if(Key3==0)
    while(!Key3);
    day++;
    if(day==30)
    day=0;
    }
    }
    if(n%4==2)
    {
    if(Key3==0)
    { 
    Delay(10); 
    if(Key3==0)
    while(!Key3);
    month++;
    if(month==12)
    month=0; 
    }
    }
    if(n%4==3)
    {
    if(Key3==0)
    { 
    Delay(10); 
    if(Key3==0)
    while(!Key3);
    year++;
    if(year==99)
    year=0; 
    }
    }
    }
    
    /************************************************/
    /***************主函数***************************/
    /************************************************/
    void main()
    {						
    TMOD=0x01; 	 /*定时器以方式一工作*/
    TH0=(65536-10000)/256;
    TL0=(65536-10000)%256;/*10ms计时*/
    EA=1;
    ET0=1;/*允许定时器0中断*/
    TR0=1;/*打开定时器0*/
    while(1)
    {
    static uChar h=0;
    /*时钟和日期切换功能*/ 
    if(Key4==0) 
    {
    Delay(10); 
    if(Key4==0)
    while(!Key4);
    h++;
    }
    if(h%2==0)/*如果按键偶数次则显示时钟*/
    {
    Dispaly1(second,minute,hour);
    Keyscan1(); 
    }
    
    if(h%2==1)/*如果按键奇数次则显示日期*/ 
    {
    Dispaly2(year,month,day);
    Keyscan2();
    }
    }
    }
    /**********************中断函数**************************/
    void time0_int(void) interrupt 1
    {
    TH0=(65536-10000)/256;
    TL0=(65536-10000)%256;
    count++;
    if(count==100)/*10ms??ê±£???100′??ò??o?1s*/
    {
    count=0;
    second++;
    if(second==60)
    {
    second=0;
    minute++;
    if(minute==60)
    {
    minute=0;
    hour++;
    if(hour==24)
    {
    hour=0;
    day++;
    if(day==30)
    {
    day=0;
    month++;
    if(month==12)
    {
    month=0;
    year++;
    if(year==99)
    {
    year=0;
    }
    }
    }
    }
    }
    }
    }
    /*判断整点提醒*/
    if(second==00&&minute==00)								   
    Buzzer=0;
    else
    Buzzer=1;
    }
    

    最后实现的效果
    时间显示:
    在这里插入图片描述
    日期显示:
    在这里插入图片描述
    具体功能通过4个按钮实现

    注意!

    实际仿真中数码管显示可能会不稳定,具体原因已排除代码问题,通过实验把蜂鸣器换成发光二极管后显示正常,但是换为蜂鸣器后显示就会不稳定;所以猜测可能是仿真电路的问题或者软件bug,上实物后应该不会出现这种情况

    展开全文
  • 已经生成的hex文件,可以驱动proteus仿真的时钟,基于51单片机的设计
  • 51单片机时钟项目

    2015-08-23 16:01:54
    利用51单片机keil平台开发时钟,具有显示年日月时间和闹钟等功能
  • 本文是用于个人学习记录,如有...(已51单片机为例) 2.打开仿真 先看一下此刻sec所对应的的数字记录下 然后点击要你要运行的语句(在词条语句的数字行点击,点击完成红色) 点击运行按钮 运行后的...

    本文是用于个人学习记录,如有出错请多多指教!

    一、keil仿真语句运行时间运算

    1.在keil下仿真,我们打开工程设置对话框,在target 的标签下,Xtal(MHZ),改为11.0592;(已51单片机为例)

     2.打开仿真

    先看一下此刻sec所对应的的数字记录下

     然后点击要你要运行的语句(在词条语句的数字行点击,点击完成红色)

     

    点击运行按钮

    运行后的观看sec变化

    即运行一条语句所花费的时间等于 423.18-422.09=1.09us

    而这个时间正好是51单片机在11.0592Mhz晶振频率下,一个机器周期(重要)所花费的时间。

    二、单片机周期

    (1)时钟周期。也称震荡周期,定义为时钟频率的倒数(时钟周期就是单片机外接晶振的倒数,如12MHZ的晶振,它的时钟周期就是1/12us),它是单片机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。显然,对同一种单片机来说,时钟频率越高,单片机的工作速度越快。但是,不同单片机的内部硬件结构电路不想听,所需要的时钟频率范围也不一定相同。

    (2)状态周期。它是时钟周期的两倍。

    (3)机器周期。单片机的基本操作周期,在一个操作周期内,单片机完成一项基本操作,如取指令、读写等。

    (4)指令周期。它是CPU执行一条指令所需要的时间。一般一个指令周期包含1~4个机器周期。

     

     

    展开全文
  • 下来就能直接用!有源程序,电路图以及编译文件!
  • 51单片机驱动DS1302时钟1602液晶显示keil工程文件C源文件,通过液晶1602显示DS1302的时间
  • 51单片机时钟设计.rar

    2020-04-16 08:39:43
    51单片机时钟万年历、lcd1602显示,ds1302时钟模块,可按键设置时间,可设置闹钟,keil工程加proteus,protel dxp 2004原理图,PCB图纸,本人精心设计,已做好实物,实测好用。
  • MKL26Z128VFT4单片机KEIL工程创建验证 最近在用一款恩智浦core-m0核的单片机,由于供应商提供的开发sdk不适用,所以决定自己研究单片机底层创建基于MKL26Z128VFT4单片机KEIL工程实现底层驱动的开发,在NXP官网...

    MKL26Z128VFT4单片机KEIL工程创建验证

    最近在用一款恩智浦core-m0核的单片机,由于供应商提供的开发sdk不适用,所以决定自己研究单片机底层创建基于MKL26Z128VFT4单片机的KEIL工程实现底层驱动的开发,在NXP官网下载SKD及keil工程配置工程中遇到的一些问题和解决方案进行记录。

     

    1、SDK创建下载

    (1)选择芯片适用的SDK模板,进行下载,下载地址:https://mcuxpresso.nxp.com/en/select

    (2)创建好SDK后就可以进行下载,下载前进行如下图选择自己适用的配置,我选择的是keil版SDK.

    (3)下载SDK及描述SDK的支持文档

    下载完成就可以进行SDK的探索了。

    2、SDK简介

    (1)SDK内容简述

    在SDK_2.4.1_MKL26Z128xxx4_doc\docs文件夹下,有SKD使用的介绍文档和API使用示例文档,可以简单了解一下,后面实际用到时再去详细看,这里注意了,SDK默认是MKL46Z的demo版,所以SDK里面也包含了MKL46Z的工程资料,在配置自己的工程时需要特别注意。

    (2)keil工程位置

    解压下载的SDK压缩包,在SDK解压后的路径SDK_2.4.1_MKL26Z128xxx4\boards\frdmkl46z\下,我们能找到SDK已经有的例程工程

    我们可以选取最简单的demo_apps里面的hello_world例程工程进行配置,验证在自己的MKL26板子上运行编译好的程序。但是在能运行之前,这个过程还是比较辛苦的,因为有比较多的问题会出现,因为工程默认是为MKL46Z芯片制定的,所以需要将工程进行一些搬移配置,下面我们就来配置我们需要的MKL26Z芯片适用的keil工程。

    3、基础工程搭建验证

    (1)hello_word工程基础配置

    用Keil5.21打开工程,keil工程缺乏ARM keil对于MKL26Z系列单片机的器件支持包,所以需要在keil官网去下载专门的器件支持包,下载地址:http://www.keil.com/dd2/nxp/mkl26z128xxx4/

    下载安装后,再重新打开hello_world的keil工程就会有可选器件包:

    打开工程后,查看工程的结构和文件,你会发现,其是MKL46Z的工程模板,所以需要对其进行重新添加配置。

    配置过程如下:

    步骤1:更换工程中MKL46Z文件(启动文件(startup)和驱动文件(driver)和通用文件(utilities))成MKL26Z适用的

    MKL26Z芯片适用的源文件及启文件在SDK_2.4.1_MKL26Z128xxx4\devices\MKL26Z4路径下,把上述的三个文件夹内的相应文件替换掉,点击ok,再进行下一步操作。

    步骤2:配置工程options target

    上图中步骤3位置需改成图中样子,那个是个芯片型号宏定义,图中步骤4需要将之前我们替换文件时的文件路径重新包含一下:

    这样还没完,比较重要的一步,需要照下图提示进行配置,不然程序运行系统初始化时直接进入HardFault_Handler,我遇到这个问题的时候找了一下,收到这篇博文启发,感兴趣的可以参考一下:https://blog.csdn.net/u013184273/article/details/83860802

    正确配置如下:

    配置正确后,配置OutPut项勾选生产HEX文件,下载到板子上,单步调试可以看到程序能正常运行到main函数里面了。

    中间省略了一下比较简单的配置,像j-link调试器配置,和生产hex的配置,这里不再赘述。

     

    (2)工程源码更改,实现LED灯闪烁

    参照SDK_2.4.1_MKL26Z128xxx4\boards\frdmkl46z\demo_apps\led_blinky\mdk路径下的led闪烁工程的main函数,拷贝到上面配置好的工程的main函数中,如下是main.c的内容

    /*
     * The Clear BSD License
     * Copyright (c) 2013 - 2015, Freescale Semiconductor, Inc.
     * Copyright 2016-2017 NXP
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without modification,
     * are permitted (subject to the limitations in the disclaimer below) provided
     *  that the following conditions are met:
     *
     * o Redistributions of source code must retain the above copyright notice, this list
     *   of conditions and the following disclaimer.
     *
     * o Redistributions in binary form must reproduce the above copyright notice, this
     *   list of conditions and the following disclaimer in the documentation and/or
     *   other materials provided with the distribution.
     *
     * o Neither the name of the copyright holder nor the names of its
     *   contributors may be used to endorse or promote products derived from this
     *   software without specific prior written permission.
     *
     * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE.
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
     * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
     * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
     * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     */
    
    #include "fsl_device_registers.h"
    #include "fsl_debug_console.h"
    #include "fsl_uart.h"
    #include "board.h"
    
    #include "pin_mux.h"
    /*******************************************************************************
     * Definitions
     ******************************************************************************/
    #define BOARD_LED_GPIO BOARD_LED_RED_GPIO
    #define BOARD_LED_GPIO_PIN BOARD_LED_RED_GPIO_PIN
    
    /*******************************************************************************
     * Prototypes
     ******************************************************************************/
    volatile uint32_t g_systickCounter;
    
    /*******************************************************************************
     * Code
     ******************************************************************************/
    void SysTick_Handler(void)
    {
        if (g_systickCounter != 0U)
        { 
            g_systickCounter--;
        }
    }
    
    void SysTick_DelayTicks(uint32_t n)
    {
        g_systickCounter = n;
        while(g_systickCounter != 0U)
        {
        }
    }
    
    
    /*!
     * @brief Main function
     */
    int main(void)
    {
        /* Define the init structure for the output LED pin*/
        gpio_pin_config_t led_config = {
            kGPIO_DigitalOutput, 0,
        };
    
        /* Board pin init */
        BOARD_InitPins();
    
        /* Init output LED GPIO. */
        GPIO_PinInit(BOARD_LED_GPIO, BOARD_LED_GPIO_PIN, &led_config);
    
        /* Set systick reload value to generate 1ms interrupt */
        if(SysTick_Config(SystemCoreClock / 1000U))
        {
            while(1)
            {
            }
        }
    
        while (1)
        {
            /* Delay 1000 ms */
            SysTick_DelayTicks(1000U);
            GPIO_PortToggle(BOARD_LED_GPIO, 1u << BOARD_LED_GPIO_PIN);
        }	
    	
    }

    在如下两个宏修改自己用来控制led的GPIO

    #define BOARD_LED_GPIO BOARD_LED_RED_GPIO
    #define BOARD_LED_GPIO_PIN BOARD_LED_RED_GPIO_PIN

    再就是在BOARD_InitPins()函数中配置控制led的GPIO时钟使能

    #define PIN24_IDX    24u   /*!< Pin number for pin 24 in a port */
    void BOARD_InitPins(void)
    {
    	
        /* Port A Clock Gate Control: Clock enabled */
        CLOCK_EnableClock(kCLOCK_PortE);
        /* PORTE24 is configured as PTE24 */	
        PORT_SetPinMux(PORTE, PIN24_IDX, kPORT_MuxAsGpio);         
    }

    我使用的是PTE24控制的led灯,所以如上配置使能PTE24的时钟和指定引脚复用功能。

    编译通过后,下载到demo板上验证,可以看到LED正常闪烁。

     

    展开全文
  • 51单片机 电子时钟--液晶屏显示 --基于Protues和keil模拟
  • 基于51单片机时钟汇编程序,实现了走时,校准,闹钟功能
  • 用汇编编写的时钟程序.共四个数码管,共阳极.p2.0,p2.1,p2.2,p2.3控制位选,段选接P0口.低两位数码管显示秒,高两位数码管显示分.
  • //打开HSI时钟 FLASH_Unlock(); //解锁FLASH编程擦除控制器 FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位 FLASH_ErasePage(add); //擦除指定地址页(整页...

    变量定义

    u32     a; //定义32位无符号变量a
    u16     a; //定义16位无符号变量a
    u8     a; //定义8位无符号变量a
    vu32     a; //定义易变的32位无符号变量a
    vu16     a; //定义易变的16位无符号变量a
    vu8     a; //定义易变的8位无符号变量a
    uc32     a; //定义只读的32位无符号变量a
    uc16     a; //定义只读的16位无符号变量a
    uc8     a; //定义只读的8位无符号变量a
    

    延时函数

    #include "delay.h"
    
    delay_us(1); //延时1微秒
    delay_ms(1); //延时1毫秒
    delay_s(1); //延时1秒
    

    关于LED灯的函数

    void GPIO_WriteBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin, BitAction BitVal)

    功能:设置或者清除指定的数据端口位*(控制LED灯的亮与灭)*
    GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设
    GPIO_Pin:待设置或者清除指的端口位*(LED灯的指定)*
    BitVal: 该参数指定了待写入的值 (亮,灭)

    /* Set the GPIOA port pin 15 */
    GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET);
    
    void GPIO_SetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)

    功能:设置指定的数据端口位*(设置LED亮)*
    GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设
    GPIO_Pin:待设置的端口位*(LED灯的指定)*

    /* Set the GPIOA port pin 10 and pin 15 */
    GPIO_SetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15);
    
    void GPIO_ResetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)

    功能:清除指定的数据端口位 (设置LED灭)
    GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设
    GPIO_Pin:待清除的端口位*(LED灯的指定)*

    /* Clears the GPIOA port pin 10 and pin 15 */
    GPIO_ResetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15);
    
    void GPIO_Write(GPIO_TypeDef* GPIOx, u16 PortVal)

    功能:向指定 GPIO 数据端口写入数据*(设置LED的亮灭)*
    GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设
    PortVal: 待写入端口数据寄存器的值

    /* Set the GPIOA port pin 15 */
    GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET);
    

    关于按键控制的函数

    u8 GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)

    功能:读取指定端口管脚的输入(读按键接口的电平)
    GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设
    GPIO_Pin:待读取的端口位(按键的指定)
    返回值:输入端口管脚值

    /* Reads the seventh pin of the GPIOB and store it in ReadValue
    variable */
    u8 ReadValue;
    ReadValue = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7);
    
    u8 GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)

    功能:读取指定端口管脚的输出
    GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设
    GPIO_Pin:待读取的端口位(按键的指定)
    返回值:输出端口管脚值

    /* Reads the seventh pin of the GPIOB and store it in ReadValue
    variable */
    u8 ReadValue;
    ReadValue = GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_7);
    

    关于FLASH

    //FLASH写入数据
    void FLASH_W(u32 add,u16 dat)  //参1:32位的FLASH地址;参2:16位数据
    { 
    //   RCC_HSICmd(ENABLE); //打开HSI时钟
         FLASH_Unlock();  //解锁FLASH编程擦除控制器
         FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位
         FLASH_ErasePage(add);     //擦除指定地址页(整页擦除)
         FLASH_ProgramHalfWord(add,dat); //从指定页的addr地址开始写
         FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位
         FLASH_Lock();    //锁定FLASH编程擦除控制器
    }
    
    //FLASH读出数据
    u16 FLASH_R(u32 add)//参1:32位读出FLASH地址;返回值:16位数据
    {
        u16 a;
        a = *(u16*)(add);//从指定页的addr地址开始读
        return a;
    }
    

    在这里插入图片描述

    蜂鸣器

    有源蜂鸣器无源蜂鸣器
    内置频率发生电路内部没有发生电路
    通电就能发出声音需要外部给予频率
    声音频率固定可产生不同频率声音
    成本高成本低

    两种蜂鸣器外观上几乎无差别,要通过型号分辨
    发出1kHz声音,即每秒1000个周期

    void BUZZER_Init(void)//蜂鸣器接口的初始化
    { 
        GPIO_InitTypeDef  GPIO_InitStructure;  
        GPIO_InitStructure.GPIO_Pin = BUZZER; //选择端口号                       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)   
        GPIO_Init(BUZZERPORT, &GPIO_InitStructure);
        GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鸣器接口输出高电平1
    }
    
    void BUZZER_BEEP1(void)//蜂鸣器响一声
    { 
       u16 i;
       for(i=0;i<200;i++)
       {
         GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鸣器接口输出0
         delay_us(500); //延时
         GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鸣器接口输出高电平1
         delay_us(500); //延时
       }
    }
    
    展开全文
  • 51单片机驱动DS1302时钟串口自动更新时间keil工程文件C源文件,通过串口工具dofly,波特率9600,点击更新
  • MCS-51单片机的特殊功能寄存器 符号 地址 功能介绍 B F0H B寄存器 ACC E0H 累加器 PSW D...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,964
精华内容 1,985
关键字:

单片机时钟程序keil