基于STC系列单片机实现PNP型三极管S8550驱动共阳数码管或NPN型三极管S8050驱动共阴数码管功能

动态数码管显示(proteus仿真图和程序) 一、基础理解 本博客基于STC89C52RC单片机进行编程。 采用四位一体动态数码管显示。 二、共阳极数码管 1、基础介绍 共阳极数码管显示需要PNP三极管进行驱动电路。 三极管的集电极连接数码管的位选端,发射极连接电源,基极连接单片机进行控制。 基极高电平,集电极就低电平,基极低电平,集电极就高电平,数码管亮。 仿真中需要在位选端接电阻接地,否则当基极为高电平时,集电极还是高电平。 实际电... 阅读详情
AI摘要

博客展示了Digitron.c、Digitron.h、Timer0.c、Timer0.h等代码文件,与单片机相关,属于嵌入式硬件领域。

在这里插入图片描述在这里插入图片描述
Digitron.c

#include "Digitron.h"
//#include "Key.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
//uchar code DigitronBitCodeArray[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//定义八位共阴数码管位码数组变量 为什么不是{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f} 这才是定义八位共阴数码管位码数组变量 不对吗? 在不使用NPN三极管驱动 用单片机端口直接连接驱动 位码数组是对的 但数码管亮度不够 因此使用了NPN型三极管(比如S8050)来驱动共阴数码管位选 NPN型三极管(比如S8550)基极输入高电平才能导通 解释:共阴数码管 阴极是公共端 对应位选 低电平选通 阳极是显示端 对应段选 高电平选通 由于共阴数码管阴极公共端接单片机来驱动共阴数码管阳极显示端 共阴数码管的亮度会比较低 需要借助NPN型三极管的集电极连接共阴数码管阴极公共端 而NPN型三极管的基电极串个限流电阻连接单片机端口 通过单片机端口输出高电平到NPN型三极管的基电极 从而导通NPN型三极管 放大流过共阴数码管的电流 这样共阴数码管的亮度才会比较亮    
//uchar code DigitronSegmentCodeArray[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};//定义共阴数码管显示0到F数据及符号“—”及熄灭数组变量
//uchar code DigitronSegmentCodeOfPointArray[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1,0x40,0x00};//定义带小数点共阴数码管显示0.到F.数据及符号“—”及熄灭数组变量
uchar code DigitronBitCodeArray[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//定义八位共阳数码管位码数组变量 为什么不是{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80} 这才是定义八位共阳数码管位码数组变量 不对吗? 在不使用PNP三极管驱动 用单片机端口直接连接驱动 位码数组是对的 但数码管亮度不够 因此使用了PNP型三极管(比如S8550)来驱动共阳数码管位选 PNP型三极管(比如S8550)基极输入低电平才能导通 解释:共阳数码管 阳极是公共端 对应位选 高电平选通 阴极是显示端 对应段选 低电平选通 由于共阳数码管阳极公共端接单片机来驱动共阳数码管阴极显示端 共阳数码管的亮度会比较低 需要借助PNP型三极管的集电极连接共阳数码管阳极公共端 而PNP型三极管的基电极串个限流电阻连接单片机端口 通过单片机端口输出低电平到PNP型三极管的基电极 从而导通PNP型三极管 由外接电源来驱动共阳数码管 这样共阳数码管的亮度才会比较亮    
uchar code DigitronSegmentCodeArray[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};//定义共阳数码管显示0到F数据及符号“—”及熄灭数组变量
//uchar code DigitronSegmentCodeOfPointArray[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e,0xbf,0xff};//定义带小数点共阳数码管显示0.到F.数据及符号“—”及熄灭数组变量
uchar DigitronCacheDataArray[] = {0,0,0,0};//定义共阳数码管缓存数据数组变量
uchar DigitronBootTimerFlag = 1;//定义共阳数码管开机时间标志位变量 
uint  DigitronBootTimer = 0;//定义数码管开机时间变量
//extern uint KeyPressNumber;//如果在Key.c文件下已经定义按键按下数值变量KeyPressNumber 则以此语句来引用Key.c文件下的按键按下数值变量KeyPressNumber 否则先在Key.c文件下定义按键按下数值变量KeyPressNumber 接着在Key.h文件下的用extern关键字声明按键按下数值变量KeyPressNumber 最后通过在其他.c文件下#include "Key.h" 就可以引用在Key.c文件下已经定义的按键按下数值变量KeyPressNumber
  void DigitronBootDisplay()//数码管开机显示函数
{
   do
  {
    //if(DigitronBootTimer == 500 )//如果数码管开机时间等于1s
    LED0 = ~ LED0;//LED灯亮灭更新
   }while(DigitronBootTimer <= 500);//当数码管开机时间小于5s
   DigitronBootTimerFlag = 0;//数码管开机时间标志位清0
   LED0 = 1;//LED灯熄灭
  }
  void DigitronDisplayDataSplit()//数码管显示数据分解函数
 {
   DigitronCacheDataArray[0] = KeyPressNumber / 1000;//数码管千位数据显示
   DigitronCacheDataArray[1] = KeyPressNumber / 100 % 10;//数码管百位数据显示
   DigitronCacheDataArray[2] = KeyPressNumber / 10 % 10;//数码管十位数据显示
   DigitronCacheDataArray[3] = KeyPressNumber % 10;//数码管个位数据显示
  }
  void DigitronDisplayData()//数码管显示数据函数  
{  
   static uchar i = 0;//定义静态数码管管位变化变量
   DigitronSegmentCode = 0xff;//数码管段码消影
   DigitronBitCode = 0xff;//数码管位码消影
   switch(i)//数码管管位变化筛选
 {
    case 0 ://数码管千位显示
            DigitronSegmentCode = 0xff;//数码管段码消影
            DigitronSegmentCode = DigitronSegmentCodeArray[DigitronCacheDataArray[0]];//数码管千位的段码显示
            DigitronBitCode = DigitronBitCodeArray[0];//数码管千位码显示
            i++;//数码管管位变化自加1
            break;//跳出
    case 1 ://数码管百位显示
            DigitronSegmentCode = 0xff;//数码管段码消影
            DigitronSegmentCode = DigitronSegmentCodeArray[DigitronCacheDataArray[1]];//数码管百位的段码显示
            DigitronBitCode = DigitronBitCodeArray[1];//数码管百位码显示
            i++;//数码管管位变化自加1
            break;//跳出 
    case 2 ://数码管十位显示
            DigitronSegmentCode = 0xff;//数码管段码消影
            DigitronSegmentCode = DigitronSegmentCodeArray[DigitronCacheDataArray[2]];//数码管十位的段码显示
            DigitronBitCode = DigitronBitCodeArray[2];//数码管十位码显示
            i++;//数码管管位变化自加1
            break;//跳出
    case 3 ://数码管个位显示
            DigitronSegmentCode = 0xff;//数码管段码消影
            DigitronSegmentCode = DigitronSegmentCodeArray[DigitronCacheDataArray[3]];//数码管个位的段码显示
            DigitronBitCode = DigitronBitCodeArray[3];//数码管个位码显示
            i = 0;//数码管管位变化清0
            break;//跳出
    default:break;//跳出
   }
  }

Digitron.h

#ifndef  _DIGITRON_H
#define  _DIGITRON_H
#include "reg51.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
#define DigitronSegmentCode P0//自定义共阳数码管段码端口为单片机P0组引脚
#define DigitronBitCode P2//自定义共阳数码管位码端口为单片机P2组引脚
sbit LED0 = P1^0;//位定义LED灯为单片机P1.0脚
extern uchar code DigitronBitCodeArray[];//声明八位共阳数码管位码数组变量 可被其他.c文件通过#include "其他.h"引用该变量
extern uchar code DigitronSegmentCodeArray[];//声明共阳数码管显示0到F数据及符号“—”及熄灭数组变量 可被其他.c文件通过#include "其他.h"引用该变量
extern uchar DigitronCacheDataArray[];//声明共阳数码管缓存数据数组变量 可被其他.c文件通过#include "其他.h"引用该变量
extern uchar DigitronBootTimerFlag;//声明共阳数码管开机时间标志位变量 可被其他.c文件通过#include "其他.h"引用该变量
extern uint DigitronBootTimer;//声明数码管开机时间变量 可被其他.c文件通过#include "其他.h"引用该变量
void DigitronBootDisplay();//声明数码管开机显示函数 
void DigitronDisplayDataSplit();//声明数码管显示数据分解函数
void DigitronDisplayData();//声明数码管显示数据函数
void DigitronBootDisplay();//声明数码管开机显示函数
void DigitronDisplayDataSplit();//声明数码管显示数据分解函数
void DigitronDisplayData();//声明数码管显示数据函数
#endif 

Timer0.c

#include "Timer0.h"
#include "Digitron.h"
//#include "Key.h"
/*****关于通过特殊功能寄存器AUXR设定定时器/计数器模式为1T或12T模式不需分频或需12分频8051系列单片机定时器初值(定时计数初值)计算的知识点*****/
  /****
  时钟周期(又称振荡周期):单片机晶振频率的倒数 例:单片机晶振频率12MHz 则时钟周期=[1/(12*10^6)Hz]s=0.000000083s=0.000083ms=0.083us
  机器周期:单片机执行一条指令过程中需要完成一个基本操作(如:取指、译码、执行等基本操作)所需的时间 8051系列单片机的一个机器周期由6个S周期(状态周期)组成 一个时钟周期定义为一个节拍(用P表示) 二个节拍定义为一个状态周期(用S表示) 那么8051单片机的机器周期由6个状态周期组成 也就是说一个机器周期=6个状态周期=12个时钟周期=[12x[1/(12*10^6)Hz]s]s=0.000001s=0.001ms=1us
  指令周期:单片机取出一条指令且执行完这条指令所需的时间
  以上三者间的关系:指令周期>机器周期>时钟周期
  一、以下是8051单片机定时器用12分频计算定时器初值的一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
   0、计算nT单片机机器周期T公式:T=n*(1/晶振频率)=几us
   1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us
   2、定时时间=定时计数*一个机器周期 1ms=定时计数*1us 定时计数=1ms/1us=1000us/1us=1000次
   3、定时器初值(定时计数初值)=2^n-定时计数 n为几位定时器 此处n=16 则定时器初值(定时计数初值)=2^16-1000=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256 低八位放TL0=0x18或(65536-64536)%256
  二、以下是8051单片机定时器用12分频或不分频计算定时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
   1、综合公式:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value 
   2、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
  (1)、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
  (2)、TL0 = Value相当于TL0 = (65536-时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
 (一)、以下是8051单片机定时器用12分频计算定时器初值:
     定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value 
 (二)、以下是8051单片机定时器不用分频计算定时器初值:
     定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/1/1KHz)=2^16-(12*10^6)Hz/1/1000Hz)=65536-12000=53536 把53536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xd1或(65536-53536)/256或Value >> 8 低八位放TL0=0x20或(65536-53536)%256或=Value
 (三)、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
     1、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
     2、TL0 = Value相当于TL0 = (65536-10000)%256=55536%256=240 分析:65536-10000=55536转化成二进制为11011000 11110000 55536%256=240转化成二进制为11110000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000取低8位就可以得到55536%256=240的二进制数11110000
 (四)、由定时器定时初值(定时计数初值)推导出定时器定时时间步骤如下:
     1、如果定时器定时初值(定时计数初值)是拆开成高八位和低八位赋值形式 如:TH0=0xfc TL0=0x18 先把高八位和低八位赋值组成一个十六位数据0xfc18 转化成十进制数据64536 用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率  转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率]  转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
     2、如果定时器定时初值(定时计数初值)是十进制数据 如:64536 直接用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率  转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率]  转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
  ****/
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
  void Timer0Init()//定时器0的16位定时模式1用12分频定时2ms初始化函数 晶振为12MHz
{
   //AUXR &= 0x7f;//设定定时器/计数器模式为12T
   TMOD &= 0xf0;//设定定时器/计数器工作模式清0
   TMOD |= 0x01;//设定定时器/计数器为定时器 工作模式为16位定时器0模式1
   TH0 = 0xf8;//设定定时器0高8位初值
   TL0 = 0x30;//设定定时器0低8位初值
   TF0 = 0;//定时器0溢出中断标志位清0
   ET0 = 1;//打开定时器0中断开关
   EA = 1;//打开定时器中断总开关
   TR0 = 1;//打开定时器0开关
  } 
  void Timer0() interrupt 1//定时器0的16位定时模式1用12分频定时2ms中断函数 晶振为12MHz
{
   TR0 = 0;//关定时器0开关
   if(DigitronBootTimerFlag == 1)//数码管开机时间标志位置1
 {
    DigitronBootTimer++;//数码管开机时间自加
   }
   if(DigitronBootTimerFlag == 0)//判断共阳数码管开机时间标志位是否等于0
 { 
    DigitronDisplayDataSplit();//数码管显示数据分解函数
    DigitronDisplayData();//数码管显示数据函数
    //KeyScan();//按键扫描函数 该函数放在定时器定时2ms的中断函数中扫描
   }
   TH0 = 0xf8;//设定定时器0计数高8位初值
   TL0 = 0x30;//设定定时器0计数低8位初值
   TR0 = 1;//开定时器0开关
  }

Timer0.h

#ifndef  _TIMER0_H
#define  _TIMER0_H
#include "reg51.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
void Timer0Init();//声明定时器0初始化函数
#endif 
单片机外围电路设计之五:三极管 单片机外围电路设计之五:三极管 三级管是一起数字键电路的基础,在数字电路中三极管一般工作在开关状态,所以,在这里,我们将谈谈,三极管工作在开关状态的一些问题,至于放大电路的应用,这里就不在说明了。 1概述 半导体三极管又称“晶体三极管”或“晶体管”。在半导体锗或硅的单晶上制备两个能相互影响的PN结,组成一个PNP(或NPN)结构。中间的N区(或P区)叫基区,两边的区域叫发射区和集电区,... 阅读详情

相关推荐

单片机数码管三极管驱动:从电路原理到动态扫描实战

在嵌入式系统与单片机开发中,驱动能力是连接微控制器与外部负载(如LED、数码管)的核心基础概念。其原理在于,单片机GPIO口的电流输出能力有限,通常仅为10-20mA,无法直接驱动需要较大工作电流的显示器件。为了安全、稳定地控制这些负载,必须引入电流放大或开关电路,这构成了嵌入式硬件设计的关键技术价值。三极管作为一种经典的电流控制型半导体器件,通过小电流(基极电流)控制大电流(集电极电流),完美解决了驱动能力不足的问题,成为入门学习和中小规模应用中最经济、直观的解决方案。其典型应用场景包括多位数码管动态扫描

weixin_30345577的博客 318

洛谷 U41571 Agent2

U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的。每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了。只有不咕鸟Lyn_king一个人冒着太阳等了半个多小时,然后居然看到连ENLIGHTENED行动参谋都咕咕咕了,果然咕咕咕是人类的本性啊。 题目描述 作为一...

HJ921004的博客 218

51单片机数码管驱动:从原理到仿真,新手避坑指南

数码管作为嵌入式系统中最基础的人机交互显示器件,其驱动原理是单片机入门的关键。它本质上是由多个LED组成的阵列,通过段选和位选信号控制。共阴与共阳两种结构决定了驱动逻辑的差异,核心在于理解电流路径与IO口电平的对应关系。动态扫描技术利用人眼视觉暂留效应,通过高速轮流点亮各位数码管实现稳定显示,这要求精确的时序控制。在工程实践中,IO口驱动能力不足是常见问题,常需借助三极管或驱动芯片进行电流放大。对于51单片机初学者,使用Keil进行C语言编程,结合Proteus进行电路仿真,是验证数码管驱动逻辑、排查硬件连

weixin_30945039的博客 385

【redis/lua】Lua: 给 Redis 用户的入门指导

转载自: http://www.oschina.net/translate/intro-to-lua-for-redis-programmers?print Lua: 给 Redis 用户的入门指导 可能你已经听说过Redis 中嵌入了脚本语言,但是你还没有亲自去尝试吧?  这个入门教程会让你学会在你的Redis 服务器上使用强大的lua语言。 Hello, Lu

shuhuai007的专栏 2176

51单片机交通灯项目实战:三极管驱动、按键消抖与中断优先级全解析

在嵌入式入门与课程设计中,51单片机交通灯是一个经典的综合实践项目,它涵盖了状态机建模、信号驱动、人机交互与实时响应等核心概念。项目难点往往不在点亮LED,而在于硬件驱动与软件时序的协同:例如三极管作为开关器件,其选型与基极电阻计算直接决定LED灯组的亮度一致性与可靠性;按键消抖则需理解机械触点的物理特性,采用延时确认状态机避免误触发;而中断优先级的合理配置,保证了定时器时基与外部紧急响应的实时性。掌握这些基础原理,不仅能完成一个功能完备的交通灯系统,更能迁移到物联网控制、智能家居等更广泛的嵌入式应用场景。

weixin_34343000的博客 323

基于AT89C52单片机的交通灯控制系统设计与实现

单片机作为嵌入式系统的核心,通过编程控制I/O口实现对外设的精准操作,其原理在于利用定时器中断进行多任务调度,从而构建稳定可靠的实时控制系统。这种技术在工业自动化、智能家居等领域具有广泛应用价值。本文以经典的交通灯控制项目为例,深入剖析了状态机编程思想和数码管动态扫描等关键技术,并详细介绍了AT89C52单片机在电路设计、程序调试中的实践要点,为初学者提供了从理论到实践的完整学习路径。

weixin_33797791的博客 373

STC单片机驱动数码管亮度不够?手把手教你用S8550/S8050三极管搞定(附完整代码)

本文详细解析了STC单片机驱动数码管亮度不足的问题,并提供了使用S8550(PNP型)和S8050(NPN型)三极管的解决方案。通过电路优化和完整代码示例,帮助电子爱好者有效提升数码管显示亮度,适用于各种51系列单片机应用场景。

weixin_30911451的博客 372

单片机引脚驱动电路(负载开关电路)

在低压数字系统中,由微控制器管理很多负载,我们需要在合适的时刻,控制mcu引脚输出高低电平,给某个模块供电。下面介绍一下常用负载开关电路。

及时总结 2676

【单片机基础】单片机数码管驱动函数(三极管驱动)

将单片机数码管显示驱动封装成一个函数,方便需要用到的时候直接调用1、数码管电路原理图2、数码管码表3、位选IO管脚定义4、延时函数5、动态显示一位数码管6、动态显示两位数码管7、动态显示三位数码管8、动态显示4位数码管9、主函数调用示例 1、数码管电路原理图 2、数码管码表 //数码管码表,共阳极 unsigned char leddata[]={ 0xC0, //"0" 0xF9, //"1" 0x

小途的博客 8988

IFIX数据库Datebase当前值问号

IFIX数据库Datebase当前值问号,已解决,亲测有效 在OPC PowerTool有数据的情况下,IFIX数据库Datebase当前值显示???? 问题分析及解决方法 我的IFIX5.8版本,其它版本可参考 打开IFIX工作台:应用程序–任务控制–I/O驱动–OPC Client;查看OPC驱动是否被禁用,点击启动,变成激活状态即可;若点击启动无法激活OPC驱动,需要重新安装OPC驱动,方法如下: 下载I/O Driver文件 下载链接:https://download.youkuaiyun.com/down

Ron_Tso的博客 2759

逆向工程的艺术:如何绕过PDD的长连接机制实现高效抓包

本文深入解析了如何通过逆向工程技术绕过拼多多(PDD)的长连接机制实现高效抓包。详细介绍了动态调试方案、关键函数Hook技巧及流量解密重组方法,帮助开发者在非Root环境下捕获并解析PDD的加密数据。结合Python工具链,实现稳定数据采集,适用于电商数据分析和反爬策略研究。

weixin_29058331的博客 674

PNP型三极管s9012驱动共阳极数码管

1.对于PNP型的三极管s9012,下面是三极管的发射极,基极,集电极的相应位置图。 2.对于三极管来说又可以分NPN,PNP型的,关于他们的工作原理可以去百度直接搜索。 3.一位共阳极数码管的引脚位置图如下 4.因为直接拿单片机的引脚驱动共阳极的数码管,数码管的亮度会比较低。而用三极管来驱动会有效的解决数码管的亮度问题。以下为pnp型三极管驱动共阳数码管的电路图(已验证) 希望可以给大家带来帮助。。 ...

yyyyyrr5的博客 3万+

LPDDR4x 深度解析(3) - SDRAM核心操作机制

本文深入解析LPDDR4x SDRAM的核心操作机制,包括基础架构、刷新操作、读写流程及低功耗设计。详细介绍了存储阵列、地址解码器等关键模块,以及自刷新与自动刷新模式的区别。通过实测数据和技术细节,揭示LPDDR4x在性能优化和功耗控制方面的创新设计,为硬件工程师提供实用参考。

weixin_29278805的博客 308

单片机数码管驱动原理:从静态显示到动态扫描与TM1650芯片应用

数码管作为常见的数字显示器件,其本质是由多个LED组成的模块,通过控制不同段的亮灭来显示字符。其驱动原理涉及数字电路与单片机I/O操作,核心在于电流驱动能力与扫描时序控制。静态显示虽然简单,但消耗大量I/O资源;动态扫描则利用人眼视觉暂留效应,通过快速轮询实现多位数码管分时显示,有效节省硬件资源。在工程实践中,常需配合三极管或专用驱动芯片(如74HC595)增强驱动能力,并注意消影、定时器中断优化以提升稳定性。随着技术发展,集成驱动芯片如TM1650通过I2C接口和内置扫描电路,进一步简化了开发流程,实现了

weixin_33925615的博客 287

CentOS 7下Synopsys DC综合工具安装与配置全攻略(附常见报错解决方案)

本文详细介绍了在CentOS 7操作系统上安装与配置Synopsys Design Compiler(DC)综合工具的完整流程。内容涵盖从系统环境准备、软件安装、许可证配置到实战综合的全过程,并针对DC综合工具在安装和运行中常见的报错问题提供了具体的解决方案,帮助数字IC设计初学者快速搭建稳定的EDA学习环境。

weixin_29159441的博客 257

RK3568笔记十七:LVGL v8.2移植

若该文为原创文章,转载请注明原文出处。本文介绍嵌入式图形库移植到Linux开发板ATK-RK3568上的步骤。

4230

别再死记硬背段码表了!从硬件电路到C代码,彻底搞懂STC单片机驱动数码管的原理

本文深入解析STC单片机驱动数码管的底层原理,从硬件电路设计到C代码实现,详细讲解PNP/NPN三极管(如S8550)的选用逻辑与动态扫描机制。通过对比共阳/共阴数码管的驱动差异,揭示位码数组的硬件映射关系,帮助开发者摆脱死记硬背,真正掌握设计思维。

weixin_42531494的博客 164

YOLOv9改进策略【Neck】| GSConv+Slim Neck:混合深度可分离卷积和标准卷积的轻量化网络设计

实时检测器架构的轻量级设计GsConv。

Limiiiing的博客 1364

基于STC系列单片机实现定时器扫描数码管显示 带数码管开机显示的功能

【代码】基于STC系列单片机实现定时器扫描数码管显示 带数码管开机显示的功能。

CWQLTYH的博客 483

AXI2APB_bridge 设计

此处研究AHB Slave到 APB master的桥接器,实现接口转化,例如下图之后是参数描述

Starry__的博客 4036

【GeoDa实用技巧100例】024:geoda计算全局(局部)莫兰指数Moran‘s I,LISA聚类地图,显著性地图

【GeoDa实用技巧100例】024:geoda计算全局(局部)莫兰指数Moran's I,单变量莫兰指数,双变量莫兰指数计算,LISA聚类地图,显著性地图,Geoda双变量莫兰指数是一种强大的地理空间数据分析工具。

智慧空间实验室 6051

基于STC系列单片机实现定时器0扫描数码管显示定时器/计数器1作为计数器1产生计数的功能

【代码】基于STC系列单片机实现定时器0扫描数码管显示定时器/计数器1作为计数器1产生计数的功能。

CWQLTYH的博客 1230

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

基于STC系列单片机实现外部中断0控制按键调节定时器0产生PWM(脉宽调制)的功能

【代码】基于STC系列单片机实现外部中断0控制按键调节定时器0产生PWM(脉宽调制)的功能。

CWQLTYH的博客 989

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

51单片机交通灯项目:三极管驱动、数码管扫描与中断优先级详解

嵌入式开发中,单片机硬件驱动和软件时序设计往往是初学者跨过‘跑马灯’后的第一道坎。驱动电路的电流计算、按键信号的可靠性处理以及中断响应的实时性,直接决定了系统能否稳定运行。三极管作为经典开关器件,通过基极小电流控制集电极大电流,能有效解决IO口驱动能力不足的问题;而数码管动态扫描与状态机消抖则是平衡显示刷新与CPU负载的关键技术。理解这些基础原理后,再结合中断优先级和主循环架构,就能构建一个响应及时、运行稳定的控制逻辑。本文以51单片机交通灯项目为实例,复盘从电路选型到软件框架的完整落地过程,并针对三极管驱

weixin_34378969的博客 260

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: 基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的按键扫描、数码管显示按键值、显示按键LED应用
下一篇: 基于STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的定时器(16位定时模式)应用
CWQLTYH
博客等级 码龄10年 1432粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值