找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7245|回复: 24
打印 上一主题 下一主题
收起左侧

怎么实现用51单片机3个I/O口显示8位数码管?有代码但看不懂,求教。

  [复制链接]
跳转到指定楼层
楼主
  1. /**************************************************************************************
  2. *                              动态数码管显示实验                                                                                                  *
  3. 实现现象:下载程序后数码管从右至左显示0-7。
  4. 注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。                                                                                                                                                                  
  5. ***************************************************************************************/

  6. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

  7. typedef unsigned int u16;          //对数据类型进行声明定义
  8. typedef unsigned char u8;

  9. sbit LSA=P2^2;
  10. sbit LSB=P2^3;
  11. sbit LSC=P2^4;

  12. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  13.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

  14. /*******************************************************************************
  15. * 函 数 名         : delay
  16. * 函数功能                   : 延时函数,i=1时,大约延时10us
  17. *******************************************************************************/
  18. void delay(u16 i)
  19. {
  20.         while(i--);        
  21. }

  22. /*******************************************************************************
  23. * 函 数 名         : DigDisplay
  24. * 函数功能                   : 数码管动态扫描函数,循环扫描8个数码管显示
  25. *******************************************************************************/
  26. void DigDisplay()
  27. {
  28.         u8 i;
  29.         for(i=0;i<8;i++)
  30.         {
  31.                 switch(i)         //位选,选择点亮的数码管,(主要就是这里看不懂,3个I/O口是怎样控制8位数显示的)
  32.                 {
  33.                         case(0):
  34.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  35.                         case(1):
  36.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  37.                         case(2):
  38.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  39.                         case(3):
  40.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  41.                         case(4):
  42.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  43.                         case(5):
  44.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  45.                         case(6):
  46.                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  47.                         case(7):
  48.                                 LSA=1;LSB=1;LSC=1; break;//显示第7位        
  49.                 }
  50.                 P0=smgduan[i];//发送段码
  51.                 delay(100); //间隔一段时间扫描        
  52.                 P0=0x00;//消隐
  53.         }
  54. }

  55. /*******************************************************************************
  56. * 函 数 名       : main
  57. * 函数功能                 : 主函数
  58. * 输    入       : 无
  59. * 输    出             : 无
  60. *******************************************************************************/
  61. void main()
  62. {        
  63.         while(1)
  64.         {        
  65.                 DigDisplay();  //数码管显示函数        
  66.         }               
  67. }
复制代码

实验6:动态数码管显示.rar

17.05 KB, 下载次数: 13

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:351097 发表于 2019-9-27 23:01 | 只看该作者
数码管的选通是用译码器控制的,比如74HC138,只要三个地址输入,就可以控制哪个数码管选通
回复

使用道具 举报

板凳
ID:453974 发表于 2019-9-27 23:19 | 只看该作者
这个是位选端用的74HC138译码器驱动的,另外的数据端使用P0口进行的数据传送,当位选通时,输入对应数据。
回复

使用道具 举报

地板
ID:425825 发表于 2019-9-27 23:21 | 只看该作者
采用了74LS138, 3线-8线译码器
回复

使用道具 举报

5#
ID:149144 发表于 2019-9-27 23:22 | 只看该作者
三个位码 不是直接控制的 数码管,应该是 通过 3-8 译码器 将000 --- 111 转换成 0000 0001 --- 1000 0000
百度  74138
如果想用三根线 个人建议用 74595
回复

使用道具 举报

6#
ID:462827 发表于 2019-9-28 00:59 | 只看该作者
3个引脚通过74HC138译码器来进行位选呗
回复

使用道具 举报

7#
ID:235200 发表于 2019-9-28 02:10 | 只看该作者
程序只用到两个IO口,P0和P2口,P0输出段显码,P2的3位输出到74138进行译码进行位选,每次选中8位数码管的1位,轮流使每1位数码管显示2ms左右达到扫描显示
回复

使用道具 举报

8#
ID:617327 发表于 2019-9-28 02:14 | 只看该作者
可以看一下开发板原理图吗
回复

使用道具 举报

9#
ID:213173 发表于 2019-9-28 05:35 | 只看该作者
本帖最后由 wulin 于 2019-9-28 10:12 编辑

利用38译码器74HC138输入二进制输入000~111,轮流输出11111110~01111111八位驱动低电平
你可以把显示函数DigDisplay()里的“delay(100); //间隔一段时间扫描”改为10000,在低速下观察动态扫描过程
回复

使用道具 举报

10#
ID:332444 发表于 2019-9-28 06:49 | 只看该作者
https://baike.baidu.com/item/译码器/4882151 注释很清楚,虾米不懂没说出来?3个口分别控制8位数码管通过译码器,P0送数码管的段。
回复

使用道具 举报

11#
ID:332444 发表于 2019-9-28 06:59 | 只看该作者
电路图?发出电路图看看。
回复

使用道具 举报

12#
ID:86450 发表于 2019-9-28 08:11 | 只看该作者
你后面可能接了 38译码器。 你要看硬件电路,而不是程序。
回复

使用道具 举报

13#
ID:586438 发表于 2019-9-28 08:47 | 只看该作者
2的3次方 ,3个IO口可以检测出八种不同的状态,每个状态控制一个位选信号。
回复

使用道具 举报

14#
ID:94031 发表于 2019-9-28 08:50 | 只看该作者
要看懂这程序,先要弄清楚数码管显示一个数的原理,就是公共端导通时,段码要送相应码。
回复

使用道具 举报

15#
ID:544092 发表于 2019-9-28 08:55 | 只看该作者
硬件电路上有74LS138之类的译码器,3线-8线
回复

使用道具 举报

16#
ID:155507 发表于 2019-9-28 09:02 | 只看该作者
74138译码器控制的数码管
这个数字芯片属于3线-8线译码器,输入3位,输出8位。
因为3位2进制数可以组成8个状态,即000,001,010,011,100,101,110,111。然后没一种状态的输出是唯一的,8位输出中有一位为0。举个例子:输入假如输入为000,那么输出就是01111111,假如数码管是共阳型,这时第一位数码管就被点亮;假如输入为001,那么输出就是10111111,
这时点亮的数码管就是第二位了;以此类推,输入010时输出就为11011111……一直到输入111,输出11111110。
就是这8种组合。

8位数码管 按顺序先亮第一个再第二个再最后一个
循环的速度很快
看起来就是一起亮的

回复

使用道具 举报

17#
ID:294737 发表于 2019-9-28 09:43 | 只看该作者
网上视频很多,可以看看
回复

使用道具 举报

18#
ID:617572 发表于 2019-9-28 13:55 | 只看该作者
这个要通过74LS138译码器来实现I/O口对数码管的控制
回复

使用道具 举报

19#
ID:529540 发表于 2019-9-28 15:34 | 只看该作者
也可以用专门的led驱动芯片, tm1628 之类的,也是3个io口控制,可以控制很多数码管或led灯
回复

使用道具 举报

20#
ID:575020 发表于 2019-10-4 10:32 | 只看该作者
怎么上面都推荐74ls138,我买了几个74hc138,不知有啥不一样,还买了几个595也不知道咋用呢

回复

使用道具 举报

21#
ID:619205 发表于 2019-10-5 03:46 | 只看该作者
關於原主題的問題,要回答這跟問題還是得看你的開發版,依據程式碼來看,他有很大的可能是使用了編碼器.這你可以找出你的開發版的資料手冊,來看看它到底是則麼做的,如果使用的是編碼,它的原理我和  singrain 的問題一起解答74ls138 HC595是完全不同的東西使用的目的也不一樣,要解釋這兩個的區別,最好還是看它們的資料手冊.

74ls138 是3對8編碼器主要是用來選擇位址,使用編碼器的主要目的,是在有許多元件時,可以只通過N調控制線,控制2^n不同的器件,減少控制線,你可以把它當成開關來看待,解釋這個最快的方式就是上真值表
可以在真值表中看出  74ls138 在使用終將使能角位,以HLL接好後(在電路直接接好就行),可以通過C,B,A 三個角位來控制對應輸出為低准位 000 對應 Y0 , 001 對應Y1  ,010 對應  ,Y2  011對應Y3 以此類推
,而其他沒有被選擇的輸出都為高準位.
如果你的器件是低準位有響應你就可以使用74ls138來擴充你的位址.数码管為例便是共陰極的共同端
, 另外如果你打算使用串利傳輸 可以將G1A與G1B邊連起來當作資料線,這樣你就能控制他的輸出高底準位,而沒有被選中的位址
依然維持高準位.

HC595 是八位元個移位暫存器,其目的是將串列傳輸的值,轉換為並列傳輸,減少資料線,以数码管為例接A~G角位,要解釋這個需要的是時序圖 


PINS 1-7, 15QA " QHOutput Pins
PIN 8GNDGround, Vss
PIN 9QH"Serial Out
PIN 10MRMaster Reclear, active low
PIN 11SH_CPShift register clock pin
PIN 12ST_CPStorage register clock pin (latch pin)
PIN 13OEOutput enable, active low
PIN 14DSSerial data input
PIN 16VccPositive supply voltage
  • 輸出
  • Q0~Q7:8bit並行資料輸出,例如街數碼管的8個腳位。
  • QH′:串聯輸出端,與下一個74HC595的DS相連,實現多個595晶片之間的串聯
  • 輸入
  • DS:序列資料,也就是你要傳出的值
  • SH_CP:移位暫存器的時序輸入。上升沿時移位暫存器中的資料依次移動一位元,即Q0中的資料移到Q1中,Q1中的資料移到Q2中,依次類推;下降沿時移位暫存器中的資料保持不變。
  • ST_CP:存儲寄存器的時序輸入。上升沿時移位暫存器中的資料進入存儲寄存器,下降沿時存儲寄存器中的資料保持不變。應用時通常將ST_CP置為低點平,移位結束後再在ST_CP端產生一個正脈衝更新顯示資料。
  • MR:重置(RESET),低電平時將移位暫存器中的資料清零.
  • OE:輸出允許,高電平時禁止輸出(高阻態)


回复

使用道具 举报

22#
ID:618842 发表于 2019-10-6 15:05 | 只看该作者
你可以百度搜一下38译码器  3个io口控制八个  原理就是  给这三个口不同的电平  刚好就是 8个
回复

使用道具 举报

23#
ID:591676 发表于 2019-10-6 17:33 | 只看该作者
需要使用译码器,比如74h138或者其他的但是要注意带电平类型
回复

使用道具 举报

24#
ID:524818 发表于 2019-10-6 18:21 | 只看该作者
楼上说的都对,是通过38译码器实现三根线控制8种状态,以实现数码管显示内容
回复

使用道具 举报

25#
ID:555516 发表于 2019-10-7 14:39 | 只看该作者
好的  谢谢各位的解答了   问题已经解决了  用3-8线译码器就可以了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表