求助,关于单片机串行转并行问题!

求助,关于单片机串行转并行问题!,第1张

74HC595是具有8位移位寄存器和一个存储器,三态输出功能。移位寄存器和存储器是分别的时钟。数据在SCK的上升沿输入,在RCK的上升沿进入的存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输入(SI),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能 OE时(为低电平),存储寄存器的数据输出到总线。

QB--|1 16|--VccQC--|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 <reg51h>

#include <intrinsh>

#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,<br>0x66,0xb6,0xbe,0xe0, //4,5,6,7,<br>0xfe,0xe6,0xee,0x3e, //8,9,A,b,<br>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发送数据并显示

}

}

//看看这个程序,可以参考一下。

//0832各种波型输出演示 //P11P10 = 00时 正弦波 //P11P10 = 01时 锯齿波 //P11P10 = 10时 方波 //P11P10 = 11时 三角波 //需要连接的导线://(1)译码器Y0接DAC0832的CS //(2)P36即XWR插孔接DAC0832的WR //(3)8芯的排线连接8排针的P0口和DAC0832的D7-D0 //(4)串并转换区的+5v接DAC0832的参考电压Vref插孔#include <reg51h> #include <ABSACCH>//absacch是C51中绝对地址访问函数的头文件 #define daport XBYTE[0x8000]//将daport定义为外部I/O口,地址8000H,则74ls138的Y0有效 sbit P1_1=P1^1; sbit P1_0=P1^0; unsigned char i,j,k; bit updown; //三角波的上升/下降 unsigned char code sinn[64]={ 198,204,210,216,222,228,233,237,242,245,249,251,253,255,255,255, 255,254,252,250,247,243,239,235,230,224,219,213,207,201,194,188, 181,175,169,163,158,152,147,143,139,136,133,131,129,128,128,128, 129,130,132,135,138,142,146,151,156,162,168,174,180,186,193,199 }; //正弦的数值在128-255之间,所以输出的正弦幅值在0-5v void main(void) { updown=0; i=128; j=0; while(1) { if (P1_1==1) { if (P1_0==0) //输出占空比为25%的方波 { if (j<=40) i=255;//i=255时输出的电压为+5v else if(j<=160) i=0;//i=0时输出的电压为-5v else j=0; } else //输出-5v—+5v的三角波 { if (updown==0) //上升 { if (i==255) updown=1; else i=i+5;//i++; } else //下降 { if (i==0) updown=0;//if(i==128) updown=0;i=128输出的电压为0 else i=i-5;//i--; } } } else{ if (P1_0==0) //正弦波 { i=sinn[j]; if (j>=63) j=0; } else //锯齿波 { if (i==255) i=128; else i++; } } daport=i; for (k=0;k<2;k++); j++; }}

是十进制调整指令,用来在进行十进制运算(BCD码)时进行校正的。

单片机将各功能部件集成在一块晶体芯片上,集成度很高,体积自然也是最小的。芯片本身是按工业测控环境要求设计的,内部布线很短,其抗工业噪音性能优于一般通用的CPU。单片机程序指令,常数及表格等固化在ROM中不易破坏,许多信号通道均在一个芯片内,故可靠性高。

扩展资料:

注意事项:

时钟监控有效与省电指令STOP是一对矛盾。只能使用其中之一。 看门狗技术是监测应用程序中的一段定时中断低电压复位技术是监测单片机电源电压,当电压低于某一值时产生复位信号。

由于单片机技术的发展,单片机本身对电源电压范围的要求越来越宽。电源电压从当初的5V降至33V并继续下降到27V、22V、18V。在是否使用低电压复位功能时应根据具体应用情况权衡一下。

参考资料来源:百度百科-单片机

以上就是关于求助,关于单片机串行转并行问题!全部的内容,包括:求助,关于单片机串行转并行问题!、单片机汇编程序实现DA转换,用DAC0832芯片实现、求教,单片机中的DA指令是指啥啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存