『壹』 基於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--); //延時
}
}
}