单片机实现并行输入转串行输出6
发布网友
发布时间:2023-10-13 02:57
我来回答
共5个回答
热心网友
时间:2024-11-25 00:55
从PO口采集到并行数据:
MOV A,P0
通过一个I/0接口,P1.0,串行输出:
(协议:P1.0低3ms为通信开始,3ms后定时每1ms送出1位,共8位,没有校验位.11ms后检测到P1.0为高就结束了)
自已写程序吧!
热心网友
时间:2024-11-25 00:55
74hc595是具有8位移位寄存器和一个存储器,三态输出功能。移位寄存器和存储器是分别的时钟。数据在sck的上升沿输入,在rck的上升沿进入的存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输入(si),和一个串行输出(q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能
oe时(为低电平),存储寄存器的数据输出到总线。
qb--|1
16|--vcc
qc--|2
15|--qa
qd--|3
14|--si
qe--|4
13|--/g
qf--|5
12|--rck
qg--|6
11|--sck
qh--|7
10|--/sclr
gnd-|8
9|--qh'
74595的数据端:
qa--qh:
八位并行输出端,可以直接控制数码管的8个段。
qh':
级联输出端。我将它接下一个595的si端。
si:
串行数据输入端。
74595的控制端说明:
/sclr(10脚):
低点平时将移位寄存器的数据清零。通常我将它接vcc。
sck(11脚):上升沿时数据寄存器的数据移位。qa-->qb-->qc-->...-->qh;下降沿移位寄存器数据不变。(脉冲宽度:5v时,大于几十纳秒就行了。我通常都选微秒级)
rck(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常我将rck置为低电平,当移位结束后,在rck端产生一个正脉冲(5v时,大于几十纳秒就行了。我通常都选微秒级),更新显示数据。
/g(13脚):
高电平时禁止输出(高阻态)。如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。
74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。这在串行速度慢的场合很有用处,数码管没有闪烁感。
应用如下:
以下是用c语言编写的,采用动态扫描方式显示0123这四个数字,此程序是经过模拟仿真的。
//#################################################################
//程序名称:8位数码管显示程序
//程序功能:让8位数码管显示display_7leds[8]中的内容
//程序说明:使用时改变display_7leds[8]中的内容,调用wr7leds()函数即可
//#################################################################
#include
<reg51.h>
#include
<intrins.h>
#define
uchar
unsigned
char
#define
uint
unsigned
int
//#############管脚定义#######################
#define
port_led
p0
//led位选信号输入管脚
sbit
sclk=p2^0;
//595移位时钟信号输入端
sbit
st=p2^1;
//595锁存信号输入端
sbit
da=p2^2;
//595数据信号输入端
//#############################################
//共阴极数码管显示代码:7
6
5
4
3
2
1
0
//
a
b
c
d
e
f
uchar
code
led_7seg[16]={0xfc,0x60,0xda,0xf2,//0,1,2,3,
0x66,0xb6,0xbe,0xe0,
//4,5,6,7,
0xfe,0xe6,0xee,0x3e,
//8,9,a,b,
0x9c,0x7a,0x9e,0x8e};//c,d,e,f
//#####################################################
//名称:wr595()向595发送一个字节的数据
//功能:向595发送一个字节的数据(先发低位)
//#####################################################
void
wr595(uchar
wrdat)
{
uchar
i;
sclk=0;
st=0;
for(i=8;i>0;i--)//循环八次,写一个字节
{
da=wrdat&0x01;
//发送bit0
位
wrdat>>=1;
//要发送的数据右移,准备发送下一位
sclk=0;
//移位时钟上升沿
_nop_();
_nop_();
sclk=1;
_nop_();
_nop_();
sclk=0;
}
st=0;
//上升沿将数据送到输出锁存器
_nop_();
_nop_();
st=1;
_nop_();
_nop_();
st=0;
}
//##########################################################
//
延时函数
//##########################################################
void
delay(uint
del)
{
while(del--)
{
;
}
}
//##########################################################
//名称:wr7leds()8个led显示数字函数
//功能:向595发送一个字节的数据,然后发送位选信号
//##########################################################
void
wr7leds(void)
{
uchar
i,wx;
wx=0x01;
//位选信号初始化
for(i=0;i<4;i++)
//循环4次写4个数据
{
wr595(led_7seg[i]);
//传送显示数据
port_led=~wx;
//送位选信号
wx<<=1;
//位选信号左移,准备显示下一个数字
delay(50);
//延时,(决定亮度,和闪烁)
}
}
//##########################################################
//主函数
//##########################################################
main(void)
{
while(1)
{
wr7leds();
//向74hc595发送数据并显示
}
}
热心网友
时间:2024-11-25 00:56
“当然有必要,楼上的朋友你要尊重别人的原创!
不要尽是让别人用595啊,138啊这些东西,这样搞来搞去那电子就都一样了!
”
我说你最好连铬铁也不要用。
热心网友
时间:2024-11-25 00:56
有必要么?这样数据很难处理的,你加个595可以很容易实现。。
热心网友
时间:2024-11-25 00:57
当然有必要,楼上的朋友你要尊重别人的原创!
不要尽是让别人用595啊,138啊这些东西,这样搞来搞去那电子就都一样了!