MC9S12XS128终极例程

合集下载

飞思卡尔16位单片机9S12XS128使用和程序

飞思卡尔16位单片机9S12XS128使用和程序

飞思卡尔16位单片机9S12XS128使用收藏最近做一个关于飞思卡尔16位单片机9S12XS128MAA的项目,以前未做过单片机,故做此项目颇有些感触。

现记录下这个艰辛历程。

以前一直是做软件方面的工作,很少接触硬件,感觉搞硬件的人很高深,现在接触了点硬件发现,与其说使用java,C#等语言写程序是搭积木,不如说搞硬件芯片搭接的更像是在搭积木(因为芯片是实实在在拿在手里的东西,而代码不是滴。

还有搞芯片内部电路的不在此列,这个我暂时还不熟悉)。

目前我们在做的这个模块,就是使用现有的很多芯片,然后根据其引脚定义,搭接出我们需要的功能PCB板,然后为其写程序。

废话不多说,进入正题。

单片机简介:9S12XS128MAA单片机是16位的单片机80个引脚,CPU是CPU12X,内部RAM 8KB,EEPROM:2KB,FLASH:128KB,外部晶振16M,通过内部PLL可得40M总线时钟。

9S12XS128MAA单片机拥有:CAN:1个,SCI:2个,SPI:1个,TIM:8个,PIT:4个,A/D:8个,PWM:8个下面介绍下我们项目用到的几个模块给出初始化代码1、时钟模块初始化单片机利用外部16M晶振,通过锁相环电路产生40M的总线时钟(9S12XS128系列标准为40M),初始化代码如下:view plaincopy to clipboardprint?/******************系统时钟初始化****************/void Init_System_Clock(){asm { // 这里采用汇编代码来产生40M的总线LDAB #3STAB REFDVLDAB #4STAB SYNRBRCLR CRGFLG,#$08,*//本句话含义为等待频率稳定然后执行下一条汇编语句,选择此频率作为总线频率BSET CLKSEL,#$80}}/******************系统时钟初始化****************/void Init_System_Clock(){asm { // 这里采用汇编代码来产生40M的总线LDAB #3STAB REFDVLDAB #4STAB SYNRBRCLR CRGFLG,#$08,*//本句话含义为等待频率稳定然后执行下一条汇编语句,选择此频率作为总线频率BSET CLKSEL,#$80}}上面的代码是汇编写的,这个因为汇编代码量比较少,所以用它写了,具体含义注释已经给出,主函数中调用此函数即可完成时钟初始化,总线时钟为40M.2、SCI模块初始化单片机电路做好了当然少不了和PC之间的通信,通信通过单片机串口SCI链接到PC 端的COM口上去。

基于MC9S12XS128的双轮平衡车控制系统设计毕业设计

基于MC9S12XS128的双轮平衡车控制系统设计毕业设计

基于MC9S12XS128的双轮平衡车控制系统设计[摘要]本文主要介绍了双轮平衡车的控制系统设计方案。

采用MC9S12XS128作为核心控制器,在此基础上增加了各种接口电路板组成整个硬件系统,包括单片机最小系统,直流驱动电机控制模块,电源管理模块,测速编码模块,人机交互等模块。

软件调试部分依次对应硬件各模块进行程序设计,包括A/D模块,PWM模块,ECT模块,PID控制算法,人机交互控制等。

完成车模的制作和软件设计后对整个控制系统进行调试,先阐述了调试的策略,再分别就现有调试工具条件下的软件和硬件调试进行了分析,对相应的调试方法做了基本的介绍。

最后根据调试情况对整个系统做了修改,基本达到设计要求。

[关键词]双轮平衡车;MC9S12XS128;模块设计;调试策略Based On MC9S12XS128 of the Two-wheeled BalancingVehicle Control System DesignElectrical Engineering and Automation Specialty CHEN MingAbstract: This article mainly introduces the balance of the Two-wheeled balancing vehicle control system design scheme. The MC9S12XS128 as core controller, on the basis of interface circuit board of increasing the hardware system, including single chip minimize system, dc motor control module, power management module, code modules speed, man-machine interaction module. Software debugging session in the corresponding module design program, including A/D module, PWM module, ECT module, PID control algorithm, the man-machine interactive control, etc. Accomplish the production and the software design draw after the whole control system for debugging, first expounds the commissioning of the strategy, second,different debugging tools under the conditions of existing software and hardware debugging are analyzed, the corresponding debugging method basic introduction. According to the situation of the whole system debugging have modified, basic to meet the design requirements.Key words: the Two-wheeled balancing vehicle; MC9S12XS128; MODULAR DESIGN ; Debugging strategy目录1 引言 (1)1.1 双轮自平衡小车的研究意义 (1)1.2 双轮自平衡小车的发展历程和现状 (1)1.2.1国外的研究成果 (2)1.2.2国内的研究成果 (2)1.3 本课题的研究内容和关键问题 (2)2 双轮平衡小车系统的总体概述 (3)2.1 系统组成 (3)2.2 系统各模块的主要功能 (3)2.3 系统的主要特点 (4)3 双轮平衡小车硬件电路设计 (4)3.1 整体电路设计 (4)3.2 单片机最小系统 (5)3.3 直流驱动电机控制电路 (6)3.4 电源模块电路设计 (6)3.5 测速编码电路设计 (7)3.5.1 陀螺仪电路 (8)3.5.2 编码器电路 (8)3.6 人机交互接口电路设计 (9)3.6.1CAN总线与LIN总线设计 (9)3.6.2通信接口设计 (10)3.6.3人机交互电路设计 (10)4 双轮平衡小车软件设计 (11)4.1 软件模块功能与框架 (11)4.1 A/D模块 (12)4.1.1A/D转换原理 (12)4.1.2A/D转换模块功能结构 (12)4.1.3A/D转换模块的编程步骤 (13)4.2 PWM模块 (13)4.2.1PWM的主要特点 (13)4.2.2PWM应用及初始化 (14)4.3 ECT模块 (14)4.4 PID控制算法 (15)4.4.1PID控制原理 (15)4.4.2 PID参数的整定 (16)4.5 人机交互 (16)4.5.1 LCD液晶显示 (16)4.5.2 矩阵键盘按键识别 (17)4.5.3 串口与上位机的通讯 (17)5 双轮平衡小车的系统调试 (18)5.1 调试策略 (18)5.1.1硬件调试 (18)5.1.2软件调试 (18)5.1.3综合调试 (18)5.2 串口调试 (18)5.2 监控调试 (20)5.3 无线调试 (21)5.3.1无限遥控开关 (21)5.3.2无线通信模块 (21)6 结论 (23)参考文献 (24)附录1:单片机最小系统原理图 (25)附录2:单片机最小系统电路图 (26)附录3:单片机最小系统PCB图 (26)致谢 (27)1 引言本章简要的介绍了两轮自平衡小车的起源与发展、研究意义以及国内外的研究现状,并依此提出了本论文研究的主要内容。

第9章 MC9S12XS128定时器模块及其应用实例

第9章 MC9S12XS128定时器模块及其应用实例
【作为定时基准】产生内部定时,例如用于定时采样等。 MC9S12XS128定时器模块称为TIM(Timer Module)。
《MC9S12XS单片机原理及嵌入式系统开发》
第9章 MC9S12XS128定时器模块及其应用实例
本节内容
9.2 TIM模块结构和工作原理 9.2.1 TIM模块结构 9.2.2 TIM模块工作原理 9.2.3 TIM模块寄存器 9.2.4 TIM模块中断系统
《MC9S12XS单片机原理及嵌入式系统开发》
第9章 MC9S12XS128定时器模块及其应用实例
9.3 TIM模块的自由运行计数器和定时器基本寄存器及设置
9.3.1 自由运行主定时器与时钟频率设置 定时器系统控制寄存器TSCR1中的TEN位是TIMCLK时钟的总开关。 当TEN=0时,自由运行主定时器的时钟被关断,定时器停止工作,但并不
《MC9S12XS单片机原理及嵌入式系统开发》
第9章 MC9S12XS128定时器模块及其应用实例
9.1 TIM模块概述 定时器/计数器的特点:
(1)可以有多种工作方式——定时方式或计数方式等。 (2)计数器的模值可变——计数的最大值有一定的限制,取决于计数器
的位数。计数的最大值限制了定时的最大值。 (3)可以根据规定的定时或计数值,当定时时间到或到达计数终点时,
《MC9S12XS单片机原理及嵌入式系统开发》
第9章 MC9S12XS128定时器模块及其应用实例
9.1 TIM模块概述
9.2.2 TIM模块工作原理
【输入捕捉】
输入捕捉(Input Capture,IC):通过捕获自由运行计 数器的计数值来检测外部事件和记录选定的输入信号 跳变边沿的时间。
《MC9S12XS单片机原理及嵌入式系统开发》

MC9S12XS128IO口编程

MC9S12XS128IO口编程
I/0 口的作用
• 输出功能
• 相应引脚输出高低电平

1 --- 输出高电平 5V

0 --- 输出低电平 0V
注:I/O口带载能力低
I/0 口的作用
• 输入功能
ቤተ መጻሕፍቲ ባይዱ
• 读取相应引脚的电压高低

高---5V --- 读取结果为 1

低---0V --- 读取结果为 0
一般3V以上可识别为高电平,有些要 3.6V以上,但这不是绝对数据。
X128的I/O口
• MC9S12X128通用I/O口包括PORTA、PORTB、PORTE、 PORTK、PORTT、PORTS、PORTM、PORTP、PORTH、PORTJ、
PORTAD
• 注意:PORTK有7个引脚,PORTJ有4个引脚,其余均有8个

引脚
• 其中,B、E、K端口的寄存器名与A口类似 • 如PORTA PORTE PORTB PORTK ~~PORTA_PA1 • DDRA DDRB DDRE DDRK ~~DDRA_DDRA1
• 寄存器的值为1表示该引脚为输出,0表示输入
• 例:DDRA_DDRA0=1 ,A0为输出

DDRA_DDRA6=0 , A6为输入

DDRA=0XFF即0B11111111 ,A口为输出(含8引个脚)

DDRA=0X00即0B00000000 ,A口为输入(含8引个脚)
数据寄器PORTA
• A口共有8个引脚
• 实例1
• 设置A口8个引脚输出高电平 • DDRA=0XFF; //设为输出 • PORTA=0XFF; //输出为1,即高电平
• 实例2
• 读取A口电平信息,并存在变量 a 中 DDRA=0X00; //设置为输入 a=PORTA; //将电平信息读入变量a中 //若外部电平全为高,则a=0XFF

飞思卡尔16位单片机MC9S12XS128加密(程序下载不进去,正负极未短路,通电芯片不发烫)后解锁的方法及步骤

飞思卡尔16位单片机MC9S12XS128加密(程序下载不进去,正负极未短路,通电芯片不发烫)后解锁的方法及步骤

飞思卡尔16位单片机MC9S12XS128加密(程序下载不进去,正负极未短路,通电芯片不发烫)后解锁的方法及步骤/*****************************************************************************/ *本人用此法成功解救了4块板子【窃喜!】,此说明是本人边操作边截图拼成的,有些是在别的说明上直接截图【有些图本人不会截取,就利用现成的了,不过那也是本人用豆和财富值换来的】,表达不清之处还望见谅,大家将就着看吧!如能有些许帮助,我心甚慰!!!————武狂狼2014.4.23 /*****************************************************************************/编译软件:CW5.1版本,下载器:飞翔BDMV4.6 【1】,连接好单片机,准备下载程序,单击下载按钮出现以下界面或(图1.1)图 1.1——4中所有弹出窗口均单击“取消”或红色“关闭”按钮依次进入下一界面(图1.2)(图1.3)(图1.4)******************************************************************************* *******************************************************************************【2】单击出现如下图所示下拉列表,然后单击(图2.1)出现下图(图2.2)对话框,按下面说明操作(图2.2)弹出图2.3,单击按钮,依次出现如图2.4--5窗口,均单击(图2.3)(图2.4)******************************************************************************* *******************************************************************************【3】单击出现下拉列表,然后单击下拉列表中单击按钮出现如下界面,单击选择相对应的单片机型号(我选的红色方框里的HCS12X….),单击OK. PS:【此步骤是本人自己试出来的,若不进行此操作,图3.3中下拉列表中无要找选项】(图3.1)(图3.3)(图3.4)(图3.5)红色方框2中默认即为所要选的文件,此步只需单击确认按钮即可,如有不同读者酌情处置。

飞思卡尔9S12XS128 单片机教程

飞思卡尔9S12XS128 单片机教程

9S12XS128 单片机开发工具包清华Freescale MCU/DSP 应用开发研究中心9S12XS128单片机开发工具包 (1)概述 (3)9S12XS128单片机 (3)9S12XS128开发工具包组件 (3)9S12XS128开发板及与PC 通信 (4)9S12XS128 开发板 (4)开发板的硬件连接 (5)PC机的设置 (6)监控程序及监控命令详解 (8)命令详解 (8)复位、中断向量表 (12)用户可以使用的RAM空间 (12)编译器CodeWarrior for HCS12 使用方法入门 (13)建立工程文件 (13)编写main.c 程序 (15)定义存储空间分配 (17)应用程序的编译 (18)向开发板下载程序 (20)运行应用程序 (21)概述这里描述的是一套9S12XS128 系列单片机开发系统套件。

以后的更新的版本见清华Freescale单片机应用开发研究中心的网站:。

开发系统主要由两个部分组成,分别是调试下载用的TBDML和开发用目标板。

其中TBDML的使用请参见文档“BDM for S12(TTBDM)用户手册V 34.pdf”。

目标板是有异步串行口的驱动的基本系统。

针对9S12XS128 芯片我们编写了9S12XS128目标板监控程序,可以方便地完成应用系统的开发。

用户可以在此基础上设计自己所需的目标母板,完成项目的初期开发。

应用软件完成后,用开发工具板擦除监控程序,下载最终的应用程序。

9S12XS128 单片机S12XS 16 位微控制器系列针对一系列成本敏感型汽车车身电子应用进行了优化。

S12X 产品满足了用户对设计灵活性和平台兼容性的需求,并在一系列汽车电子平台上实现了可升级性、硬件和软件可重用性、以及兼容性。

S12XS 系列可以经济而又兼容地扩展至带XGate 协处理器的S12XE 系列单片机,从而为用户削减了成本,并缩小了封装尺寸。

S12XS系列帮助设计者迅速抓住市场机遇,同时还能降低移植成本。

MC9S12XS128开发板实验指导手册

MC9S12XS128开发板实验指导手册

MC9S12XS128开収板实验挃导手册目录第1章MC9S12XS128开収板概述 (4)第2章MC9S12XS128开収板结极 (10)第3章CodeWarrior快速入门 (17)3.1安装CodeWarrior软件 (17)3.2安装BDM驱动 (17)3.3创建新工程 (17)3.4调试新建工程 (21)第4章基础实验 (25)实验一复位及看门狗 (25)实验二蜂鸣器实验 (27)实验三LED灯实验 (28)实验四按键实验 (29)实验五ATD实验 (33)实验六锁相环实验 (37)实验七SCI串口实验 (38)实验八PWM实验 (41)实验九TIM实验 (42)实验十实时中断实验 (44)实验十一PIT实验 (45)实验十二数码管实验 (46)第5章高级实验 (47)实验一数字电压表 (47)实验二数字秒表及定时器 (48)实验三蜂鸣器播放音乐 (50)实验四汉显液晶实验 (51)实验五ZX0802A小液晶实验 (52)实验六遥控模块实验 (54)实验七温度传感器实验 (56)实验八RS-485总线实验 (58)实验九LIN总线实验 (59)实验十CAN总线实验 (63)实验十一SAE-J1939实验 (66)实验十二SD卡实验 (67)实验十三综合演示实验 (69)第6章补充实验 (70)实验一DFLASH实验 (70)版权所有盗用必究第1章MC9S12XS128开収板概述MC9S12XS128 (以下简称XS128)开収板是由“飞翔科技”基于XS128单片机的功能而开収的一款开収板。

该开収板硬件资源丰富,布局清晰明了,利用该开収板的硬件资源可熟悉和掌握XS128单片机的功能,充分体现出汽车电子的特色。

本部分将对XS128开収板的功能迚行简单介绍,以方便用户快速了解该开収板的功能。

下图为XS128开収板实物图。

与开収板配合使用的还有以下几个配件:跳线帽单股跳线连接线双股跳线连接线12V电源适配器串口延长线可以选配的配件主要有:BDM下载器12864汉显液晶模块ZX0802A小液晶无线遥控模块该开収板可分20个功能模块,下面简单介绍每个功能模块:●电源电路:电源模块使用LM2940芯片,将12V的电源转换成5V的电源,并使用LM1117芯片将5V的电源转换为3.3V,以便给SD卡供电。

mc9s12xs128程序教程

mc9s12xs128程序教程

711 次
该寄存器是 0~7 通道 PWM 输出起始极性控制位,用来设置 PWM 输出的起始 电平。
用法:PWMPOL_PPOL0=1--- 通道 0 在周期开始时输出为高电平,当计数 器等于占空比寄存器的值时,输出为低电平。对外输出波形先是高电平然后再变 为低电平。
2、PWM 波形对齐寄存器 PWMCAE
该控制寄存器设定通道的级联和两种工作模式:等待模式和冻结模式。这 两种模式如图 10 和图 11 所示。
图 10 等待模式
图 11 冻结模式
只有当相应的通道关闭后,才能改变 这些控制字。 用法: PWMCTL_CON67=1 --- 通道6、7 级联成一个 16 位的 PWM 通道。此 时只有7 通道的控制字起作用,原通道 7 的使能位、PWM 输出极性选择位、时 钟选择控制位以及对齐方式选择位用来设置级联后的 PWM 输出特性 PWMCTL_CON67=0 --- 通道6,7 通道不级联 CON45、CON23、CON01 的用法同 CON67 相似。设置此控制字的意 义在于扩大了PWM 对外输出脉冲的频率范围。 PSWAI=1 --- MCU 一旦处于等待状态,就会停止时钟的输入。这样就不 会因时钟在空操作而费电;当它置为0,则MCU 就是处于等待状态,也允许 时钟的输入。 PFRZ=1 --- MCU 一旦处于冻结状态,就会停止计数器工作。 (责任编辑:dzsj8)
1、PWM 预分频寄存器 PWMPRCLK
PWMPRCLK 寄存器每一位如图 3 所示:
复位默认值:0000 0000B
813 次
图3 PWMPRCLK 寄存器
PWMPRCLK 寄存器包括 ClockA 预分频和 ClockB 预分频的控制位。ClockA、 ClockB 的值为总线时钟的 1/2n (0≤n≤7),具体设置参照图 4 和图 5

mc9s12xs128程序教程

mc9s12xs128程序教程
1、PWM 预分频寄存器 PWMPRCLK
PWMPRCLK 寄存器每一位如图 3 所示:
复位默认值:0000 0000B
813 次
图3 PWMPRCLK 寄存器
PWMPRCLK 寄存器包括 ClockA 预分频和 ClockB 预分频的控制位。ClockA、 ClockB 的值为总线时钟的 1/2n (0≤n≤7),具体设置参照图 4 和图 5
/*******************************************************************/
图 14 PWM 左对齐方式 2、中心对齐方式
在该方式下,脉冲计数器为双向计数,计数初值为 0 。 当 PWM 使能后,计数器 PWMCNT 从 0 开始对时钟信号递增计数,开始输出一个 周期。当计数器与占空比常数寄存器 PWMDTY 相等时,比较器 1 输出有效,触发器 翻转,而 PWMCNT 继续计数,当计数值与周期常数 PWMPER 相等时,比较器 2 输出 有效,此时改变 PWMCNT 的计数方向,使其递解计数;当 PWMCNT 再次与 PWMDTY 相 等时,比较器 1 再一次输出有效,使触发器再次翻转,而 PWMCNT 继续递减计数, 等待 PWMCNT 减回至 0,完成一个输出周期。原理参照图 15: /********************************************************************/ 玉良理解的就是计数器的值先增加到与 PWMDTY 相等后,比较器 1 置位,而计数器 继续计数,当数值与 PWMPER 中的值相等后,改变其计数方向,改为递减计数,当 再一次与 PWMDTY 中的值相等后,比较器再一次输出有效,使触发器反转,而计数 器继续递减计数直到计数器的值为 0,从而完成一个输出周期。 /*********************************************************************/

MC9S12XS128串口操作例程

MC9S12XS128串口操作例程

MC9S12XS128串口操作例程MC9S12XS128 串口操作例程Code Warrior 4.7Target : MC9S12XS128Crystal: 16.000Mhzbusclock: 8.000MHzpllclock:16.000MHz本程序主要包括以下功能:1.设置锁相环和总线频率;2.IO口使用;3.共四路ATD使用及显示方法。

LED计数,根据灯亮可以读取系统循环了多少次************************************************************** ***************************/#include /* common defines and macros */#include /* derivative information */#include#include#include#pragma LINK_INFO DERIVATIVE "mc9s12xs128"#pragma CODE_SEG DEFAULT#define CR_as_CRLF TRUE // if true , you can use "\n" to act as CR/LF,// if false, you have to use "\n\r",but can get a higher speed static int do_padding;static int left_flag;static int len;static int num1;static int num2;static char pad_character;unsigned char uart_getkey(void){while(!(SCI0SR1&0x80)) ; //keep waiting when not emptyreturn SCI0DRL;}/*void uart_init(void) {SCI0CR2=0x0c;SCI0BDH=0x00;//16MHz,19200bps,SCI0BDL=0x1aSCI0BDL=0x34;//16MHz,9600bps,SCI0BDL=0x34}*/void uart_putchar(unsigned char ch){if (ch == '\n'){while(!(SCI0SR1&0x80)) ;SCI0DRL= 0x0d; //output'CR'return;}while(!(SCI0SR1&0x80)) ; //keep waiting when not empty SCI0DRL=ch;}void putstr(char ch[]){unsigned char ptr=0;while(ch[ptr]){uart_putchar((unsigned char)ch[ptr++]);}}static void padding( const int l_flag){int i;if (do_padding && l_flag && (len < num1))for (i=len; i<="" p="">uart_putchar( pad_character);}static void outs( char* lp){/* pad on left if needed */len = strlen( lp);padding( !left_flag);/* Move string to the buffer */while (*lp && num2--) uart_putchar( *lp++);/* Pad on right if needed */len = strlen( lp);padding( left_flag);}static void reoutnum(unsigned long num, unsigned int negative, const long base ){char* cp;char outbuf[32];const char digits[] = "0123456789ABCDEF";/* Build number (backwards) in outbuf */cp = outbuf;do {*cp++ = digits[(int)(num % base)];} while ((num /= base) > 0);if (negative) *cp++ = '-';*cp-- = 0;/* Move the converted number to the buffer and *//* add in the padding where needed. */len = strlen(outbuf);padding( !left_flag);while (cp >= outbuf)uart_putchar( *cp--);padding( left_flag);}static void outnum(long num, const long base ,unsigned char sign)//1, signed 0 unsigned{unsigned int negative;if ( (num < 0L) && sign ){negative=1;num = -num;}else negative=0;reoutnum(num,negative,base);}static int getnum( char** linep){int n;char* cp;n = 0;cp = *linep;while (isdigit(*cp))n = n*10 + ((*cp++) - '0');*linep = cp;return(n);}void printp( char* ctrl, ...){int long_flag;int dot_flag;char ch;va_list argp;va_start( argp, ctrl);for ( ; *ctrl; ctrl++) {/* move format string chars to buffer until a format control is found. */ if (*ctrl != '%') {uart_putchar(*ctrl);#if CR_as_CRLF==TRUEif(*ctrl=='\n') uart_putchar('\r');#endifcontinue;}/* initialize all the flags for this format. */dot_flag = long_flag = left_flag = do_padding = 0;pad_character = ' ';num2=32767;try_next:ch = *(++ctrl);if (isdigit(ch)){if (dot_flag)num2 = getnum(&ctrl);else {if (ch == '0')pad_character = '0';num1 = getnum(&ctrl);do_padding = 1;}ctrl--;goto try_next;}switch (tolower(ch)) {case '%':uart_putchar( '%');continue;case '-':left_flag = 1;break;case '.':dot_flag = 1;break;case 'l':long_flag = 1;break;case 'd':if (long_flag ==1 ){if(ch == 'D') {outnum( va_arg(argp, unsigned long), 10L , 0);continue;}else /* ch == 'd' */ {outnum( va_arg(argp, long), 10L,1);continue;}}else{if(ch == 'D') {outnum( va_arg(argp, unsigned int),10L,0);continue;}else /* ch == 'd' */{outnum( va_arg(argp, int), 10L,1); continue;}}case 'x': // X 无符号,x 有符号if (long_flag ==1 ){if(ch == 'X'){outnum( va_arg(argp, unsigned long), 16L,0); continue;}else /* ch == 'x' */{outnum( va_arg(argp, long), 16L,1); continue;}}else{if(ch == 'X'){outnum( va_arg(argp, unsigned int), 16L,0); continue;}else /* ch == 'x' */{outnum( va_arg(argp, int), 16L,1);continue;}} //如果按照16进制打印,将全部按照无符号数进行continue;case 's':outs( va_arg( argp, char*));continue;case 'c':uart_putchar( va_arg( argp, int));continue;default:continue;}goto try_next;}va_end( argp);}#pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt 20 SCI0_ISR(void){SCI0CR2_RIE=0;//此处为串口中断需要处理的事情uart_putchar(uart_getkey());PORTA_PA0=~PORTA_PA0;SCI0CR2_RIE = 1;}#pragma CODE_SEG DEFAULT//-----------------------------------------------------void setbusclock(void){CLKSEL=0X00; //disengage PLL to systemPLLCTL_PLLON=1; //turn on PLLSYNR=1;REFDV=1; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;_asm(nop); //BUS CLOCK=16M_asm(nop);while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;CLKSEL_PLLSEL =1; //engage PLL to system;}//-----------------------------------------------------static void SCI_Init(void){SCI0CR1 =0x00;SCI0CR2 =0x2c; //enable Receive Full Interrupt,RX enable,Tx enable SCI0BD =0x68; //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//-----------------------------------------------------void Dly_ms(int ms){int ii,jj;if (ms<1) ms=1;for(ii=0;ii<ms;ii++)< p="">for(jj=0;jj<2670;jj++); //busclk:16MHz--1ms}void main(void){unsigned char LedCnt=0;setbusclock();SCI_Init();DDRA=0xFF;PUCR_PUPBE=1;EnableInterrupts;for(;;){LedCnt=(LedCnt>0XFE?0:++LedCnt);Dly_ms(1000); //修改延时以修改数据发送频率//低电平灯亮用这句,注释掉下面那句PORTA_PA0=~PORTA_PA0;//高电平灯亮用这句,注释掉上面那句//PORTB=LedCnt;putstr("\nhttp:%/%//doc/4115489903.html,");printp("\n Minute elapsed: %03ds",LedCnt); }}</ms;ii++)<>。

MC9S12XS128学习中文精华版

MC9S12XS128学习中文精华版

IO口模块程序示例Void PORTB_Init(void){DDRB=0xff;//PB口作输出使用,1为输出,0为输入PORTB=0x00;//PB口数据寄存器值}注意:IO口要注意以下几点:(1)每个IO口的数据寄存器名可能不同(2)AN口只能作输入用(3)PH,PJ(高两位,低两位),PP可用输入中断功能使用(4)IO口作输入与输出时有不同的寄存器对应(5)IO口作复用时不能作IO口用,相反也不行IO口可用作:调试接口(接数码管、液晶、拨码开关等等)所以必须掌握使用拨码开关要注意这样用;DDRB=0XFF;//输出PORTB=0XFF;DDRB=0X00;//输入AD模块程序示例Void ATD_Init(void){ATD0CTL1 = 0x00;//8位精度,不放电ATD0CTL2 = 0x42;//快速清除标志位,禁止外部触发,使能中断ATD0CTL3=0x8a;//右对齐,每序列4次转换,不用FIFO,进入FreezeMode 完成当前转换ATD0CTL4 = 0x03;//采样用4个ATD周期,F(ATD)=1MHz[bus clock为8MHz]ATD0CTL5 = 0x29;//SCAN模式,单通道,通道9ATD0DIEN = 0x00;//禁止数据输入}Void main(void){ATD_Init();………………………………………}#pragma CODE_SEG NON_BANKEDvoid interrupt 22 Int_AD0(void){ DisableInterrupts;AD_wData = ATD0DR0L; //读ATD转换的寄存器值(低八位)ATD0STAT0_SCF=0;//(当AFFC为1时,写0清零;为1时写1清零)EnableInterrupts;}注意:ATD模块要着重注意:(1)标志位清零(比较复杂)(转换后的储存顺序(3)精度的选择和转换速度(4)单个通道与多通道转换的区别定时器模块程序示例Void Timer_Init(void){TSCR1=0X90;//使能定时器并设置为自动清除标志TFLG1 TSCR2=0X03;//设置分频系数为8,及232)多通道TIE=0X01;//定时器通道0中断使能TIOS_IOS0=1;//PT0口为输出比较TC0=TCNT+1677;//设定初值//定的时间就是从0加到1677要的时间EnableInterrupts;Void main(void){Timer_Init();…………………..}#pragmaCODE_SEGNON_BANKEDvoid interrupt 8 Timer(void) {DisableInterrupts;TC0=TCNT+1677;//设定比较器下次中断时间TSCR1=0x00;//关定时器(一般情况定没必要用这个)EnableInterrupts;}注意:定时器模块要关重注意以下几点:(1)初值的设定,每次中断都要置初值(2)标志位的清零方式(3)PT口作为输入捕捉时的设置区别脉冲累加模块示例Void PT7_Init(void){PACTL=0X40;//脉冲累加系统使能,下降没触发,使用预分频因子定义的时钟PACNT=0X00;//设定脉冲累加计数寄存器初值}注意:脉冲累加模块注意以下几点:(1)PACTL中的各位配合使用表,可以在自备次料上查PWM脉宽调制模块示例PWME=0X02;//使能PWM1口,及PP1口PWMCTL=0X10;//级连PP0和PP1PWMPRCLK=0X07;//预分频A系数为128PWMCLK_PCLK1=0;//级连通道01选择时钟A PWMPOL=0X02;//级连通道01极性们为先高电平输出PWMCAE=0X00;//级连通道01为左边对齐输出PWMDTY01=1000;//占空比寄存器值PWMPER01=1500;//周期寄存器值}注意:PWM模块要注意以下几点:(1)PWM级联时寄存器名称区别(2)预分频与分频的联合应用串行口SCI程序示例SCI0BDL=(byte)(8000/9600/16);//设置总线为8M时SCI波特率为9600HzSCI0CR1=0x00;//数据格式为8位(没有奇偶校验位)SCI0CR2=0x2c;//接收中断使能,发送使能,接收器使能}Void main(void){SCI_Init();………………………}#pragma CODE_SEG NON_BANKEDinterrupt 20 void SCI_RX_IRS(void){byte RxData,RX;DisableInterrupts;RX=SCI0SR1;//读状态寄存器,为清零作准备RxData=(byte)SCI0DRL; //读接收寄存器的值EnableInterrupts;}注意:串行口SCI要注意以下几点:(1)波特率的设置注意总线频率是否有变(2)SCI数据格式(2)接收中断标志清零是先读状态寄存器再读数据寄存器(4)发送时不能用中断,只能轮询标志位(易错)!!!琐相环模块程序示例Void SetBusCLK_32M(void){ CLKSEL=0x00;//不使用锁相环PLLCTL_PLLON=1;//锁相环电路允许SYNR=0xc0|0x03;//SYNDIV=3REFDV=0xc0|0x01;//REFDIV=1POSTDIV=0x00;//分频系数为20=1_asm(nop);//等待锁相环稳定_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);while(!(CRGFLG_LOCK==1)); CLKSEL_PLLSEL=1;//使用锁相环(只能写最后)}注意:锁相环要注意以下几点(1)锁相环使用后改变了总线频率,所以相它与总线频率相关的各模块寄存器也要相应改变,以免出现低级错误(易错)!!(2)锁相环设置顺序(3)超率不能超出范围(4)公式中的FOSC为晶振频率而非时钟频率,别搞错了!SPI通信模块程序示例void SPI_Init(void){//SPI初始化SPI0CR1=0xde;//SPI中断使能,SPI系统使能,SPI为主机模式,SPI时钟极性为低时钟有效,SPI传送期间从机SS脚可保持低电平SPI0CR2=0x12;样//模式错误使能,等待模式下停止SPI时钟SPI0BR=0x07;//分频系数为256SPI0SR_SPIF=0;//接收中断标志初始化为0}void Send_Data(unsigned char data){//SPI发送数据while(!SPI0SR_SPTEF);//等待发送寄存器为空SPI0DRL=data;while(!(SPI0SR_SPIF));//等待接收标志置1,接收到的是返回值aa=SPI0DRL;}unsigned char Read_Data(){//SPI读数据unsigned char data;while(!SPI0SR_SPTEF);//等待发送寄存器空(因为SPI中收、发都用一个寄存器)SPI0DRL=0xff;while(!SPI0SR_SPIF);//等待接收标志置位data=SPI0DRL;//读出数据return data;//返回数据}注意:SPI要注意以下几点:(1)HCS12中SPI数据寄存器虽然有十六位,但有用的只有八位(用到的)PC9S12XS128MAL中断向量表#define VectorNumber_Vporth25PORTH中断号#define VectorNumber_Vportj24PORTJ中断号#define VectorNumber_Vatd022A/D转换中断号#define VectorNumber_Vsci121串行口1中断号#define VectorNumber_Vsci020串行口0中断号#define VectorNumber_Vtimch08定时器中断。

MC9S12XS128电机测试程序

MC9S12XS128电机测试程序

/*****************************************************************************/ //功能说明:MC9S12XS128--PWM//实现功能:电机先正向加速转后正向减速转然后电机反加速转再反向减速转// 通道3(PTP3)控制正转通道1(PTP1)控制反转//程序设计:杨洋//QQ 号码:814118650//设计时间:2011.01.16--14:19/*****************************************************************************/ #include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */unsigned char i;unsigned long j;/********************锁相环初始化子程序*******************************/void PLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1){ //锁相环时钟=2*16*(2+1)/(1+1)=48MHzREFDV=1; //总线时钟=48/2=24MHzSYNR=2;while(!(CRGFLG&0x08));CLKSEL=0x80; //选定锁相环时钟}/******************PWM 初始化子程序*****************************/void PWM_Init(void){PWME_PWME3=0; // Disable PWM 禁止PWME_PWME1=0; // Disable PWM 禁止PWMPRCLK=0x33; // 时钟预分频寄存器设置------0011 0011 A=B=24M/8=3M PWMSCLA=15; // 时钟设置------------------SA=A/(2*15)=100k PWMSCLB=15; // 时钟设置------------------SB=B/(2*15) =100k}/******************PWM3 初始化子程序*****************************/void PWM3_Init(void){PWMCLK_PCLK3=1; // 时钟源的选择--------------PWM3-----SBPWMPOL_PPOL3=1; // 极性设置------------------开始输出高电平PWMCAE_CAE3=0; // 对齐方式设置--------------左对齐PWMCTL=0x00; // 控制寄存器设置------------无级联PWMPER3=50; // 周期寄存器设置------------Frequency=SB/50=2KPWME_PWME3=1; // Enable PWM 使能}/******************PWM1 初始化子程序*****************************/void PWM1_Init(void){PWMCLK_PCLK1=1; // 时钟源的选择--------------PWM1-----SAPWMPOL_PPOL1=1; // 极性设置------------------开始输出高电平PWMCAE_CAE1=0; // 对齐方式设置--------------左对齐PWMCTL=0x00; // 控制寄存器设置------------无级联PWMPER1=50; // 周期寄存器设置------------Frequency=SB/50=2K PWME_PWME1=1; // Enable PWM 使能}/******************电机正转子程序*****************************/void RUN_STRAIGHT(void){//--------------正转加速------------------------//for(i=50;i>10;i--){while(j--);j=200000;PWMDTY3=i; //设置占空比PWME_PWME3=1; //使能PWM}while(j--);j=2000000;//--------------正转减速------------------------//for(i=10;i<50;i++){while(j--);j=200000;PWMDTY3=i; //设置占空比PWME_PWME3=1; //使能PWM}PWME_PWME3=0;}/******************电机反转子程序*****************************/void RUN_BACK(void){//--------------反转加速------------------------//for(i=50;i>10;i--){while(j--);j=200000;PWMDTY1=i; //设置占空比PWME_PWME1=1; //使能PWM}while(j--);j=2000000;//-------------反转减速------------------------//for(i=10;i<50;i++){while(j--);j=200000;PWMDTY1=i; //设置占空比PWME_PWME1=1; //使能PWM}PWME_PWME1=0;}/********************主函数************************************/ void main(void){/* put your own code here */PLL_Init();PWM_Init();PWM3_Init();RUN_STRAIGHT();while(j--);j=100000;PWM1_Init();RUN_BACK();EnableInterrupts;//for(;;)//{_FEED_COP(); /* feeds the dog *///} /* loop forever *//* please make sure that you never leave main */ }。

飞思卡尔MC9S12XS128单片机中断优先级设置简易教程

飞思卡尔MC9S12XS128单片机中断优先级设置简易教程

本教程试图用最少的时间教你飞思卡尔XS128单片机的中断优先级设置方法和中断嵌套的使用,如果是新手请先学习中断的基本使用方法。

先来看看XS128 DataSheet 中介绍的相关知识,只翻译有用的:七个中断优先级每一个中断源都有一个可以设置的级别高优先级中断的可以嵌套低优先级中断复位后可屏蔽中断默认优先级为1同一优先级的中断同时触发时,高地址(中断号较小)的中断先响应注意:高地址中断只能优先响应,但不能嵌套同一优先级低地址的中断下面直接进入正题,看看怎么设置中断优先级:XS128中包括预留的中断一共有128个中断位,如果为每个中断都分配一个优先级寄存器的话会非常浪费资源,因此飞思卡尔公司想出了这样一种办法:把128个中断分为16个组,每组8个中断。

每次设置中断时,先把需要的组别告诉某个寄存器,再设置8个中断优先寄存器的某一个,这样只需9个寄存器即可完成中断的设置。

分组的规则是这样的:中断地址位7到位4相同的中断为一组,比如MC9SX128.h中这些中断的位7到位3都为D,他们就被分成了一组。

0~F正好16个组。

INT_CFADDR就是上面说到的用来设置组别的寄存器:我们需要设置某个组别的中断时,只要写入最后8位地址就行了,比如设置SCI0的中断优先级,就写入0xD0。

设置好组别之后,我们就要该组中相应的中断进行设置,设置中断的寄存器为这其实是一组寄存器,一共有8个,每个都代表中断组中的一个中断。

对应规则是这样的:中断地址的低四位除以2比如还是SCI0,低四位是6,除以二就是3,那么我们就需要设置INT_CFDATA3 往INT_CFDATAx中写入0~7就能设置相应的中断优先级了拿我本次比赛的程序来举个例子:我们的程序中需要3个中断:PIT0,PORTH,SCI0。

PIT0定时检测传感器数值,PORTH连接干簧管进行起跑线检测,SCI0接收上位机指令实现急停等功能。

因此中断优先级要SCI0>PORTH>PIT0。

飞思卡尔MC9S12XS128单片机重点模块讲解

飞思卡尔MC9S12XS128单片机重点模块讲解

基于飞思卡尔 MC9S12XS128MCU 的模块讲解及测试
安徽工业大学 自动化系 刘昌元 } /*--------------------- 主函数------------------------------------*/ void main(void) { DDRB=0x3f; LED=0x01; EnableInterrupts; while(1) { delay(time); LED<<=1; delay(time); //延时 //高电平信号左移一位 //定义 B0-B5 口为输出 // 点亮第一只灯 //允许中断
基于飞思卡尔 MC9S12XS128MCU 的模块讲解及测试
安徽工业大学 自动化系 刘昌元 � 概述:
飞思卡尔单片机的端口名称和 51 系列单片机有区别, 51 单片最经典的通用 I/O 口名称是 P0 口、P1 口、 P2 口、P3 口。而飞思卡尔 128 单片机是由 A 口、B 口、 K 口、E 口等标称的, 熟悉 51 单片的同学在此学习飞思卡尔单片时要知道变通,同样的对于学习其他单片机也是 一样的,先熟悉端口名称,再熟悉其端口功能,再熟悉其寄存器。C 语言的编程语法和算法 思路是通用的。 现在功能强悍一点的单片都在内部集成了很多现成的模块, 我们可以通过对 其模块寄存器编程配置我们需要的功能即可, 此处的 128 单片机就是这样一款单片机, 在此 我就我个人学习的一些心得写出来, 仅供交流与参考, 同时我也希望帮助新手能够很快得上 手。 具体更深层的内容大家还需要去参考芯片的技术手册和其他参考书。 以下我就分模块来 讲解, 大家在学习的过程中也需要一个模块一个模块的来学习和测试。 其实我个人觉得买过 来的开发板用途不是很大,因为很多端口被其在 PCB 设计时固化了,留给我们的端口并不 多,使用起来极不方便,所以我个人建议大家可以买个带有最小系统的模块,自己用排针和 插槽焊一个程序调试板,再焊一排共阴极的发光二极管(最好能发不同颜色光的) ,再焊几 个开关电路和按键电路即可。 我们在代码的各个位置通过点亮发光二极管来知道程序走到哪 一步了。下面我提供的测试例程也是这么来的,节省硬件就是节省开支啊,多动脑子,多想 办法可以克服很多困难的。 注: 一个寄存器的多个位可以一次性写入配置的, 但是为了使大家读程序理解方便我对寄存 器的每一位几乎一位一位配置的,我麻烦了,不过可以给大家读程序带来方便。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SCI程序串行通信时MCU与外部设备之间进行通信的一种简单而有效的硬件方法。

无论用查询方式还是中断方式进行串行通信编程,在程序初始化时均必须对SCI进行初始化。

初始化主要包括波特率设置、通信格式的设置、发送接收数据方式的设置等。

对SCI进行初始化,需要设置如下几部分:(1)定义波特率一般选内部总线时钟为串行通信的时钟源。

通过设置SCI波特率寄存器SCI0BD的波特率选择位SBR[12:0],来选择合适的分频系数。

(2)写控制字到SCI控制寄存器1(SCI0CR1)设置是否允许SCI、数据长度、输出格式、选择唤醒方法、是否校验等。

(3)写控制字到SCI控制寄存器2(SCI0CR2)设置是否允许发送与接收、是中断接收还是查询接收等。

串行通信程序如下:/** write in “Init.h” **/#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions *///void InitBusClk(void); //可以不使用锁相环void InitSci(void);/** write in “Init.c” **///初始化程序#include "Init.h"/*//------------初始化Bus Clock------------//void InitBusClk(void) {DisableInterrupts;CLKSEL=0X00; //PLLSEL 1 : Bus Clock=PLLCLK/2// 0 : Bus Clock=OSCCLK/2PLLCTL_PLLON=1; //开启PLLSYNR=0; //OSCCLK=16MHzREFDV=0X0F; //PLLCLK=2*OSCCLK*[(1+SYNR)/(1+REFDV]=32/16=2MHz while(!(CRGFLG_LOCK==1)); //直到LOCK=1,when PLL is ready,退出循环CLKSEL_PLLSEL=1; //PLLSEL 1 : Bus Clock=PLLCLK/2=2MHz/2=1MHz// 0 : Bus Clock=OSCCLK/2=16M/2=8MHz}*///---------------初始化SCI---------------//void InitSci(void){SCI0BD=4545; //设波特率为110//SCI baud rate = SCI module clock/(16*SCIBD)=Bus Clock/(16*SCIBD)// = 8MHz/(16*4545)=500kHz/4545=110bps//SCIBD : SBR12-SBR0,Value from 1 to 8191SCI0CR1=0;SCI0CR2=0X2C; // 0010 1100 RIE=1,TE=1,RE=1// RIE=1 RDRF and OR interrupt requests enabled// TE=1 Transmitter enabled// RE=1 Receiver enabled}/** write in “SCI.h” **///函数声明unsigned char SciRead();void SciWrite(byte);/** write in “SCI.c” **///串行通信程序#include "Init.h"#include "SCI.h"//---------------读SCI数据---------------//unsigned char SciRead(){if(SCI0SR1_RDRF==1){//数据从移位寄存器传送到SCI数据寄存器SCIDRL//SCI0SR1_RDRF==1表明数据寄存器SCI0DRL为满,可以接收新的数据SCI0SR1_RDRF=1; //读取SCI数据寄存器会将RDRF清除,重新置位return SCI0DRL; //返回数据寄存器的数值}}//---------------写SCI数据---------------//void SciWrite(byte sci_value){while(!(SCI0SR1&0X80));//SCI0SR1_TDRE==1表明数据寄存器SCI0DRL为空,可以发送新的数据SCI0DRH=0;SCI0DRL=sci_value; //发送新的数据至数据寄存器SCI0DR}//---------------中断程序-----------------//#pragma CODE_SEG NON_BANKEDinterrupt 20 void Sci_Intrrupt(void){ //SCI的中断向量号为20byte text;DisableInterrupts; //关中断text=SciRead(); //接收数据寄存器SCI0DRL中的数据asm nop;asm nop;SciWrite(text); //发送数据至数据寄存器SCI0DRLDDRA=0XFF; //设A口为输出,用来显示是否执行中断,可以不用PORTA_PA6=!PORTA_PA6;EnableInterrupts; //开中断}#pragma CODE_SEG DEFAULT/** write in “main.c”” **/#include "Init.h"#include "SCI.h"void main(void) {/* put your own code here */_DISABLE_COP(); //关看门狗DisableInterrupts; //关中断//InitBusClk();InitSci();EnableInterrupts; //开中断for(;;) {// _FEED_COP(); /* feeds the dog */} /* loop forever *//* please make sure that you never leave main */}A/D转换应用实例要让ATD 开始转换工作,必须经过以下三个步骤:1.将ADPU 置1,使ATD 启动;2.按照要求对转换位数、扫描方式、采样时间、时钟频率及标志检查等方式进行设置;3.发出启动命令;如果上电默认状态即能满足工作要求,那么只要将ADPU 置1,然后通过控制寄存器发出转换命令,即可实现转换。

程序描述:由通道ATD0进行单通道A/D转换,转换值在B口显示。

程序如下:程序一:#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */byte ad_value; //AD转换结果void Delay(int i) { //延时程序int j;for(;i>0;i--)for(j=500;j>0;j--);}/***---------------初始化程序---------------***/void InitBusClk(void) {CLKSEL=0X80; //PLLSEL 1 : Bus Clock=PLLCLK/2// 0 : Bus Clock=OSCCLK/2PLLCTL_PLLON=1; //开启PLLSYNR=0;REFDV=0X03; //OSCCLK=16MHz//PLLCLK=2*OSCCLK*[(1+SYNR)/(1+REFDV]=32/4=8MHzwhile(!(CRGFLG_LOCK==1)); //直到LOCK=1,when PLL is ready,退出循环CLKSEL_PLLSEL=1;//PLLSEL 1 : Bus Clock=PLLCLK/2=8MHz/2=4MHz// 0 : Bus Clock=OSCCLK/2=16M/2=8MHz}void InitAD(void){ATD0CTL2 = 0XC0; // 1100 0000 启动A/D,快速清除标志位// 无等待模式,外部触发禁止(bit2=0),中断禁止(bit1=0)ATD0CTL3 = 0X0C;// 0 0001 1 00 转换序列为1 、FIFO模式启动,冻结模式下继续转换ATD0CTL4 = 0XE1; // 1 11 00001 8位精度,16AD采样时间// 总线(1+1)*2 = 4 分频,AD时钟= 1MHz ATD0CTL5 = 0X27;// 0 0 1 0 0 111 右对齐,无符号,连续转换,单通道, 起始通道ATD7// DJM DSGN SCAN MULT 0 CC CB CA// DJM :1-Right justified 0-Left justified// DSGN:1-Signed data 0-Unsigned data// SCAN:1-Continuous 0-Single conversion// CC CB CA : Analog Input Channel Select CodeATD0DIEN = 0X00; // 数字输入disabled}/***---------------主程序---------------***/void main(void) {/* put your own code here */_DISABLE_COP(); // 关看门狗InitBusClk();InitAD();DDRB=0XFF; // 设PORTB为输出口PORTB=0x00;EnableInterrupts; // 开放总中断for(;;) {while(!ATD0STAT2L_CCF7); //等待转换结束,退出循环ad_value=(byte)ATD0DR7H;//左对齐,右对齐时转换结果都先存储在ATD0DRxH,后存储在ATD0DRxL.Delay(200); //延时PORTB=ad_value;//PORTB输出AD转换结果,并用8个LED发光二极管显示//_FEED_COP(); /* feeds the dog */} /* loop forever *//* please make sure that you never leave main */}程序二:(用指针实现AD转换)#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */ byte AD_Value; //AD转换结果void Delay(int i) { //延时程序int j;for(;i>0;i--)for(j=500;j>0;j--);}/***---------------初始化程序---------------***/(初始化程序与上述相同)/***---------------读取AD转换结果---------------***/void AD_GetValue(word *AD_Value){*AD_Value=ATD0DR0;}void main(void) {/* put your own code here */_DISABLE_COP(); //关看门狗InitBusClk();InitAD();DDRB=0XFF; //设PORTB为输出口PORTB=0x00;EnableInterrupts;for(;;) {while(!ATD0STAT2L_CCF7); //等待转换结束,退出循环AD_GetValue(&AD_Value); //读取转换结果Delay(400);PORTB=AD_Value; //转换结果在B口显示_FEED_COP(); /* feeds the dog */} /* loop forever *//* please make sure that you never leave main */}程序三:(用中断实现AD转换)#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */#include <mc9s12xs128.h>byte AD_Data=0;//*void Delay(int i) {int j;for(;i>0;i--)for(j=500;j>0;j--);}//*//***---------------初始化程序---------------***/void InitBusClk(void) {CLKSEL=0X80; //PLLSEL 1 : Bus Clock=PLLCLK/2// 0 : Bus Clock=OSCCLK/2PLLCTL_PLLON=1; //开启PLLSYNR=0;REFDV=0X03; //OSCCLK=16MHz//PLLCLK=2*OSCCLK*[(1+SYNR)/(1+REFDV]=32/4=8MHz while(!(CRGFLG_LOCK==1)); //直到LOCK=1,when PLL is ready,退出循环CLKSEL_PLLSEL=1; //PLLSEL 1 : Bus Clock=PLLCLK/2=8MHz/2=4MHz// 0 : Bus Clock=OSCCLK/2=16M/2=8MHz}void InitAD(void){ATD0CTL2 = 0XC3;// 110 000 11 启动A/D,快速清除标志位,无等待模式,外部触发禁止(bit2=0) // 中断开放(bit1=1,bit0=1)// bit1 :ATD Sequence Complete Interrupt Enable// bit0 :ATD Sequence Complete Interrupt FlagATD0CTL3 = 0X0C;// 0 0001 1 00 转换序列为1 、FIFO模式启动,冻结模式下继续转换ATD0CTL4 = 0XE1; // 1 11 00001 8位精度,16AD采样时间// 总线(1+1)*2 = 4 分频,AD时钟= 1MATD0CTL5 = 0XA7;// 1010 0111 右对齐,无符号,连续转换,单通道, 起始通道ATD7ATD0DIEN = 0X00; // 数字输入disabled}/***---------------主程序---------------***/void main(void) {/* put your own code here */DisableInterrupts; //关中断InitBusClk();InitAD();DDRB=0XFF; //设B口为输出口PORTB=0X00;EnableInterrupts; //开中断for(;;){//while(!ATD0STAT2L_CCF7);PORTB=(byte)AD_Data; //B口显示转换结构}}/***---------------中断服务程序---------------***/#pragma CODE_SEG NON_BANKEDvoid interrupt 22 IntAD(void){ // AD转换的中断向量号为33 DisableInterrupts; //关中断//while(!ATD0STAT2L_CCF7);AD_Data=ATD0DR0H; //读取AD转换结果EnableInterrupts; //开中断}#pragma CODE_SEG DEFAULTPWM例程//---------------------------------------------------------------------------------------------------////功能说明:MC9S12XS128--PWM例程//使用说明:实现通道0(PTP0)输出频率为1Hz,占空比为50%的方波,可以用发光二极管显示,每秒钟放光二极管亮一次//--------------------------------------------------------------------------------------------------//#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */void Delay(int i){int j ;for(;i>0;i--)for(j=500;j>0;j--);}void InitPWM(void){PWME =0x00; //clear PWM Enable register 关闭PWM输出PWMPOL = 0XFF; //初始极性高电平PWMCAE =0x00; // left allign 左对齐//PWMCTL = 0x50; // 0101 0000 CON01 CON45PWMCLK = 0x01; // 0000 0001 con0 uses Clock SA// SA Clock A is the clock source for PWM channel 0// SA Clock SA is the clock source for PWM channel 1// SA Clock B is the clock source for PWM channel 2// SA Clock B is the clock source for PWM channel 3// SA Clock A is the clock source for PWM channel 4// SA Clock A is the clock source for PWM channel 5// SA Clock B is the clock source for PWM channel 6// SA Clock B is the clock source for PWM channel 7PWMPRCLK=0x07;// 0000 0111 时钟A 128分频clockA=bus colck/128=8MHz/128=1/16 MHzPWMSCLA=0XFA;// 1111 1010 时钟SA为1/16MHz/(250*2)=1/8000MHz=1/8kHz=1000/8Hz=125HzPWMPER0=125; // Period = 1s *** (0.008)*125=1s *** PWMDTY0=60;PWME = 0x01; // 0000 0001 开启通道0的PWM 输出}void main(void) {/* put your own code here */InitPWM();EnableInterrupts;for(;;) {_FEED_COP(); /* feeds the dog */} /* loop forever *//* please make sure that you never leave main */}。

相关文档
最新文档