找回密码
 立即注册
楼主: MagicBude

8051U学习打卡+笔记

[复制链接]
  • 打卡等级:常住居民I
  • 打卡总天数:68
  • 最近打卡:2025-06-18 13:05:22
已绑定手机

2

主题

18

回帖

334

积分

中级会员

积分
334
发表于 2025-2-6 23:07:24 | 显示全部楼层

九、数码管

1.数码管介绍

数码管介绍——外观

image-20250203205050288image-20250203205101764image-20250203205120403image-20250203205132804image-20250203205144131

数码管也叫LED数码管,内部是由多个发光二极管封装在一起组成,他们可以有很多种颜色,很多种外形,很多种样式,但是本质来说他们都是通过点亮内部的LED来显示的,只要面板做好了,理论可以显示任意的字符或者图案。

以第一张图这种最普通的数码管来说,一个“8”我们称之为1位数码管,两个“8”就是2位数码管,以此类推。

数码管显示内容:

image.png

image-20250203205316064

数码管介绍——类型

image-20250203205524307

按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管

image-20250203205639739

“AS”代表单色,而“BS”代表双色

2.数码管显示原理

image-20250204115339208

image-20250204115432832

image-20250204115455088

3.数码管静态显示

/**************** 向HC595发送一个字节函数 ******************/
void Send_595(u8 dat)
{
    u8  i;
    for(i=0; i<8; i++)
    {
        dat <<= 1;
        P_HC595_SER   = CY;
        P_HC595_SRCLK = 1;
        P_HC595_SRCLK = 0;
    }
}
​
/********************** 显示扫描函数 ************************/
void DisplayScan(void)
{
    Send_595(t_display[LED8[display_index]]);   //输出段码
    Send_595(~T_COM[display_index]);            //输出位码
​
    P_HC595_RCLK = 1;
    P_HC595_RCLK = 0;
    if(++display_index >= 8)    display_index = 0;  //8位结束回0
}

使用ISP软件自带工具快速生成数码管数组

image-20250204120611686

4.数码管动态显示

image-20250206230159766

具体的控制的流程如图所示,N表示有几个数码管!其中需要注意每个延时不能太短,我们这边程序就以1ms为准,且需要保证总共一个循环结束的时间不能大于20ms,因为人眼的视觉不容易分辨出50HZ以上的动态刷新。

image.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:68
  • 最近打卡:2025-06-18 13:05:22
已绑定手机

2

主题

18

回帖

334

积分

中级会员

积分
334
发表于 2025-2-6 23:09:58 | 显示全部楼层

十、虚拟键盘LED和数码管

1.虚拟显示——LED

1.1 硬件准备

image-20250206222841278

image-20250206223016705

1.2 软件准备(最新的ISP软件)

image-20250206223403199

1.3 参数设置

image-20250206223621175

image-20250206223518787

1.4 选择指定的接口和协议匹配

image-20250206223748098

image-20250206223803097

DIP40封装LED接口

image-20250206224620088

image-20250206224459256

image-20250206224510483

image.png

任务1:P2口流水灯,P10闪烁

u8 P2_STATE = 0X01;

u8 P10_STATE = 0;

// 任务1:P2口流水灯,P10闪烁 
void TASK_1( void )
{
  
// ----------------------- p2端口流水灯  -----------------------
    LED40_SetPort(2,~P2_STATE);         //点亮P20端口
  
    P2_STATE = (P2_STATE<<1);           //1000 0000 -> 1 0000 0000
    if( P2_STATE == 0 )
        P2_STATE = 1;
  
// ----------------------- p10端口闪烁  ----------------------- 
    if( P10_STATE == 0 )
        LED40_SetBit(1,0);
    else
        LED40_ClrBit(1,0);
  
    P10_STATE = !P10_STATE;
}

2.虚拟显示——数码管

image.png

7段数码管接口

image-20250206224735476

image-20250206224821711

image-20250206224832690

image.png

任务2:左边数码管显示P32按下次数 右边数码管显示P33按下次数

u16 Key_Vol ;               //按键按下持续时间
u16 Key_Vol_2 ;             //按键按下持续时间
u16 KEY1_COUNT = 0;         //P32按钮计数
u16 KEY2_COUNT = 0;         //P33按钮计数

void KEY_Task(void)
{
// ------------P32按钮计数------------  
    if( P32 == 0 )
    {
        Key_Vol++;
        if( Key_Vol==5 )
        {
            KEY1_COUNT++;
        }
    }
    else
    {
        Key_Vol = 0;
    }
  
// ------------P33按钮计数------------  
    if( P33 == 0 )
    {
        Key_Vol_2++;
        if( Key_Vol_2==5 )
        {
            KEY2_COUNT++;
        }
    }
    else
    {
        Key_Vol_2 = 0;
    }   
  
}
u32 KEY_Count = 0;

// 任务2:左边数码管显示P32按下次数, 右边数码管显示P33按下次数
void TASK_2( void )
{
    KEY_Count = KEY1_COUNT *10000 + KEY2_COUNT;
  
    SEG7_ShowLong( KEY_Count ,10);
  
}

3.虚拟键盘

image.png

虚拟键盘接口

image.png

任务3:按下数字按键在数码管显示对应的按键数字!

task.c

u32 REC_NUM = 0;

// 任务3:按下数字按键在数码管显示对应的按键数字!
void TASK_3( void )
{
    SEG7_ShowLong( REC_NUM ,10);
}

main.c

extern u32 REC_NUM;
while(1)
{

    if (bUsbOutReady)                           //如果接收到了数据
    {
        REC_NUM = UsbOutBuffer[5]-48;
        //USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)

        usb_OUT_done();                   
    }
    Task_Pro_Handler_Callback();                //执行功能函数

}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:68
  • 最近打卡:2025-06-18 13:05:22
已绑定手机

2

主题

18

回帖

334

积分

中级会员

积分
334
发表于 2025-2-11 22:44:49 | 显示全部楼层

十一、矩阵键盘

1. 矩阵按键的原理

image.png

在按键数量较多时,为了减少I/O口的占用,将按键排列成矩阵排列的形式的按键阵列我们称为矩阵按键。

2. 矩阵按键的程序实现

按键识别原理:端口默认为高电平,实时读取到引脚为低电平是表示按下。

①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。

②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。

③第三步:行列组合一下就可以判断出是哪个按键按下了。

任务1:数码管显示当前的按键号

//任务1:数码管显示当前的按键号
void Task_1(void)
{
    //①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
    COL1 = 0;
    COL2 = 0;
    COL3 = 0;
    COL4 = 0;
    ROW1 = 1;
    ROW2 = 1;
  
    if(( ROW1 == 0 ) || ( ROW2 == 0 ))      //如果行按键有按下
    {
        if(( ROW1 ==0 ) && ( ROW2 ==0 ))    //如果两行都有按键按下,不处理
        {
    
        }
        else if((( ROW1 ==1 )&&( ROW2 ==0 )) || (( ROW1 ==0 )&&( ROW2 ==1 )))   //如果有按键按下,而且只有一颗
        {
            if( ROW1 ==0 )              //判断哪一行,输出行开始的序号
                key_num = 0;
            else if( ROW2 ==0 )
                key_num = 4;
        
            //②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
            COL1 = 1;
            COL2 = 1;
            COL3 = 1;
            COL4 = 1;
            ROW1 = 0;
            ROW2 = 0;
    
            if( COL1 ==0 )              //判断哪一列,叠加按键的序号
            {
//              key_num = key_num ;
            }
            else if( COL2 ==0 )
            {
                key_num = key_num + 1;
            }
            else if( COL3 ==0 )
            {
                key_num = key_num + 2;
            }
            else if( COL4 ==0 )
            {
                key_num = key_num + 3;
            }
        }
        COL1 = 0;
        COL2 = 0;
        COL3 = 0;
        COL4 = 0;
        ROW1 = 1;
        ROW2 = 1;   
    }
    else
    {
        key_num = 0xff;
    }
  
    //③第三步:行列组合一下就可以判断出是哪个按键按下了。

}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:68
  • 最近打卡:2025-06-18 13:05:22
已绑定手机

2

主题

18

回帖

334

积分

中级会员

积分
334
发表于 2025-2-13 21:23:34 | 显示全部楼层

十二、复位系统

由于设备比较复杂,可能会出现某些不确定因素,当出现某种未知的错误的时候,我们可以通过复位操作来确保设备工作在已知的状态,使其能够正确运行。(当然前提是这个设备的软硬件没有损坏!)

确保系统处于确定状态:复位操作可以确保单片机在开始工作时处于已知的状态,使其能够正确初始化各个寄存器和外设。避免不确定行为:没有进行复位时,内部控制寄存器的内容可能是随机的,这可能导致定时器溢出、中断异常、外设误操作等不确定行为。初始化系统:复位操作可以进行系统的初始化,包括清除寄存器、设置默认值、配置时钟等,为系统正常运行做好准备。保证程序正常开始执行:复位确保程序从正确的地址开始执行,避免跳转到未知的地址或执行错误的指令。

image-20250213210007984

1.硬件复位

1.上电复位(复位电压为1.7-1.9V):

image-20250213210302176

①上电复位时间的影响因素1

PS:如对开机时间没有严格要求,建议勾选这个!

②上电复位时间的影响因素2

PS:如果需要快速开机,建议将P3.2、P3.3至少一个上拉一个5.1K电阻到VCC

2.低压复位:

image-20250213210444199image-20250213210707962

  • 勾选后,当VCC电压低于设置的低压检测电压时,MCU会产生低压复位。
  • 如果不勾选允许低压复位选项,当VCC电压低于设置的低压检测电压时,MCU会产生低压中断标志。如果使能了低压中断的话,就会产生低压中断。

3.复位脚复位:

image-20250213211239728

image.png

image-20250213211333459

  • 将下载软件的“复位脚用在I/O口”勾勾去掉,并外接上图的电阻和按键,即可实现硬件复位!

4.看门狗复位:

在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清理看门狗(也叫喂狗),那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。所以,在使用有看门狗的芯片时要注意清理看门狗。

image-20250213211658194

任务1:编写看门狗程序

参考手册9.7.1范例程序(程序有USB功能记得先加USB复位)

P3M0 = 0x00;
P3M1 = 0x00;
 
P3M0 &= ~0x03;
P3M1 |= 0x03;
  
USBCON = 0X00;
USBCLK = 0X00;
IRC48MCR = 0X00;
Delay10ms();

2.软件复位

image.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:68
  • 最近打卡:2025-06-18 13:05:22
已绑定手机

2

主题

18

回帖

334

积分

中级会员

积分
334
发表于 2025-2-13 21:54:01 | 显示全部楼层

十三、外部中断

1.中断系统介绍

image-20250213212513831

当中央处理机 CPU 正在处理某件事的时候外界发生了紧急事件请求,CPU 暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统。

  • ●CPU 总是先响应优先级别最高的中断请求
  • ●CPU 能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序
  • ●每一个中断源可以用软件独立地控制为开中断或关中断
  • ●部分中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的中断
    image-20250213212831745

image.png

  • ●CPU 总是先响应优先级别最高的中断请求
  • ●CPU 能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序
  • ●每一个中断源可以用软件独立地控制为开中断或关中断
  • ●部分中断的优先级别均可用软件设置,高优先级的中断请求可以打断低优先级的中断

2.外部中断介绍

外部中断就是在单片机的一个引脚上,由于外部因素导致了一个电平的变化(比如由高变低),而通过捕获这个变化,单片机内部自主运行的程序就会被暂时打断,转而去执行相应的中断处理程序,执行完后又回到原来中断的地方继续执行原来的程序。

image-20250213214053654

问:什么引脚能作为外部中断口?

  • 引脚带INTx标识的

问:分别能支持什么类型的中断?

image-20250213214919895

image-20250213215121931

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:68
  • 最近打卡:2025-06-18 13:05:22
已绑定手机

2

主题

18

回帖

334

积分

中级会员

积分
334
发表于 2025-2-13 23:04:10 | 显示全部楼层

十四、IO中断

1.IO中断介绍

image.png

相比于外部中断,IO中断有以下优点:

1.支持所有的IO口(外部中断只有特定的外部中断的引脚)

2.可以任意配置上升沿/下降沿/高电平/低电平(外部中断只有上升/下降沿中断)

缺点:

IO中断同时只能支持一种中断模式,外部中断0和1可以同时支持上升/下降沿中断(可以用两个IO端口实现双边沿检测!)。

2.IO中断用法

1.选择合适的中断模式

image.png

2.打开端口的中断功能

image.png

3.配置IO口的中断

image.png

4.中断号处理

image.png

3.中断优先级的设置

image.png

相同优先级,靠前的中断源先执行,执行完 之后在执行低中断源,且一个中断源在执行的时候不能被打断。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:68
  • 最近打卡:2025-06-18 13:05:22
已绑定手机

2

主题

18

回帖

334

积分

中级会员

积分
334
发表于 2025-2-17 20:58:41 | 显示全部楼层

十五、定时器做计数器

1.计数器的作用

image-20250217205201408

image-20250217205242165

2.定时器做为计数器的用法

image-20250217205504118

image-20250217205637706

image-20250217205731517

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-19 05:36 , Processed in 0.147733 second(s), 84 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表