‘壹’ 基于51单片机通过74HC595控制四相步进电机的C程序
我有一个74hc595串入并出控制led程序,你自己改一改就行了。
前提是你还需要一个电机驱动芯片(如l293d,uln2003等)。
/************************************************************************************
* 标题: 试验74HC595驱动8位LED灯(c语言) *
* *
* 连接方法:JP12用条线冒短接 JP1(LED灯接口)和JP2(595接口) 用8PIN排线连接 * *
******************************************************************************** *
*通过本例程了解 74HC595(串入并出)基本原理和使用 *
*3个I/O扩展8个输出,通过片选可以串接更多74HC595芯片,得到更多的输出数 *
* 请学员认真消化本例程,懂74C595在C语言中的操作 *
*此汇编程序留给大家做为课后作业自己完成。关于HC595汇编驱动参考“静态显示(74HC595驱动)”。
*************************************************************************************/
#include <reg51.h>
#include <intrins.h>
#define NOP() _nop_() /* 定义空指令 */
//SPI IO
sbit MOSIO =P3^4;
sbit R_CLK =P3^5;
sbit S_CLK =P3^6;
void delay(unsigned int i); //函数声名
void HC595SendData(unsigned char SendVal);
main()
{ unsigned char Led=0xfe; //1111 1110
HC595SendData(0xff); //初始化595使他为高电平 让LED处于熄灭状态
while(1)
{
HC595SendData(Led); //调用595驱动程序 把LED的数据送到595
Led<<=1;
Led = Led| 0x01; //移位后,后面的位为高电平;
if (Led == 0xff ) Led=0xfe; //1111 1110
delay(200);
}
}
/*****************************************************************************
* 延时子程序 *
* *
******************************************************************************/
void delay(unsigned int i)
{
unsigned int j;
for(i; i > 0; i--)
for(j = 300; j > 0; j--);
}
/*********************************************************************************************************
** 函数名称: HC595SendData
** 功能描述: 向SPI总线发送数据
*********************************************************************************************************/
void HC595SendData(unsigned char SendVal)
{
unsigned char i;
for(i=0;i<8;i++)
{
if((SendVal<<i)&0x80) MOSIO=1; //set dataline high 0X80 最高位与SendVal左移的最高位 进行逻辑运算
else MOSIO=0; // 如果为真 MOSIO = 1
S_CLK=0;
NOP(); //产生方形波
NOP();
S_CLK=1;
}
R_CLK=0; //set dataline low
NOP(); //产生方形波
NOP();
R_CLK=1; //片选
}
‘贰’ 怎么用C语言编写74HC595移位程序
看电路图,行驱动直接接在单片机I/O口上,有问题吧,单片机I/O不管是输入还是输出,都承受不了32LED灯。所以在I/O口上要加放大电路。这个不是小程序,只能说思路。先要明白汉字显示就是点阵显示。根据电路一次最多只能2个汉字,再多就只能滚动或刷屏。所以以2个汉字为基础开始编程。将第一行的点阵(32个位),顺序写入595,输出595.
控制第一行的I/O驱动,点亮第一行。延时5ms将第二行的点阵(32个位),顺序写入595,关第一行,输出595.
控制第二行的I/O驱动,点亮第二行。延时5ms同理,顺序点亮16行。一屏扫描完毕,重复循环,汉字就显示出来了。必须重复循环,否则没显示。
显示滚动效果。滚动效果其实就是控制行点阵的内容,将每行的32个位,右移一位,再写入595,就是滚动效果了。每扫描一屏,移位一个,位扫描多屏,移动一个,可以控制滚动的速度
‘叁’ 两片74hc595实现16位串行移位c程序
/*74HC595写入函数 HC_DATA为要写入的数据*/
void HC595(uchar HC_DATA)//74HC595的写入函数
{ uchar hc_num; //定义一个8位变量 用来做循环8次移位
HC595_STCP=0; //打开开始通讯
for(hc_num=0;hc_num<8;hc_num++)//循环8次 写入变量
{HC595_DS=HC_DATA&0x01; //IO口赋值
HC_DATA=HC_DATA>>1; //数据移位
HC595_SHCP=0; //拉低时钟信号以出现上升沿
HC595_SHCP=1; //钟信号线上升沿时 数据移位
}
HC595_STCP=1; //拉高锁存数据
}
//74HC595操作相关引脚
#define HC595_DS P35 //串行数据输入端
#define HC595_OE P30 //输出允许端 低电平 数据引脚
#define HC595_STCP P31 //上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。
#define HC595_SHCP P36 //上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。) 时钟信号线
调用的话 如果你的变量是16位的那么调用两次
HC595(变量/256);//
HC595(变量%256);//
‘肆’ 求一个C语言程序,5个74hc595级联驱动40个LED跑马灯的简易程序
40个LED其实可以把LED做成矩阵方式连接,就没必要用5片595驱动了啊,你这样感觉硬件电路有点累赘。不过呢你这样做呢程序简单点,是吧。
手上只有2片联级使用的,给你个参考吧,有问题再说
//**********************************
//写595两个字节
行数据
//*****data_A为高字节,data_B是低字节
void
WRITER_595A(data_A,data_B)
{
uint
i,n;
//
data1=datt;
//赋值显示数据
for(i=0;i<8;i++)
//写入第一字节
{
n=data_A
&
0x80;
if(n==0x80)
LS595_DATA_A=1;
else
LS595_DATA_A=0;
LS595_CLOK_A=0;
LS595_CLOK_A=1;
data_A=data_A<<1;
}
for(i=0;i<8;i++)
//写入第二字节
{
n=data_B
&
0x80;
if(n==0x80)
LS595_DATA_A=1;
else
LS595_DATA_A=0;
LS595_CLOK_A=0;
LS595_CLOK_A=1;
data_B=data_B<<1;
}
LS595_SCLK_A=0;
LS595_SCLK_A=1;
LS595_SCLK_A=0;
}
‘伍’ 74hc595单片机c语言程序
void shift_out(uchar g) //移位输出
{
uchar i;
uchar dly=5;
uchar tmp=g;
for(i=0;i<8;i++)
{
if((tmp&0x80)==0x80)
{
DS_out=1;
}
else
{
DS_out=0;
}
SHCLK=0; //移位
dly=2;
while(dly--);
SHCLK=1;
dly=2;
while(dly--);
tmp=tmp<<1;
}
STCLK=0; //锁存
dly=5;
while(dly--);
STCLK=1;
}
‘陆’ 74HC595咋编程控制
sbit _LCLK = LCLK;
sbit _SCLK = SCLK;
sbit _DATA = DATA;
/*******************************************************************************
函数功能:向一片595发送数据
输入参数:数据的地址
输出参数:无
*******************************************************************************/
void Send595(UCHAR * pdat)
{
unsigned char i,j;
j=0x80;
for (i=0;i<8;i++)
{
if((*pdat)&j) _DATA = 1;
else _DATA = 0;
_SCLK = 0;
_SCLK = 1;
j>>=1;
}
}
/*******************************************************************************
函数功能:串行静态显示函数
输入参数:显存的地址
输出参数:无
*******************************************************************************/
code UCHAR DisplayHex[]={0xC0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
};
void DisplayBy595(UCHAR * pdat)
{
UCHAR i;
for(i=0;i<4;i++)
{
Send595(&DisplayHex[*(pdat+i)]);
}
_LCLK=0;
_LCLK=1;
}
‘柒’ 74HC595程序C语言
#i nclude <reg51.h>
#define uchar unsigned char
uchar code DAT[18]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0x00,0x40 };
uchar DispDat={ 1,2,3,4,5,6 };
sbit ENABLE=P3^3;
sbit SERIALIN=P3^2;
sbit CLOCK=P3^4;
sbit LATCH=P3^5;
void DispGroup(void)//6B595或74HC595显示123456
{
uchar i,j,temp;
for (i=0; i<6; i++) {
temp=DAT[DispDat];
for (j=0;j<8;j++){
temp=temp<<1; SERIALIN=CY; CLOCK=1; CLOCK=0;
}
}
LATCH=0; LATCH=1;
}
//在程序初始化时CLOCK=0; LATCH=1; ENABLE=0;
‘捌’ 求一个用74HC595级联驱动8个7段数码管静态显示的C语言程序。
/*****************************************************
16*128 LED点阵屏 C 程序
******************************************************
声明:
本程序供大家学习之用,用勿用于商业用途。尊重版权。
编写:邓椿薪
时间:2006年1月20日 晚
邮箱:[email protected]
*******************************************************
//595连级输出数据,138行驱动。P0_1为移动速度高速/*点阵显示汉字程串口输出字符数据,
//P2口输出行扫描信号,P2_7输出595锁存信号。*/
#define uchar unsigned char
#define uint unsigned int
#include <REG51.H>
#include <CODESUB.H>
uchar yid,h,d=12; //YID为移动计数器,H为行段计数器。
uint zimuo,zimuo1; //字模计数器
uchar BUFF[18]; //缓存
void in_data(void); //调整数据
void rxd_data(void); //发送数据
void in_data1(char h);
void rxd_data1(void);
void sbuf_out1(void);
void sendsw(uchar k); //发送段代码
void sbuf_out(void); //16段扫描
void key(void);
sbit AN1=P3^4;
sbit AN2=P3^5;
sbit clk=P3^3;
unsigned code sw[16]={0x7f,0x6f,0x5f,0x4f,0x3f,0x2f,0x1f,0x0f,0xf7,
0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0}; /*16行段码*/
/********************************************/
void main(void)
{ uchar i;
zimuo1=sizeof(hanzi)-6*32;//(zishu+9)*32;
yid=0;
zimuo=0;
while(1)
{
while(yid<100) //数据移位。
{
for(i=0;i<D;I++) if(zimuo 后移一个字, zimuo="zimuo+32*5;//zimuo+32;" yid="0;" } 移动一步 yid++; sbuf_out1();key(); { 移动速度>zimuo1) //总数减7个字。
zimuo=0;
}
}
void sbuf_out1()
{
char i;
for(h=0;h<32;h++)
{
in_data1(h);
clk=1;
rxd_data1();
if(h>=16)
else i=h;
sendsw(sw[i]);
}
}
/******************************************************/
void in_data1(char h)
{
char s,i;
if(h>=16)
{i=(h-16);
for(s=5;s>=0;s--) //h为向后先择字节计数器,zimuoo为向后先字计数器
{
// if(zimuo%32)
BUFF[2*s+1]=hanzi[zimuo+1+32*s+2*i]; //把第一个字模的第一个字节放入BUFF1中,第二个字模和第一个字节放入BUFF3中
BUFF[2*s]=hanzi[zimuo+0+32*s+2*i]; // 把第一个字模的第二个字节放入BUFF0中,第二个字模的第二个字节放入BUFF1中
}
}
else
{
i=h;
for(s=5;s>=0;s--) //h为向后先择字节计数器,zimuoo为向后先字计数器
{
// if(zimuo%32)
BUFF[2*s+1]=hanzi[zimuo+1+32*s+2*i]; //把第一个字模的第一个字节放入BUFF1中,第二个字模和第一个字节放入BUFF3中
BUFF[2*s]=hanzi[zimuo+0+32*s+2*i]; // 把第一个字模的第二个字节放入BUFF0中,第二个字模的第二个字节放入BUFF1中
}
}
}
/*******************************************************/
void rxd_data1(void) //串行发送数据
{
char s;
for(s=0;s<10;s++) //发送5字节数据
{
SBUF=255-BUFF[s];//把BUFF中的字节从大到小移位相或后发送输出。
while(!TI);TI=0; //等待发送中断
}
}
void sendsw(uchar k)
{
TI=0;
SBUF=k;
while(!TI);TI=0;
clk=0;
}
void key(void)
{
uchar a,b;
if(AN1==0)
{
for(a=0;a<10;a++)
}
if(AN1==0)
{while(AN1==0)
{}
if(AN1)
{d++;
if(d>100)
d=100;
}
}
}
if(AN2==0)
{for(a=0;a<10;a++)
}
if(AN2==0)
{while(AN2==0)
{}
if(AN2)
{d--;
if(d==0)
d=1;
}
}
}
}
不是我写的,但我想会对你有用。
‘玖’ 我用STC89C52RC单片机写一段74HC595驱动数码管静态显示,程序该怎么写啊,用C语言
#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharw;
sbitshu=P2^1;
sbitshift=P2^0;
sbitput=P2^2;
voiddelay1(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite(uchardat)
{
for(w=0;w<8;w++)
{
shu=dat&0x80;
delay1(1);
shift=1;
dat<<=1;
delay1(1);
shift=0;
}
}
voidout()
{
put=0;
delay1(1);
put=1;
delay1(1);
}
voidmain()
{
//put=1;
while(1)
{
write(0x5b);//可修改这个显示的数,
out();
}
}
‘拾’ 74HC595的C语言程序,求详细注释。
#include<reg51.h>
#include<INTRINS.H>
sbit SCLK=P1^0; //定义P1^0端口为595的频率
sbit DAT=P1^1; //定义P1^1端口为595的数据
sbit SLCK=P1^2; ////定义P1^2端口为595的输出频率
unsigned char code tab[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};//0-9,-,全灭
void sendbyte(unsigned char a)//单位数据发送函数
{unsigned char i; //定义一个无字符串变量
for(i=0;i<8;i++) //for 循环,循环8次,把一个数变成二进制发送出去
{
SCLK=0;// 把595 SCLK频率置低电平
DAT=a&0x80;//把数据与0X80后发送出去
a=a<<1; 把数据a左移一位
SCLK=1; 把595频率置高
}
}
void out595(void) //595输出函数
{
SLCK=0;
_nop_(); //延时函数,系统自带
SLCK=1;
}
main() //主函数
{ unsigned char i ; //定义一个无符号局部变量I
unsigned intf=60000; //赋值
while(1)//进循环
{for(i=0;i<9;i++) //进FOR循环
{
sendbyte(tab[i]); //调用发送函数 发送I数据道595 比如第一次循环的时候 i 数为0 tab[0] 那么发送的数就是0x3f
out595(); //数据输出函数,现在数据在595内面,现在这个就是输出到数码管
while(f--); //延时
}
}
}