51 AutoLeaders控制组——51单片机任务二

【51单片机使用LED1602显示日期时间】 我们用了定时器,LCD1602显示此功能,完成后可进行简单的时间,日期显示的功能。可以学习到定时器的使用以及LCD1602的使用,对使用这个内容进行一个加固,同时也可以进行一些修改使这个函数可以变成大伙想要的内容数据。希望对大家有帮助。 阅读详情

51 AutoLeaders控制组——51单片机任务二

任务概述

通过数码管显示“时-分-秒”,并可通过矩阵键盘进行调整

主要任务

1、初始状态:

DS1302时间初始化为12:00:00,数码管显示从DS1302获取的时间

2、调节模式;

按下S4进入调节模式,可通过S1、S5控制“时”的加减;S2、S6控制“分”的加减;S3、S7控制“秒”的加减

在调节某一位时,对应位置的显示应闪烁

3、计时模式

从调整后的时间开始显示,“-”以1s为周期闪烁

附加任务

1、将当前显示的时间通过串口发送

2、制作一个闹钟

任务解析

主要任务

1、初始状态

创建一个数组,按顺序、位置将数组中的事件数据经转换后输入DS1302即可

2、调节模式

通过按键对数组中的数字进行操作

通过定时器控制一个标志位以1s为周期进行转换,用于标记数码管的亮暗,实现闪烁效果

通过一个标记变量,达到实现控制模式的效果,当按下S4时,进入调节模式

再创建一个标记变量,当控制加减的按键被按下时,切换到对应的显示模式,实现闪烁效果

在对时间进行加减时,注意合法性检查

3、计时模式

当按下S8时,将数组中的数字写入DS1302并在数码管显示

附加任务

1、将当前显示的时间通过数码管发送

添加数码管模块,在ASCII表中找到0的ASCII值,将需要发送的数据加上0的值进行发送,即可以文本形式在串口助手端进行接收

(注:可以通过连续发送的方式在接收端显示出 “xx:xx:xx” 的效果)

2、制作闹钟

为了方便对函数进行复用,可以将之前的数组转换为二维数组,并在修改时间的函数的参数中添加一个标记位,用于标记是对时钟的修改还是对闹钟的修改

此外,还需一个标记位用于标记闹钟是否开启,以及一个单独的数码管显示模式用于表示闹钟响起(数码管和LED以及点阵屏有管脚冲突,目前我没有找到好的方法来防止这种冲突)

另:可以通过上一次按键的输入值和当前按键输入值的比较实现按键不干扰程序工作的效果

以下是这次任务的主要源码

main.c

#include <STC89C5xRC.H>
#include "DS1302.h"
#include "NixieTube_Display.h"
#include "Delay.h"
#include "Uart.h"
#include "Timer0.h"
#include "MatrixKey.h"
#include "MatrixLED.h"


void main()
{
    unsigned char Current_Time = 0;
    unsigned char Mode = 0;
    unsigned char Is_Clock_On = 0;//闹钟是否开启
    unsigned char Clock_Mark = 0;//闹钟是否响起


    unsigned char Key_Num = 0;
    unsigned char last_Key_Num = 0;

    unsigned char i = 0;
    int j = 0;


    DS1302_Init();
    DS1302_SetTime();//设定初始时间

    Uart_Init();
    Timer0_Init();

    while(1)
    {
        Key_Num = MatrixKey();
        if(Key_Num == 8 && last_Key_Num == 0)
        //在矩阵键盘的输入中不添加死循环,通过对上一次按键值和这一次的按键值的判断来实现按键不影响程序运行的效果
        {
            if(Mode = 1) DS1302_SetTime(); //设置调整后的时间
            Mode = 0;//计时模式
            //Time_Select = 0;//重置时间选择
        }

        if(Key_Num == 4 && last_Key_Num == 0)
        {
            Mode = 1;//调整时间
        }
        if(Key_Num == 16 && last_Key_Num == 0)
        {
            Uart_SentTime();//发送时间
        }
        
        if(Key_Num == 9 && last_Key_Num == 0)
        {
            Mode = 3;//调整闹钟时间
        }

        if(Key_Num == 10 && last_Key_Num == 0)
        {
            Is_Clock_On++;
            Is_Clock_On %= 2;//开关闹钟
        }
        last_Key_Num = Key_Num;


        switch(Mode)
        {   
            case 0:
            //计时模式
                if(Is_Clock_On == 1)
                {
                    NixieTube_Display(8, 11);
                    if(Clock_Mark == 0) Clock_Mark = Is_Clock_Alarm();

                    if(Clock_Mark == 1)
                    {
                        j++;
                        if(j < 2000) NixieTube_DisplayAlarm();//显示CLOC模拟闹钟响起
                        DS1302_ReadTime();
                        if(j == 2000)
                        {
                            j = 0;
                            Clock_Mark = 0;
                        }
                    }
                    else
                    {
                        DS1302_ReadTime();
                        NixieTube_DisplayTime(0, 0);
                    }
                }
                else
                {
                    DS1302_ReadTime();
                    NixieTube_DisplayTime(0, 0);
                }
                break;
        
            case 1:
            //调节模式
                DS1302_TimeChange(0);
                //第一个参数置0时调整时钟,置1调整闹钟
                if(Is_Clock_On == 1) NixieTube_Display(8, 11);
                break;
            
            case 3: 
            //调整闹钟
                DS1302_TimeChange(1);
                if(Is_Clock_On == 1)  NixieTube_Display(8, 11);
                break;
        }

    }
}


unsigned char Flicker_Mark = 0;//用于标记亮灭
void Timer0_Isr(void) interrupt 1
{
    static unsigned int T0_count = 0;

	TL0 = 0x66;
	TH0 = 0xFC;

    T0_count++;
    if(T0_count >= 500)
    {
        T0_count = 0;
        Flicker_Mark = ~Flicker_Mark;
    }
}

DS1302.c

#include <STC89C5xRC.H>
#include "MatrixKey.h"
#include "NixieTube_Display.h"

//对端口重定义
sbit DS1302_SCLK = P3^6;
sbit DS1302_IO = P3^4;
sbit DS1302_CE = P3^5;


#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82 
#define DS1302_HOUR 0x84 
#define DS1302_DATE 0x86
#define DS1302_MONTH 0x88
#define DS1302_DAY 0x8a
#define DS1302_YEAR 0x8c
#define DS1302_WP 0x8e


void DS1302_Init();
void DS1302_Write(unsigned char Command, unsigned char Data);
unsigned char DS1302_Read(unsigned char Command);
void DS1302_SetTime();
void DS1302_ReadTime();
unsigned char DEC_To_BCD(unsigned char DEC_Num);
unsigned char BCD_To_DEC(unsigned char BCD_Num);
void DS1302_TimeChange(unsigned char Change_Mode);


char DS1302_Time[2][3] = {{12, 0, 0}, {12, 0, 0}};
//分别用于计时、闹钟


void DS1302_Init()
//初始化DS1302
{
    DS1302_CE = 0;//使能
    DS1302_SCLK = 0;//串行时钟置0
}


void DS1302_Write(unsigned char Command, unsigned char Data)
//写入数据
{
    unsigned char i = 0;
    DS1302_CE = 1;//停止运行
    for(i = 0; i < 8; i++)
    {
        DS1302_IO = Command & (0x01 << i);
        DS1302_SCLK = 1;
        DS1302_SCLK = 0;
    }

    for(i = 0; i < 8; i++)
    {
        DS1302_IO = Data & (0x01 << i);
        DS1302_SCLK = 1;
        DS1302_SCLK = 0;
    }

    DS1302_CE = 0;//恢复运行
    DS1302_SCLK = 0;
}


unsigned char DS1302_Read(unsigned char Command)
//读取当前时间
{
    unsigned char Data = 0x00;
    unsigned char i = 0;
    Command |= 0x01;//保证第一位置1
    DS1302_CE = 1;
    for(i = 0; i < 8; i++)
    {
        DS1302_CE = 1;
        DS1302_IO = Command & (0x01 << i);
        DS1302_SCLK = 0;
        DS1302_SCLK = 1;
        //在最后一个循环时为上升沿
    }


    for(i = 0; i < 8; i++)
    {
        DS1302_SCLK = 1;
        //重复置1,减去一个脉冲周期
        DS1302_SCLK = 0;
        //读取一位,同时使执行结束时为0
        if(DS1302_IO)
        {
            Data |= (0x01 << i);
            //从最低位开始读取,应存到最低位
        }
    }

    DS1302_CE = 0;
    DS1302_SCLK = 0;

    DS1302_IO = 0;//这里需要将IO重置,否则读取的数据会在输入数据和ff之间横跳
    return Data;
}


void DS1302_SetTime()
//将时间写入DS1302
{
    DS1302_Write(DS1302_WP, 0x00);//关闭写保护
    DS1302_Write(DS1302_HOUR, DEC_To_BCD(DS1302_Time[0][0]));
    DS1302_Write(DS1302_MINUTE, DEC_To_BCD(DS1302_Time[0][1]));
    DS1302_Write(DS1302_SECOND, DEC_To_BCD(DS1302_Time[0][2]));
    DS1302_Write(DS1302_WP, 0x81);//打开写保护
}


void DS1302_ReadTime()
//读取当前时间
{
    unsigned char Temp = 0;

    Temp = DS1302_Read(DS1302_HOUR);
    DS1302_Time[0][0] = BCD_To_DEC(Temp);
    Temp = DS1302_Read(DS1302_MINUTE);
    DS1302_Time[0][1] = BCD_To_DEC(Temp);
    Temp = DS1302_Read(DS1302_SECOND);
    DS1302_Time[0][2] = BCD_To_DEC(Temp);
}



unsigned char DEC_To_BCD(unsigned char DEC_Num)
//十进制转BCD
{
    return DEC_Num / 10 * 16 + DEC_Num % 10;
}


unsigned char BCD_To_DEC(unsigned char BCD_Num)
{
    return BCD_Num / 16 * 10 + BCD_Num % 16;
}


void DS1302_TimeChange(unsigned char Change_Mode)
//Change_Mode为0时调整时钟,为1时调整闹钟
{
    static unsigned char Time_Select = 0;//保证变量不被删除,防止在每一次调用函数的时候都置0
    unsigned char Key_Num = 0;
    static unsigned char last_Key_num = 0;
    
    Key_Num = MatrixKey();
    if((Key_Num == 1 && last_Key_num == 0) || (Key_Num == 5 && last_Key_num == 0)) Time_Select = 0;
    if((Key_Num == 2 && last_Key_num == 0) || (Key_Num == 6 && last_Key_num == 0)) Time_Select = 1;
    if((Key_Num == 3 && last_Key_num == 0) || (Key_Num == 7 && last_Key_num == 0)) Time_Select = 2;


    switch(Time_Select)
    {
        case 0:
            NixieTube_DisplayTime(Change_Mode, 1);
            //合法性检查
            if(Key_Num == 1 && last_Key_num == 0)
            {
                DS1302_Time[Change_Mode][0]++;
                if(DS1302_Time[Change_Mode][0] > 23) DS1302_Time[Change_Mode][0] = 0;
            }
            if(Key_Num == 5 && last_Key_num == 0)
            {
                DS1302_Time[Change_Mode][0]--;
                if(DS1302_Time[Change_Mode][0] < 0) DS1302_Time[Change_Mode][0] = 23;
            }
            last_Key_num = Key_Num;
            break;
    

        case 1:
            NixieTube_DisplayTime(Change_Mode, 2);
            if(Key_Num == 2 && last_Key_num == 0)
            {
                DS1302_Time[Change_Mode][1]++;
                if(DS1302_Time[Change_Mode][1] > 59) DS1302_Time[Change_Mode][1] = 0;
            }
            if(Key_Num == 6 && last_Key_num == 0)
            {
                DS1302_Time[Change_Mode][1]--;
                if(DS1302_Time[Change_Mode][1] < 0) DS1302_Time[Change_Mode][1] = 59;
            }
            last_Key_num = Key_Num;
            break;
    
        case 2:
            NixieTube_DisplayTime(Change_Mode, 3);
            if(Key_Num == 3 && last_Key_num == 0)
            {
                DS1302_Time[Change_Mode][2]++;
                if(DS1302_Time[Change_Mode][2] > 59) DS1302_Time[Change_Mode][2] = 0;
            }
            if(Key_Num == 7 && last_Key_num == 0)
            {
                DS1302_Time[Change_Mode][2]--;
                if(DS1302_Time[Change_Mode][2] < 0) DS1302_Time[Change_Mode][2] = 59;
            }
            last_Key_num = Key_Num;
            break;

        default:
            last_Key_num = Key_Num;
    }
}


unsigned char Is_Clock_Alarm()
//判断闹钟是否响起
{
    unsigned char i = 0;
    for(i = 0; i < 3; i++)
    {
        if(DS1302_Time[0][i] != DS1302_Time[1][i]) return 0;
    }
    return 1;
}

NixieDisplay.c

#include<STC89C5xRC.H>
#include "Delay.h"
#include "DS1302.h"
#include "Uart.h"

//0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -, ., C, L, O对应的段码
unsigned char NixieTable[15] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x40, 0x80, 0x39, 0x38, 0x3F};

void NixieTube_Display(unsigned char location, unsigned char num)
//分别传入显示位置、显示内容
{
    switch(location)
    //选择显示位置
    {
        case 1:
            P24 = 1;
            P23 = 1;
            P22 = 1;
            break;

        case 2:
            P24 = 1;
            P23 = 1;
            P22 = 0;
            break;

        case 3:
            P24 = 1;
            P23 = 0;
            P22 = 1;
            break;

        case 4:
            P24 = 1;
            P23 = 0;
            P22 = 0;
            break;

        case 5:
            P24 = 0;
            P23 = 1;
            P22 = 1;
            break;

        case 6:
            P24 = 0;
            P23 = 1;
            P22 = 0;
            break;

        case 7:
            P24 = 0;
            P23 = 0;
            P22 = 1;
            break;

        case 8:
            P24 = 0;
            P23 = 0;
            P22 = 0;
            break;
    }

    P0 =  NixieTable[num];
    Delay(1);
    //让数码管稳定显示,否则亮度会变低
    //注意STC89C52RC的晶振频率为11.0592MHz,在创建延时函数时应注意选择
    P0 = 0x00;
    //清零
}

extern unsigned char Flicker_Mark;//调用外部变量
extern unsigned char Is_Clock_On;
void NixieTube_DisplayTime(unsigned char Time, unsigned char Flicker_Select)
//数码管显示时间
{    
    if(Flicker_Select == 0)//正常显示,不闪烁
    {
        NixieTube_Display(1, DS1302_Time[Time][0] / 10);
        NixieTube_Display(2, DS1302_Time[Time][0] % 10);
        
        NixieTube_Display(4, DS1302_Time[Time][1] / 10);
        NixieTube_Display(5, DS1302_Time[Time][1] % 10);
        
        NixieTube_Display(7, DS1302_Time[Time][2] / 10);
        NixieTube_Display(8, DS1302_Time[Time][2] % 10);

        if(Flicker_Mark == 0)
        {
            NixieTube_Display(3, 10);
            NixieTube_Display(6, 10);
        }
    }

    if(Flicker_Select == 1)//时闪烁
    {
        if(Flicker_Mark == 0)
        {
            NixieTube_Display(1, DS1302_Time[Time][0] / 10);
            NixieTube_Display(2, DS1302_Time[Time][0] % 10);
        }
    
        NixieTube_Display(4, DS1302_Time[Time][1] / 10);
        NixieTube_Display(5, DS1302_Time[Time][1] % 10);
        
        NixieTube_Display(7, DS1302_Time[Time][2] / 10);
        NixieTube_Display(8, DS1302_Time[Time][2] % 10);

        NixieTube_Display(3, 10);
        NixieTube_Display(6, 10);
    }

    if(Flicker_Select == 2)//分闪烁
    {
        NixieTube_Display(1, DS1302_Time[Time][0] / 10);
        NixieTube_Display(2, DS1302_Time[Time][0] % 10);
        
        if(Flicker_Mark == 0)
        {
            NixieTube_Display(4, DS1302_Time[Time][1] / 10);
            NixieTube_Display(5, DS1302_Time[Time][1] % 10);
        }
        
        NixieTube_Display(7, DS1302_Time[Time][2] / 10);
        NixieTube_Display(8, DS1302_Time[Time][2] % 10);

        NixieTube_Display(3, 10);
        NixieTube_Display(6, 10);
    }

    if(Flicker_Select == 3)//秒闪烁
    {
        NixieTube_Display(1, DS1302_Time[Time][0] / 10);
        NixieTube_Display(2, DS1302_Time[Time][0] % 10);
        
        NixieTube_Display(4, DS1302_Time[Time][1] / 10);
        NixieTube_Display(5, DS1302_Time[Time][1] % 10);
        
        if(Flicker_Mark == 0)
        {
            NixieTube_Display(7, DS1302_Time[Time][2] / 10);
            NixieTube_Display(8, DS1302_Time[Time][2] % 10);
        }

        NixieTube_Display(3, 10);
        NixieTube_Display(6, 10);
    }
}


void NixieTube_DisplayAlarm()
//显示CLOC作为闹钟响起的标志
{
    if(Flicker_Mark == 0)
    {
        NixieTube_Display(1, 12);
        NixieTube_Display(2, 13);
        NixieTube_Display(3, 14);
        NixieTube_Display(4, 12);
    }
}

串口发送时间函数

void Uart_SentTime()
//串口发送当前时间
{
	unsigned char i = 0;
	for(i = 0; i < 3; i++)
	{
		Uart_SendByte(DS1302_Time[0][i] / 10 + 48 );
		Uart_SendByte(DS1302_Time[0][i] % 10 + 48 );
		if(i < 2)
		{
			Uart_SendByte(58);
		}
	}
}
在运行opencv时出现的两个问题:AttributeError: module ‘cv2‘ has no attribute ‘gapi_wip_gst_GStreamerPipeline‘ 解决了opencv的两个问题:由问题一引出 AttributeError: module 'cv2' has no attribute 'gapi_wip_gst_GStreamerPipeline' cv2.error:OpenCV(4.1.2)C:\projects\opencvpython\opencv\modules\highgui\src\window.cpp:717:error: (-2:Unspecified error) The function is not implemented... 阅读详情

相关推荐

@transactional滥用导致数据源连接池耗尽问题

@transactional滥用导致数据源连接池耗尽问题

qq_43205267的博客 1201

基于MCS-51单片机的数字时钟设计

基于MCS-51单片机的数字时钟设计 一、项目描述 1.基于DS1302时钟模块,可以完成年、月、日、时、分、秒、周的正确显示。 2.可以通过外部按键对当前时间进行校准。 3.能够以12小时和24小时制表示方式显示时间。 4.能够通过外部按键设置闹钟提醒时间。 实际操作: LCD1602显示时钟,按K3键进入时钟设置,此时秒钟停止走动,按K1键选择设置的秒、分、时、 日、月、星期、年,按K2键进行加1,设置完成后,再次按下K3键继续走时,按下K4进入闹钟 界面设置(在闹钟界面不能按下K3),K1进行选择时、

G1842965496的博客 4885

移远EC800M CAT1模块HTTP POST实战:从AT指令到数据上报的完整避坑指南

本文详细介绍了移远EC800M CAT1模块通过AT指令实现HTTP POST数据上报的完整开发流程,包括模块初始化、PDP上下文配置、HTTP POST实现及优化策略。针对实际开发中的常见问题如网络异常、低功耗需求等提供了经过验证的解决方案,帮助开发者快速实现稳定可靠的物联网数据传输功能。

weixin_42556197的博客 480

两位数码管显示学号练习程序和图_【Proteus】数码管简易计时器

前言本章介绍使用定时器与数码管来做一个简易的计数器,使用3个2位一体数码管来分别代表时,分,秒。使用锁存器来控制数码管的段选与位选。先放一张完整的仿真图:锁存器:锁存器在数码管驱动中是非常常用的一种器件。简单来说,锁存器最主要的作用就是缓存。可以按照下面的简单描述来理解:当LE给到1的时候,锁存器就会使能打开,然后由单片机给输入数据到D0-D7,然后关闭LE端口,也就是LE端口给0,这时候锁存器的...

weixin_39783857的博客 8414

ESP32-S3开发环境避坑指南:VS Code+ESP-IDF离线安装全流程(附国内镜像加速)

本文提供了一份详细的ESP32-S3开发环境离线安装指南,重点解决网络依赖问题。通过整合国内镜像加速,手把手教你完成VS Code、ESP-IDF框架、工具链及Python依赖的本地化部署,实现稳定、可重复的开发环境搭建,大幅提升IoT开发效率。

peach的博客 962

【全新官方接口】php检测微信域名拦截,检测微信域名被封

你的域名在微信被拦截的3种常见情况 1、域名因违规或有风险被拦截(红色拦截) 2、类似taobao.com,douyin.com这种的恶意竞争式拦截,淘宝、抖音等微信的竞争对手一般都是白色拦截(白色拦截) 3、有一个中间页的拦截,需要多次点击按钮才可以跳转到你的域名的,多是一些新型域名后缀,例如.top .xyz .link后缀,这种情况,备案后可以解决(备案拦截) 通过php get_headers()函数就可以分析到结果 这个下标为6是一个URL,在微信访问后正是这个讨厌的页面! 如果切换为

TANKING,开源开发者! 2876

定时器和数码管

通过上节课的实验,大家会发现,我们逐渐进入比较实质性的学习了,需要记住的内容也更多了,个别地方可能会感觉吃力。但是大家不要担心,要有信心。这个跟小孩学走路一样,刚开始走路不太稳,没关系,多走几步多练练。看视频的时候要注意专心,一遍看不懂,思考一下,再回头看第二遍和第三遍,没准一下就明白了。如果三遍还看不明白,那就把不懂的问题放一放,继续往下学两课再回头看一次,也可以到QQ群里或单片机论坛http:

逍遥l天的博客 3428

基于STM32F4通用定时器实现Livox激光雷达PPS硬件同步的工程实践

本文详细介绍了基于STM32F4通用定时器实现Livox激光雷达PPS硬件同步的工程实践。通过分析PPS信号的时序要求,对比不同定时器的特性,并提供完整的代码实现与调试技巧,帮助开发者解决多传感器数据融合中的时间同步问题。实测表明,该方案在车载环境中稳定运行超过2000小时。

weixin_30540691的博客 325

数码管定时器

一次协会作业的记录

LevolutionL的博客 1726

HTML5+CSS3+JS小实例:扇形展开折叠菜单

你肯定见过那种圆形浮动按钮(FAB),点一下弹出几个选项。大部分实现就是菜单项从底下往上"弹"出来,排成一列——能用,但没啥记忆点。后来我看到 Path 那个经典的扇形菜单,点一下,五个按钮像花瓣一样从中心散开,每个带不同的延迟和弹性曲线。当时就觉得:这才对嘛,交互就该有点"戏剧性"。今天拆一个纯手写版本,HTML + CSS + JS,不依赖任何库。六菜单项、扇形 144° 展开、弹性过渡、点击关闭、键盘可达——该有的都有。

艾恩小灰灰的博客 164

Field Characteristics 深入解析,理解 SAP ABAP Analytics 中 Dimension 与 Measure 的真正边界

在SAP ABAP Analytics数据模型中,字段应建模为Dimension还是Measure,关键在于业务语义而非数据类型。Dimension提供分析上下文,构成数据坐标系,支持钻取与切片;Measure则需具备明确聚合语义(如#SUM、#MIN、#MAX),且必须满足Distinct(无重复)与Complete(无缺失)原则,确保聚合结果准确。错误的建模会导致聚合偏差,根源常在事实粒度不清或关联关系不当。因此,正确划分字段角色,本质是让Analytical Engine准确理解业务数据的分析逻辑。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 58

AutoLeaders控制组——51单片机学习任务(二)

由于单片机IO端口具有线与的功能,因此当任意一个按键按下时,行和列都有一根线被线与,通过运算就可以得出按键的坐标从而判断按键键值。如果cpu在处理一个中断源请求时,发生了一个优先级更高的请求,那么cpu会优先处理该请求,处理完再回到低级中断服务程序,这个过程被称作。虽然,并行通信的效率高,传输速度快,但是要想实现同时接收十分困难。矩阵键盘可以作用在数码管,作用在LCD,也可以作用在串口。矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。这样键盘中按键的个数是4×4个。

2301_79727954的博客 1199

51单片机入门指南-基于STC89C52(持续更新)

一、环境介绍 编程IDE: keil5 单片机型号: STC89C51/52 开发板: 普中科技的开发板 完整PDF资源下载地址:https://download.youkuaiyun.com/download/xiaolong1126626497/19785856 二、51单片机开发手册介绍 2.1 前言 51单片机是对所有兼容Intel 8031指令系统的单片机的统称。 该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最.

8798

AutoLeaders控制组——51单片机任务二

我的思路是分为两个模式:计时与调时,分别写一个子函数,主函数只保留判断以及初始化,然后再用计时器来完成闪烁。在完成的过程中数码管显示出现不稳定的情况,在舍友的帮助下修改了Delay函数,问题就解决了。此次任务实在是太难了,用到了矩阵键盘,数码管显示,定时器以及DS1302等知识。DS1302函数(由于只用到时分秒,故简化)只要认真看完视频,相信大家都能独立完成。

2301_79717461的博客 57

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

AutoLeaders控制组—51单片机学习笔记(二)中任务

整体功能介绍:数码管显示时间, 通过矩阵键盘中的 S4 和 S8 切换模式, 按下 S4 进入时间调节模式, 此时可以通过 S1-S3 和 S5-S7 对时间的时、 分、 秒进行调整, 调节时间的某一位时, 该位需要闪烁;按下 S8 进入计时模式, 从刚刚设定的时间开始计时, 数码管显示从 DS1302 获取的时间。

2301_79706713的博客 158

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

AutoLeaders控制组—51单片机学习笔记——如何控制任务中用到的外设

单片机笔记

mz2004117的博客 2233

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

AutoLeaders控制组——51单片机学习笔记(定时器、串口通信)

本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整。 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及前面的知识点,可能需要提前了解(可以翻看本人之前的文章或者去B站看UP主的视频)

draw_future_TL的博客 5039

AutoLeaders控制组—51单片机学习笔记(二)

第二次单片机学习笔记

mz2004117的博客 2328

AutoLeaders控制组——51单片机学习笔记(二)

模块化编程是什么?有什么好处?传统方式编程:所有的函数放在main.c里,当使用模块较多时,文件内的代码十分杂乱,不利于代码的组织和管理,也很影响编程者的思路。模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用的函数声明,其他.c文件想使用其中代码时,只需要include“xxx.h”文件即可。使用模块化编程可以极大提高代码的可阅读性、可维护性、可移植性。为什么我们可以选择使用模块化代码?

Lesley0608的博客 1498

51 AutoLeaders控制组——51单片机任务

模式2要求最后两位显示数字按1s的频率改变,那么这里我们需要写一个类似计时器的程序来计算一秒的时间,但是不能直接用延时函数,因为在延时函数执行的过程中我们是没有办法进行操作的,因此我们需要考虑其它的实现方法,这里我通过计算数码管的扫描此时来得到大致1s的时间。模式4的要求为每按一下K4,显示的数字加一,那么这里我们需要一段代码用于判断K4是不是被第一次按下(即K4被按下前是否处于模式4),当K4是第一次按下时,将计数器归零,否则计数器加1,最后在数字达到99时,加1则归零。时间周期:通常指一个时钟周期。

flashier的博客 375

Autoleaders控制组——51单片机学习笔记(2)

LCD1602是一块两排的液晶显示屏,可以输出字母,数字或者一些符号,相比数码管,它可以显示的信息更多,但也使它更加难以解释。这是一个原理简单,但驱动操作比较复杂的外设。这是关于驱动液晶显示屏的代码。//引脚配置://函数定义:/*** @brief LCD1602延时函数,可延时1ms* @param 无* @retval 无*/_nop_();_nop_();_nop_();i = 11;j = 190;do/*** @brief LCD1602写命令。

2302_80457984的博客 2098

Autoleaders控制组——51单片机学习笔记

本笔记为初学者上b站江科大自化协的51单片机入门教程P1-P12所得笔记,包含单片机简介和LED、独立按键、数码管相关内容。

weixin_74342249的博客 889

AutoLeaders控制组——51单片机学习笔记(一)

在b站视频中我们学习了0-9的表示,然后自己学习如何表示“U”和“-”,放在数组的10和11位,方便后续使用。if语句实现按下S4后第七位和第八位加一的功能,当加到10时重新计数。用for循环和if语句实现数字变化,当显示到10后重新计时。用for循环和if语句实现“--”的闪烁。用动态显示使U3 03常亮。按下S3后进入if语句。按下S4后进入if语句。按下S1后进入if语句。按下S2后进入if语句。按下其他键跳出模式一。按下其他键跳出模式二。按下其他键跳出模式三。按下其他键跳出模式四。

2301_79720422的博客 1547

复习3天拿下蓝桥杯单片机国一

这篇文章主要给AutoLeaders控制组成员制定学习方法与提供一些小技巧,在你们学到每一个阶段时都可以先看一下我的笔记哦。当然啦,其他小伙伴也可以根据这篇文章去备战蓝桥杯哦。

m0_74453832的博客 8392
上一篇: 51 DS1302
下一篇: 常用调试方法
flashier
博客等级 码龄3年 381粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值