51单片机串口1工作方式0驱动74hc595和74hc164输出数码管
串入并出芯片74HC595应用实例

基于proteus的51单片机仿真实例七十五、串入并出芯片74HC595应用实例标签: proteus单片机实例芯片应用2010-02-24 00:331、本例中利用一片595控制一个数码管显示。
实现了利用3个IO口控制8位数据的输出2、74HC595的控制端口:1)SH_CP(11脚):移位时钟脉冲输入端。
在上升沿时移位寄存器将数据移位2)DS(14脚):串行数据输入端。
本例通过移位运算将每次移位的数据送到PWD寄存器的进位标志位CY,CY再将值传递给DS引脚,8次移位后完成一个字符的串行传送。
3)ST_CP(12脚):锁存脉冲控制端,在上升沿时移位寄存器的数据被传入存储寄存器,这时如果OE端为低电平,传入存储器的数据会直接输出到输出端Q0-Q7。
本例在一个字节的移位操作完成后,通过在ST_CP端产生一个上升沿将数据送出。
4)/MR(10脚):低电平时将移位寄存器数据请0.一般情况下接VCC5)/OE(13脚):高电平时输出端禁止输出(高阻态)。
低电平时允许数据输出使用74HC595的优点是能锁存数据,这样在移位过程中可以保持输出端的数据不变。
而74HC164则没有这种功能。
//利用74HC595实现端口扩展#include <reg51.h> // 寄存器头文件包含#include <intrins.h> // 空操作函数,移位函数头文件包含sbit SH_CP = P2^0; //移位时钟脉冲端口sbit DS = P2^1; // 串行数据输入端口sbit ST_CP = P2^2; //锁存端口unsigned char temp;unsigned char code disp_buff[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管段码表//延时函数void delayms(unsigned int x){unsigned char i;while(x--){for(i = 0;i < 120;i++);}}//串行输入函数void input_595(void){unsigned char i;for(i = 0;i < 8;i++){temp <<= 1; // 数据移位DS = CY; //产生一个时钟上升沿,使数据移位SH_CP = 1; //_nop_();_nop_();SH_CP = 0;}}//数据并行输出函数void output_595(void){ST_CP = 0; // 锁存器端口产生一个上升沿,将数据输出_nop_();ST_CP = 1;_nop_();ST_CP = 0; //锁存数据}//void main(void){unsigned char i;while(1){for(i = 0;i < 10;i++){temp = disp_buff[i]; //数码管显示input_595(); //将一个字节的数据串行输入595output_595(); //595移位寄存器数据传输到存储寄存器,并输出到数据端口 delayms(500);}}}3、在keil c51中新建工程ex63,编写如下程序代码,编译并生成ex63.hex文件4、在proteus中新建仿真文件ex63.dsn,电路原理图如下所示5、将ex63.hex文件载入at89c51中,启动仿真,按动拨码开关,观察运行结果。
MCS-51单片机串口编程及应用介绍

起 始 位
数
据 位
校 验 位
停 止 位
异步通信的帧格式
二、同步通信传送方式
同步传送:以同步字符 同步传送:以同步字符SYN开始连续发 开始连续发 再以同步字符结束, 送,再以同步字符结束,时钟信号同时发 适用高速、大容量的数据传送。 送。适用高速、大容量的数据传送。
开始 同步字符 同步字符 数据段 同步字符 结束 同步字符
工作原理: 工作原理: 发送:CPU执行 执行MOV SBUF,A,将数据送入SBUF SBUF。 发送:CPU执行MOV SBUF,A,将数据送入SBUF。 发送控制器按波特率发生器(定时器构成) 发送控制器按波特率发生器(定时器构成)提供的时钟速 率将SBUF中的数据一位、一位从TXD输出,发送结束时, SBUF中的数据一位 TXD输出 率将SBUF中的数据一位、一位从TXD输出,发送结束时,置 TI=1。 TI=1。 接收:接收控制器按波特率发生器提供的时钟速率从RXD引 接收:接收控制器按波特率发生器提供的时钟速率从RXD引 RXD 脚一位一位接收数据,当收到一个完整字符时,装入SBUF 脚一位一位接收数据,当收到一个完整字符时,装入SBUF 中,同时置RI=1,通知CPU,CPU执行MOV A,SBUF,将数据读 同时置RI=1,通知CPU,CPU执行MOV A,SBUF, RI=1 CPU 执行 入累加器A 入累加器A。 注意:由于SBUF具有双缓冲作用,它可以在CPU读入之前 注意:由于SBUF具有双缓冲作用,它可以在CPU读入之前 SBUF具有双缓冲作用 CPU 开始接收下一数据, CPU应在下一数据接收完毕前读取 开始接收下一数据, CPU应在下一数据接收完毕前读取 SBUF内容 由于串口的接收、发送各自独立, 内容。 SBUF内容。由于串口的接收、发送各自独立,所以可同时发 送及接收,即可以实现全双工通讯。 送及接收,即可以实现全双工通讯。
74HC595与数码管

第十九篇 74HC595与数码管2011-03-08 15:07第十九篇 74HC595与数先引用一句官方语:“74HC595是硅结构的CMOS器件,兼容低电压TTL电路,遵守JEDEC标准。
长话短说,它的功能是8位串行输入并行输出移位寄存器,也就是串行转并行。
下图是封装图:74HC595内部有两个寄存器:8位移位寄存器和8为存储寄存器,下面要PROTEUS做下各个引脚的调试一下可以看出:DS为串行数据输入口;SH_CP为串行时钟输入口,SH_CP每个上升沿到来时,芯片内部的移位寄存高位移出丢失,次高位成为最高位,并在Q7'体现出来(根据Q7'可以看出,74HC595也有串行输寄存器的值输出到存储寄存器,存储寄存器直接和引脚Q0~Q7相连,所以存储寄存器的值会直接反行功能;OE是输出使能,高电平时Q0~Q7为高阻态,低电平时Q0~Q7为存储寄存器的值;MR为低时无效;VCC接电源;GND接地。
好了,所有引脚介绍完了。
有的封装图引脚名字不太一样,功能下面用两片74HC595(U1和U2)分别控制四位数码管(U1)的显示和选位(U2),为了减少连线U1的DS),这样连续向U2的DS写两个字节(第一个是要显示的数字,第二个是位选),就可以连SH_CP,P0.6连DS,P0.7连P0.7ST_CP)就可以操作此四连共阴数码管(注意是共阴,不是上篇示的数字”和“位选”取反即可)。
如下图:这个实验测试下://*********************************************************************************** //功能:LPC2103利用两片74HC595操作四位共阴数码管//说明://用两片74HC595(U1和U2)分别控制四位数码管(U1)的显示和选位(U2),//为了减少连线,两片74HC595串联(U2的Q7'输出到U1的DS),这样连续向U2的DS写//两个字节(第一个是要显示的数字,第二个是位选),就可以显示了。
基于51单片机的74HC164驱动六位数码管显示程序与仿真

P2=0xff; //数码"灭"
}
}
main()
{
separateData(123456);
while(1)
{
display();
}
}
DS_data[2]=dat/100%10;
DS_data[3]=d4]=dat/10000%10;
DS_data[5]=dat/100000%10;
}
void write_164(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
sbit MOSI=P1^1;//符号DSA引脚1数据输入符号DSB引脚2数据输入
unsigned char code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//共阴数码管
基于51单片机的74HC164驱动六位数码管显示程序与仿真
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//74HC164
sbit CLK=P1^0;//符号CP引脚8时钟输入(低电平到高电平边沿触发)
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
51单片机串口工作方式0和1

ACALL DELAY
CLR TI
; 手动清中断标志
RR A ; 循环位移
; 80H、40H、20H、10H、08H …
CLR P1.0
; CD4094 输出并口关闭
MOV SBUF,A ; 数据传出,产生中断
RETI
END
注: 延时子程序 DELAY 未给出
2021/5/15
方式 0 用于扩展并行 I/O口
=
/32
9600bps 1200bps
=
/12/计次/16
计1次 计3次 计3次 计6次 计12次 计24次
9.6kbit/s 实际10.416 = 6MHz/12/计次/16 1
0
2
FDH
1.2kbit/s 实际1.302 = 6MHz/12/计次/32 0
0
2
F4H
时钟振荡频率为6MHz或12 MHz时,产生的比特率偏差较大,
写入SBUF后自动开始发 送
2021/5/15
图5-1
请求中断
CPU响应中断后:CLR TI
5.2 用AT89C51的串行口扩展并行口
5.2.2 用74LS164扩展并行输出口
74LS164:8位串入并出移位寄存器。
图是利用74LS164扩展二个8位并行输出口的接口电路。
每当新数据写入SBUF,即把SBUF中的8位数据以串行移
• 数据区
发送数据区首址 20H,接收数据区首址 40H
• 主频选用
fosc = 6MHz
• T1 设置
,同时RI=0)时,串行口即开始接收数据。RXD为数据输入端
,TXD为移位脉冲信号输出端,也以fosc/12的固定比特率,
单片机74HC595程序应用(附原理图)

×
↑
L
H
×
NC
QHale Waihona Puke ’移位寄存器的内容到达保持寄存器并从并口输出
↑
↑
L
H
×
Q6’
Qn’
移位寄存器内容移入,先前的移位寄存器的内容到达保持寄存器并输出。
H=高电平状态
L=低电平状态
↑=上升沿
↓=下降沿
stcp2=1;//上升沿将数据送到输出锁存器
stcp2=0;
}
void main()
{
uchar i;
while(1)
{
for(i=0;i<2;i++)
{
QR0_5951(DAT[0]);
OUT_5951();
QR1_5952(wei[i]);
OUT_5952();
delay(1);
}
}
}
描述
595是告诉的硅结构的CMOS器件,
STCP
12
存储寄存器时钟输入
OE
13
输出有效(低电平)
DS
14
串行数据输入
VCC
16
电源
功能表
输入
输出
功能
SHCP
STCP
OE
MR
DS
Q7’
Qn
×
×
L
↓
×
L
NC
MR为低电平时紧紧影响移位寄存器
×
↑
L
L
×
L
L
空移位寄存器到输出寄存器
×
74HC164驱动数码管

只要用到一片164就够了,作动态扫描,下面程序是两个数码管动态扫描,164并行输出口再接一片功率驱动芯片,如TD62083。
程序如下:/**************************************//* 74LS164数码管动态显示*//**************************************///-------------------------------------库函数声明,管脚定义------------#include <at89x51.h>#define uchar unsigned charsbit simuseri_CLK=P1^1; //用P1^1模拟串口时钟sbit simuseri_DATA=P1^0; //用P1^0模拟串口数据sbit a0=ACC^0;unsigned char code dis_code[11]={0x28,0x7E,0xa2,0x62, //查表显示0, 1、、9 0x74,0x61,0x21,0x7A,0x20,0x60, 0x01};uchar numer,temp;uchar ge,shi;//----------------------------------------------------------------------------// 函数名称:out_simuseri// 输入参数:data_buf// 输出参数:无// 功能说明:8位同步移位寄存器,将data_buf的数据逐位输出到simuseri_DATA//----------------------------------------------------------------------------void out_simuseri(uchar data_buf){uchar i;i=8;ACC=data_buf;do{simuseri_CLK=0;simuseri_DATA=a0;simuseri_CLK=1;ACC=ACC>>1;}while(--i!=0);}/************************************/void delay(uchar ms) //延时程序{uchar i;while(ms--){for (i=0;i<125;i++);}}/***********************************/void main(){uchar m;while(1){for(temp=0;temp<99;temp++){ge=temp/10;shi=temp%10;for(m=0;m<20;m++) //显示频率200ms加1次{P2_0=0; //位段码numer=dis_code[ge];out_simuseri(numer); //个位移位显示delay(5);P2_0=1;P2_1=0;numer=dis_code[shi]; //十位移位out_simuseri(numer);delay(5);P2_1=1;}m=0;}}}/****************************************/#i nclude<reg51.h>#define uint unsigned int#define uchar unsigned charsbit DAT=P1^1; //模拟串口数据发送端sbit CLK=P1^2;//模拟时钟控制端uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//0-9,-,全灭(共阳字段表)void sendbyte(uchar byte){uchar num,c;num=tab[byte];for(c=0;c<8;c++){CLK=0;DAT=num&0x80; //(0x80即十进制的128, 二进制的10000000 按位发送)CLK=1;num<<=1;}}void delay_50ms(unsigned int t) //50MS演示程序{unsigned int j;for(;t>0;t--)for(j=6245;j>0;j--){;}}main(){unsigned char h;while(1){for(h=0;h<10;h++){delay_50ms(1);sendbyte(h);delay_50ms(10);}h=0;}}下面这段是74ls164 驱动共阴数码管的程序源码#i nclude<reg51.h>#define uint unsigned int#define uchar unsigned charsbit DAT=P1^1;sbit CLK=P1^2;uchar code tab[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xff,0xf6};//0-9,-,全灭void sendbyte(uchar byte){uchar num,c;num=tab[byte];for(c=0;c<8;c++){CLK=0;DAT=num&0x01;CLK=1;num>>=1;}}void delay_50ms(unsigned int t) {unsigned int j;for(;t>0;t--)for(j=6245;j>0;j--){;}}main(){unsigned char h;while(1){for(h=0;h<10;h++){delay_50ms(1);sendbyte(h);delay_50ms(10);}h=0;}}刚开始的时候把74HC164当成了74HC573使了,还看了原理图,半天摸不出个所以然,然后上网查了资料,才知道原来74HC164是串入并出的,此时才知道思考方向出错了。
51单片机74HC595驱动一位数码管显示程序

{
unsigned char i;
for(i=0;i<8;i++)
{
if((dat<<i)&0x80)
MOSI=1;
else MOSI=0;
SCLK=0;
_nop_();
_nop_();
SCLK=1;
}
}
void Out_595()
{
RCLK=0;
sbit MOSI=P1^1;//DS第14脚串行数据输入
sbit RCLK=P1^2;//STCP第12脚存储寄存器时钟输入
unsigned char code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//共阴数码管
_nop_();
_nop_();
RCLK=1;
_nop_();
_nop_();
RCLK=0;
}
main()
{ In_595(Tab[8]);
Out_595();
while(1) ;
}
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCLK=P1^0;//SHCP第11脚移位寄存器时钟输入
sbit MOSI=P1^1;//DS第14脚串行数据输入
sbit RCLK=P1^2;//STCP第12脚存储寄存器时钟输入
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我也是研究了好几天才开发明白的所以废话不多少,直接上硬货
一,代码部分:
(1)相关寄存器配置:
串行口控制寄存器SCON
串行口控制寄存器SCON的格式
D7 D6 D5 D4 D3 D2 D1 D0
SCON SM0 SM1 SM2 REN TB8 RB8 TI RI 98H 位地址9FH 9EH 9DH 9CH 9BH 9AH 99H 98H
SM0、SM1——串行口的4种工作方式选择位
SM0 SM1 方式功能
0 0 0 同步移位寄存器方式
0 1 1 8位异步收发,波特率由定时器控制
1 0
2 9位异步收发,波特率为时钟频率的1/64或者1/32 1 1
3 9位异步收发,波特率由定时器控制
寄存器的十六进制操作控制:
复习一下例子:
SCOM = 0x02
0X02的0代表在高八位,2的位置代表在低八
按照8421 8421顺序操控
scon SM0 SM1 SM2 REN TB8 RB8 TI RI
8 4 2 1 8 4 2 1
还不懂的画再来一个例子明白了就跳过往下:
例如问配置REN置1,发送8位时间置1,接收标志位置1怎么配置
答:0x1A
好接着往下:
(1)代码原创:
#include <reg52.h>
#include <intrins.h>
unsigned char count;
sbit ST_CP = P3^5; //P3^5 串行锁存寄存器时钟RCK,上升沿有效
void main()
{
SCON = 0x00;//工作方式0
while(1)
{
for(count=0;count<8;count++)
{
SBUF = 0x55;
while(!TI)
TI = 0;
//左移一位将高位补给低位,如果二进制数为01010101 那么_crol_(1) 为10101010
}
ST_CP = 1;
_nop_();
_nop_();
ST_CP = 0;
for(count=30000;count>0;count--);//串口通信太快了,延时一下方便看示波器时序
}
}
(1)代码解析
51单片机通过直接操控SBUF寄存器会自动启动发送8位数据,期间TXD作为时钟线,每发送一位都会置1一次时钟线TXD,因此74HC595的SCK引脚只需连接51芯片的TXD引脚即可,51单片机会自动拉高拉低发送.
二,protues仿真部分:
(1),74HC595引脚功能:
9 脚:串行数据出口引脚。
当移位寄存器中的数据多于8个bit位时,会把原来的8个bit 数据一个个重新更新
10脚:MR,低电平时,清空移位寄存器中已有的数据位,一般不需要,接高电平即可。
14脚:DS(SER),串行数据输入引脚
13脚:OE,输出使能控制脚,它是低电才使能输出,所以接GND
12脚:RCK(STCP),存储寄存器时钟输入引脚。
上升沿时,数据从移位寄存器转存到存储寄存器。
11脚:SCK(SHCP),移位寄存器时钟引脚,上升沿时,移位寄存器中的数据位数据整体后移,并接受新的数据位(从SER输入)。
Q0~Q7:并行输出引脚
74HC595数据端:
QA--QH:8位并行输出端,可以直接控制数码管的8个段
QH':级联输出端,可将它接下一个595的SI端
SI:串行数据输入端
74HC595的控制端说明
/SCLR(10脚):低电平时将移位寄存器数据清零,通常接VCC
SCK(11脚):上升沿时数据寄存器的数据移位.QA-QB-.QC....下降沿移位寄存器数据不变(2)74HC164时序及引脚功能:
————————————————。