?? dianji001.c
字號:
/**************************************************************
**項目名稱:兩相混合式步進電機驅動程序
**功能描述:
**說 明:
/**************************************************************
頭文件預處理:
**************************************************************/
#include <reg52.h>
#include <math.h>
#include <stdio.h>
/**************************************************************
數據類型宏定義:
**************************************************************/
#define uchar unsigned char
#define uint unsigned int
/*============================================================
I/O Ports' Definition:
============================================================*/
sbit IN1=P2^0;
sbit IN2=P2^1;
sbit IN3=P2^2;
sbit IN4=P2^3;
sbit Led_Clk=P1^5; //clock port of 74HC164
sbit Led_Dat=P1^6; //data port of 74HC164
sbit Led_Cs=P1^7; //Led display controlling(using BJT's base)
/**************************************************************
全局變量聲明:
**************************************************************/
uint t=15;
uchar fx;
uchar power;
uchar step0=0;
uchar step1=0;
uchar Cnt0=0;
uchar Cnt1=0;
uchar key_value,key_value_temp;
/**************************************************************
函數說明:
**************************************************************/
void Led_Display();
void Led_Write(uchar leddat);
void Key_Func();
//void zheng();
//void fan();
void delay(uint t);
void delay1();
/**************************************************************
code tab:
**************************************************************/
uchar code tab[]={
0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,//0-9
0xFF//dark all
};
void main()
{
TMOD=0x11; //甚至定時器0/1的工作方式
ET0=1; //允許定時器0中斷
ET1=1; //允許定時器1中斷
EA=1; //允許總中斷
while(1)
{
Key_Func();
Led_Display();
}
}
/**************************************************************
**函數名稱:Key_Func
**功能描述:鍵盤處理
***************************************************************
**調用函數:None
**參 數:None
**返 回 值:None
**************************************************************/
void Key_Func()
{
P1=0xff;
key_value=P1;
key_value=(key_value&0x1f);
do
{
key_value_temp=P1;
key_value_temp=(key_value_temp&0x1f);
delay1();
}while(key_value_temp!=0x1f);
switch(key_value)
{
case 0x1e: if(t<995) t+=5;
break;
case 0x1d: if(t>5) t-=5;
break;
case 0x1b: fx=0; //正向向運轉
power=1;
TH0=0xBC;
TL0=0xb0;
TR1=0; //關閉定時器1
TR0=1; //啟動定時器0
IN1=0;
IN2=1;
IN3=0;
IN4=1;
break;
case 0x17: fx=1; //反向運轉
power=1;
TH1=0xBC;
TL1=0xb0;
TR0=0; //關閉定時器0
TR1=1; //啟動定時器1
IN1=0;
IN2=1;
IN3=0;
IN4=1;
break;
case 0x0f: power=0; //停止運轉
TR0=0; //關閉定時器0
TR1=0; //關閉定時器1
default: break;
}
}
/*==================Key_Func 函數結束=======================*/
/**************************************************************
**函數名稱:Led_Display
**功能描述:LED數碼管顯示
***************************************************************
**調用函數:Led_Write
**參 數:None
**返 回 值:None
************************************************************/
void Led_Display()
{
uint p=t ;
uchar s ,i;
Led_Cs=1;
for (i=0;i<3;i++)
{
s=p%10;
p=p/10;
Led_Write(s);
}
//輸出轉速
Led_Write(10); //全黑,作為分割點
Led_Write(fx); //運轉方向標識符 1為正向,0為反向
Led_Write(power);
Led_Cs=0;
delay1(); //輸出運轉標識符 1為運轉,0為停轉
}
/********************Led_Display 函數結束*********************/
/**************************************************************
**函數名稱:Led_Write
**功能描述:移位寄存器送出一個字節的數據
***************************************************************
**調用函數:None
**參 數:None
**返 回 值:None
**************************************************************/
void Led_Write(uchar leddat)
{
uchar i;
uchar dat=tab[leddat];
for(i=0;i<8;i++)
{
if((dat&0x80)==0) Led_Dat=0;
else Led_Dat=1;
Led_Clk=0; //時鐘端產生脈沖
Led_Clk=1; //送出一位數據
dat<<=1;
}
}
/*********************Led_Write 函數結束**********************/
/**************************************************************
**函數名稱:delay
**功能描述:延時
***************************************************************
**調用函數:None
**參 數:None
**返 回 值:None
**************************************************************/
void delay1()
{
uchar i,k;
for(i=0;i<=50;i++)
for(k=0;k<15;k++)
{
;
}
}
/********************* delay 函數結束**********************/
void Tmr0_ISR() interrupt 1 using 1 //定時器0中斷 正轉
{
Cnt0++;
if(Cnt0==t)
{
Cnt0=0 ;
switch(step0)
{
case 0: IN1=1;
IN2=0;
break;
case 1: IN3=1;
IN4=0;
break;
case 2: IN2=1;
IN1=0;
break;
case 3: IN4=1;
IN3=0;
break; //正轉輸出順序
}
if(step0==3) step0=0;
else step0++;
}
TH0=0x3c;
TH0=0xb0;
}
/**************************************************************/
void Tmr1_ISR() interrupt 3 using 2 //定時器1 反轉
{
Cnt1++;
if(Cnt1==t)
{
Cnt1=0 ;
switch(step1)
{
case 0: IN4=1;
IN3=0;
break;
case 1: IN2=1;
IN1=0;
break;
case 2: IN3=1;
IN4=0;
break;
case 3: IN1=1;
IN2=0;
break; //反轉輸出順序
}
if(step1==3) step1=0;
else step1++;
}
TH1=0x3c;
TH1=0xb0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -