📄 main.c
字号:
#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908GZ16.h> /* include peripheral declarations */
#include <stdio.h>
#pragma MESSAGE DISABLE C1106 // WARNING C1106: Non-standard bitfield type
//自定义的标志位(对位进行操作)
//注意:对位进行取反的操作为 ~MyFlag_0 (不是 !MyFlag_0 )
typedef union {
unsigned char FlagByte;
struct {
unsigned char Flag0 :1;
unsigned char Flag1 :1;
unsigned char Flag2 :1;
unsigned char Flag3 :1;
unsigned char Flag4 :1;
unsigned char Flag5 :1;
unsigned char Flag6 :1;
unsigned char Flag7 :1;
} Bits;
} Flag;
Flag MyFlag;
#define MyFlag_0 MyFlag.Bits.Flag0
#define MyFlag_1 MyFlag.Bits.Flag1
#define MyFlag_2 MyFlag.Bits.Flag2
#define MyFlag_3 MyFlag.Bits.Flag3
#define MyFlag_4 MyFlag.Bits.Flag4
#define MyFlag_5 MyFlag.Bits.Flag5
#define MyFlag_6 MyFlag.Bits.Flag6
#define MyFlag_7 MyFlag.Bits.Flag7
#define MyFlag_8 MyFlag.Bits.Flag8
#define FG_PWM1 MyFlag_3
#define FG_PWM2 MyFlag_4
#define Flag_KeyPress MyFlag_2
uint New_T1CH0,Old_T1CH0; //改变的新的PWM占空比值
char buf[20];
uint AD_Filter(uchar chanel)
{uint sum,a[5],Max,Min;
uchar i;
for(i=0;i<5;i++)
{ADSCR=chanel; //disable interrupt,One conversion per time
while(!ADSCR_COCO);//等待转换完成,或者while(ADSCR & 0x080)
a[i]=ADR;
}
Max=a[0];Min=a[0];sum=a[0];
for(i=1;i<5;i++)
{sum=sum+a[i];
if(a[i]>Max)Max=a[i];
if(a[i]<Min)Min=a[i];
}
return((sum-Max-Min)/3);
}
void Transmit (unsigned char* sMessage){
while(*sMessage!= 0){SCDR = *sMessage;sMessage++;while(!SCS1_SCTE);}
}
void initial(void){
CONFIG2=0x0b; //Bit 3:Enable CAN, Bit 2:Disable extra divide-by-128 prescaler in timebase module
//Bit 0:Internal data bus clock used as clock source for SCI
CONFIG1=0x3b;//0x4b;//LVI disable, COP disable
PCTL=0x00; // PLL,(用4M晶振产生8M总线频率)
//PBWC=0x80;PCTL=0x02;PMS=8;PMRS=0x70;PBWC_ACQ=1;PCTL_PLLON=1;while(!PBWC_LOCK);PCTL_BCS=1;
SCBR = 0x02; // Select 9600 Baud rate over a clock = 2.4576 MHz
//SCBR = 0x30; //当总线频率8M,用此语句
SCC1 = 0x40;SCC2 = 0x08;SCS1;
ADCLK=0x74;// 采用总线频率且总线为8M
PTDPUE=0xff;//PTD0~3为输入口,默认为输入,因此上拉
DDRC_DDRC2=0;DDRC_DDRC3=0;PTCPUE_PTCPUE2=1;PTCPUE_PTCPUE3=1;//PTC2,PTC3为输入且配置上拉
T2SC=0x30;T2SC1=0x00;T2SC0=0x00;DDRD_DDRD7=1;PTD_PTD7=1;DDRD_DDRD6=1;PTD_PTD6=1;//停止并复位定时器,关闭pwm
DDRE_DDRE2=1;PTE_PTE2=1; //PTE2为HSO0,配置为输出高
DDRA_DDRA2=1;DDRA_DDRA3=1;PTA_PTA2=1;PTA_PTA3=1; //强制制动,解锁初始化(参照pdf文档)
//INTKBIER=0x0c;INTKBSCR=0x04; //开中断,键盘的下降沿输入产生中断
DDRA_DDRA2=0;DDRA_DDRA3=0;
T2SC1=0x00;DDRD_DDRD7=1;PTD_PTD7=0;
T2SC=0x30;T2MOD=2000;T2CH0=0;T2SC0=0x1a;
T2SC_TOIE=1;//允许溢出中断,
T2SC0_CH0IE=1;
T2SC_TSTOP=0; //开始记数
FG_PWM1=0;
FG_PWM2=0;
/**/
}
void Delays(void)
{uint i=10000;
while(i--);
}
void main(void) {uint temp;
initial();
EnableInterrupts;
New_T1CH0=0;
Old_T1CH0=0;
while(1)
{temp=AD_Filter(2);
if(temp>1000)temp=1000;
else if(temp<0)temp=0;
temp=temp*6/5;
sprintf(buf,"%d\n",temp);
Transmit("buf");
New_T1CH0=430+temp;
if(New_T1CH0<Old_T1CH0)
FG_PWM1=1;
else
FG_PWM2=1;
}
}
interrupt void T2CH0OutCompare_ISR (void)
{
if(FG_PWM1)
{T2CH0=New_T1CH0;
Old_T1CH0=New_T1CH0;
FG_PWM1=0;}
T2SC0;
T2SC0_CH0F=0;
}
interrupt void T2Overflow_ISR (void)
{//TIM1 Overflow
if(FG_PWM2)
{T2CH0=New_T1CH0;
Old_T1CH0=New_T1CH0;
FG_PWM2=0;}
T2SC;//清除溢出标志位
T2SC_TOF=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -