stc8a8k單片機+AB相編碼器控制PWM輸出測試程序,
#include "stc8.h"
#include "intrins.h"
//測試工作頻率為11.0592MHz
//sfr INTCLKO = 0x8f;
#define EX2 0x10
#define EX3 0x20
#define EX4 0x40
#define CYCLE 30000
int val = 0;
int val1 = 200;
int val2 = 5;
bit dir = 0;
bit ccw = 0;
bit cw = 0;
void PWM_init(void);
void exint_init(void);
/*****************************************************************/
void Delay100us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 2;
j = 15;
do
{
while (--j);
} while (--i);
}
void Delay500us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 6;
j = 93;
do
{
while (--j);
} while (--i);
}
/**********************************************************************/
void exint_init() //外部中斷初始化
{
// IT0 = 0; //使能INT0上升沿和下降沿中斷
IT0 = 1; //使能INT0下降沿中斷
EX0 = 1; //使能INT0中斷
// IT1 = 0; //使能INT1上升沿和下降沿中斷
// IT1 = 1; //使能INT1下降沿中斷
// EX1 = 1; //使能INT1中斷
INTCLKO = EX2; //使能INT2下降沿中斷
//INTCLKO |= EX3; //使能INT3下降沿中斷
//INTCLKO |= EX4; //使能INT4下降沿中斷
// EA = 1;
}
void PWM_init() //PWM初始化設置
{
P_SW2 = 0x80;
PWMCKS = 0x00; // PWM時鐘為系統時鐘
PWMC = CYCLE; //設置PWM周期為
PWM0T1 = 0x0000;
PWM0T2 = 0x0001;
//PWM0CR = 0x88; //使能PWM0-P1.0輸出
//PWM0CR = 0x80; //使能PWM0-P2.0輸出
PWM0CR = 0x90; //使能PWM0-P6.0輸出
PWM1T1= 0x0000;
PWM1T2= 0x0001;
//PWM1CR = 0x88; //使能PWM1-P1.1輸出
//PWM1CR = 0x80; //使能PWM1-P2.1輸出
PWM1CR = 0x90; //使能PWM1-P6.1輸出
PWM2T1 = 0x0000;
PWM2T2 = 0x0001;
//PWM2CR = 0x88; //使能PWM2-P1.2輸出
//PWM2CR = 0x80; //使能PWM2-P2.2輸出
PWM2CR = 0x90; //使能PWM2-P6.2輸出
PWM3T1 = 0x0000;
PWM3T2 = 0x0001;
//PWM3CR = 0x88; //使能PWM2-P1.3輸出
//PWM3CR = 0x80; //使能PWM2-P2.3輸出
PWM3CR = 0x90; //使能PWM2-P6.3輸出
PWM4T1 = 0x0000;
PWM4T2 = 0x0001;
//PWM4CR = 0x88; //使能PWM4-P1.4輸出
//PWM4CR = 0x80; //使能PWM4-P2.4輸出
PWM4CR = 0x90; //使能PWM4-P6.4輸出
PWM5T1 = 0x0000;
PWM5T2 = 0x0001;
//PWM5CR = 0x88; //使能PWM5-P1.5輸出
//PWM5CR = 0x80; //使能PWM5-P2.5輸出
PWM5CR = 0x90; //使能PWM5-P6.5輸出
PWM6T1 = 0x0000;
PWM6T2 = 0x0001;
//PWM6CR = 0x88; //使能PWM5-P1.6輸出
//PWM6CR = 0x80; //使能PWM6-P2.6輸出
PWM6CR= 0x90; //使能PWM6-P6.6輸出
PWM7T1 = 0x0000;
PWM7T2 = 0x0001;
//PWM7CR = 0x88; //使能PWM7-P1.7輸出
//PWM7CR = 0x80; //使能PWM7-P2.7輸出
PWM7CR = 0x90; //使能PWM7-P6.7輸出
P_SW2 = 0x00;
PWMCR = 0xc0; //啟動PWM模塊
//EA = 1;
}
/*************************************************************/
void main()
{
// P0M0 = 0x00; P0M1 = 0x00; //設置P0.0~P0.7為雙向口模式
// P1M0 = 0xff; P1M1 = 0x00; //設置P1.0~P1.7為推挽輸出模式
// P2M0 = 0x00; P2M1 = 0xff; //設置P2.0~P2.7為高阻輸入模式
// P3M0 = 0xff; P3M1 = 0xff; //設置P3.0~P3.7為開漏模式
// P4M0 = 0xff; P4M1 = 0xff; //設置P4.0~P4.7為開漏模式
// P5M0 = 0xff; P5M1 = 0xff; //設置P5.0~P5.7為開漏模式
// P6M0 = 0xff; P6M1 = 0xff; //設置P6.0~P6.7為開漏模式
// P7M0 = 0xff; P7M1 = 0xff; //設置P7.0~P7.7為開漏模式
exint_init();
PWM_init();
EA = 1;
PCON = 0x02; //MCU進入掉電模式
_nop_(); //掉電喚醒后立即進入中斷服務程序
_nop_();
while (1)
{
if(P36==0)
{
val+=val2;
Delay500us();
if (val >=30000) val=0 ;
}
}
}
/***********************************************************************/
void PWM_Isr() interrupt 22
{
//static bit dir = 1;
//static int val = 0;
if (PWMCFG & 0x80)
{
PWMCFG &= ~0x80; //清中斷標志
_push_(P_SW2);
P_SW2 |= 0x80;
PWM0T2 = val;
PWM1T2 = val;
PWM2T2 = val;
PWM3T2 = val;
PWM4T2 = val;
PWM5T2 = val;
PWM6T2 = val;
PWM7T2 = val;
_pop_(P_SW2);
}
}
/***********************************************************************/
void INT0_Isr() interrupt 0
{
if((P32==0)&&(P33==1)) ccw=1,cw=0;
else ccw=0;
if((P32==0)&&(P33==0)) cw=1,ccw=0;
else cw=0;
if(ccw==1)
{
val+=val1;
if (val >=30000) val=0 ;
}
if(cw==1)
{
val-=val1;
if (val <=0) val=30000;
}
}
/*
void INT1_Isr() interrupt 2
{
}
*/
void INT2_Isr() interrupt 10
{
P50=!P50;
P51=!P51;
}
/*
void INT3_Isr() interrupt 11
{
P60 = !P60; //測試端口
}
void INT4_Isr() interrupt 16
{
P60 = !P60; //測試端口
}
*/
|