数字温度计单片机课程设计用74LS573驱动4位数码管

数字温度计单片机课程设计用74LS573驱动4位数码管,第1张

在proteus中用74hc573,做数码管显示的仿真。

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

void delay(uint z)

uchar temp,aa,numdu,numwe,bai,shi,ge

uint shu

void init()

sbit dula=P2^6

sbit wela=P2^7

uchar code table[]={

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

0x66 , 0x6d , 0x7d ,

0x07, 0x7f , 0x6f ,

0x77, 0x7c , 0x39 ,0x5e ,0x79 ,

0x71 ,0x00

}

void display(uchar bai,uchar shi,uchar ge)

void main()

{

shu=219

init()

while(1)

{

display(bai,shi,ge)

}

}

void delay(uint z)

{

uint x,y

for(x=zx>0x--)

for(y=110y>0y--)

}

void display(uchar bai,uchar shi,uchar ge)

{

wela=1

P0=0xfe

wela=0

dula=1

P0=table[bai]

dula=0

delay(1)

wela=1

P0=0xfd

wela=0

dula=1

P0=table[shi]

dula=0

delay(1)

wela=1

P0=0xfb

wela=0

dula=1

P0=table[ge]

dula=0

delay(1)

}

void init()

{

TMOD=0x01

TH0=(65536-50000)/256

TL0=(65536-50000)%256

EA=1

ET0=1

TR0=1

}

void timer0() interrupt 1

{

TH0=(65536-50000)/256

TL0=(65536-50000)%256

aa++

if(aa==2)

{

aa=0

shu--

if(shu==10)

{

TR0=0

ET0=0

}

bai=shu/100

shi=shu%100/10

ge=shu%10

}

}

印象中 单片机的四个p口中,只有p0口的驱动能力最差,所以要想输出在点的电流得接上拉电      阻。p0.0当然可以输出高电平,只是它的输出电流有限,电流太小不足以点亮二极管。 你可以在程序里让p0.0输出个高电平(p0.0空接),然后用电压表测一下它的电压就知道了。

p0.0-p0.7都不能够点亮二极管。 p1-p3应该是可以的。

你看看74h573的资料吧。其实我以前用的是三极管,相信这个74h573应该也是同样的道理,只是将电流放大的东西而已。电流放大多少与三极管的参数和输入电流大小有关。不同三极管的电流放大倍数不一样。

为什么名字叫 RLED,难道是red led? 可又标了个'471' 。我也不太明白,不过这个电阻没啥决定性的作用,去掉应该也是可以的。你可以把它短路掉试试。

图画的不对,既然用了锁存器,就要节约IO端口,两个锁存器的输入应该共用一个端口P0或P2

假设为P0

每个锁存器有1个锁存信号L,需占用两条IO线,假设分别接 P1.6和P1.7

由于是动态扫描显示,所以显示函数调用时要放在WHILE或FOR循环中反复运行,才能看见结果

程序如下:

#include<reg52.h>

sbit dula=P1^6//段锁存信号

sbit wela=P1^7//位锁存信号

#define uchar unsigned char

void delay(i)

{

for(j=ij>0j--)

for(k=125k>0k--)

}

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}

void display(uchar qian_c,uchar bai_c,uchar shi_c,uchar ge_c)//4位显示程序

{

P0=table[qian_c] //显示千位

dula=1

dula=0

P0=0xfe

wela=1

wela=0

delay(2)

P0=table[bai_c] //显示百位

dula=1

dula=0

P0=0xfd

wela=1

wela=0

delay(2)

P0=table[shi_c] //显示十位

dula=1

dula=0

P0=0xfb

wela=1

wela=0

delay(2)

P0=table[ge_c] //显示个位

dula=1

dula=0

P0=0xf7

wela=1

wela=0

delay(2)

P0=xff //显示完毕后关闭所有位显示,也可不要,但退出显示程序时会留尾巴,即最后一个数码管还在显示

wela=1

wela=0

}

void main( )

{

 .....//其它代码

 while(1)

  {

display(b1,b2,b3,b4)//调用显示函数

.....//其它代码,不能占用CPU太多时间,否则显示闪烁

  }

}


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

原文地址: http://outofmemory.cn/yw/11570567.html

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

发表评论

登录后才能评论

评论列表(0条)

保存