参考链接:
51单片机七段数码管显示时钟加按键控制—③—74HC595版
51单片机七段数码管显示时钟加按键控制—②—74HC595版
文章目录
- 一、实验内容:
- 二、实验分析:
- 三、仿真图:
- 四、源代码:
一、实验内容:
1.使用七段数码管显示一个时钟
2.编写程序让接在P0口的数码管显示时分秒,秒数每秒加一
3.要求1秒时间间隔使用定时器中断实现
4.七段数码管的位选和段选通过74HC595控制
二、实验分析:
①七段数码管显示屏需要显示数字的话需要知道段码(具体显示的数值)和位码(第 1——8 位)
②单片机传输信息告诉显示屏位码和段码是多少是通过74HC595芯片实现,使用此芯片的好处是能使用更少的引脚控制更多的位(原本需要单片机上8个引脚控制位码,8个引脚控制段值,现在只需要3根引脚即可“无限”扩展)
③单片机是怎么告诉显示器位码和段码是多少的呢,如果是使用8位+8位的话,那么直接就可以通过将配置引脚输出不同的值即可选中段码和位码 。示例
而使用74HC595的话则通过51芯片先发送八位位码,再送八位段码。一个比特一个比特传输,共两个字节,调用两次SendTo595(char byteData)函数。
因为51单片机是8位的不能一次送16位进去,所以分两次执行
8+8位控制举例:例如我拿出P0_0—P0_7 八引脚控制段值,P2_0—P2_7八引脚控制位码。如果我要做第1位显示数字5,那么我只需要在P0八口输出0x6D——0110 1101, P2八口输出0x7F——0111 1111
位码选择:
*注:此处使用的是CC共阴数码管
选择段值 :
七段数码管引脚定义:
(这里的编码显示的是共阳的,共阴没找到相应的图,知道怎么对应就行。)
三、仿真图:
四、源代码:
(注释我感觉写的挺详细的,要看懂的话要先了解74HC595的工作方式)
#include "reg52.h"
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit SER = P0^1;
sbit SCK = P0^0;
sbit RCK = P0^2;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
char duanMa[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
char duanZhi[8]={0,0,0x40,0,0,0x40,0,0};
u16 num1=55,num2=59,num3=23;
static int i = 0;
void SendTo595(char byteData);
void display(u16 num1,u16 num2,u16 num3)
{
char i=0;
static char shi1,ge1,shi2,ge2,shi3,ge3;
shi1=(char)num1/10;
ge1=(char)num1%10;
shi2=(char)num2/10;
ge2=(char)num2%10;
shi3=(char)num3/10;
ge3=(char)num3%10;
duanZhi[0]=smgduan[shi1];
duanZhi[1]=smgduan[ge1];
duanZhi[3]=smgduan[shi2];
duanZhi[4]=smgduan[ge2];
duanZhi[6]=smgduan[shi3];
duanZhi[7]=smgduan[ge3];
i=0;
for(;i<8;i++)
{
SendTo595(~duanMa[i]);
SendTo595(duanZhi[i]);
RCK = 0;
_nop_();
_nop_();
RCK = 1;
}
}
void TimerInit()
{
TMOD|=0X01;
TH0=0X4C;
TL0=0X00;
ET0=1;
EA=1;
TR0=1;
}
void main()
{
TimerInit();
while(1)
{
if(i==20)
{
i=0;
num1++;
if(num1==60)
{
num1=0;
num2++;
if(num2==60)
{
num2=0;
num3++;
if(num3==24)
{
num3=0;
}
}
}
}
display(num3,num2,num1);
}
}
void SendTo595(char byteData)
{
char i=0;
for(;i<8;i++)
{
SER = byteData>>7;
byteData= byteData<<1;
SCK = 0;
_nop_();
_nop_();
SCK = 1;
}
}
void Timer0() interrupt 1
{
TH0=0x4C;
TL0=0x00;
i++;
}
最后也来个动图演示吧
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)