74HC595标准程序
74HC595完整中文资料之欧阳美创编
74HC595芯片是一种串入并出的芯片,在电子显示屏制作当中有广泛的应用。
74HC595是8位串行输入/输出或者并行输出移位寄存器,具有高阻、关、断状态。
三态。
特点 8位串行输入 8位串行或并行输出存储状态寄存器,三种状态输出寄存器可以直接清除 100MHz的移位频率输出能力并行输出,总线驱动串行输出;标准中等规模集成电路应用串行到并行的数据转换 Remote c ontrol holding register. 描述 595是告诉的硅结构的CMOS 器件,兼容低电压TTL电路,遵守JEDEC标准。
595是具有8位移位寄存器和一个存储器,三态输出功能。
移位寄存器和存储器是分别的时钟。
数据在SCHcp的上升沿输入,在STcp的上升沿进入的存储寄存器中去。
如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。
移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
CPD决定动态的能耗, PD=CP D×VCC×f1+∑(CL×VCC2×f0) F1=输入频率,CL=输出电容 f0=输出频率(MHz) Vcc=电源电压引脚说明符号引脚描述内部结构结合引脚说明就能很快理解 595的工作情况引脚功能表:真值表:74595的数据端:QA--QH: 八位并行输出端,可以直接控制数码管的8个段。
QH': 级联输出端。
我将它接下一个595的SI端。
SI: 串行数据输入端。
74595的控制端说明:/SRCLR(10脚): 低点平时将移位寄存器的数据清零。
通常我将它接Vcc。
SRCK(11脚):上升沿时数据寄存器的数据移位。
QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。
(脉冲宽度:5V时,大于几十纳秒就行了。
74HC595详解
74HC595 详解
工作电压2-6V,推荐5V。
14 脚串行输入:595 的数据来源只有这一个口,一次只能输入一个位,那
幺连续输入8 次,就可以积攒为一个字节了。
13 脚OE 输出使能控制脚:如果它不工作,那幺595 的输出就是高阻态,595 就不受我们程序控制了,这显然违背我们的意愿。
OE 的上面画了一条线,表示他是低电平有效。
于是我们将他接GND。
10 脚SRCLR 位移寄存器清空脚:他的作用就是将位移寄存器中的数据
全部清空,这个很少用到,所以我们一般不让他起作用,也是低电平有效,于是我们给他接VCC。
12 脚RCLK 存储寄存器:数据从位移寄存器转移到存储寄存器,也是需要
时钟脉冲驱动的,这就是12 脚的作用。
它也是上升沿有效。
11 脚SRCLK 移位寄存器时钟输入:当一个新的位数据要进来时,已经进
入的位数据就在移位寄存器时钟脉冲的控制下,整体后移,让出位置。
分析下数据输入和输出过程:
假如,我们要将二进制数据0111 1111 输入到595 的移位寄存器中,下面。
《单片机原理与应用》实验报告-574hc595实验
leds(255);//全灭
}
4.实验操作说明
第一步:连接电路,上传代码;
第二步:观察数码管的显示情况。
5其他说明
无
6.实验结果
数码管依次循环显示:数字1~9,小数点,全熄灭。
见实验5文件夹下视频:74HC595控制8段数码管。
五、教师评语
签名:
日期:
成绩
《单片机原理与应用》实验报告
实验序号:5实验项目名称:74hc595实验
学 号
1507162233
姓 名
杨舫
专业、班
15计算机
实验地点
指导教师
何一凡
实验时间
2016.10.22
一、实验目的
1.了解74hc595的工作原理
2.掌握74hc595的使用方法
3.熟练掌握Arduino设计的流程、方法
二、实验设备(环境)及要求
delay(1000); //暂停1秒钟让你看到效果
}
void loop()
{
leds(249);//1
leds(164);//2
leds(176);//3
leds(153);//4
leds(146);//5
leds(130);//6
leds(248);//7
leds(128);//8
l
1.原理图
2.实际连接图
3.实验程序代码
int latchPin = 4;
int clockPin = 5;
int dataPin = 2; //这里定义了那三个脚
void setup ()
{
pinMode(latchPin,OUTPUT);
74HC595 中文芯片手册(word文档良心出品)
74HC595
8位移位寄存器与输出锁存器
功能描述
这种高速移位寄存器采用先进的硅栅CMOS技术。
该装置具有高的抗干扰性和标准CMOS集成电路的低功率消耗,以及用于驱动15个LS-TTL负载的能力。
此装置包含馈送一个8位D型存储寄存器的8位串行入,并行出移位寄存器。
存储寄存器具有8 TRI-STATEÉ输出。
提供了用于两个移位寄存器和存储寄存器独立的时钟。
移位寄存器有直接首要明确,串行输入和串行输出(标准)引脚级联。
两个移位寄存器和存储寄存器的使用正边沿触发的时钟。
如果两个时钟被连接在一起时,移位寄存器的状态将总是提前存储寄存器的一个时钟脉冲。
该54HC/74HC逻辑系列就是速度,功能和引脚输出与标准54LS/74LS逻辑系列兼容。
所有输入免受损害,由于静电放电由内部二极管钳位到VCC和地面。
产品特点
1低静态电流:80 mA最大值(74HC系列)
2低输入电流为1mA最大
38位串行输入,并行出移位寄存器以存储
4宽工作电压范围:2V±6V
5级联
6移位寄存器直接明确
7保证移频率:DC至30兆赫。
74HC595protues原理图和程序
74hc595;文件名:74hc595.c;功能:使用74HC595制作6位静态显示电路,在数码管上分别显示123456。
;硬件:见图8-4*/#include "pic.h"typedef unsigned char uchar;typedef unsigned int uint;__CONFIG(HS&WDTDIS&LVPDIS);//配置文件,设置为HS方式振荡,禁止看门狗,低压编程关闭#define Dat RB1 //定义串行数据输入端#define Clk R B0 //定义时钟端#define RCK RB2 //定义控制端uchar DispBuf[6]={1,2,3,4,5,6};const uchar DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x8 6,0x8E,0xFF};//定义定形码表void SendData(unsigned char SendDat) //传送一个字节的数据数据{ unsigned char i;for(i=0;i<8;i++){ if((SendDat&0x80)==0)Dat=0;elseDat=1;Clk=0;Clk=1;SendDat=SendDat<<1;}}void Disp(){ uchar c;uchar i;RCK=0; //存储寄存器输入禁止for(i=0;i<6;i++){ c=DispBuf[5-i]; //取出待显示字符,先送高位SendData(DispTab[c]); //送出字形码数据}RCK=1; //存储寄存器输入允许}void main(){ TRISB=0; //设置PORTB为输出Disp();for(;;);}。
74HC595的具体使用的步骤
74HC595 的具体使用的步骤
第一步:目的:将要准备输入的位数据移入74HC595 数据输入端上。
方法:送位数据到_595。
第二步:目的:将位数据逐位移入74HC595,即数据串入
方法:SCK_595 产生一上升沿,将PSI_595 上的数据移入74HC595 中.从低到高
第三步:目的:并行输出数据。
即数据并出
方法:P1.1 产生一上升沿,将由SI_595 上已移入数据寄存器中的数据送入到输出锁存器。
说明:从上可分析:从SCK_595 产生一上升沿(移入数据)和RCK_595 产生一上升沿(输出数据)是二个独立过程,实际应用时互不干扰。
即可输
出数据的同时移入数据。
74HC595 数码管程序
74HC595 数码管程序#include <reg51.h> //51芯片管脚定义头文件#include <intrins.h> //内部包含延时函数 _nop_();#define uchar unsigned char#define uint unsigned intuchar code DAT[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴数码管显示码sbit HC595_sRCLR=P1^0; // 清空移位寄存器sbit HC595_sRCLK=P1^1; // 寄存器输出时钟sbit HC595_RCLK =P1^2; // 移位时钟sbit HC595_OE =P1^3; // 并行输出使能sbit HC595_sER =P1^4; // 串行数据uchar temp;/********************************************************//*/* 延时子程序/*/*******************************************************/void delay(int ms){int k;while(ms--){for(k=0; k<250; k++){_nop_();_nop_();_nop_();_nop_();}}}/********************************************************//* */ /*将显示数据送入74HC595内部移位寄存器 *//* */ /********************************************************/void WR_595(void){uchar j;for (j=0;j<8;j++){temp=temp<<1 ;HC595_sER=CY;HC595_sRCLK=1; //上升沿发生移位_nop_();_nop_();HC595_sRCLK=0;}}/********************************************************//* */ /*将移位寄存器内的数据锁存到输出寄存器并显示 *//* */ /********************************************************/void OUT_595(void){HC595_RCLK=0;_nop_();_nop_();HC595_RCLK=1; //上升沿将数据送到输出锁存器_nop_();_nop_();_nop_();HC595_RCLK=0;}/********************************************************* * * 主程序 ** * *********************************************************/main(){ ////////////////////////////////////////////////////以下为输出位初始化HC595_OE=1; //并行输出为高阻状态_nop_();_nop_();HC595_sRCLR=0; //清空移位寄存器_nop_();HC595_sER=0; //清零_nop_();_nop_();HC595_RCLK=0; //移位时钟初始为低_nop_();HC595_sRCLK=0; //寄存器时钟初始为低 _nop_();HC595_OE=0; //允许并行输出_nop_();HC595_sRCLR=1; //结束复位状态//////////////////////////////////////////////////循环显示 0--9while(1){uchar i;for (i=0; i<10; i++){temp=DAT[i]; //取显示数据 WR_595();OUT_595();delay(200);}}}。
74hc595的跑表程序
#include<reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit key3=P0^2;//减sbit key2=P0^1;//加sbit key1=P0^0;//定时sbit clk=P1^4;sbit IO=P1^5;sbit rst=P1^3;sbit sck=P1^1;sbit ds=P1^0;sbit rck=P1^2;sbit ACC0=ACC^0;sbit ACC7=ACC^7;uchar k1=0,time;uchar shi=12,fen=34,miao=56;uchar shi1,fen1,miao1;uchar code times[]={0xBF,0x86,0xDB,0xCF,0x0E6,0xED,0xFD,0x87,0xFF,0xEF}; void delay(uint z)//延时程序{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/**********DS1302的程序**********/void InputByte(uchar byte1)//1302-写单字节{ uchar i;ACC=byte1;for(i=8;i>0;i--){IO=ACC0;clk=1;clk=0;ACC=ACC>>1;}return;}uchar OutputByte() //1302-读单字节{uchar i;for(i=8;i>0;i--){ ACC=ACC>>1;ACC7=IO;clk=1;clk=0;}return(ACC);}void write_ds1302(uchar add,uchar date)//1302-写子程序{rst=0;_nop_();clk=0;_nop_();rst=1;InputByte(add);_nop_();InputByte(date);clk=1;_nop_();rst=0;}uchar read_ds1302(uchar add)//1302-读子程序{uchar date;rst=0;_nop_();clk=0;_nop_();rst=1;InputByte(add);date=OutputByte();clk=1;_nop_();rst=0;return(date);}void write_time()//写DS1302时间子程序{write_ds1302(0x8e,0x00); //写保护寄存器shi1=((shi/10)<<4|(shi%10));write_ds1302(0x84,shi1); //时fen1=((fen/10)<<4|(fen%10));write_ds1302(0x82,fen1); //分miao1=((miao/10)<<4|(miao%10));write_ds1302(0x80,miao1); //秒write_ds1302(0x8e,0x80); //写保护寄存器void read_time()//读DS1302时间子程序{miao1=read_ds1302(0x81); //秒寄存器miao=((miao1&0x70)>>4)*10+(miao1&0x0f);fen1=read_ds1302(0x83); //分fen=((fen1&0x70)>>4)*10+(fen1&0x0f);shi1=read_ds1302(0x85); //时shi=((shi1&0x70)>>4)*10+(shi1&0x0f);}/*******HC595***********/void write595(uchar time){uchar i,ge,si,ge1,si1;si1=time/10;ge1=time%10;si=times[si1];ge=times[ge1];for(i=8;i>0;i--){sck=0;//拉低74HC595时钟if((ge&0x80)!=0) ds=1;else ds=0;ge<<=1;sck=1;//拉高74HC595时钟}for(i=8;i>0;i--){sck=0;//拉低74HC595时钟if((si&0x80)!=0) ds=1;else ds=0;si<<=1;sck=1;//拉高74HC595时钟}}/***********显示程序************/void xianshi(){write595(miao);write595(fen);write595(shi);rck=0;_nop_();//延时rck=1;//打入并行数据/**********键盘控制***********/ void keyscan()//键盘控制{if(key1==0){delay(25);if(key1==0){while(!key1);//松开按键k1++;if(k1==4){write_time();k1=0;}}}if(k1!=0){if(key2==0){delay(25);if(key2==0){while(!key2);if(k1==1)//shi{shi++;if(shi==24)shi=0;}if(k1==2)//fen{fen++;if(fen==60)fen=0;}if(k1==3)//miao{miao++;if(miao==60)miao=0;}xianshi();}}if(key3==0){delay(45);if(key3==0){while(!key3);if(k1==1)//shi{shi--;if(shi==-1)shi=23;}if(k1==2)//fen{fen--;if(fen==-1)fen=59;}if(k1==3)//miao{miao--;if(miao==-1)miao=59;}xianshi();}}}}/***********主程序************/ void main(){while(1){if(k1==0){read_time();xianshi();}keyscan();}}。
74HC595 级联数码管编程
74HC595 级联数码管编程这只是一个例程,实际应用中最好用定时器刷新显示,74hc595 内部有锁存器显示所以显示很稳定,亮度高,无频闪,成本低,比用三极管控制的节约成本,减少IO 口占用,电路简单,利于集成化、模块化,且可以无限级联扩展。
如果需要进一步控制亮度的话就把13 脚引出用PWM 的方法进行亮度控制。
#include <stc12c5620ad.h>#define uchar unsigned char#define uint unsigned intsbit sclk=P3^4; //sclksbit rclk=P3^3; //rclksbit sda=P3^2; //sdaunsigned char code shu[]= //数字编码{0xc0,0xf9,0xa4,0xb0,0x99, //0,1,2,3,40x92,0x82,0xf8,0x80,0x90 //5,6,7,8,9};unsigned char code wei[]= //位选编码{0xff,0x80,0x40,0x20,0x10, //全亮,1,2,3,40x08,0x04,0x02,0x01 //5,6,7,8};uchar bdata sdat; //声明一个可位寻址变量sbit bdat=sdat^7;void display(unsigned char x,y) //显示子程序(位选,段选){unsigned char k;sdat=x;for(k=0;k<8;k++){sclk=0;sda=bdat;sdat<<=1;sclk=1;}sdat=y;for(k=0;k<8;k++){sclk=0;sda=bdat;sdat<<=1;sclk=1;}rclk=1;rclk=0;}void init(void) //初始化函数{}void main(void) //主函数{init();while(1){display(wei[1],shu[1]);display(wei[2],shu[2]);display(wei[3],shu[3]);display(wei[4],shu[4]);display(wei[5],shu[5]);display(wei[6],shu[6]);display(wei[7],shu[7]);display(wei[8],shu[8]);}}。
74HC595驱动数码管C程序
/*************************************
用途:
注意:内部8M晶振
************************************************/
#include "config.h"
volatile unsigned int countnum=0;
extern void HC_595_OUT(unsigned char data);
extern void Seg7_Led_Update(void);
extern void Seg7_Led_display(unsigned int data);
extern void Seg7_Led_float(float data);
文件:spi.h
用途:
注意:内部8M晶振
************************************************/
#ifndef __spi_H__
#define __spi_H__
#define SS 0
#define SCK 1
#define MOSI 2
#define Seg7_Bitselect_DDR DDRB
#define Seg7_Bit0 4
#define Seg7_Bit1 5
#define Seg7_Bit2 6
#define Seg7_Bit3 7
#define dp 7
#define Seg7_Bit0_En() {Seg7_Bitselect_DDR|=(1<<Seg7_Bit0);Seg7_Bitselect_PORT|=(1<<Seg7_Bit0);}
单片机驱动74HC595的c51程序
单片机驱动74HC595的c51程序//该子程序为74HC595 发送字符的程序,该程序是先发送的是最低位!//芯片74HC595 的时钟引脚为第11 脚//芯片74HC595 的数据引脚为第14 脚//芯片74HC595 的锁存引脚为第12 脚//当有多片74HC595 串联时,只有当所有数据都发送完成后,再锁存信号!//同样74hc164 与51 单片机连接也可以由这个程序来驱动#include#define uchar unsigned char#define uint unsigned int sbit clk=P3 ;sbit dat=P3;sb it shuo_cun=P3;uchar volatile e,f;uchar code tab[]={0x03,/*0*/0x9F,/*1*/0x25,/*2*/0x0D,/*3*/0x99,/*4*/0x49,/*5*/0x41,/*6*/0x1F,/*7*/0x01,/*8*/0x09,/*9*/};void fa_shon(uchar k) //{uchar i; //定义循环变量for(i=0;i8;i++) //因为是1 字节是8 位,所以循环8 次{dat=k0x01; //将要发送的数据与上0X01 送到数据引脚clk=0; //时钟引脚加低电平clk=1; //时钟引脚加高电平k=1; //将发送的数据右移1 位} }void main() {TMOD=0x01;TH0=15535/256;TL0=15535%256;EA=1;ET0=1;TR0=1;while(1){ uchara;for(a=0;a3;a++){fa_shon(tab[e%10]);fa_shon(tab[e%100/10]);fa_shon(tab[e/100]);}s huo_cun=0; //锁存为低电平shuo_cun=1; //锁存为高电平}}void tt()interrupt1{TH0=15535/256;TL0=15535%256;f++;if(f10){f=0;e++;if(e250)e=0;}}tips:感谢大家的阅读,本文由我司收集整编。
74hc595 操作方法
74hc595 操作方法
74HC595是一种移位寄存器芯片,主要用于扩展输出IO。
以下为74HC595的操作方法:
1. 初始化74HC595芯片:将MR引脚置高,然后将SRCLR引脚置低。
这样可以清空芯片内部的数据,并准备开始向芯片输出数据。
2. 向74HC595芯片输入数据:先将SER引脚置低,然后依次将需要输出的数据位写入到SRCLK引脚上。
当每一位数据都写入完成后,将SRCLK引脚置低。
3. 将输入数据写入到输出寄存器:将RCLK引脚置高,数据就会从SR寄存器中传到输出寄存器中,然后输出到Q0-Q7引脚。
4. 重复以上操作:如需输出更多的数据,可以重复以上步骤,直到所需数据全部输出。
5. 关闭74HC595芯片:当所有数据全部输出后,将SRCLR引脚置高,将输出的数据清空,这样就可以关闭芯片。
需要注意的是,74HC595芯片的工作方式为移位输出,数据在输入时是从高位到低位依次输入的。
因此,在使用时要根据所需输出的数据位数进行相应的控制。
此外,还需要保证输入时序的正确性,以避免在输入时发生错误。
74HC595在单片机上的应用及程序
74HC595在单片机上的应用及程序74HC595具有8位串入并出的三态门电路。
高速率:最高55MHz(5V工作电压)宽的工作电压范围:2V -6V每个口的最大电流值(QA-QH):±35mA当单片机的I/O资源比较紧张时,采用595并进行级联是一个很好的选择。
管脚定义:PIN NO symbol name and function15 QA data output1 QB data output2 QC data output3 QD data output4 QE data output5 QF data output6 QG data output7 QH data output8 GND ground9 QH’ serial data outputs10 /SCLR shift register clock input11 SCK shift register clock input12 RCK storage register clock input13 /G output enable input14 SI serial data input16 Vcc positive supply voltage时序图:请参照595的数据手册程序编制:端口定义设置:sbit DATA=P1^5;sbit SHIFT=P1^6;sbit STORAGE=P1^7;1、写595Void write_595(uchar x)//功能:将无符号8位数x,写入到595的shife register{Uchar j;For(j=0;j<8;j++)//循环8次,以便shift register保存8位数据{X=x<<1;//将数据左移一位,最高位数据进入到CY中SHIFT=0;//shift端置0_nop_();_nop_();_nop_();DATA=CY;//将一位数据送入595串口数据端SHIFT=1;//shift端产生一个上升沿,数据就送入到了shift register_nop_();//延时_nop_();_nop_();SHIFT=0;//shift端产生一个下降沿,shift register内容保持不变}}3、595数据的输出/********595输出函数函数*******************/void out_595(void){STORAGE=0;_nop_();_nop_();STORAGE=1;//上升沿shift register 的内容保存到store register _nop_();_nop_();STORAGE=0;//下降沿store register 的内容保持不变}4、只要在主函数中分别调用以上两个函数即可将要显示的数值X 显示出来。
74HC595按键显示实用程序
74HC595按键显示程序#include<reg51.h>#include<intrins.h>sbit DS=P1^1;sbit SH_CP=P1^2;sbit ST_CP=P1^3;sbit K1=P1^4;sbit K2=P1^5;sbit K3=P1^6;sbit K4=P1^7;unsigned char code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xc6}; unsigned char code wei[]={0xfe,0xfd,0xfb,0xf7};char num1,num2,num3,num4,su,D,C,num_1,num_2;int A;void delay(int x)//延时{int a,b;for(a=0;a<=x;a++)for(b=0;b<=110;b++);}void num_in(char su)//数据输入{int j;for(j=0;j<8;j++){SH_CP=0;DS=su&0x80;su<<=1;SH_CP=1;_nop_();}}void num_out()//数据输出{ST_CP=0;ST_CP=1;_nop_();}void display()//显示子程序{num_in(wei[0]);num_in(duan[num_1]);num_out();delay(3);num_in(wei[1]);num_in(duan[num_2]);num_out();delay(3);num_in(wei[2]);num_in(duan[num3]);num_out();delay(3);num_in(wei[3]);num_in(duan[num4]);num_out();delay(3);}void display_1()//显示子程序1 {num_in(wei[0]);num_in(duan[num1]);num_out();delay(3);num_in(wei[1]);num_in(duan[num2]);num_out();delay(3);num_in(wei[2]);num_in(duan[num3]);num_out();delay(3);num_in(wei[3]);num_in(duan[num4]);num_out();delay(3);}void menu()//菜单程序0~9{switch(D){case 1: {num_1=10; num_2=10; num3=1; num4=11;};break;case 2: {num_1=10; num_2=10; num3=2; num4=11;};break;case 3: {num_1=10; num_2=10; num3=3; num4=11;};break;case 4: {num_1=10; num_2=10; num3=4; num4=11;};break;case 5: {num_1=10; num_2=10; num3=5; num4=11;};break;case 6: {num_1=10; num_2=10; num3=6; num4=11;};break;case 7: {num_1=10; num_2=10; num3=7; num4=11;};break;case 8: {num_1=10; num_2=10; num3=8; num4=11;};break;case 9: {num_1=10; num_2=10; num3=9; num4=11;};break;case 0: {num_1=10; num_2=10; num3=0; num4=11;};break;}}void xiugai() //修改按键{if(K2==0){delay(3);if(num1==10)num1=0;if(K2==0)num1++;while(!K2)display();}}void tuichu(){if(K1==0){delay(3);if(K1==0)A=!A;while(!K1)display();}}void shezhi() //设置按键{while(K1==1){int c,d;for(c=0;c<20;c++){xiugai();display_1();}for(d=0;d<20;d++){xiugai();display();}}}void xianshi()//显示按键{if(K1==0){delay(3);if(K1==0){while(K4==1)display_1();}while(!K1)display();}}unsigned char keyuse()//按键程序{if(K1==0){delay(3);if(K1==0)A=!A;while(!K1)display();}if(K2==0){delay(3);if(K2==0);while(!K2)display();}if(K3==0){delay(3);if(K3==0)shezhi();while(!K3)display();}if(K4==0){delay(3);if(K4==0){if(D==10)D=0;menu();D++;}while(!K4)display();}}void main()//主程序{while(1){keyuse();display();xianshi();}}。
74hc595串联编程2009
74hc595串联编程2009-02-16 18:46分类:默认分类字号:大中小做了个51的开发板,功能比较多,但是PIN资源就这么多,对于一些比较简单的功能模块作了串并处理。
板里8个LED灯和X8的led数码管,如果直接连接到单片机上要使用12个管脚,稍作处理,只要3个就行。
先说595的使用,关键是11脚CLK控制为上升沿时,串行数据输入移位寄存器,输入后看12脚STCP,如果是上升沿就并行输出,这里是三个过程,输入允许-》串行输入-》输出允许,这三个过程要处理好先后问题,我编程的时候就是用循环将这三个过程层次化。
/**********************************************************************************************************************LED灯为末级,SEG8选通信号为次级,首级是段码。
*************************************************************************************/#include"reg52.h"#define uchar unsigned char#define uint unsigned intuchar bdata outbyte;sbit bitout outbyte^7;sbit bout = P1^5; //位输出sbit sclk = P1^6; //输入允许同步信号sbit slclk = P1^7; //输出允许信号uchar code segment[]={}; //这里要看是共阴还是共阳uchar code tab[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x800}; //led显示void leddisp(uchar i , uchar location, uchar m){uchar j;outbyte=tab[m];for(j=0;j<8;j++){bout = bitout;sclk=0;sclk=1;sclk=0;outbyte = outbyte<<1;}outbyte=location;for(j=0;j<8;j++){bout = bitout;sclk=0;sclk=1;sclk=0;outbyte = outbyte<<1;}outbyte=segment[i];for(j=0;j<8;j++){bout = bitout;sclk=0;sclk=1;sclk=0;outbyte = outbyte<<1;}slclk = 0;slclk = 0;slclk = 0;}void main(){uchar i=0;uchar location=1;uchar m=1;while(1){leddisp(i,location,m);i++;location = location<<1;if(i == 8){i = 0;location = 1;}}}。
74hc595驱动数码管实例程序
/*************************************程序内容:利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”。
到此保持住。
编写人:李英杰硬件支持:12MHz、74hc595驱动数码管、对应YL-48开发板时间:2012.8.22备注:参考郭天祥《十天学会单片机》***************************************/#include<reg52.h>#include<intrins.h>#define uint unsigned int //宏定义#define uchar unsigned char //宏定义unsigned char code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0,0xc7,0xc7,0x86,0x89}; // 共阳数码管位码值unsigned char code wei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};unsigned char disbuf[]={7,6,5,0,0,0,10,11,12,13,14};//数码管初值sbit si=P2^2;sbit sclk=P2^4;sbit slck=P2^3;//void senda();void send();void out();void init();void delay (unsigned char h);uint temp,t0,t1,shu,flat,flat1;//flat为流水灯运行标志位、flat1为数码管标志位uchar m,n,num;main(){shu=432;// disbuf[3]=shu%10/10;//disbuf[4]=shu/10%10;//disbuf[5]=shu%10;init();while(1){if(flat1==0)//flat1为1,数码管递减中{for(n=0,m=0;n<6,m<6;n++,m++){send();out();}}//while(1);else//当数码管递减完后、显示hello {for(n=6,m=0;n<11,m<5;n++,m++){send();out();}}}}void init(){temp=0xfe;P1=temp;TMOD=0x11;//定时器0、1 工作方式都为1TH0=(65536-50000)/256;//定50ms的初值TL0=(65536-50000)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;}void time0() interrupt 1 //定时器0 子函数{TH0=(65536-50000)/256;TL0=(65536-50000)%256;t0++;if(flat==0){if(t0==10){t0=0;temp=_crol_(temp,1);P1=temp;}}else{P1=0xff;TH0=(65536-50000)/256;//重新定义初值TL0=(65536-50000)%256;t0++;if(t0%10==0)P1=~P1;if(t0==60){TR0=0;P1=0xff;flat1=1;}}}void time1() interrupt 3//定时器1 子函数{TH1=(65536-50000)/256;TL1=(65536-50000)%256;t1++;if(t1==2){t1=0;disbuf[3]=shu/100;disbuf[4]=shu/10%10;disbuf[5]=shu%10;shu--;if(shu==397){TR1=0;flat=1;}//TR0=0;}}/*void senda(void){uint a ;for(a=0;a<8;a++){sclk=0;si=num&0x80;num=num<<1;sclk=1;}}*/void send(void)// 数据传输{uchar a,b;// for(m=0;m<6;m++)// {if(b==0){b++;num=wei[m];for(a=0;a<8;a++){sclk=0;si=num&0x80;num=num<<1;sclk=1;}// senda();}if(b==1){b--;num=duan[disbuf[n]];for(a=0;a<8;a++){sclk=0;si=num&0x80;num=num<<1;sclk=1;}//senda();}// m++;//if(m==6)//m=0;}//}void out()// 数据输出{slck=0;delay(50);slck=1;}void delay (uchar h)//延时0.1ms个单位{while(h--);}。