单片机中LED显示电路用三极管驱动电路怎么连接啊?四个数码管。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机中LED显示电路用三极管驱动电路怎么连接啊?四个数码管。相关的知识,希望对你有一定的参考价值。

//单片机中LED显示电路用三极管驱动电路四个数码管。可以参考一下

#include<reg52.h>

sbit led0=P3^2;

sbit led1=P3^3;

sbit led2=P3^4;

sbit led3=P3^5;

sbit ledd=P3^7;

unsigned char code table[]=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;

unsigned char g,s,b,d,a;

unsigned  int num;

void delay(unsigned char x)

unsigned char i,j;

for(i=x;i>0;i--)

for(j=110;j>0;j--);

 

void display()

P1=table[d];

led3=0;

delay(5);

led3=1;

P1=table[b];

led2=0;

delay(5);

led2=1;

P1=table[s];

led1=0;

delay(5);

led1=1;

P1=table[g];

led0=0;

delay(5);

led0=1;

void ont()

num=0;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

void main()

ont();

while(1)

if(a==20)

a=0;

ledd=~ledd;

num++;

d=num/1000;

b=num%1000/100;

s=num%100/10;

g=num%10;

display();

if(num==10000)

num=0;

void time_0() interrupt 1

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

a++;

参考技术A 三极管的基极接单片机引脚,集电极接+5V电源和数码管的共阳极,发射极接地。
三极管,全称应为半导体三极管,也称双极型晶体管、晶体三极管,是一种电流控制电流的半导体器件·其作用是把微弱信号放大成幅度值较大的电信号, 也用作无触点开关。晶体三极管,是半导体基本元器件之一,具有电流放大作用,是电子电路的核心元件。三极管是在一块半导体基片上制作两个相距很近的PN结,两个PN结把整块半导体分成三部分,中间部分是基区,两侧部分是发射区和集电区,排列方式有PNP和NPN两种。
参考技术B 三极管B极接电阻到单片机的IO口,剩下的E就接地,C接显示器的段位(这个是共阳的接法) 参考技术C

如果所示即为4个数码管三极管驱动位选。

参考技术D 90系列的三极管有C9011、C9013可以作为驱动开关三极管,其它的都不行。
普遍来说都是C9013的。
90系列三极管极性的辨认方法:引有901*字样的一面朝向你,从你的左手起向右手边,分别是 E(发射极)、B(基极)、C(集电极)。

基于iTOP-4412开发板(精英版)的linux 4.14.2系统LED字符驱动程序设计

一、电路原理图

1、LED灯原理图

开发板底板上有两个LED灯,在开发板使用手册中能够找到其电路原理图如下:

LED2和LED3都用三极管驱动,且三极管基极高电平时导通点亮LED。其中LED2驱动三极管基极与核心板 KP_COL0 引脚连接,LED3驱动三极管基极与核心板 VDD50_EN 引脚连接。

2、核心板原理图

在核心板原理图中我们可以看出KP_COL0 引脚连接到CPU的AA4引脚,也就是说连接到GPL2的D0上了:

在核心板原理图中我们可以看出VDD50_EN 引脚连接到CPU的J2引脚,也就是说连接到GPK1的D1上了:

二、GPIO口操作

1、GPIO口简介

从上面陈述过程能够看出,三星猎户座4412处理器诸多GPIO当中GPK1和GPL2与LED有关,见下图:

2、GPIO口地址

4412的GPIO是通过寄存器操控的,其中GPK与GPL的基地址相同,为:0x1100_0000。GPK1各寄存器如下图:

GPL2各寄存器如下图:

3、GPIO配置寄存器与数据寄存器

GPK1CON寄存器如下图:

从上表中可以看出LED3连接的GPK1_1对应配置寄存器的4至7位,并且赋值为0x1时为输出模式。
GPK1DAT寄存器如下图:

GPL2CON寄存器如下图:

从上表中可以看出LED2连接的GPL2_0对应配置寄存器的0至3位,并且赋值为0x1时为输出模式。
GPL2DAT寄存器如下图:

三、C代码访问GPIO

在linux系统中C语言访问IO内存使用writel()和readl()函数,这两个函数被定义在头文件在io.h当中。

1、配置LED2和LED3引脚为输出引脚

因为LED2连接GPL2_0,所以代码如下:

writel((~(0xf<<0)&readl(GPL2CON_VA))|(0x1<<0),GPL2CON_VA);

因为LED3连接GPK1_1,所以代码如下:

writel((~(0xf<<4)&readl(GPK1CON_VA))|(0x1<<4),GPK1CON_VA);

2、点亮LED2和LED3

因为LED2连接GPL2_0,所以代码如下:

writel(readl(GPL2DAT_VA)|(0x1<<0), GPL2DAT_VA);

因为LED3连接GPK1_1,所以代码如下:

writel(readl(GPK1DAT_VA)|(0x1<<4), GPK1DAT_VA);

3、熄灭LED2和LED3

因为LED2连接GPL2_0,所以代码如下:

writel(readl(GPL2DAT_VA) &(~(0x1<<0)), GPL2DAT_VA);

因为LED3连接GPK1_1,所以代码如下:

writel(readl(GPK1DAT_VA) &(~(0x1<<4)), GPK1DAT_VA);

四、标准字符驱动实现

字符驱动中的基本功能包括设备的注册、设备硬件资源注册、命令接收和LED控制几个部分。代码如下:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/io.h>

#define DRV_NAME "drv_led"
#define DEV_NAME "cdev_led"

#define GPK1_CON_VA GPK1_VA_BASE
#define GPK1_DAT_VA GPK1_VA_BASE+0x1
#define GPK1_PA_BASE 0x11000060

#define GPL2_CON_VA GPL2_VA_BASE
#define GPL2_DAT_VA GPL2_VA_BASE+0x1
#define GPL2_PA_BASE 0x11000100

unsigned int *GPK1_VA_BASE;
unsigned int *GPL2_VA_BASE;

struct cdev cdev;
static struct class *cdev_class;
dev_t dev_id;

int initGPIO(void)

	writel((readl(GPL2_CON_VA)& ~(0xF<<0)) |(0x1<<0),GPL2_CON_VA);
	writel((readl(GPK1_CON_VA)& ~(0xF<<4)) |(0x1<<4),GPK1_CON_VA);
	return 0;


int led_open(struct inode *node, struct file *filp)

	initGPIO();
	return 0;


int setLedData(unsigned int cmd)

	switch (cmd)
   
		case 0:
			writel(readl(GPL2_DAT_VA) &(~(0x1<<0)), GPL2_DAT_VA);
			writel(readl(GPK1_DAT_VA) &(~(0x1<<1)), GPK1_DAT_VA);		  
			break;
		case 1:
			writel(readl(GPL2_DAT_VA) |(0x1<<0), GPL2_DAT_VA);
			writel(readl(GPK1_DAT_VA) &(~(0x1<<1)), GPK1_DAT_VA);		  
			break;
		case 2:
			writel(readl(GPL2_DAT_VA) &(~(0x1<<0)), GPL2_DAT_VA);
			writel(readl(GPK1_DAT_VA) |(0x1<<1), GPK1_DAT_VA);
			break;
		case 3:
			writel(readl(GPL2_DAT_VA) |(0x1<<0), GPL2_DAT_VA);
			writel(readl(GPK1_DAT_VA) |(0x1<<1), GPK1_DAT_VA);
			break;
		default:
			writel(readl(GPL2_DAT_VA) &(~(0x1<<0)), GPL2_DAT_VA);
			writel(readl(GPK1_DAT_VA) &(~(0x1<<1)), GPK1_DAT_VA);		  
   
	return 0;


long drv_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)

   if(arg<4)	printk("arg is: %d\\n",arg);

	setLedData(arg);	//arg can be set 00,01,10,11
	return 0;


static struct file_operations drv_fops =

    .open = led_open,
    .unlocked_ioctl = drv_ioctl,
;

static int cdev_led_init(void)

	alloc_chrdev_region(&dev_id, 0 , 1 , DEV_NAME); 
	cdev_init(&cdev,&drv_fops);
	cdev_add(&cdev, dev_id, 1);
	cdev_class = class_create(THIS_MODULE,DEV_NAME);
	device_create(cdev_class,NULL, dev_id, 0, DEV_NAME);

	request_mem_region(GPK1_PA_BASE,0x08,"led_io_mem1");
	GPK1_VA_BASE = ioremap(GPK1_PA_BASE,0x08);
	
	request_mem_region(GPL2_PA_BASE,0x08,"led_io_mem2");
	GPL2_VA_BASE = ioremap(GPL2_PA_BASE,0x08);

	printk("GPK1_VA: 0x%08x\\n",(unsigned int)GPK1_VA_BASE);
	printk("GPL2_VA: 0x%08x\\n",(unsigned int)GPL2_VA_BASE);

	return 0;


static void cdev_led_exit(void)

	device_destroy(cdev_class,dev_id);
	class_destroy(cdev_class);
	cdev_del(&cdev); 
	unregister_chrdev_region(dev_id,1);


module_init(cdev_led_init);
module_exit(cdev_led_exit);
MODULE_LICENSE("GPL");

以上是关于单片机中LED显示电路用三极管驱动电路怎么连接啊?四个数码管。的主要内容,如果未能解决你的问题,请参考以下文章

单片机的IO驱动LED灯电路,需要用到三极管,求原理图,并说明

想用一个mos管做开关,单片机的I/O口控制一个5V/3W的led灯,用p沟道好还是n沟道的好。应用电路是怎么样?

STM32怎么实现单片机控制LED灯常亮10S后熄灭?

怎样用单片机io口控制大功率led灯亮灭,用1117芯片

单片机驱动多个LED

请问P沟道场效应管改如何驱动啊?为啥我的这个BUCK电路中IRF5305不加驱动信号却一直处于导通状态呢?