找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+74hc595芯片控制数码管显示ccx

[复制链接]
跳转到指定楼层
楼主
ID:284412 发表于 2019-5-2 09:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//根据实验现象,对每行程序的功能进行注释!
#include        <reg52.h>  

sbit        P27  = P2^7;//        SER 串行数据输入引脚
sbit        P25  = P2^5;//  RCLK  储存寄存器时钟        
sbit        P26 = P2^6;        // SRCLK 输入数据移位时钟

void Send_595(unsigned char dat);//74hc595发送数据函数声明
void BufToSeg();//数码管显示函数声明
void NumToNuf();//数据转换函数声明
void Delay(unsigned int n);// 延时函数声明

unsigned char code Segcode[]=
{0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F};        //共阴极数码管段码0~9

unsigned char code Bitcode[]=
{0x01,0x02};//第一和第二个共阳极数码管位选码        

unsigned char  DisBuf[2];
unsigned char Count;

/*************主程序*********************************/
void main()
{
        unsigned char m; //定义一个无符号字符型变量m
        while(1)   //大循环
        {
                if(++m==220)  
                {
                        m=0;
                        if(++Count==60)
                                Count=0;
                }                        //延时 1s
                NumToNuf(); //取余取整函数
                BufToSeg(); //显示函数
        }
}
/*****************************************************/
/***************595发送字节程序***********************/
void Send_595(unsigned char dat)        
{               
        unsigned char        i;
        for(i=0; i<8; i++)  //循环是为了将8位数据送入595中
        {
                if(dat & 0x80)        //判断最高位数据 是否为“1”
                        P27 = 1;        //若为“1”,就把1通过 P26发送给74hc595
                else                        
                        P27 = 0;        //若为“0”,就把0通过 P26发送给74hc595
                P26 = 0;
                P26 = 1;  //P26出现上升沿,单片机通过 P26向74hc595发送数据
                dat = dat << 1; //左移一位
        }
}

/*****************毫秒级延时子程序*****************************/
void Delay(unsigned int n)
{
        unsigned char i;//定义一个无符号字符型变量i
        while(n--)
        {
                for(i=0;i<123;i++);
        }
}
/**************两位数取整取余子程序***************************/
void NumToNuf()
{
        DisBuf[0]=Count/10; //取整
        DisBuf[1]=Count%10;        //取余
}
/**************数码管显示子程序***************************/
void BufToSeg()
{
        unsigned char k;
        for(k=0;k<2;k++)
        {
                Send_595(~Bitcode[k]);//发送位选信号,取反后为共阴极数码管,位选第一二个数码管               
                Send_595(Segcode[DisBuf[k]]);//发送段选信号        ,在前两个数码管上显示DisBuf[]的值
                P25 = 0;
                P25 = 1;          // P25出现上升沿,                                                
                Delay(1);        //延时1s        
        }
}

send595.rar

1.12 KB, 下载次数: 12, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:1 发表于 2019-5-2 17:21 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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