先上题目:

这一模块主要是数码管显示模块,包括硬件原理图设计与驱动程序等。
参考设计1、http://www.360doc.com/content/16/0425/12/22995076_553624121.shtml

  1. 硬件设计

74HC595是在单片机系统中常用的芯片之一他的作用就是把串行的信号转为并行的信号,常用在各种数码管以及点阵屏的驱动芯片, 使用74HC595可以节约单片机mcu的I/O口资源,用3个I/O就可以控制8个数码管的引脚,他还具有一定的驱动能力,可以免掉三极管等放大电路,所以这块芯片是驱动数码管的神器, 应用非常广泛。这里可以下载74HC595的中文资料http://www.51hei.com/f/74HC595中文资料.pdf

  1. 软件设计

参考程序,这只是一个例程,实际应用中最好用定时器刷新显示,74hc595 内部有锁存器显示所以 显示很稳定,亮度高,无频闪,成本低,比用三极管控制的节约成本,减少 IO 口占用,电 路简单,利于集成化、模块化,且可以无限级联扩展。

如果需要进一步控制亮度的话就把 13 脚引出 用 PWM 的方法进行亮度控制。http://www.mianfeiwendang.com/doc/3a76c188ca965369a7f1212e

#include <stc12c5620ad.h>#define uchar unsigned char74HC595 级联数码管编程#define uint unsigned intsbit sclk=P3^4; //sclksbit rclk=P3^3; //rclksbit sda=P3^2; //sdaunsigned char code shu[]= //数字编码 {0xc0,0xf9,0xa4,0xb0,0x99, //0,1,2,3,40x92,0x82,0xf8,0x80,0x90 //5,6,7,8,9};unsigned char code wei[]= //位选编码 {0xff,0x80,0x40,0x20,0x10, //全亮,1,2,3,40x08,0x04,0x02,0x01 //5,6,7,8};uchar bdata sdat; //声明一个可位寻址变量 sbit bdat=sdat^7;void display(unsigned char x,y) //显示子程序(位选,段选) {unsigned char k;sdat=x;for(k=0;k<8;k++){sclk=0;sda=bdat;sdat<<=1;
sclk=1;}sdat=y;for(k=0;k<8;k++){sclk=0;sda=bdat;sdat<<=1;
sclk=1;
}

参考软件2:
https://zhidao.baidu.com/question/1991596791837750027.html

#define u8 unsigned char   #define u16 unsigned int   sbit MR=P1^6; //寄存器清0,避免数据错位   sbit RCK=P1^5; //并行输出时钟   sbit DS=P1^4; //数据线   sbit CLK=P1^3; //移位输入时钟   void writ_595(u8 dat)   { u8 i;         MR=0; //寄存器清0,避免数据错位   MR=1;   for(i=0;i<8;i++)   {   CLK=0;   if((dat&0x80) == 0x80)   DS = 1; //串行数据输出   else   DS = 0;   CLK=1; //移位输入时钟,上升沿输入   dat<<=1;   }   RCK=0; //并行输出时钟         RCK=1;      }   该子函数可以直接调用,比如writ_595(0xfe);Q0-Q7脚则输出对应的二进制码
  1. 参考文章
    1、http://www.cnblogs.com/lulipro/p/5067835.html
    2、http://www.51hei.com/chip/3978.html

2017年11月11日程序
能读取AD值并且显示在数码管上

#include <reg52.h>
#include <intrins.h>#define uint unsigned int
#define uchar unsigned char
#define _Nop() _nop_()
#define nop() _nop_()//数码管引脚
sbit sclk=P2^0;          //定义HC595第11脚,串行时钟输入端sbit cpla=P2^1;          //定义HC595第12脚,输出锁存脉冲输入端sbit sdat=P2^2;          //定义HC595第14脚,串行数据输入端//adc0832引脚
sbit ADC0832_CLK = P1^4; /*定义ADC控制端口*/
sbit ADC0832_DIO = P1^5;
sbit ADC0832_CS = P2^0;    //低电平使能uchar ADC_flag; /*ADC读取成功标致位*///共阳
//unsigned char code segment[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};// 段码
//共阴
unsigned char code segment[11] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,0x80/*小数点*/};// 段码unsigned char code Wei[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};// 位选
unsigned char led_ram[4];    //显示缓冲区,存放电压值//相关函数声明void delay();//*******延时子函数*******/
void hc595(unsigned char byte);//*****串行输出一个字节子函数******//
void display();//*******显示子函数********//uchar ADC0832_Read(uchar ch);//ADC0832驱动程序
unsigned int ADC0832da_to_Volage(unsigned char da);/*将输入的数据转换成方便的电压值*/
void delay_1ms(uchar x);/*1MS为单位的延时程序*/void main(void)
{uint adc_volage_buff; /*ADC转换后对应电压值缓冲*/uchar adc_db_buff; /*ADC转换值缓冲*///uchar i;delay_1ms(1);while(1){ adc_db_buff = ADC0832_Read(0); /*启动ADC转换*/if(ADC_flag==1){adc_volage_buff = ADC0832da_to_Volage(adc_db_buff); /*将ADC值转换为电压值,方便直观显示*/led_ram[0]=adc_volage_buff/100;//个位led_ram[1]=10;//小数点led_ram[2]=adc_volage_buff%100/10;//小数点后位led_ram[3]=adc_volage_buff%10;//小数点后两位display();   //调显示子程序   }}
}/**********************************************************************************************
**           数码管相关
**
**********************************************************************************************///*******延时子函数*******//void delay(){unsigned int i;for (i=400;i>0;i--);}//*****串行输出一个字节子函数******//void hc595(unsigned char byte){unsigned char i;for (i=8;i>0;i--)     //循环8次{sclk=0;sdat=0x80&byte;       //从最高位开始串行输出byte<<=1;             //向高位移一位,即向左移一位sclk=1;               //上升沿推进一位}}//*******显示子函数********//void display(){unsigned char j,ledbit=0xfe;  //ledbit位码,指向LED4位,最右位for (j=0;j<4;j++)             //循环显示3位{hc595(segment[led_ram[j]]);   //先串行输出段码hc595(ledbit);                //后串行输出位码cpla=1;                       //cpla上升沿输出端锁存cpla=0;ledbit=_crol_(ledbit,1);      //位码向左移一位delay();}}/**********************************************************************************************
**           ADC0832相关
**
**********************************************************************************************/
////////////////以下是ADC0832驱动程序////////////////////////////
uchar ADC0832_Read(uchar ch)
{/*读取ADC的 CH 通道电压值,ADC作为2路单独电压输入*/uchar i;uchar ADC_buff=0;uchar temp=0;ADC0832_CS = 1;ADC0832_DIO = 1;   /*启动位*/ADC0832_CLK = 0;ADC0832_CS = 0;nop();ADC0832_CLK = 1; nop();ADC0832_CLK = 0;ADC0832_DIO = 1;  /*送 SGL/DIF 位 */nop();ADC0832_CLK = 1;nop();ADC0832_CLK = 0;if(ch==0) ADC0832_DIO = 0; //10为通道0;11为通道1   /*送转换通道值*/else ADC0832_DIO = 1;ADC0832_CLK = 1;nop();ADC0832_CLK = 0;nop();  ADC0832_DIO = 1; /*释放DIO端口,转由ADC控制*/nop();ADC0832_CLK = 1;nop();for(i=0;i<8;i++)  /*准备读取8位数据*/  {   nop();ADC0832_CLK = 0;nop();nop();ADC_buff=ADC_buff<<1;if(ADC0832_DIO==1) ADC_buff=ADC_buff+1;  /*读取数据*/ADC0832_CLK = 1;            }for(i=0;i<8;i++){temp = temp>>1;if(ADC0832_DIO==1) temp = temp | 0x80; /*读取校验数据*/ADC0832_CLK = 1;nop();ADC0832_CLK = 0;nop();}ADC0832_CS = 1;ADC0832_CLK = 1;if(temp == ADC_buff) ADC_flag = 1;else ADC_flag = 0;return ADC_buff;  /*返回转换值*/
}/*将输入的数据转换成方便的电压值*/
unsigned int ADC0832da_to_Volage(unsigned char da)
{/*将输入的数据转换成方便的电压值*//*转换公式 volage=da*Vref/256 其中Vref为500(5.00V) , */unsigned int Volage;Volage = da*500/256;return Volage;
}/*1MS为单位的延时程序*/
void delay_1ms(uchar x)
{uchar j;while(x--){for(j=0;j<125;j++){;}}
}

第五届电气学院比赛之XXX——数码管显示模块相关推荐

  1. void函数调用时显示不允许使用不完整的_4位数码管显示模块驱动

    TM1637四位数码管模块是一个带时钟点的4位共阳数码管(0.36英寸)的显示模块,驱动芯片为TM1637,驱动方式为IIC,因此只需2根信号线即可使单片机控制4位8段数码管(数码管8级亮度可调). ...

  2. STM32F103单片机驱动TM1637数码管显示模块

    最近项目中需要用到数码管显示,于是买了一个TM1637芯片驱动的四位数码显示模块,现将调试过程记录一下,方便以后参考. 使用的单片机是STM32F103C8T6最小系统 使用的数码管模块是TM1637 ...

  3. STM32F407控制TM1638按键数码管显示模块

    TM1638按键数码管显示模块 实物图 原理图 tm1638.c文件 #include "tm1638.h" #include "delay.h" // // ...

  4. 4位数码管显示模块TM1637芯片C语言驱动程序

    一.概述 TM1637 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数 字接口.数据锁存器.LED 高压驱动.键盘扫描等电路.芯片手册已上传到资源,需要的可以下 ...

  5. verilog 数码管显示模块

    对于有FPGA开发板的同学们来说,数码管是一个比较常见的外设,那么如何驱动它就是一个问题?本次小白用4位8段的共阳极数码管,来做本次小实验.对了那什么叫做位?什么叫做段? 简单来说,开发板上有几个数码 ...

  6. c语言数码管显示乘法口诀,数码管随机模拟显示乘法口诀实验报告

    宁 波 工 程 学 院 设计与讨论 课程设计报告 课 题 题 目: 数码管随机模拟显示乘法口诀 学 院 名 称: 电子与信息工程学院 专 业: 学生 姓名: 指 导 教 师: 目录 第一章 技术指标 ...

  7. 51单片机入门——动态数码管显示详解

    51单片机:动态数码管显示 - 模块图 - 显示原理 – 消抖 静态数码管技术 + 人眼视觉停留 显示原理类似于以前的 胶片机放影视,也就是只要我切换的速度足够快你就看不出来其实我是一次次显示的(滑稽 ...

  8. Arduino实时时钟设计(TM1637数码管显示)

    设计者:STCode(公众号同名) 1.实时时钟功能介绍 该设计利用DS1302获取时间数据,用4位led数码管显示模块显示当前的年月日信息,并且设计有一个按键,可以切换时间数据. 2. 使用主要器件 ...

  9. 基于FPGA的数字钟——(三)时钟显示模块(数码管)

    基于FPGA的数字钟--(三)数码管显示模块 一.硬件原理 本设计中使用 6 个共阳数码管,可以显示 6 个数字(包含小数点) .电路用 PNP管来反向驱动并且控制列扫描信号来选择哪个数码管.而且所有 ...

  10. TM1638 LED数码显示模块ARDUINO驱动代码

    最近买了块LED数码管显示模块,板上焊接8个数码管,8个独立LED灯,8个独立按键.TM1638驱动芯片,五芯信号接口,5V供电.如下图:         电路图如下: 商家提供的演示代码显示混乱,代 ...

最新文章

  1. Asp.Net中查询域名的Whois信息
  2. android实现多画面播放,可无缝切换小窗/全屏的android播放器实现
  3. 1.10 访问对象的属性和行为
  4. 基于ZXing的二维码,你可以这样改造它
  5. 掌握Python字典的12个例子
  6. Visual Studio 如何创建C/C++项目
  7. [Abp vNext微服务实践] - 搭建租户管理服务
  8. 微信小程序使用函数的方法
  9. 服务器选购seo优化规则,如何选择有利于SEO优化的空间服务器
  10. java使用POST发送soap报文请求webservice返回500错误解析
  11. esxi虚拟机的显卡怎么来的_远程映射图形界面,登录ESXI后台管理,更加方便操作...
  12. 计算机光驱运行功能,电脑如何设置光驱位第一启动项
  13. matlab求解不等式方程组解集,matlab求不等式方程组的可行解
  14. Java 编程规范 -- 易错精简版
  15. 更改系统高亮显示颜色(highlight color)
  16. 如何全链路进行前端性能优化
  17. 预计一季度国内手机市场下滑逾30%;美国或取诺基亚爱立信控
  18. MAC文件误删怎么办?mac数据恢复,亲测很好用的方法
  19. ges resource dynamic和ges enqueues占用较高导致实例终止问题处理
  20. visio新建画图时,拖出来的电气元器件是灰色的

热门文章

  1. 网闸端口限制时,用HaneWin NFS Server来部署单一接口来交互,实现挂载便于访问
  2. Linux-虚拟机封装
  3. spss数据预处理步骤_常用SPSS数据处理方法,你都会吗?
  4. MySQL数据库左右连接
  5. 485转4-20mA信号转换0-10v5v电压电流采集模块
  6. CuteEditor 6.0 在线HTML编辑器的领航者
  7. 地下水数值模拟软件有哪些?GMS、Visual modflow、FEFLOW哪个更好用呢?
  8. Tomcat安装及环境配置(详细教程)
  9. AUTOCAD——标注关联
  10. 2019冬季乙级考试