📄 main.c
字号:
#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908GZ16.h> /* include peripheral declarations */
#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占空比值
ulong temp;
void initial(void){
CONFIG2=0x0f; //Bit 3:Enable CAN, Bit 2:Enable extra divide-by-128 prescaler in timebase module
//Bit 0:Internal data bus clock used as clock source for SCI
CONFIG1=0x4b;//LVI enable, COP disable
PCTL=0x00; //turn off the PLL, CGMXCLOCK=(crystal clock)
FG_PWM1=0;
FG_PWM2=0;
}
void Delays(void)
{uint i=10000;
while(i--);
}
void T1CH0PWM(void){
//定时器 1 的通道0做PWM输出
//当采用晶振4.9152MHz,则总线频率1228800Hz,如定时器分频系数=1,则产生PWM周期(T1MOD值)/1228.8 (ms),高电平时间(T1CH1值)/1228.8 (ms)
//默认时TMOD为0XFFFF,则PWM周期为53ms
T1SC=0x30; //先停止并复位记时器
T1MOD=0x3332;
T1CH0=0x800;
//T1SC1=0x5e; //PWM模式,允许中断,比较符合时输出高
T1SC0=0x5a; //PWM模式,允许中断,比较符合时输出低
//T1SC0_CH0IE=0;
T1SC_TOIE=0;//允许溢出中断,
T1SC0_CH0IE=0;
T1SC_TSTOP=0; //开始记数
}
/*******************************************************************
!!!!!!本程序实现非缓冲方式下PWM输出,而且不导致波形失真或者波形丢失!!!!!!
*******************************************************************/
void main(void) {
initial();
EnableInterrupts;
// DDRA_DDRA4=1;
DDRA_DDRA5=1;
DDRA_DDRA4=1;
PTA_PTA5=0;
PTA_PTA4=1;
//T1CH0PWM();
/*
New_T1CH0=0x800;
Old_T1CH0=0x800;
while(1)
{
New_T1CH0=New_T1CH0+100;
if(New_T1CH0<Old_T1CH0)
FG_PWM1=1;
else
FG_PWM2=1;
if(New_T1CH0>=0x3300)
New_T1CH0=0x800;
//for(temp=0;temp<100;temp++)
Delays();
}*/
}
interrupt void T1CH0OutCompare_ISR (void)
{
if(FG_PWM1)
{T1CH0=New_T1CH0;
Old_T1CH0=New_T1CH0;
FG_PWM1=0;}
T1SC0;
T1SC0_CH0F=0;
}
interrupt void T1Overflow_ISR (void)
{//TIM1 Overflow
if(FG_PWM2)
{T1CH0=New_T1CH0;
Old_T1CH0=New_T1CH0;
FG_PWM2=0;}
T1SC;//清除溢出标志位
T1SC_TOF=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -