要求:使用数码管显示学号411-03
C51单片硬件电路相关模块:
一.数码管显示模块:
LED1~8端接138译码器的右端,由138译码器的P2_2,P2_3,P2_4三个管口控制,即接在MCU的P2_2,P2_3,P2_4上面,当P2_2,P2_3,P2_4为111时,最左端数码管可以开始工作,P2_2,P2_3和 P2_4为110时,左边第二个数码管可以工作。
二.74HC245芯片:
由于P0端给的电流比较小,不足以支持数码管足够的亮度,故通过74HC245对电流放大使其达到足够的电流大小
三.138译码器
四.MCU模块
主函数如下:
#include
#include
#include"Delay.h"
#include"NiXie.h"
void main()
{
while(1)
{
NiXie(1,4); //第 1 个数码管输出 4
NiXie(2,1); //第 2 个数码管输出 1,下面类比
NiXie(3,1);
NiXie(4,10);
NiXie(5,0);
NiXie(6,3);
}
}
Delay延时函数头文件
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms);
#endif
Delay延时函数:延时以1ms为单位的xms个循环(在12.000MHZ下的单片机)
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
NiXie数码显示函数头文件
#ifndef __NiXie_H__
#define __NiXie_H__
#include
void NiXie(unsigned char Loction,Num);
#endif
NiXie数码显示函数C文件
#include
#include
#include "Delay.h"
unsigned char Table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40}; //0~9,-
void NiXie(unsigned char Loction,Num)
{
switch(Loction)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
//当为111时,138译码器右端输出0111 1111,Y7的非为0低电平,LED8可以工作
case 2:P2_4=1;P2_3=1;P2_2=0;break;
//接下如上
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=Table[Num];
//P0输出相应的数组元素
//数组元素对应的八位二进制接在74HC245输入上,74HC245放大输出在abcdefg和dp上
//共阴dp接低电平0时使用可以工作
//数码管点亮对应的二极管组成数字
Delay(1);
P0=0x00;
//数码管工作时 位选 段选 位选 段选....
//在操作中间过程中,由于单片机太快,上一段的数据会串到下一段数据中去
//如果没有一次清零使全部LED灯管熄灭,那么在LED灯闪烁时容易造成串数据
//经过清零可以 完成 消影
}
共阳极数码管编码表:
unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
共阴极数码管编码表:
unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};