其实这个很简单,你应该知道如果直接用单片机端口 *** 作的程序
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控制数码管等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)