/**********************************************
*   徐方鑫    2011.2.16
*   280599580@qq.com
***********************************************/
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include <MC9S12XS128.h>     /* derivative information *///1M=1006080//40MHz BUS_CLOCK
/*
#define SynrDefine 0x53
#define RefdvDefine 0x07         //时钟频率等于2*晶振频率*(SYNR0+1)/(REFDV0+1)
#define SciDefine 0x106          //串行总线频率=时钟频率/(16*SCI0BDL)
*/
//----------------------------------------------------- //80MHz BUS_CLOCK
#define SynrDefine 0xD3
#define RefdvDefine 0x03         //时钟频率等于2*晶振频率*(SYNR0+1)/(REFDV0+1)
#define SciDefine 0x20c          //串行总线频率=时钟频率/(16*SCI0BDL)
#define WAITTIME 100000           //启动延时时间
#define SpeedInterrupt 1000         //速度周期采样时间,定时1000 * 0.01ms = 10ms
#define AdInterrupt 100             //Ad周期采样时间,定时100 * 0.01ms = 1ms
int SpeedNow=0;                  //速度采样初始化
int sensor_ad[5]=0;                //i=0~4,AD数据采样结果
//----------------------------------------------------- //92MHz BUS_CLOCK
/*
#define SynrDefine 0xD6
#define RefdvDefine 0x03         //时钟频率等于2*晶振频率*(SYNR0+1)/(REFDV0+1)
#define SciDefine 0x25a          //串行总线频率=时钟频率/(16*SCI0BDL)
*/
//----------------------------------------------------- /******************************************************************
*函数名:Wait_Time
*入口参数无
*出口参数: 无
*功能描述: 简单延迟程序
*******************************************************************/
void Wait_Time(ulong cnt) {unsigned char a,b;while(--cnt) {for(b=4;b>0;b--)for(a=248;a>0;a--);}
}
//----------------------------------------------------- /******************************************************************
*函数名:PLL_Init
*入口参数SNNR寄存器值,REFDV0寄存器值
*出口参数: 无
*功能描述:使用PLLCLK,时钟频率=2*晶振频率*(SYNR0+1)/(REFDV0+1)
*******************************************************************/
void PLL_Init(byte SYNR0,byte REFDV0)
{CLKSEL=0x00; //disable pll; CLKSEL_PLLSEL = 0; PLLCTL_PLLON = 0;SYNR = SYNR0; //REFDV = REFDV0; PLLCTL = 0xc0; //0xC0 CME=1,PLLON=1PLLCTL_PLLON = 1; while(!CRGFLG_LOCK); CLKSEL_PLLSEL = 1;return;
}
//----------------------------------------------------- /******************************************************************
*函数名:SCI_Init
*入口参数SCI0BD寄存器值
*出口参数: 无
*功能描述:使用SCI_Init,串行总线频率=时钟频率/(16*SCI0BDL)
*******************************************************************/
static void SCI_Init(int SCI0)
{SCI0CR1 =0x00;SCI0CR2 =0x2c; //enable Receive Full Interrupt,RX enable,Tx enable      SCI0BD  =SCI0; //SCI0BDL=busclk/(16*SCI0BDL)//busclk  8MHz, 9600bps,SCI0BD=0x34//busclk 16MHz, 9600bps,SCI0BD=0x68//busclk 24MHz, 9600bps,SCI0BD=0x9C//busclk 32MHz, 9600bps,SCI0BD=0xD0  //busclk 40MHz, 9600bps,SCI0BD=0x106
}
//----------------------------------------------------- /******************************************************************
*函数名:Sci0Tx
*入口参数SCI0DRL寄存器值
*出口参数: 无
*功能描述: 发送串口数据
*******************************************************************/
void Sci0Tx(unsigned char text)
{unsigned char temp;temp=SCI0SR1; /*clear flag*///发送前判断SC0DR是否处于忙状态。SC0DR.7=0:处于忙状态while (!SCI0SR1_TDRE); /* wait for output buffer empty */while(!SCI0SR1_TC); //等待数据发送结束SCI0DRH=0;SCI0DRL=text;
}
//----------------------------------------------------- /******************************************************************
*函数名:Sci0Rx
*入口参数无
*出口参数: 串口数据
*功能描述: 接收串口数据
*******************************************************************/
byte Sci0Rx(void)
{byte result,temp;temp=SCI0SR1; /*clear flag*/if((temp&0x20)>0)result=SCI0DRL;return result;
}
//----------------------------------------------------- /******************************************************************
*函数名:PWM_Init
*入口参数无
*出口参数: 无
*功能描述: 脉宽调制初始化( BUS_CLOCK=80M ),1口马达,6口舵机
*******************************************************************/
void PWM_Init(void) {PWME=0x00;       //禁止PWM模块PWMCAE=0x00;     //全部左对齐输出PWMPOL=0xFF;     //全部为先输出高电平再输出低电平PWMCLK=0xFF;     //01级联-马达,6-舵机预分频//其中CLOCK A或CLOCK SA控制0,1,4,5通道的PWM,CLOCK B或CLOCK SB控制2,3,6,7通道的PWMPWMPRCLK=0x22;   //CLOCK SA与CLOCK SB都进行4分频//设置频率A=bus clock/4=20MHz,B=bus clock/4=20MHzPWMSCLA=0x01;    //CLOCK SA进行10分频,即20MHZ/2/1=10MHZPWMSCLB=0x05;    //CLOCK SB进行10分频,即20MHZ/2/5=2MHZPWMCTL_CON01=1;  //01级联PWMPER01=2500;   //输出频率的算法:SA clock/2500=4KHz;PWMDTY01=1250;   //通道01初始化占空比50%PWMPER6=2000;    //输出频率的算法:SB clock/2000=100Hz;PWMDTY6=1000;    //通道6初始化占空比50%PWME=0x22;       //打开01,6通道(只需开通高位即可)}
//----------------------------------------------------- /******************************************************************
*函数名:PIT_Init
*入口参数无
*出口参数: 无
*功能描述: 时钟周期中断初始化程序
*******************************************************************/
void PIT_Init(void)
{  PITCFLMT_PITE=0; //关闭PIT  //微定时器的装载寄存器  PITMTLD0= 80-1;//8位定时器初值设定。80分频,在80MHzBusClock下,为0.1MHz,即10us=0.01ms  //PITMTLD1= 80-1;//8位定时器初值设定。80分频,在80MHzBusClock下,为0.1MHz,即10us=0.01ms  //PITMTLD1= 160-1;//8位定时器初值设定,160分频,在16MHz的总线时钟频率下,为0.1MHz,即1us=0.01ms  //定时器的装载寄存器 //中断定时基准时间设定 PITLD0  = SpeedInterrupt - 1 ;//16位定时器初值设定。PITTIME*0.01MS,定时1000 * 0.01ms = 10ms  PITLD1  = AdInterrupt - 1 ;//定时100*0.01ms = 1msPITCE_PCE0=1;//使能通道0  PITCE_PCE1=1;//使能通道0PITMUX_PMUX0=0;//0:相应16位定时器与微时基0连接  PITMUX_PMUX1=0;//0:相应16位定时器与微时基0连接//PITMUX_PMUX1=1;//1:相应16位定时器与微时基1连接  PITINTE_PINTE0=1;//开通PIT0定时器的溢出中断      PITINTE_PINTE1=1;//开通PIT1定时器的溢出中断   PITCFLMT_PITE=1; //使能PIT
}
//----------------------------------------------------- /******************************************************************
*函数名:ECT_Init
*入口参数无
*出口参数: 无
*功能描述: 脉冲累加计数,PTT7口,电路接法:需要上拉电阻5.1千欧姆
*******************************************************************/
void ECT_Init(void)
{TSCR1 = 0x00;           //禁止时钟  TIOS = 0x7f;      //设置通道7为输入捕捉功能PACTL=0x50;     PACNT=0x00;TSCR2 = 0x00;TCTL3 = 0x40;   //设置通道7上升沿捕捉 TSCR1=0x80;   //允许时钟计数
}
//----------------------------------------------------- /******************************************************************
*函数名:AD_Init
*入口参数无
*出口参数: 无
*功能描述: AD模块转换程序
*******************************************************************/
void AD_init()
{ ATD0CTL1=0b00000000; // 8位转换//ATD0CTL1=0b00100000; // 10位转换//ATD0CTL1=0b01000000; // 12位转换ATD0CTL2=0x40;       //上电,标志位快速清零,忽略外部触发,中断禁止。ATD0CTL3 = 0b10101000; //转换序列长度为7,结果寄存器数据右对齐//S8C  S4C  S2C  S1C  转换序列长度// 0    0    0    0        8        ATD0CTL3 = ob10000000// 0    0    0    1        1        ATD0CTL3 = ob10001000// 0    0    1    0        2        ATD0CTL3 = ob10010000// 0    0    1    1        3        ATD0CTL3 = ob10011000// 0    1    0    0        4        ATD0CTL3 = ob10100000// 0    1    0    1        5        ATD0CTL3 = ob10101000// 0    1    1    0        6        ATD0CTL3 = ob10110000// 0    1    1    1        7        ATD0CTL3 = ob10111000// 1    x    x    x        8        ATD0CTL3 = ob11xxx000ATD0CTL4=0x44; // 采样周期个数为8, A/D Clocks= 80M / 2*(4+1) = 8M //SMP2 SMP1    SMP0    PRS4    PRS3    PRS2    PRS1    PRS0//SMP2  SMP1    SMP0    PS,DG128的第七位为SRES8// 0    0     0    采样周期个数为4// 0    0     1    采样周期个数为6// 0    1     0    采样周期个数为8// 0    1     1    采样周期个数为10// 1    0     0    采样周期个数为12// 1    0     1    采样周期个数为16// 1    1     0    采样周期个数为20// 1    1     1    采样周期个数为24//ATDCLK = BUSCLK / ( 2 * ( PRS + 1 ) ) //AD时钟分频,设置预分频因子时,应使ATDCLK不小于0.25MHz,同时不大于8.3MHz。ATD0CTL5 = 0b00110000;  //0 SC SCAN MULT | CD CC CB CA//6:0特殊通道禁止,5:1连续转换,4:1多通道轮流采样ATD0DIEN=0x00;        //禁止数字输入 }
//----------------------------------------------------- /******************************************************************
*函数名:Read_ad
*入口参数无
*出口参数: 无
*功能描述: 读取AD采样数据,简单平均值滤波,3次平均值
*******************************************************************/
void Read_ad(void)
{     int ad_temp[5][3]={0};     //AD临时采样存储int i;for(i=0; i<=2; i++)  //采集3次{while(!ATD0STAT2_CCF0);  //等待转换结束   ad_temp[0][i] = ATD0DR0;  //读取转换的结果while(!ATD0STAT2_CCF1);  //等待转换结束   ad_temp[1][i] = ATD0DR1;  //读取转换的结果while(!ATD0STAT2_CCF2);  //等待转换结束   ad_temp[2][i] = ATD0DR2;  //读取转换的结果while(!ATD0STAT2_CCF3);  //等待转换结束   ad_temp[3][i] = ATD0DR3;  //读取转换的结果while(!ATD0STAT2_CCF4);  //等待转换结束   ad_temp[4][i] = ATD0DR4;  //读取转换的结果//while(!ATD0STAT2_CCF5);  //等待转换结束   //ad_temp[5][i] = ATD0DR5;  //读取转换的结果//while(!ATD0STAT2_CCF6);  //等待转换结束   //ad_temp[6][i] = ATD0DR6;  //读取转换的结果}//计算平均值for(i=0; i<=4; i++)  {sensor_ad[i] = (ad_temp[i][0] + ad_temp[i][1] + ad_temp[i][2]) /3 ;  }//适当的滤波}
//----------------------------------------------------- /******************************************************************
*函数名:ALL_Init
*入口参数无
*出口参数: 无
*功能描述: 全部初始化函数
*******************************************************************/
void ALL_Init(void) {PLL_Init(SynrDefine,RefdvDefine);  //PLL总线初始化SCI_Init(SciDefine);   //串口初始化PWM_Init();  //PWM脉宽初始化PIT_Init();  //PIT时钟周期中断初始化ECT_Init();  //ECT脉冲累加器初始化AD_init();   //AD采样初始化Sci0Tx('w');Sci0Tx('a');Sci0Tx('i');Sci0Tx('t');Wait_Time(WAITTIME); //启动延时Sci0Tx('r');Sci0Tx('u');Sci0Tx('n');
}
//----------------------------------------------------- /******************************************************************
*函数名:main
*入口参数无
*出口参数: 无
*功能描述: 主函数
*******************************************************************/
void main(void) {//初始化/* put your own code here */ALL_Init();    //系统初始化EnableInterrupts;      //允许中断for(;;){ Sci0Tx(sensor_ad[0]);_FEED_COP();    //定时喂看门狗 }
}
//----------------------------------------------------- /******************************************************************
*函数名:PIT0
*入口参数无
*出口参数: 无
*功能描述: 中断测速函数,速度为全局变量SPEED_NOW
*******************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区      void interrupt 66 PIT0(void)
{                  //相应代码                   DisableInterrupts;PITTF=0x01;     //清中断标志位 SpeedNow=PACNT; //获取车速 PACNT=0;        //编码器计数重置EnableInterrupts;
}  #pragma CODE_SEG DEFAULT
//-----------------------------------------------------  /******************************************************************
*函数名:PIT1
*入口参数无
*出口参数: 无
*功能描述: 后台AD处理程序
*******************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区 void interrupt 67 PIT1(void)
{                  //相应代码    DisableInterrupts;             PITTF=0x02;   //清中断标志位   Read_ad();    //读取AD结果EnableInterrupts;
}  #pragma CODE_SEG DEFAULT  //----------------------------------------------------- 

飞思卡尔XS128的基本模板程序相关推荐

  1. 飞思卡尔XS128八位数模转换模块的实验与心得体会

    飞思卡尔XS128八位数模转换模块的实验与心得体会 数模转换的编程流程: 代码标注 数模转换的编程流程: ① 锁相环时钟设置,这一步不细讲,后面会有文章来专门解释锁相环的设置,将总线时钟频率升到32M ...

  2. 飞思卡尔XS128系列(三) PIT

    刚报名参加了第五届飞思卡尔智能车竞赛的时候,知道要用飞思卡尔的16位单片机,当时也没在意,就随便买了本这方面的书,记得书名是:<基于HCS12的嵌入式系统设计>,我是因为这本书各模块后面的 ...

  3. 让atmega8可以和飞思卡尔xs128一样对IO引脚进行定义

    好吧,不得不承认,我使用飞思卡尔的XS128单片机已经非常之习惯了,结果一上手atmega8,最令我反感的就是atmega8不能对IO引脚进行操作,非要用些繁琐的位操作.我就不,我就要像飞思卡尔那样操 ...

  4. 飞思卡尔智能车摄像头上位机…

    原文地址:飞思卡尔智能车摄像头上位机采集程序 作者:玲声依旧美 基于飞思卡尔XS128单片机 摄像头采集测试程序     OV7620采集程序说明:摄像头数据口接PA0-PA7:行中断接PT0,场中断 ...

  5. 飞思卡尔智能车 电机PID

    提到小车的控制必然想到的PID控制,这也是各技术报告都不会漏掉的名词,在飞思卡尔XS128系列(二)PWM模块中已经提到了一些电机控制方面的东西,主要讲了用PID和BANG-BANG控制相结合的方式来 ...

  6. 飞思卡尔MKL系列单片机用jlink烧写程序出现的Kinetis (connect): Timeout while halting CPU. CPU does not stop.问题

    最近用Jlink烧写飞思卡尔MKL16Z128单片机时发现经常出现不能连接成功的情况,用的是SWD接口,排查了好久后来发现问题在单片机的RESET脚上,因为之前用SWD接口的时候只接4线(SWD.SC ...

  7. 红外寻迹小车基于K128单片机的红外对管飞思卡尔智能车(5个对管)程序部分

    红外寻迹小车基于K128单片机的红外对管飞思卡尔智能车(5个对管)软件部分包括: 出库 直行模块 大,小弯道 环岛 s弯 停车 #include "headfile.h" #inc ...

  8. mc9s12 c语言,飞思卡尔mc9s12的prm文件详解之二

    关于Codewarrior 中的 .prm 文件 要讨论单片机的地址映射,就必须要接触.prm文件,本篇的讨论基于 Codewarrior 5.0 编译器,单片机采用MC9S12XS128. 通过项目 ...

  9. 飞思卡尔智能车之摄像头使用篇

    飞思卡尔智能车之摄像头使用    今天来给大家说说摄像头的使用,很显然摄像头对摄像头组的重要性是不言而喻的,因为摄像头是小车提取赛道信息最关键的传感器了,所以只有把摄像头使用好才能让你的小车快速稳定的 ...

最新文章

  1. iOS base64 MD5
  2. zendframwork入口关键Zend_Application.php类
  3. 第二课.进一步熟悉Linux
  4. Oracle RAC禁用DRM
  5. ubuntu20.04下安装Docker和NVIDIA Container Toolkit教程
  6. linux网卡内核文件在哪里,linux-2.6.35内核配置和网卡驱动添加
  7. mysql获取当前时间,及其相关操作
  8. 解决阿里云服务器磁盘报警
  9. linux mariadb 升级,linux mariadb
  10. cocos creator 方法数组_基于 Cocos 游戏引擎的音视频研发探索
  11. Hi3559AV100开发环境搭建
  12. 让你的博文自动带上缩址,方便发到微博客上
  13. AI初学者用什么软件?适合AI新手的9款人工智能开源软件
  14. 支付宝小程序使用 icontfont字体图标
  15. scratch基础讲解与小游戏制作(接水果)
  16. 提取小米手机系统完整包BOOT,及ROOT!
  17. 抖音短视频流量获取攻略,掌握好这些一定可以出爆款
  18. 谷歌安装插件Fatkun 批量保存网页图片
  19. 19号笔刷 ps_ps的19号笔刷怎样设置,详细点,最好配点图
  20. SEO 已死,LLMO 万岁

热门文章

  1. 金融(Finance) 精萃
  2. 绝对路径 和 相对路径(C语言 )
  3. 【整理】细胞培养常规方法:上皮细胞、内皮细胞、神经胶质、骨骼肌细胞、心肌细胞、巨噬细胞、肾小球细胞、裸小鼠移植瘤单细胞培养细胞
  4. 嘉禾病历系统服务器,嘉和口腔专科电子病历系统
  5. 夜已微凉----爱、未央
  6. 最经典的寓言 - 乌鸦和兔子
  7. Bing每日壁纸api链接code
  8. 项目经理如何做好任务分解,制定项目计划
  9. python实验七 网络爬虫和文本处理
  10. WSL Ubuntu 20.04下Android源码下载