2016-09-15 22:12:41 baidu_35534327 阅读数 1272
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3410 人正在学习 去看看 朱有鹏

共阳极数码管是指八段数码管的八段发光二极管的阳极(正极)都连在一起,而阴极对应的各段可分别控制,如图(B)所示:

共阴极数码管是指八段数码管的八段发光二极管的阴极(负极)都连在一起,而阳极对应的各段分别控制,如图(C)所示:


共阴级输入高电平有效,共阳级输入低电平有效。


驱动程序如下:

/*seg.c*/

#include "./delay/delay.h"
#define SEGPORT  P0
sbit bit_select = P2^0;    //定义位码位为P2^0口
sbit seg_select = P2^1;    //定义断码位为P2^1口

/*共阴极数码管的0~F的显示*/
unsigned char seg_data[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char bit_data[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void main()
{
    unsigned char i;
    SEGPORT = 0;
	
    /*消除数码管刷新时的重影*/ 
    while(1)
   {
        for(i = 0; i < 8; i++)
	{		
	    SEGPORT = 0x0;
	    seg_select = 1;
	    seg_select = 0;
				    
	    SEGPORT = 0xff;
	    bit_select = 1;
	    bit_select = 0;
				 
	    SEGPORT = seg_data[i];
	    seg_select = 1;
	    seg_select = 0;
				   
	    SEGPORT = bit_data[i];
	    bit_select = 1;
	    bit_select = 0;
				    
	    delay_ms(2);
	}
<pre name="code" class="html">}
/*延时函数*/
/*delay.c*/
<pre name="code" class="html">void delay_us(unsigned char t)
{
    while(--t);
}

void delay_ms(unsigned char t)
{
    while(t--)
    {
	delay_us(245);
	delay_us(245);
		
     }
}

void delay_s(unsigned char t)
{
    while(t--)
    {
        delay_ms(200);
	delay_ms(200);
	delay_ms(200);
	delay_ms(200);
	delay_ms(200);
    }
}

/*delay.h*/


#ifndef _DELAY_H_
#define _DELAY_H_

extern void delay_us(unsigned char t);
extern void delay_ms(unsigned char t);
extern void delay_s(unsigned char t);

#endif






2015-06-06 16:13:57 gotoAndPlay1 阅读数 684
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3410 人正在学习 去看看 朱有鹏

对于数码管的操作相比于流水灯复杂一点,但也只是一点而已,不必畏惧;

接下来让我们来了解一下数码管的工作原理:

数码管有8位,每位有8段(其实是7段外加一个点),运用代码控制点亮哪一段。

首先数码管分为共阴极和共阳极两种,而我们常用的单片机即51单片机是共阴极的,什么叫共阴极呢?其实从字面就可以想象,就是有一极共同接地(数码管有8个)。

前面我说过,数码管比流水灯麻烦一点,是因为数码管是位选和段选共同控制的。

新手可能会疑惑,为什么会有段选和位选,首先我们来说一下位选和段选的分别作用:

位选是控制选中的是哪个数码管和以及选中了哪一个;

段选是控制选中的数码管的哪一段(一个数码有7段外加一个点);

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include<reg52.h>

//头文件中已给出P2^6和P2^7的地址

sbit we = P2^7;

sbit du = P2^6;


unsigned int a ;


void main()

{

      //段选为低电位给1点亮

du = 1;//打开
P0 = 0xff;//第一位是最后一个点

du = 0;//关闭

      //避免程序混乱,延迟一下

a = 10000;

while(a--);

         //位选是高电位给0点亮

we = 1; //打开
P0 = 0x55;//第一位是最后一个数码

we = 0;//关闭

       //暂停在此处,即点亮的会一直处于点亮状态

while(1);
}
2018-07-23 20:28:52 daiyun_102474 阅读数 2666
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3410 人正在学习 去看看 朱有鹏

#include <reg51.h>

#define DataPort P1    //宏定义,如果换接口,只需要修改这里

sbit Seg_Latch = P2^2; //锁存器 段锁存
sbit Bit_Latch = P2^3; //位锁存

unsigned char code Seg_Code[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char code Bit_Code[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char temp[8];

void delay(unsigned char t);
void dataproc(unsigned char n);
void display(unsigned char firstbit, unsigned char num);


void main()
{
    unsigned char i;
    while(1)
    {
        for(i = 0; i < 100; i++)
        {
            dataproc(i);
            display(0, 3);
        }
    }
}


void delay(unsigned char t)
{
    while(--t);
}

void display(unsigned char firstbit, unsigned char num)
{
    unsigned char i;
    unsigned int j;
    for(j = 0; j < 2000; j++)
    {
        for(i = 0; i < num; i++)
        {
            DataPort = Bit_Code[firstbit + i];//送位码
            Bit_Latch = 1;         //开门
            Bit_Latch = 0;         //关门
        
            DataPort = Seg_Code[temp[i]];    //送段码
            Seg_Latch = 1;         //开门
            Seg_Latch = 0;         //关门
            
            DataPort = 0x00;    //送段码
            Seg_Latch = 1;         //开门
            Seg_Latch = 0; 
            
            delay(10);
            //DataPort = 0x00;
        }
    }
}

void dataproc(unsigned char n)
{
    unsigned char i;
    for(i = 0; i < 3; i++)
    {
        temp[2 - i] = n % 10;
        n /= 10;
    }
}

/*
void DelayUs(unsigned char n)
{
    while(--n);
}

void DelayMs(unsigned char n)
{
    while(n--)
    {
      DelayUs(245);
      DelayUs(245);
    }
}    
    unsigned char i;    
    while(1)
  {        
      for(i = 0;i < 10;i++)
      {
            DataPort = 0;          //先清除数据
        Seg_Latch = 1;         //开门
        Seg_Latch = 0;         //关门
            
                            
            DataPort = 0xbf;       //送位码
            Bit_Latch = 1;         //开门
            Bit_Latch = 0;         //关门
        
            
            DataPort = Seg_Code[i];//送段码
            Seg_Latch = 1;         //开门
            Seg_Latch = 0;         //关门
            
            for(j = 0;j < 10;j++)
            {
                P1 = ~Seg_Code[j];
                DelayMs(200);
            }    
            DelayMs(200);          //选择合适的数据,使现象稳定
      }
  }    
    */

2018-11-10 22:20:09 qq_19799765 阅读数 6673
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3410 人正在学习 去看看 朱有鹏

特别鸣谢:HFUTer-朱聪强

一、LED数码管简介

LED数码管(LED Segment Displays)是由多个发光二极管封装在一起组成的器件。常见的LED数码管为“8”字型的,共计8段。每一段对应一个发光二极管。
在这里插入图片描述
数码管有共阳极共阴极两种

  • 共阴极: 数码管的发光二极管的阴极连在一起,通常公共阴极接地。当阳极为高电平时,发光二极管点亮。
  • 共阳极: 数码管的发光二极管的阳极连在一起,公共阳极接正电压,当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段被显示。
    在这里插入图片描述

二、数码管静态显示

数码管静态显示就是无论多少位LED数码管,同时处于显示状态

为了使数码管显示不同的符号或数字,只需要把某些段发光二极管点亮就可以了。
假设在共阴极的数码管上显示字符'0',需要将a、b、c、d、e、f置为高电平,即数码管八位输入为0011 1111,对应的16进制数为0X3F。所以我们只需要在程序中将0X3F赋值给对应的端口,如下:

//假设数码管与P0端口相连接
P0 = 0X3F;//显示字符‘0’

按照上述方法,显示各种字符的8段LED数码管的段码如下:
在这里插入图片描述
搭建仿真电路如下
在这里插入图片描述

例程如下:

/******************************************************************************	
* 名称:单只数码管循环显示0~9
* 说明:主程序中的循环语句反复将0~9的段码送至P0口,使数字0~9循环显示
******************************************************************************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

//共阳数码管编码表
uchar code table1[] =
{0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};

//共阴数码管编码表
uchar code table2[] =
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

//延时
void DelayMS(uint x)
{
	uchar t;
	while(x--) 
  for(t=0;t<120;t++);
}

//主程序
void main()
{
	uchar i=0;
	P0=0x00;
	for(; i < 10; ++i)
  {

    P0 = table2[i];
    if(i == 9)
      i = 0;
	 DelayMS(300);
  }
  while(1);
}

三、数码管动态显示

如果有两位的数码管,每个数码管要显示不同的字符,那么电路该怎么搭建呢?
像这样???
在这里插入图片描述
可以是可以,但是占用了太多端口,如果要同时显示4位、8位数码管,单片机的端口显然就不够用了。
因此,对于多位数码管,经常使用动态扫描的方法来显示:
无论在任何时刻只有一个LED数码管处于显示状态,利用人的视觉暂留效应,依次显示每个不同的数码管。某一时刻,只有一位LED数码管被选通显示,其余位则是熄灭的,人眼看到的是若干位稳定的同时显示的字符
搭建仿真电路如图:
在这里插入图片描述
例程如下:

/******************************************************************************	
* 名称:8只数码管动态显示多个不同字符
* 说明:数码管动态扫描显示0~7。
******************************************************************************/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//共阳数码管编码表
uchar code table1[] =
{0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};

//共阴数码管编码表
uchar code table2[] =
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
//延时
void DelayMS(uint x)
{
  uchar t;
  while(x--) 
    for(t=0;t<120;t++);
}
//主程序
void main()
{
  uchar i,wei=0x80;
  while(1)
  {
    for(i=0;i<8;i++)
    {		
	  P0=0xff;
	  P0=table1[i];  //发送段码
	  wei=_crol_(wei,1);
	  P2=wei;		   //发送位码
	  DelayMS(2);
    }
  }
}

编译、烧录,实验效果如图:
在这里插入图片描述

2014-05-29 23:25:21 u014304261 阅读数 6273
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3410 人正在学习 去看看 朱有鹏

前言:学机械的,软硬兼修必需!从基础再学起。


1. 基础


(1)数码管(7SEG-MPX4-CC-BLUE)

    数码管是一种半导体发光器件,其基本单元是发光二极管。下见数码管结构图。


    按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮;反之为高电平时不亮。

    共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。

    数码管按段数分为七段数码管和八段数码管(多一个小数点显示);按能显示多少个“8”,可分为1位、2位、3位、4位等数码管。

    驱动方式分静态式和动态式两类。静态驱动编程简单,显示高度高,但占用I/O端口多,增加硬件电路的复杂性;动态驱动通过分时轮流控制各个数码管的选通控制打开,就使各个数码管轮流受控显示。只要扫描的速度足够快,二极管的余辉效应给人印象就是一组稳定的显示数据,不会有闪烁感,能够节省大量的I/O端口,而且功耗更低。

2. 仿真电路设计


(1)元件:

    单片机(AT89C51)、4位共阴极数码管(7SEG-MPX4-CC-BLUE)。

(2)内容:

    对于数码管,P1段控,P2位控。

(3)电路连线:


3. 程序设计


(1)内容:

    共阴极数码管,低电平位有效;数码管位控以逐位显示,段控以输出当位内容;数码管发光,各位显示延时,产生常亮错觉。

(2)代码:

#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
 
void Delay(uint);
voidLedScan(void);
 
// common cathode(共阴极)
// Led code, "0~9, A~F"
ucharLedOfNum[] =
{
       0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,
       0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};

/******************** Main function ********************/
void main(void)
{
       P2 = 0xFF;
       while (1)
       {
              LedScan();
       }
}
 
/******************** Led scan ********************/
// P1控制段码显示
// P2位控(共阴极)
voidLedScan(void)
{
       uchar k;
       for (k=0; k<150; k++)
       {
              P1 = LedOfNum[2];
              P2 = 0x0E;     // 0000 1110B
              Delay(1000); 
              P1 = 0x00;     // 0000 0000B
 
              P1 = LedOfNum[3];
              P2 = 0x0D;     // 0000 1101B
              Delay(1000);
              P1 = 0x00;     // 0000 0000B
 
              P1 = LedOfNum[5];
              P2 = 0x0B;     // 0000 1011B
              Delay(1000);
              P1 = 0x00;     // 0000 0000B
 
              P1 = LedOfNum[8];
              P2 = 0x07;     // 0000 0111B
              Delay(1000);
              P1 = 0x00;     // 0000 0000B
       }
}
 
/******************** Delay function ********************/
void Delay(uint x)
{
       uchar k;
       while (x--)
              for(k=0;k<125; k++) ;
}

4. 仿真操作


(1)装入HEX文件,运行。

(2)运行结果:

    a. 常显

 

    b. 分解(改延时delay1000)






5. 实物确认

一开始有两根线接错,后来再一步步检查线路找出来。延时时间略短,亮度有点不足,或限流电阻太大了。


没有更多推荐了,返回首页