亲 想问一下 74hc595驱动3位数码管动态显示 位选直接接51单片机 该如何实现 求程序 谢谢啦 急啊 快愁死了

亲 想问一下 74hc595驱动3位数码管动态显示 位选直接接51单片机 该如何实现 求程序 谢谢啦 急啊 快愁死了,第1张

其实这个很简单,你应该知道如果直接用单片机端口 *** 作的程序

void Display(void){

P2=0XFF;

P0=ShowTable[0];

P2=0XFE;

delaymS(5);

P0=ShowTable[1];

P2=0XFD;

delaymS(5);

P0=ShowTable[2];

P2=0XFB;

delaymS(5);

P2=0XFF;

}

你换成HC595以后,只需要把P0=ShowTable[X];换成用HC595发送ShowTable[X]的数据即可

你定一个unsigned int x,y; 每个一段时间就把x加1,当大于999的时候,就另x=0; 然后你把 y=x/100; ShowTable[0]=LEDDZ[y]; ShowTable[1]=LEDDZ[y/10]; ShowTable[2]=LEDDZ[y%10];

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

uchar count;

uint disnum;

sbit dula=P2^6;

sbit wela=P2^7;

uchar code tabledu[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

display(uchar,uchar,uchar);

delay(uchar);

void main()

{

EA=1;

ET1=1;

TMOD=0x10;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

TR1=1;

while(1)

{

if(count==20)

{

count=0;

// if(disnum==1000)

// disnum=0;

disnum++;

}

display(disnum/100,disnum%100/10,disnum%100%10);

}

}

void tim1() interrupt 3 using 3

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

count++;

}

display(uchar bai,uchar shi,uchar ge)

{

P0=tabledu[bai];

dula=1;

dula=0;

P0=0xfe;

wela=1;

wela=0;

delay(1);

P0=tabledu[shi];

dula=1;

dula=0;

P0=0xfd;

wela=1;

wela=0;

delay(1);

P0=tabledu[ge];

dula=1;

dula=0;

P0=0xfb;

wela=1;

wela=0;

delay(1);

}

delay(uchar x)

{

uchar a,b;

for(a=x;a>0;a--)

for(b=255;b>0;b--);

}

//你自己看一下,有不对的就改点别忘了给分啊

用74hc595控制数码管,也没有什么特别的,一片锁存段码,另一片锁存位码,这样可以控制8位数码管,如果数码管再多,就要增加74hc595。

主要是多片595是串行连接,数据是串行输入的,关键在于写程序上。

用两片74hc595就可以连接8位LED数码管显示电路,足够显示温度了。只需要3个I/O脚,而DS18B20只需要1个I/O脚。

所以,你的单片机还有10个脚,是足够的。

用两片74hc595就可以连接8位LED数码管显示电路和程序,在这里可以搜索到无数例子的。

这个软件解决好像解决不了吧,建议如下方案:

方案1、 在热继电器上加装浪涌抑制器;

方案2、 在输入端加装滤波器

方案3、 将信号线采用屏蔽电缆并将屏蔽层接地

#include <reg51h>

#include <intrinsh>

sbit SH_CP=P2^2;

sbit DS=P2^0;

sbit ST_CP=P2^1;

char code table[]={0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e};

char code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

unsigned char code DSB[]={2,0,1,5,0,7,2,6};

void Delay(unsigned char i)

{

unsigned char j;

for(;i>0;i--)

for(j=120;j>0;j--);

}

void input_595(unsigned char Data)

{

unsigned char i;

for(i = 0;i < 8;i++)

{

SH_CP=0;

DS = Data&0x80;

Data<<=1;

SH_CP = 1;

}

}

void output_595()

{

ST_CP = 0;

ST_CP = 1;

}

void Disp(unsigned char m,unsigned char n)

{

input_595(wei[n]);

input_595(table[m]);

output_595();

}

void Display()

{

unsigned char i;

for(i=0;i<8;i++)

{

Disp(DSB[7-i],i);

}

}

void main(void)

{

while(1)

{

Display();

}

}

你的这个不是乱码就有问题了!~

你仔细理解一下这段

void wr595(uchar dat)

{

uchar a;

for(a=8;a>0;a--)

{

SH_CP=0;

DS=dat&0x80;

dat<<=1;

SH_CP=1;

_nop_();

_nop_();

SH_CP=0;

_nop_();

_nop_();

SH_CP=1;

}

}

你的for循环是有问题的

以为你的每个字节移了多次

所以就乱码了

void wr595(uchar dat)

{

uchar a;

for(a=8;a>0;a--)

{

SH_CP=0;

DS=dat&0x80;

dat<<=1;

SH_CP=1;

_nop_();

_nop_();

}

}

你看看下面的

去掉一个

以上就是关于亲 想问一下 74hc595驱动3位数码管动态显示 位选直接接51单片机 该如何实现 求程序 谢谢啦 急啊 快愁死了全部的内容,包括:亲 想问一下 74hc595驱动3位数码管动态显示 位选直接接51单片机 该如何实现 求程序 谢谢啦 急啊 快愁死了、运用51单片机实现4位8段LED数码管的动态数字显示,写出C语言程序、怎样用74HC595控制数码管等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9314464.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存