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口上去。

第8章MC9S12XS128模数转换模块及其应用实例59页PPT

第8章MC9S12XS128模数转换模块及其应用实例59页PPT

8.2 ATD模块结构组成和特点
MC9S12XS128内置的ATD 模块如图8.1所示。
《MC9S12XS单片机原理及嵌入式系统开发》 单片机原理及嵌入式系统开发》
8.2 ATD模块结构组成和特点
ATD模块具有以下基本特征: 8位/10位/12位可选转换精度; 停止模式下转换使用内部时钟; 转换完成后为低功耗状态; 自动和可编程数值比较,可设定大于或者小于等于设定值时中断申请; 可编程采样时间; 左对齐/右对齐转换数值; 外部触发功能; 转换完成中断申请; 16路模拟输入通道多路开关; 可实现VRH、VRL和(VRH+VRL)/2特殊转换; 转换序列长度为1~16; 连续转换模式; 多通道扫描功能; 外部触发功能可配置为AD通道或4个外部附加触发输入端,外部触发源可选
《MC9S12XS单片机原理及嵌入式系统开发》 单片机原理及嵌入式系统开发》
8.3 ATD模块寄存器及设置
8.3.4 ATD控制寄存器3(ATDCTL3)
S8C、S4C、S2C、S1C:转换序列长度定义位。这4位控制每个序列转换的长度。A/D 转换序列长度定义详见表8-7。复位后,S4C默认为1,所以默认的A/D转换序列的长度为 4。
8.3 ATD模块寄存器及设置
8.3.3 ATD控制寄存器2(ATDCTL2)
ETRIGE:外部触发模式使能位。该位允许表8-3中描述的AD通道或者ETRIG3~0输入 端作为外部触发源。如果外部触发源是AD某通道,则使能该通道的数字输入缓冲功能。外部 触发允许与外部事件实现同步转换。停止模式下的AD转换,外部触发不工作。
《MC9S12XS单片机原理及嵌入式系统开发》 单片机原理及嵌入式系统开发》
8.3 ATD模块寄存器及设置

MC9S12XS128例程

MC9S12XS128例程

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,然后通过控制寄存器发出转换命令,即可实现转换。

【MC9S12XS128MAA】使用说明书

【MC9S12XS128MAA】使用说明书

【MC9S12XS128MAA】使用说明书
预览说明:预览图片所展示的格式为文档的源格式展示,下载源文件没有水印,内容可编辑和复制
MC9XS128MAA 使用说明书
该系统板供电电压为:5±0.02 V ,建议使用TPS7350为其供电,理由如下:TPS7350 是微功耗低压差线性电源芯片,具有完善的保护电路,包括过流、过压、电压反接保护。

使用这个芯片只需要极少的外围元件就能构成高效稳压电路。

与LM2940及AS1117稳压器件相比,TPS7350具有更低的工作压降和更小的静态工作电流,可以使电池获得相对更长的使用时间。

由于热损失小,因此无需专门考虑散热问题。

而且其纹波很小,又为线性稳压芯片,可以为单片机及片外AD 模块提供很稳定的工作电压!
1.到货后检测:
当你的系统板到货后,请你马上测试,如系统板的有个指示灯是一闪一闪的(我们发货检测的时候讲测试程序烧录在里面),证明系统板是没有问题的。

否则就是损坏的,请你马上联系我们的客服。

系统板与下载器BDM的连接图:
该系统板的编程需要专门的飞思卡尔软件:
2.
3.
需要使用USB专用接线,使用前需要安装USB转串口CH340T 驱动
5.烧录时出现问题
如果下载程序步骤不是以上步骤,并且不能进行烧录,则可能出现以下问题:
1、电脑未安装BDM 驱动或者安装未成功;
2、下载线跟芯片下载口的方向不对;
3、连接线出现问题,拔出各接口,重新连接;
4、芯片被锁,请按照解锁文档步骤进行解锁
5、BDM 跳线帽错误。

第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单片机原理及嵌入式系统开发》

飞思卡尔MC9S12XS128各模块初始化程序--超详细注释

飞思卡尔MC9S12XS128各模块初始化程序--超详细注释

飞思卡尔MC9S12XS128各模块初始化程序--超详细注释//**************************************************************************// 武狂狼2014.5.1 整理// 新手入门的助手////***************************************************************************注释不详细/*********************************************************/函数名称:void ATD0_init(void)函数功能:ATD初始化入口参数:出口参数:/***********************************************************/void ATD0_init(void){ATD0DIEN=0x00; //使用模拟输入功能|=1;数字输入功能// ATD0CTL0=0x07; //Bit[3:0]WRAP[3:0] 反转通道选择位ATD0CTL1=0x40; // 12位精度,采样前不放电 Bit[7]ETRIGSEL(外部触发源选择位。

=0选择A/D通道AN[15:0] |=1选择 ERTIG3~0)和Bit[3:0]ETRIGCH[3:0]选择外部触发通道// Bit[6:5]SRES[1:0]A/D分辨率选择位。

Bit[4]SMP_DIS =0采样前不放电|=1采样前内部电容放电,这会增加2个A/D时钟周期的采样时间,有助于采样前进行开路检测ATD0CTL2=0x40; // 快速清零,禁止中断,禁止外部触发ATD0CTL3=0x90; // 右对齐,转换序列长度为2,非FIFOATD0CTL4=0x03; // 采样时间4个周期,PRS=31,F(ATDCLK)=F(BUS)/(2(PRS+1))// ATD0CTL5=0x30; //启动AD转换序列//:对每项数据采集时,用到哪个通道采样可在相应子函数内设置某一通道(见Sample_AD.c)while(!ATD0STAT2L_CCF0);/*********************************************************/函数名称:void PIT_init(void)函数功能:初始化PIT 设置精确定时时间(1s)入口参数:无出口参数:无说明:无/***********************************************************/void PIT_init(void){PITCFLMT=0x00; //禁止PIT模块Bit[7] PITE:PIT模块使能位,0禁用|1使能// Bit[6] PITSWAI:等待模式下PIT停止位,0等待模式下,PIT模块正常运行| 1等待模式下,PIT模块停止产生时钟信号,冻结PIT模块// Bit[5] PITFRZ: 冻结模式下PIT计数器冻结位。

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

mc9s12xs128超声波程序

mc9s12xs128超声波程序

#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define TX PORTB_PB1#define RX PORTB_PB7#define TX0 PTM_PTM4#define RX0 PTM_PTM2int SY=0;int SZ=0;int time=0;int time0=0;int rx=0;int rx0=0;void delay_1(uint shi){uchar i;for(;shi>0;shi--)for(i=100;i>0;i--); //18us}void suocun(){CLKSEL=0x00; //disengage PLL to systemPLLCTL_PLLON=1; //turn on PLLSYNR =0xc0 | 0x07; //VCOFRQ[7:6];SYNDIV[5:0];REFDV=0xc0 | 0x01; //REFFRQ[7:6];REFDIV[5:0]POSTDIV=0x00;//fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1);fPLL= fVCO/(2 ×POSTDIV);BUS= fPLL/2//if POSTDIV=0, fPLL= fVCO_asm(nop); //BUS CLOCK=64M_asm(nop);while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;CLKSEL_PLLSEL =1;}void chushihua()PITCFLMT_PITE=0X00; // PIT使能位PITCE_PCE1=0; // 通道选择PITMUX_PMUX1=0; //16位定时器微定时基准0计数PITMTLD1=5-1; //8位微定时装载寄存器PITLD1=128-1; //16位装载初始值设定频率10us PITINTE_PINTE1=1;//定时器中断通道0中断使能PITCFLMT_PITE=1;//定时中断通道0使能}/*******超声波*********/void qidong(){}void jiance(){qidong();if(time==0){TX=1;delay_1(1);TX=0;}if(time0==0){TX0=1;delay_1(1);TX0=0;}if(RX==0&&rx==1){SY=(int)(time*0.17);}if(RX==0){time=0;PITCE_PCE1=1;rx=RX;if(RX0==0&&rx0==1){SZ=(int)(time0*0.17);}if(RX0==0){time0=0;PITCE_PCE1=1;}rx0=RX0;}void duankouchushihua(){DDRB=0X02; //TX的B口置1PORTB=0X00;DDRM=0X10; // 端口M 的方向输入PTM=0X00;}void main(void){DisableInterrupts;suocun();duankouchushihua() ;chushihua();EnableInterrupts;for(;;){jiance();}}#pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt 67 PIT1_ISR(void){if(RX==1)time++;if(RX0==1)time0++;PITTF_PTF1=1;#pragma CODE_SEG DEFAULT。

MC9S12XS128_中文手册

MC9S12XS128_中文手册

第一章端口整合模块端口A,B和K为通用I/O接口端口E整合了IRQ,XIRQ中断输入端口T整合了1个定时模块端口S整合了2个SCI模块和1个SPI模块端口M整合了1个MSCAN端口P整合了PWM模块,同时可用作外部中断源输入端口H和J为通用I/O接口,同时可用作外部中断源输入端口AD整合了1个16位通道ATD模块大部分I/O引脚可由相应的寄存器位来配置选择数据方向、驱动能力,使能上拉或下拉式装置。

当用作通用IO口时,所有的端口都有数据寄存器和数据方向寄存器。

对于端口T,S,M,P,H,和J有基于每个针脚的上拉和下拉控制寄存器。

对于端口AD有基于每个针脚的上拉寄存器。

对于端口A、B、E和K,有一个基于端口的上拉控制寄存器。

对于端口T,S,M,P,H,J,和AD,有基于每个针脚的降额输出驱动控制寄存器。

对于端口A,B,E,和K,有一个基于端口的降额输出驱动控制寄存器。

对于端口S、M,有漏极开路(线或)控制寄存器。

对于端口P、H和J,有基于每个针脚的中断标志寄存器。

纯通用IO端口共计有41个,分别是:PA[7:0]PB[7:0]PE[6:5]PE[3:2]PK[7,5:0]PM[7:6]PH[7:0](带中断输入)PJ[7:6](带中断输入)PJ[1:0](带中断输入)第二章脉冲宽度调制模块XS128具有8位8通道的PWM,相邻的两个通道可以级联组成16位的通道。

PWME::PWMEPWM通道使能寄存器。

PWMEx=1将立即使能该通道PWM波形输出。

若两个通道级联组成一个16位通道,则低位通道(通道数大的)的使能寄存器成为该级联通道的使能寄存器,高位通道(通道数小的)的使能寄存器和高位的波形输出是无效的。

PWMPOLPWMPOL::PWM极性寄存器。

PPOLx=1,则该通道的周期初始输出为高电平,达到占空比后变为低电平;相反,若PPOLx=0,则初始输出为低电平,达到占空比后变为高电平。

PWMCLK::PWMCLKPWM时钟源选择寄存器。

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单片机+1602液晶显示程序

MC9S12XS128单片机+1602液晶显示程序

#in elude <hidef.h> /* com mon defi nes and macros */#in elude "derivative.h" /* derivative-specific defi niti ons */#in clude "MC9S12XS128.h"*********** 定义端****************************#defi ne LCD_E PORTA_PA2#defi ne LCD_RW PORTA_PA1 #defi ne LCD_RS PORTA_PAO#define LCD DATA PORTB void In it_PLL(void)*********** 时寸钟配^置***********************{CLKSEL=0x00; 〃48mhzPLLCTL_PLLON=1;SYNR=0XC0 | 0X05;REFDV=0X80 | 0X01;POSTDIV=OXOO;_asm (no p);_asm (no p);while(0==CRGFLG_LOCK);〃锁相环锁定CLKSEL_PLLSEL=1;〃选定外部时钟} void IO_I nit(){DDRA=0XFF;DDRB=0XFF;DDRK=0XFF;PORTA=OXOO;PORTB=OXOO;PORTK=OXOO; }/********************* 《延时函^数**********************************/ void Delay (un sig ned int time) {while(time--);} void Delay_ms( un sig ned int z) { un sig ned int a,b;for(a=0;a<z;a++){for(b=0;b<500;b++);}/***************************************************/ void LCD_WriteComma nd(un sig ned char cmd) {LCD_DATA=cmd;LCD_RS = 0;LCD_RW=0;LCD_E=0;Delay(250);LCD_E=1;} /***************************************************/ void LCD_WriteData( un sig ned char data) {LCD_DATA=data;LCD_RS=1;LCD_RW=0;LCD_E=0;Delay(250);LCD_E=1;void Display_char( un sig ned char x,un sig ned char y,un sig ned char data) {y&=0x01;/*****************1602void LCD_I nit(void){LCD_DATA=0; 〃LCD_WriteComma nd(0x38);〃// Delay_ms(5000);〃LCD_WriteComma nd(0x38);〃 〃Delay_ms(5000);〃LCD_WriteComma nd(0x38);〃〃Delay_ms(5000);LCD_WriteComma nd(0x38);〃 LCD_WriteComma nd(0x08);〃 LCD_WriteComma nd(0x01);〃Delay_ms(25); LCD_WriteComma nd(0x06);〃 LCD_WriteComma nd(OxOC);//}/**************** 显示单个字符函数 初始化函^数 *******************************************/显示模式设置 显示模式设置 显示模式设置 显示模式设置 关闭显示 显示清屏显示光标移动设置显示开及光标设置*******************************************/x&=OxOf;〃限制x不能大于15, y不能大于1//设置光标位置if(y==1)x+=0x40;x+=0x80;LCD_WriteComma nd(x);〃显示单个字符LCD_WriteData(data);} void Display_stri ng(un sig ned char x,un sig ned char y,un sig ned char *s) {************** 显示字符串函数***************************************** y&=0x01;x&=0x0f;〃限制x不能大于15,y不能大于1//设置光标位置if(y==1)x+=0x40;x+=0x80;LCD_WriteComma nd(x);//显示字符串while(*s){LCD_WriteData(*s);s++;}}/*****液晶显示函数*********************************************************/ void mai n(void){un sig ned char p1[]="peopleup" : un sig ned char p2[]="peopledow n";In it_PLL();10」nit();LCD_I nit();〃Delay_ms(50);for(;;){Display_stri ng(0,0,p1);Display_stri ng(0,1,p2);Display_char(12,0,'1');Display_char(12,1,'g');PORTA_PA7=~PORTA_PA7;}}。

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++)<>。

MC9S12XS模块及其应用实例

MC9S12XS模块及其应用实例

5.3.1 控制输出设备LED实例
由电路图可知,使用MC9S12XS128的PORTB端口控制8只 LED,PORTB端口输出低电平点亮相应LED。本例中流水灯的流动 速度没有实现精确控制,即延时时间没有精确计算,本书后面章节 会论述如何实现精确定时。
5.3.1 控制输出设备LED实例
流水灯应用实例程序清单如下所示。
3.数据方向寄存器(DDRx)
DDRx决定对应引脚配置为输出口还是输入口,如果某位为“0”,则对应 引脚设定为输入;如果某位为“1”,则对应引脚设定为输出。复位后,DDRx 值为0x00,即MCU复位后引脚默认为输入口。
PORTT、PORTS、PORTM、PORTP、PORTH和PORTJ
4.驱动控制寄存器(RDRx)
5.上拉/下拉使能寄存器(PERx)
如果端口为输入口或者“线或”模式时,可以通过上拉/下拉使能寄存器 PERx使能选择使用内置上拉/下拉电阻。如果PERx某位为“1” 时,则对应引 脚允许使用内置上拉/下拉电阻;如果某位为“0” 时,则对应引脚禁用内置上 拉/下拉电阻。
PORTT、PORTS、PORTM、PORTP、PORTH和PORTJ
6.1.2 中断 1.不可屏蔽中断 不可屏蔽中断包括软件中断、非法指令陷阱和XIRQ中断,下面简要 介绍常用的几个不可屏蔽中断。 (1)软件中断 SWI实质上是一条指令,但其执行过程与中断相同,即通过中断矢 量确定目标地址,中断矢量为$FFF6~$FFF7,它自动保存MCU的寄存 器和返回地址,最后必须通过RTI指令返回。 (2)非法指令陷阱 MCU正常工作时,每次获得的都是由汇编或编译程序生成的有效操 作码,MCU能够正确解释并执行它们,但当受到干扰或系统出现混乱时, 可能得到无法识别的操作码,即非法指令,这时MCU自动产生一次中断, 中断矢量地址为$FFF8~$FFF9。

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调试PS2

飞思卡尔单片机MC9s12xs128调试PS2

========================PS2.h=====================================#ifndef _PS2_H#define _PS2_H#define PS2_CLK PTJ_PTJ1#define PS2_RW PORTA_PA1typedef struct PS2_V alueType {char PS2_V alueData; /* 码表Num :77 /:E04A*:7C -:7B7: 6C 8:75 9:7D +:794: 6B 5:73 6:74 +:791: 69 2:72 3:7A Enter:E05A0: 70 .:71*//* 对应返回值Num :-5 /:-4 *:7C -:-27: 7 8:8 9:9 +:-14: 4 5:5 6:6 +:-11: 1 2:2 3:3 Enter:100: 0 .:-3 空格-6*/unsigned char PS2_V alueKind; //0 按下,1松手}PS2_V alueType;#endif _PS2_H======================================PS2.c============================ #include "PS2.h"#include "MC9S12XS128.h"//extern unsigned char PS2_Buffer[3];//extern unsigned char PS2_StopCodeFlag=0;//从PS/2中获取一个按键unsigned char PS2_GetData(void){unsigned char temp,i,res;for(i=0;i<11;i++) {while(PS2_CLK);if(i>0 && i<9) {res=res>>1;if(PS2_RW) {res=res|0x80;}}while (!PS2_CLK);}return res;}void Key_Interrupt(void) {//DDRJ=0X00;PIEJ_PIEJ1=1;PPSJ_PPSJ1=0;}void PS2_InsertBuffer(unsigned char *buffer,unsigned char bufferdata) {unsigned char *tempdata=buffer+1;(*buffer++)=(*tempdata++);(*buffer++)=(*buffer++);(*buffer)=bufferdata;}void PS2_GetChar(PS2_V alueType *PS2_V alue){unsigned char temp;temp=PS2_GetData();(*PS2_V alue).PS2_V alueKind=0;if(temp!=0xe0 && temp!=0xf0){switch (temp){/* 对应返回值Num :-6 /:-4 *:-5 -:-27: 7 8:8 9:9 +:-14: 4 5:5 6:6 +:-11: 1 2:2 3:3 Enter:100: 0 .:-3*/case 0x70 : (*PS2_V alue).PS2_V alueData=0; return;case 0x69 : (*PS2_V alue).PS2_V alueData=1; return;case 0x72 : (*PS2_V alue).PS2_V alueData=2; return;case 0x7A : (*PS2_V alue).PS2_V alueData=3; return;case 0x6B : (*PS2_V alue).PS2_V alueData=4; return;case 0x73 : (*PS2_V alue).PS2_V alueData=5; return;case 0x74 : (*PS2_V alue).PS2_V alueData=6; return;case 0x6C : (*PS2_V alue).PS2_V alueData=7; return;case 0x75 : (*PS2_V alue).PS2_V alueData=8; return;case 0x7D : (*PS2_V alue).PS2_V alueData=9; return;case 0x71 : (*PS2_V alue).PS2_V alueData=-3; return;case 0x79 : (*PS2_V alue).PS2_V alueData=-1; return;case 0x7B : (*PS2_V alue).PS2_V alueData=-2; return;case 0x7C : (*PS2_V alue).PS2_V alueData=-5; return;case 0x77 : (*PS2_V alue).PS2_V alueData=-6; return;case 0x66 : (*PS2_V alue).PS2_V alueData=-7; return;}}else if(temp==0xe0){temp=PS2_GetData();if(temp==0xf0){temp=PS2_GetData();(*PS2_V alue).PS2_V alueKind=1;if(temp==0x5A){(*PS2_V alue).PS2_V alueData=10; return;}else if(temp==0x4A){(*PS2_V alue).PS2_V alueData=-4; return;}}else{(*PS2_V alue).PS2_V alueKind=0;if(temp==0x5A){(*PS2_V alue).PS2_V alueData=10; return;}else if(temp==0x4A){(*PS2_V alue).PS2_V alueData=-4; return;}}}else if (temp==0xf0){(*PS2_V alue).PS2_V alueKind=1;temp=PS2_GetData();switch (temp){/* 对应返回值Num :-6 /:-4 *:-5 -:-27: 7 8:8 9:9 +:-14: 4 5:5 6:6 +:-11: 1 2:2 3:3 Enter:100: 0 .:-3 空格-7*/case 0x70 : (*PS2_V alue).PS2_V alueData=0; return;case 0x69 : (*PS2_V alue).PS2_V alueData=1; return;case 0x72 : (*PS2_V alue).PS2_V alueData=2; return;case 0x7A : (*PS2_V alue).PS2_V alueData=3; return;case 0x6B : (*PS2_V alue).PS2_V alueData=4; return;case 0x73 : (*PS2_V alue).PS2_V alueData=5; return;case 0x74 : (*PS2_V alue).PS2_V alueData=6; return;case 0x6C : (*PS2_V alue).PS2_V alueData=7; return;case 0x75 : (*PS2_V alue).PS2_V alueData=8; return;case 0x7D : (*PS2_V alue).PS2_V alueData=9; return;case 0x71 : (*PS2_V alue).PS2_V alueData=-3; return;case 0x79 : (*PS2_V alue).PS2_V alueData=-1; return;case 0x7B : (*PS2_V alue).PS2_V alueData=-2; return;case 0x7C : (*PS2_V alue).PS2_V alueData=-5; return;case 0x77 : (*PS2_V alue).PS2_V alueData=-6; return;case 0x66 : (*PS2_V alue).PS2_V alueData=-7; return;}}}。

单片机课程设计报告mc9s12xs128

单片机课程设计报告mc9s12xs128

单片机课程设计报告题目:对可调光LED灯发光强度进行控制学院:机电工程学院班级:自09A-1姓名:学号:0910101011指导教师:一、设计任务:1、单片机可选用飞思卡尔型。

2、按键及显示方案可采用CH451芯片或其他方案。

3、设计并制作可调光LED灯,并对发光强度进行控制。

二、设计方案:硬件选择:飞思卡尔MC9S12S128系类单片机,驱动模块,LED 模块,CH4541模块;工作原理:通过调节PWM为1KHz至10KHz TTL方波,调节其占空比,从而调节电压,决定了发光强度。

MC9S12S128部分管脚图:MC9S12S128主要系统参数:S12X CPU,最高总线速度 40MHz64KB、128KB和256KB 闪存选项,均带有错误校正功能(ECC) 带有ECC的、4KB至8KB DataFlash,用于实现数据或程序存储配置8 、10或12位模数转换器(ADC),转换时间3μ s支持控制区域网(CAN)、本地互联网(LIN)和串行外设接口(SPI)协议模块带有16-位计数器的、8-通道定时器出色的EMC,及运行和停止省电模式1、由于MC9S12S128自带有AD以及PWM 功能,所以对软件的要求交简单。

2、键盘输入采用CH451整体模块3、通信端口为PA口,与中断端口三、硬件结构:CH451硬件电路结构驱动模块设计四、软件设计4.1 HCS12控制软件主要理论智能车开发环境采用了飞思卡尔HCS12系列单片机开发软件CodeWarrior。

该软件具有支持多种语言、开发环境界面统一、交叉平台开发以及支持插件工具等特点。

在CodeWarrior界面完成编译后,通过BDM FOR S12工具,在CodeWarrior环境下向MC9S12模块下载程序。

BDM FOR S12工具使用简单,十分方便。

在整个系统设计中,用到了4个单片机基本功能模块:时钟模块、PWM输出模块、AD转换模块、。

通过编写程序先对所用到的模块进行初始化,并通过对相应数据寄存器或状态寄存器的读写,实现期望的功能。

mc9s12xs128内存映射和数据flash操作

mc9s12xs128内存映射和数据flash操作

解答
16位地址,寻址范围为0~65536,即64k MC9S12XS128的RAM为8K,P-FLASH为 128K,D-FLASH为8K。

*p=0x8000,访问的是P-FLASH

MC9S12XS128内存结构


MC9S12XS128使用global adress(全局地 址)对内存划分地址空间。全局地址共 23bit,寻址能力达到8M 使用全局地址划分的内存空间如下: 0x10_0000~0x10_1FFF:8K d-flash 0x7E_0000~0x7F_FFFF:128K p-flash 0x0F_E000~0x0F_FFFF:8K 非分页RAM 问题:CPU和BDM都是使用16bit local address(本地地址)我们在程序中定义的 指针变量默认都是near型,即16位地址, 如何解决?
D-flash状态寄存器
注意: 1. 开始新的FLASH命令之前必须等待上 一个命令结束,即需要查询CCIF标志。 2. 在启动flash命令之前,FSTAT寄存器中 的ACCERR和FPVIOL两个标志位必须 被清除,否则无法启动新的FLASH操 作。

完整的擦除操作
while(FSTAT_CCIF==0); if(FSTAT_ACCERR) //判断并清除标志位; FSTAT_ACCERR=1; if(FSTAT_FPVIOL) //判断并清除标志位; FSTAT_FPVIOL=1; FCCOBIX_CCOBIX=0x00; FCCOBHI=0x12; //高字节写入擦除命令 FCCOBLO=0x10; //低字节d-flash全局地址高8位,固定 为0x10 FCCOBIX_CCOBIX=0x01; FCCOB=ADDR16; //写入低16位的地址 FSTAT_CCIF=1; //启动执行命令 while(FSTAT_CCIF==0); //等待执行完成
  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 */}。

相关文档
最新文档