找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3470|回复: 1
收起左侧

C51单片机+单个74HC595动态扫描6位数码管程序

[复制链接]
ID:424598 发表于 2018-12-9 18:48 | 显示全部楼层 |阅读模式
原理图
74HC595 6位数码管.png


6位时钟数码管说明.jpg


IMG_20181209_125600.jpg

C51 单个74HC595动态扫描6位数码管.7z

11.95 KB, 下载次数: 43, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:424598 发表于 2018-12-9 18:48 | 显示全部楼层
  1. /***********74HC595动态扫描6位数码管************/
  2. //MCU:AT89S52RC
  3. //晶振:11.0592M.
  4. //采用6位数码管
  5. /***************************************************/
  6. #include<reg51.h>
  7. #include <INTRINS.H>
  8. #define uint unsigned int
  9. #define uchar unsigned char
  10. #define nop() _nop_();_nop_();

  11. sbit CLK=P2^0; //74HC595的11引脚
  12. sbit DAT=P2^1; //74HC595的14引脚
  13. sbit RCLK=P2^2;        //74HC595的12引脚
  14. sbit CS1=P2^3; //数码管段位COM1(公共端)即数码管的1脚
  15. sbit CS2=P2^4; //数码管段位COM2(公共端)即数码管的2脚
  16. sbit CS3=P2^5; //数码管段位COM3(公共端)即数码管的3脚
  17. sbit CS4=P2^6; //数码管段位COM4(公共端)即数码管的4脚
  18. sbit CS5=P2^7; //数码管段位COM5(公共端)即数码管的5脚
  19. sbit CS6=P0^7; //数码管段位COM6(公共端)即数码管的6脚

  20. //本程序支持6位共阳和共阴数码管(包插六位时钟)可根据你的数码管是共阴还是共阳,开启下面匹配的tab[]
  21. //                 0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F   全亮 全灭
  22. //uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00,0xff}; //共阳数码管 不显示0xff 全亮0x00 只显示点0x7f
  23. uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff,0x00}; //共阴数码管 不显示0x00 全亮0xff 只显示点0x80
  24. uchar t;
  25. uchar count = 0;

  26. /* //延时函数
  27. void delay(uchar z)
  28. {
  29.         uchar x,y;
  30.         for(x=z;x>0;x--)
  31.                 for(y=120;y>0;y--);
  32. }
  33. */

  34. //写数码管函数
  35. void write595(unsigned char word,uchar k1)
  36. {
  37.         uchar num,c; //变量
  38.         if(k1==1){ //如果k1的值为1,则点亮时钟数码管的:点(如果是普通的四位数码管,则点亮第二位的小数点)
  39.                 num=tab[word]|0x80; //关键就在|0x80
  40.         } else {
  41.                 num=tab[word];
  42.         }
  43.         //循环8个LED
  44.         for(c=0;c<8;c++)
  45.         {
  46.            CLK=0;
  47.            DAT=num&0x80;
  48.            num=num<<1;
  49.            CLK=1;
  50.         }
  51.         RCLK=0;
  52.         //nop();
  53.         //nop();
  54.         RCLK=1;
  55. }

  56. void select1(void)
  57. { //第一位数码管
  58.         CS1=0;CS2=1;CS3=1;CS4=1;CS5=1;CS6=1;
  59. }

  60. void select2(void)
  61. { //第二位数码管
  62.         CS1=1;CS2=0;CS3=1;CS4=1;CS5=1;CS6=1;
  63. }

  64. void select3(void)
  65. { //第三位数码管
  66.         CS1=1;CS2=1;CS3=0;CS4=1;CS5=1;CS6=1;
  67. }

  68. void select4(void)
  69. { //第四位数码管
  70.         CS1=1;CS2=1;CS3=1;CS4=0;CS5=1;CS6=1;
  71. }

  72. void select5(void)
  73. { //第五位数码管
  74.         CS1=1;CS2=1;CS3=1;CS4=1;CS5=0;CS6=1;
  75. }

  76. void select6(void)
  77. { //第六位数码管
  78.         CS1=1;CS2=1;CS3=1;CS4=1;CS5=1;CS6=0;
  79. }

  80. void init() //启动定时器
  81. {
  82.     TMOD=0X01;
  83.     TH0=(65535-46080)/256;
  84.     TL0=(65535-46080)%256;
  85.     ET0=1;
  86.     EA=1;
  87.     TR0=1;
  88. }

  89. void T0_time() interrupt 1 //定时器
  90. {     
  91.         if (count == 20) {
  92.                 t++;
  93.                 count = 0;
  94.         } else {
  95.                 ++count;
  96.         }
  97. }

  98. int main(void) //主程序
  99. {   
  100.         uchar i;
  101.         init(); //启动定时器
  102.         while(1)
  103.    { //无限循环
  104.            if(t>5) {t=0;} //当t>5,则初始为0
  105.            write595(2,0); //要写的值
  106.            select1(); //显示第一位数码管  
  107.            for(i=0;i<10;i++) _nop_();  
  108.            write595(3,1); //要写的值
  109.            select2(); //显示第二位数码管
  110.            for(i=0;i<10;i++) _nop_();  
  111.            write595(5,0); //要写的值
  112.            select3(); //显示第三位数码管
  113.            for(i=0;i<10;i++) _nop_();  
  114.            write595(6,1); //要写的值
  115.            select4(); //显示第四位数码管
  116.            for(i=0;i<10;i++) _nop_();  
  117.            write595(5,0); //要写的值
  118.            select5(); //显示第五位数码管
  119.            for(i=0;i<10;i++) _nop_();  
  120.            write595(t,0); //要写的值
  121.            select6(); //显示第六位数码管
  122.            for(i=0;i<10;i++) _nop_();  
  123.    }
  124. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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