注册会员
- 积分
- 41
- 威望
- 30
- 贡献
- 11
- 兑换币
- 13
- 注册时间
- 2013-7-9
- 在线时间
- 2 小时
- 毕业学校
- 上海海事大学
|
2#
楼主 |
发表于 2013-9-6 12:59:16
|
只看该作者
工程建立了以后还能改成浮点型吗?怎么改?
还有MC9S12XS128 ECT模块输入中断函数加了几句算式,就进不了中断,直接附程序
/****************************************************************/
/*---------------------------------------------------------*/
/************************************************************
飞翔科技MC9S12XS128汽车电子开发板
E-mail: 2008f.d@163.com
淘宝店:http://fxfreefly.taobao.com
************************************************************/
/*---------------------------------------------------------*/
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#include "LCD.h"
#define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4
#define BUS_CLOCK 32000000 //总线频率
#define OSC_CLOCK 16000000 //晶振频率
unsigned int delaytime;
unsigned int time1;
unsigned int time2;
/******新增变量*****
unsigned int T;
float xiangweicha;
float PF;
unsigned int ge;
unsigned int shi;
unsigned int bai;
/*************************************************************/
/* 初始化锁相环 */
/*************************************************************/
void INIT_PLL(void)
{
CLKSEL &= 0x7f; //set OSCCLK as sysclk
PLLCTL &= 0x8F; //Disable PLL circuit
CRGINT &= 0xDF;
#if(BUS_CLOCK == 40000000)
SYNR = 0x44;
#elif(BUS_CLOCK == 32000000)
SYNR = 0x43;
#elif(BUS_CLOCK == 24000000)
SYNR = 0x42;
#endif
REFDV = 0x81; //PLLCLK=2×OSCCLK×(SYNDIV+1)/(REFDIV+1)=64MHz ,fbus=32M
PLLCTL =PLLCTL|0x70; //Enable PLL circuit
asm NOP;
asm NOP;
while(!(CRGFLG&0x08)); //PLLCLK is Locked already
CLKSEL |= 0x80; //set PLLCLK as sysclk
}
/************************************************************/
/* 初始化ECT模块 */
/************************************************************/
void initialize_ect(void){
TSCR1_TFFCA = 1; // 定时器标志位快速清除
TSCR1_TEN = 1; // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
TIOS = 0xfe; //指定通道0为输入捕捉方式
TCTL4 = 0x01; // 设置通道0为捕捉上升沿方式
TIE = 0x01; // 允许通道0定时中断
TSCR2 = 0x07; // 预分频系数pr2-pr0:111,时钟周期为4us,
TFLG1 = 0xff; // 清除各IC/OC中断标志位
TFLG2 = 0xff; // 清除自由定时器中断标志位
}
/*************************************************************/
/* 初始化PWM */
/*************************************************************/
void init_pwm(void)
{
PWMCTL_CON01= 1; //联结通道0,1为16位的PWM
PWMPOL_PPOL1= 1; //通道01的极性为高电平有效
PWMPRCLK = 0x55; //A时钟和B时钟的分频系数为32,频率为1MHz
PWMSCLA = 100; //SA时钟频率为5KHz
PWMSCLB = 100; //SB时钟频率为5KHz
PWMCLK =0x02; //通道01用SA时钟作为时钟源
PWMCAE = 0x00; //脉冲模式为左对齐模式
PWMPER01 = 500; //通道01的周期为10Hz
PWMDTY01 = 250; //通道01的占空比为50%
PWME_PWME1 = 1; //使能通道01
}
/*************************************************************/
/* 输入捕捉中断函数 */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void capture(void)
{
if(TFLG1_C0F == 1)
TFLG1_C0F = 1;
time1 = time2;
time2 = TC0;
delaytime = time2-time1;
LEDCPU = ~LEDCPU;
/*********计算功率因数*********
xiangweicha=(delaytime*4*2*3.1415)/(T*10000);
PF=cos(xiangweicha);
ge=(PF*1000)/100;
shi=(PF*1000-ge*100)/10;
bai=(unsigned int)(PF*1000-ge*100-shi*10);
/*********显示*********
DDRB=0xff;
LCD_clear(); //清屏幕
delay_nms(1000);
LCD_write_hanzi(1,0,0);
LCD_write_hanzi(5,0,1);
LCD_write_hanzi(9,0,2);
LCD_write_hanzi(13,0,3);
LCD_write_shu(17,0,47);
LCD_write_shu(5,3,0);
LCD_write_shu(7,3,45);
LCD_write_shu(9,3,ge);
LCD_write_shu(11,3,shi);
LCD_write_shu(13,3,bai);
/*********显示*********/
}
#pragma CODE_SEG DEFAULT
/*************************************************************/
/* 主函数 */
/*************************************************************/
void main(void) {
/******新增变量*****
T=2;
xiangweicha=0.0;
PF=0.0;
ge=0;
shi=0;
bai=0;
/*********显示*********
DDRB=0xff;
LCD_init(); //初始化LCD模块
LCD_clear(); //清屏幕
delay_nms(1000);
PORTB_PB5=1;
PORTB_PB6=1;
PORTB_PB7=1;
LCD_write_hanzi(1,0,0);
LCD_write_hanzi(5,0,1);
LCD_write_hanzi(9,0,2);
LCD_write_hanzi(13,0,3);
LCD_write_shu(17,0,47);
/*********显示*********/
DisableInterrupts;
INIT_PLL();
initialize_ect();
init_pwm();
LEDCPU_dir = 1;
EnableInterrupts;
LEDCPU = 0;
for(;;) {}
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|