⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 motorola单片机MCHC908的使用方法以及例程
💻 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 + -