飞思卡尔单片机编程 之天职师大
飞思卡尔8位单片机MC9S08JM60开发板实践教程共40页word资料

第一章搭建实验环境系统时钟设置#include "App\Include\App.h"#ifndef _MCG_C#define _MCG_C//oscillator 12MHZ 倍频为24MHZ()先8分频后16倍频void S_MCGInit(void)/* the MCG is default set to FEI mode, it should be change to FBE mode*/MCGC2[7:6] BDIV总线频率分频因子–选择由MCGC1寄存器中CLKS位决定的时钟源的分频。
这控制总线频率。
00 编码0 –时钟1分频01 编码1 –时钟2分频(复位后默认)10 编码2 –时钟4分频11 编码3 –时钟8分频[5] RANGE频率范围选择–选择外部振荡器或者外部时钟源的频率范围。
1 选择1MHz到16MHz外部振荡器的频率范围。
(1MHz到40MHz的外部时钟电源)的高频率范围0 选择32kHz到100kHz外部振荡器的频率范围。
(32kHz到1MHz的外部时钟电源)的低频率范围[4] HGO高增益振荡器选择–控制外部振荡器操作模式。
1 配置外部振荡器为高增益运行0 配置外部振荡器为低功耗运行[3] LP低功耗选择–控制在忽略模式中FLL(或者PLL)是否为无效1 FLL(或PLL)在忽略模式(低功耗)中为无效的。
0 FLL(或PLL)在忽略模式中为无效的。
[2] EREFS外部参考时钟选择–为外部参考选择时钟源1 选择振荡器0 选择外部时钟源[1] ERCLKEN外部参考时钟使能–使能外部参考时钟作为MCGERCLK1 MCGERCLK激活0 MCGERCLK 无效[0] EREFSTEN外部参考时钟停止使能MCGC2 0b0011 0110 激发外部时钟(晶振)(没有使能)MCGC2=MCGC2_RANGE_MASK|MCGC2_HGO_MASK|MCGC2_EREFS_MASK|MCGC2_ERCLK EN_MASK;while(!MCGSC_OSCINIT);//MCGSC寄存器中OSCINIT(第1位)为1,表示由EREFS位选择的晶振被初始化。
飞思卡尔智能车dg128单片机控制程序代码

void AD_Init(void)
{
ATD0CTL2=0xC0; //AD模块上电, 快速清零, 无等待模式, 禁止外部触发, 中断禁止
ATD0CTL3=0x44; //每次转换8个序列, FIFO, Freeze模式下继续转
ATD0CTL4=0x02; //10位精度, 采样时间为2个AD时钟周期,ATDClock=4MHz
//设置舵机
PWMCTL_CON01=1; //使得通道0,1成为16位pwm
PWMPER0 =0x75;
PWMPER1 =0x30; //舵机的频率是: 24M/8/30000=100Hz,T=10ms
PWMDTY01=4500; // 对应为4500/30000的占空比,待调整
Infrared_detect();
data_handle();
motor_ctl();
steer_ctl();
}
}
void interrupt 26 MDC_ISR(void)
{
static unsigned int number_count=0; static unsigned int start=0; static
go=2;
if(begin>=150)
go=3;
}
}
}
//-----系统初始化-----------------------
void system_init(void) //system initiat
void speed_ctl(void); //速度控制
void motor_ctl(void); //电机控制
void PACBInit(void);
飞思卡尔单片机编程共19页word资料

关于Codewarrior 中的 .prm 文件网上广泛流传的一篇文章讲述的是8位飞思卡尔单片机的内存映射,这几天,研究了一下Codewarrior 5.0 prm文件,基于16位单片机MC9S12XS128,一点心得,和大家分享。
有什么错误请指正。
正文:关于Codewarrior 中的.prm 文件要讨论单片机的地址映射,就必须要接触.prm文件,本篇的讨论基于Codewarrior 5.0 编译器,单片机采用MC9S12XS128。
通过项目模板建立的新项目中都有一个名字为“project.prm”的文件,位于ProjectSettings->Linker Files文件夹下。
一个标准的基于XS128的.prm文件起始内容如下:.prm文件范例:NAMESENDSEGMENTSRAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;ROM_4000 = READ_ONLY DATA_NEAR IBCC_NEAR 0x4000 TO 0x7FFF;ROM_C000 =READ_ONLY DATA_NEAR IBCC_NEAR 0xC000 TO 0xFEFF;//OSVECTORS = READ_ONLY 0xFF10 TO 0xFFFF;READ_ONLY DATA_FAR IBCC_FAR 0x000800 TO 0x000BFF;EEPROM_01 =READ_ONLY DATA_FAR IBCC_FAR 0x010800 TO 0x010BFF;EEPROM_02 =READ_ONLY DATA_FAR IBCC_FAR 0x020800 TO 0x020BFF;EEPROM_03 =READ_ONLY DATA_FAR IBCC_FAR 0x030800 TO 0x030BFF;EEPROM_04 =READ_ONLY DATA_FAR IBCC_FAR 0x040800 TO 0x040BFF;EEPROM_05 =READ_ONLY DATA_FAR IBCC_FAR 0x050800 TO 0x050BFF;EEPROM_06 =READ_ONLY DATA_FAR IBCC_FAR 0x060800 TO 0x060BFF;EEPROM_07 =READ_ONLY DATA_FAR IBCC_FAR 0x070800 TO 0x070BFF;PAGE_F8 =READ_ONLY DATA_FAR IBCC_FAR 0xF88000 TO 0xF8BFFF;PAGE_F9 =READ_ONLY DATA_FAR IBCC_FAR 0xF98000 TO 0xF9BFFF;PAGE_FA =READ_ONLY DATA_FAR IBCC_FAR 0xFA8000 TO 0xFABFFF;READ_ONLY DATA_FAR IBCC_FAR 0xFB8000 TO 0xFBBFFF;PAGE_FC =READ_ONLY DATA_FAR IBCC_FAR 0xFC8000 TO 0xFCBFFF;PAGE_FE =READ_ONLY DATA_FAR IBCC_FAR 0xFE8000 TO 0xFEBFFF;ENDPLACEMENT_PRESTART,STARTUP,ROM_VAR,STRINGS,VIRTUAL_TABLE_SEGMENT,//.ostext,DEFAULT_ROM, NON_BANKED,COPYINTO ROM_C000 ;OTHER_ROM INTO PAGE_FE, PAGE_FC, PAGE_FB, PAGE_FA, PAGE_F9, PAGE_F8;//.stackstart,SSTACK,//.stackend,PAGED_RAM,DEFAULT_RAMINTO RAM;DISTRIBUTE DISTRIBUTE_INTOROM_4000, PAGE_FE, PAGE_FC, PAGE_FB, PAGE_FA, PAGE_F9, PAGE_F8;CONST_DISTRIBUTE DISTRIBUTE_INTOROM_4000, PAGE_FE, PAGE_FC, PAGE_FB, PAGE_FA, PAGE_F9, PAGE_F8;DATA_DISTRIBUTE DISTRIBUTE_INTORAM;//.vectors INTO OSVECTORS;ENDENTRIES//_vectab OsBuildNumber _OsOrtiStackStart _OsOrtiStartENDSTACKSIZE 0x100VECTOR 0 _Startup//VECTOR 0 Entry//INIT Entry1 .prm文件组成结构按所含的信息的不同.prm文件有六个组成部分构成,这里仅讨论和内存空间映射关系紧密的三个部分,其他的不做讨论。
飞思卡尔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口上去。
飞思卡尔单片机的程序

#include "derivative.h"//-----------------------------------------------------static void SCI_Init(void){SCI0CR2=0x2c; //enable Receive Full Interrupt,RX enable,Tx enableSCI0BDH=0x00; //busclk 8MHz,19200bps,SCI0BDL=0x1aSCI0BDL=0x68; //SCI0BDL=busclk/(16*SCI0BDL)//busclk 8MHz, 9600bps,SCI0BDL=0x34//busclk 8MHz, 9600bps,SCI0BDL=0x68//busclk 24MHz, 9600bps,SCI0BDL=0x9C} //busclk 32MHz, 9600bps,SCI0BDL=0xD0//busclk 40MHz, 9600bps,SCI0BD =0x104//-----------------------------------------------------static void Port_Init(void){DDRA = 0xff; //LCD1100,PA0--4,PA67 D1D2PORTA= 0x00;DDRB = 0xff; //LED PTB0--7,PORTB= 0xff; //LEDs onDDRE = 0xFF; //MOTOR CONTROLPORTE= 0x00; //PDDRH = 0x00; // PORTH inputPTIH = 0X00; // KEY,PH0--5PERH = 0xff; // PORTH pull upPPSH = 0x00; // Port H Polarity Select Register-falling edgePIEH = 0x02; // PORTH interrut disable but 1,DDRJ = 0X01; // PJ0判断行同步脉冲到达//PPSJ = 0x01; // Port J Polarity Select Register-rising EDGEPPSJ = 0x00; // Port J Polarity Select Register-falling EDGEPIEJ = 0X00; // VIDEO SYNC INTERRUPT DISABLED,BUT NOT IN MAIN() PERJ = 0xff;DDRP = 0xff;PERP = 0xff;PTP_PTP0 = 0;}//-----------------------------------------------------static void PWM_Init(void){//SB,B for ch2367//SA,A for ch0145PWMPRCLK = 0X55; //clockA,CLK B 32分频:500khzPWMSCLA = 0x02; //对clock SA 进行2*PWMSCLA=4分频;pwm clock=clockA/4=125KHz;PWMSCLB = 0X02; //clk SB=clk B/(2*pwmsclb)=125KHZ//pwm1PWMCNT1 = 0;PWMCAE_CAE1=0;PWMPOL_PPOL1=0;PWMPER1 =125;PWMDTY1 =100;PWMCLK_PCLK1 = 1;PWME_PWME1 = 0;}void AD_Init(void){A TD0CTL1=0x00; //7:1-外部触发,65:00-8位精度,4:放电,3210:chA TD0CTL2=0x40; //禁止外部触发, 中断禁止A TD0CTL3=0xa0; //右对齐无符号,每次转换4个序列, No FIFO, Freeze模式下继续转A TD0CTL4=0x01; //765:采样时间为4个AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1]A TD0CTL5=0x30; //6:0特殊通道禁止,5:1连续转换,4:1多通道轮流采样A TD0DIEN=0x00; //禁止数字输入}//-----------------------------------------------------//IOC7/PT7用于计算CS3144产生的脉冲数static void IOC_Init(void){TCTL3=0xc0;//c-输入捕捉7任何沿有效,TCTL4=0xc0;//40表示ICx禁止, 1表示上升沿, 2表示下降沿, 3表示任何沿TIE =0x00;//每一位对应相应通道中断允许,0表示禁止中断TIOS =0x00;//每一位对应通道的: 0输入捕捉,1输出比较TCTL3_EDG7x=1;//c-输入捕捉7任何沿有效,}//产生40ms的定式中断,读取IOC7的计数值static void Timer_Init(void){//TSCR1=0X80;//TIMER INT ENABLED//TSCR1=0x90;//计数器使能TEN|快速清零TFFCATSCR1=0X00; //禁止TIM//TSCR2=0X80;//DIV 1->2.5ms,enable time overflow interrrupt//TSCR2=0X82;//DIV 4->10ms//TSCR2=0X83;//DIV 8->20ms//TSCR2=0X84;//DIV 16->40msTSCR2=0X85;//DIV 32->80ms//TSCR2=0X86;//DIV 64->160ms//TSCR2=0X87;//DIV 128->320ms,enable time overflow interrruptTCNT =0; //PACTL=0X50; //PT7 PIN,PACN32 16BIT,FALLing edge,NOT INTERRUPT //PBCTL=0X40;//PBCN10 16BIT,INT DISABLED//ICPAR=0; //8BIT DISABLED}//-----------------------------------------------------// setup of the RTI interrupt frequencystatic void RTI_Init(void){//RTICTL=0x10; //2^10x40ms=4.96s//RTICTL=0X74; //SET PRESCALER,div rate=(m+1)x2^(n+9),(m=1-7,n=0-15)//tick=16Mhz/((4+1)x2^(7+9))=48.83,(/sec)//16000000/64k=244.140625 ,与晶振频率相关,与分频无关RTICTL=0x77; //8x2^16 =>32,75ms,30.5175Hz//RTICTL=0x7f; //16x2^16 =>,65.536ms,15.26Hz//RTICTL=0x1F; //16x2^10--1ms//CRGINT=0X80; //enable RTI InterruptCRGINT=0X00; //disable RTI Interrupt}static void Time_Start(void){RTI_Init();CRGINT=0X80; //enable RTI Interrupt}//-----------------------------------------------------// PLL初始化子程序BUS Clock=16Mvoid setbusclock(void){CLKSEL=0X00; // disengage PLL to systemPLLCTL_PLLON=1; // turn on PLLSYNR=0x00 | 0x01; // VCOFRQ[7:6];SYNDIV[5:0]// fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)// fPLL= fVCO/(2 × POSTDIV)// fBUS= fPLL/2// VCOCLK Frequency Ranges VCOFRQ[7:6]// 32MHz <= fVCO <= 48MHz 00// 48MHz < fVCO <= 80MHz 01// Reserved 10// 80MHz < fVCO <= 120MHz 11REFDV=0x80 | 0x01; // REFFRQ[7:6];REFDIV[5:0]// fREF=fOSC/(REFDIV + 1)// REFCLK Frequency Ranges REFFRQ[7:6]// 1MHz <= fREF <= 2MHz 00// 2MHz < fREF <= 6MHz 01// 6MHz < fREF <= 12MHz 10// fREF > 12MHz 11// pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;POSTDIV=0x00; // 4:0, fPLL= fVCO/(2xPOSTDIV)// If POSTDIV = $00 then fPLL is identical to fVCO (divide by one)._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;}//-----------------------------------------------------#pragma CODE_SEG DEFAULTvoid Init_Dev(void){setbusclock();Port_Init();SCI_Init();PWM_Init();AD_Init();Timer_Init();Time_Start();IOC_Init();}//-----------------------------------------------------。
飞思卡尔十六位单片机综合设计

秒计数(每隔一秒加一)按下4个按键任何一个可切换一、AD平均值显示二、秒计时器显示。
要求:一、AD转换采纳查询方式并进行数字滤波;要进行按键去抖动(去除键按下进程中前沿抖动和后沿抖动阻碍);秒计数器采纳实不时钟中断方式计时。
二、给出完整的程序和注释,和各程序功能模块实现机理说明。
//程序段#include <> /* common defines and macros */#include "" /* derivative-specific definitions */unsigned char a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极数码管的段码0 1 2 3 4 5 6 7 8 9 A B C D E F#define SEG8 PTT#define S0 PTP_PTP0#define S1 PTP_PTP1#define S2 PTP_PTP2#define S3 PTP_PTP3//声明变量。
c1-c4是计时器四位数,d1-d4是AD模块四位数unsigned int d,d1,d2,d3,d4,i,j,n,k=0,temp;//声明变量。
unsigned int btn,key=0,c=0,c1=0,c2=0,c3=0,c4=0;unsigned int data[10];//声明按键子程序变量//在按时中断效劳程序中读取按键,并把读取的数据存于变量Kinput中//变量Kready中是所需要的稳固的按键信息//Ktemp是中间变量,它的值是上一次的Kinput//Kstore中是上一次的Kreadyunsigned int Kinput=0,Ktemp=0,Kstore=0,Kready=0,Koutput=0;//声明display子程序,作为数码管显示void display(unsigned int a1,unsigned int a2,unsigned int a3,unsigned int a4);//声明atd子程序,作为AD转换void atd(void);//声明button子程序,作为按键转换读取,并排除干扰void button(void);//声明delay延迟程序void delay(unsigned int time);//主程序void main(void) {EnableInterrupts;DDRT=0XFF; //设置PORTT作为输出,输出到数码管DDRP=0XFF; //设置PORTP作为输出,选通数码管DDRH=0x00; //设置PORTH作为输如,按键输入ATD1CTL2=0x80; //使能AD,正常清除标志,不利用外部触发ATD1CTL3=0xf8; //只转换一个通道ATD1CTL4=0x25; //10位精度,12分频ATD1CTL5=0xb7; //右对齐,无符号,扫描模式,利用通道7CRGINT=0x80;//实时中断使能RTICTL=0x10;//分频1024for(;;){atd();//挪用atd子程序,进行ad转换,并存入d1-d4//判定按键次数key,奇数显示秒表,偶数显示ad转换。
飞思卡尔单片机教程

注 : A/D模块的时钟频率要在500KHz和2MHz之间, 所以在选择分频因子时一定要注意。
采样时间选择
SMP [1 :0]
采样时间
00
2个 A/D时钟周期
01
4个A/D时钟周期
ATDclock= ( (BusClock) / (PRS+1) ) /2
10
8个A/D时钟周期
11
16个A/D时钟周期
设CCBCA = 000,转换序列从通道
0开始;ATD0DR0,
ATD0DR1,ATD0DR2存放转换结果
设CCBCA = 0 10,转换序列从通道 2开始。 仍然是ATD0DR0,
ATD0DR1,ATD0DR2存放转换结果
S8C 、S4C 、S2C 、S1C:定义转换队列的长度 。默认长度为4。 FIFO: 结果寄存器先进先出模式 。1=FIFO模式 ,转换结果是连续 存放的;0=非FIFO模式 ,转换结果放在对应的寄存器中。 FRZ1、FRZ0:背景调试冻结模式允许 。这两个控制位就决定了,
{ while (ATD1STAT0_SCF ==0) ;
ad_value [0] = ATD1DR0; ad_value [4] = ATD1DR4;//使用 PORTB= (byte) ad_value [4] ;
}}
void ATDInit(void)
{ATD1CTL2=0xC0;//AD模块上电,快速清零,无等待模式,禁止外部触发, 中断禁止 // ADPU AFFC AWAI ETRIGLE --- ETRIGP ETRIGE ASCIE ASCIF
PRS=3
ATD1CTL5=0xA4; //右对齐无符号 ,单通道采样 ,通道0
飞思卡尔8位单片机实用教程说明书

图书基本信息书名:《飞思卡尔8位单片机实用教程》13位ISBN编号:978712108999210位ISBN编号:7121089998出版时间:2009-6出版社:曾周末、李刚、陈世利、 周鑫玲 电子工业出版社 (2009-06出版)页数:222版权说明:本站所提供下载的PDF图书仅提供预览和简介以及在线试读,请支持正版图书。
更多资源请访问:前言飞思卡尔原是全球领先的半导体公司,为汽车、消费电子、工业控制、网络和无线市场设计并制造嵌入式半导体产品。
飞思卡尔系列单片机由于其低成本和高性能的特点越来越受到用户的青睐。
本书介绍的MC9S08QG8单片机采用高性能、低功耗HCS208飞思卡尔8位微控制器为内核,是一款集成度很高、功能丰富、适用于各种应用的低价位单片机。
本书将给大家介绍它的一些主要功能及特性,包括灵活多样的低功耗模式、3.3V电压下的Flash编程、片内调试仿真器、高速ADC、IC总线、片内比较器等。
本书共12章,深入浅出地从一般单片机的基础知识人手,引出飞思卡尔8位单片机基础知识、最小系统设计,进而有步骤地、详略得当地介绍飞思卡尔8位单片机的寄存器与片内存储器、指令系统与汇编程序设计、中断系统等基本功能,并在之后的章节中,详细而又有针对性地一一介绍了集成在这款单片机内部的其他功能模块,比如定时器和比较器、异步串行通信、SPI、IC、模/数转换等功能模块。
本书还介绍了飞思卡尔单片机与MCS51单片机的区别,学过5l单片机的人会很快掌握其要点。
在本书最后一章里,有针对性地介绍了S08系列单片机c语言编程,并详细介绍了Code Warrior IDE调试软件的使用方法。
本书给出的所有例题都在实验板上运行验证过。
总之,本书力求通过最简洁的语言和表述方式、最通俗易懂的应用举例,向广大读者全面地介绍MC9S080G8单片机的功能及特性,以求能够为大专院校的学生及各相关领域的工作者提供一些帮助。
参加本书编写的还有天津大学精仪学院的薛彬、汤其剑、刘世廷、高雅彪、叶德超、黄邦奎、孙晔等研究生。
飞思卡尔单片机各种功能程序

流水灯四种效果:#include <hidef.h> /* common defines and macros */ #include <stdlib.h>#include <mc9s12xdp512.h> /* derivative information */ #pragma LINK_INFO DERIV ATIVE "mc9s12xdp512"#include "main_asm.h" /* interface to the assembly module */ unsigned char temp;//unsigned char pa @0x200;//unsigned char pb @0x202;unsigned char key;static void delay(void) {volatile unsigned long i;for(i=0;i<100000;i++);}static unsigned char random;static void Random(void) {random = (unsigned char)rand();}void effect1() {unsigned char c;for(c=0;c<=6;c++) {delay();PORTB = ~(1<<c);}for(c=7;c>=1;c--) {delay();PORTB = ~(1<<c);}}void effect2() {unsigned char c;for(c=0;c<=6;c++) {delay();PORTB = ~(3<<c);}for(c=7;c>=1;c--) {delay();PORTB = ~(3<<c);}}void effect3() {unsigned char c,t=0xfe;for(c=0;c<=7;c++) {PORTB = t;delay();t<<=1;}}void effect4() {unsigned char c,t=0;for(c=0;c<=7;c++) {PORTB=t;delay();t = (t<<1)+1;;}}void main(void) {unsigned char x;DDRA=0xf0;DDRB=0xff;for(;;) {x=PORTA&0x03;switch(x) {case 0:effect1(); break;case 1:effect2(); break;case 2:effect3(); break;case 3:effect4(); break;}}/* wait forever *//* please make sure that you never leave this function */ }//行列反转法unsigned char key_scan() //键盘扫描函数{ unsigned char x,row=4,col=4,key=16;PUCR|=0x01; //等同于PUCR=PUCR|0x01,PUCR寄存器的第0位设置为1,即允许PORTA端口的上拉电阻。
飞思卡尔单片机ppt讲解

单片机(中国)——微控制器MCU(国外)Micro Controller Unit
片上系统 SoC(System on Chip):提高可靠性、降低复杂性、减少硬件尺
寸、降低成本和功耗。
应用系统单片化:总有一款适合你!(几千种) 嵌入式系统ES( Embedded systems ):以应用为中心、以计算机技术
针孔摄像机有线或无线实时传输,可以边 拍边看。这些摄像头都是很小的,最小的 跟手表上装的那种纽扣电池差不多。
1.3 单1.1片计算机机历的分史类与及发新展 技术
单片机的发展
• 20世纪70年代,4位单片机问世 • 第一代(1976一1978年)探索阶段
Intel、Motorola • 第二代(I978一1982年)完善阶段
同时可以实现简单的调试功能,如显示和修改各内部寄存器、显 示和修改内存等。 * 通过PC串口和单片机的串口实现人机对话,可以使单片机的开发 不依赖于任何开发工具(51系列仿真芯片SST89E516) * 占用用户资源(串口、片内RAM和闪存) * 监控程序和应用程序共享一个CPU,因此不能做动态调试。
CPU的集成度已达到千万只晶体管,时钟频率高达GHz
1.3 单片机历史及新技术
计算机的发展动向
1.大型、巨型计算机
2.小型、微型计算机
中国国防科技大学2011年5月公布超级电脑“ 天河一号”,每秒运算速度逾千万亿次,使中国
成为继美国之后第二个能研制千万亿次超级电脑
的国家。该电脑一天的运算量相当于一台主流个 人电脑不间断地计算160年。这套重155吨的先进 系统,由103个冰箱大小的银灰色机柜组成,占地 面积约1000平方公尺。这台超级电脑耗资人民币6 亿元。
飞思卡尔单片机教学

串联方式(PE7引脚要拉低)
并联方式(PE7引脚要拉高)
a
29 29
第3章 MC9S12单片机的内核及片上资源
时钟初始化寄存器-共5个
(1)锁相环控制寄存器(PLLCTL)
时钟监控允许位 1=允许 0=禁止
锁相环电路允许位 1=允许 0=禁止
注:其余各位的描述见教材49页。
a
30 30
第3章 MC9S12单片机的内核及片上资源
注:其余各位的描述
见教材49页和50页。
a
32 32
第3章 MC9S12单片机的内核及片上资源
PLL例子
CLKSEL=0x00; //禁止PLL PLLCTL=0xe1; //PLL电路允许 SYNR=2;REFDV=1; //设置倍频参数 PLLCTL=0x60; //时钟监控禁止 while(0==(CRGFLG&0x08));//等待稳定 CLKSEL=0x80; //选择PLL作为时钟 //若晶振为16M,则PLLCLK=2*16*3/2=48MHz,则总线频率是
R/W:读写信号,指示总线上数据方向 LSTRB:总线模式下低位字节(奇地址)选通 ECLK:内部总线时钟输出,一般在宽扩展模式下地址锁存用 BKGD(MODC)、MODB、MODA:模式选择 NOACC/XCLKS:当前外部总线操作无效
a
55
第3章 MC9S12单片机的内核及片上资源
模式选择
a
66
Block3
$C000~$FF00 16K($3F) Block2 Block1 Block0
16KB
$30 $31 $32 $33 $34 $35 $36 $37 $38 $39 $3A $3B $3C $3D $3E $3F
第四届全国“飞思卡尔”杯广东技术师范学院机电之星技术报告1

1
第二章 智能车机械安装
2.1 智能车总体设计
2.1.1 车辆设计思路
车辆对路况的判断距离越远,越能提前得到路况信息,对车辆行驶速度越 有帮助。我们提出的算法就是基于远距离探测配合近距离探测控制的算法。所 以,我们使用双层红外探测设备,组成两层探测体系,两层探测体系再结合控 制算法进行控制。 整车设计简图:
2
第二章
智能车机械安装
在机械加工中为了确保精度和安装要求,我们使用了机床和钻孔机进行加 工,取得了很好的效果。 根据车辆的行驶特性,我们调整了车辆的重心和车轮的内束角,取得了很 好的效果。若重心前移,重心到后轴水平距离增大,易发生后轴侧滑,对高速 汽车危险性大;若重心后移,重心到后轴水平距离减小,前轮易丧失转向能力。 实践证明前轮压力大一点对车辆的转向很有好处,因为车的自身功率较小,不 易加到很高的速度,所有,刹车性能的好坏对车辆影响有限,但转向性能的提 高,过弯速度的提高对比赛成绩有决定性的影响。所以,我们将车的重心通过 机械安装的调整,调整到靠近前轮的位置。 2.1.3 车辆电气部分的设计 我们使用了 112 脚的 MC9S12XS128 最小开发板进行开发设计, 软件开发是 CodeWarrior 软件编程和 BDM 组成的标准开发环境。 2.1.4 电气部分控制方案 我们的控制方案简单的说就是利用远距离传感器对远方路况信号进行处理 和判断,然后控制车辆的转角和速度,即控制车辆巡线行驶。同时,根据前方 路况切换不同的控制算法,近距离传感器则是对车辆行驶起间接控制作用,判 断车是否正常行驶和是否通过终点线。不同的控制算法都是通过远距离传感器 的信息而切换的,同时,速度传感器对车辆的行驶状态进行采集,测量车速。
III
第一章
引言
智能汽车的行驶控制一直以来是自动化、汽车等学科研究的目标,首届“飞 思卡尔”杯全国大学生智能车大赛以邀请赛的方式使更多的学校和同学有了探 索的机会。现在历经四届,每一届都较前一届无论是速度还是稳定性都有新的 突破。大学生智能模型车竞赛是在飞思卡尔半导体公司资助下举办的以 HCS12 单片机为核心的大学生课外科技竞赛。组委会将提供一个标准的汽车模型、直 流电机和可充电式电池,参赛队伍要制作一个能够自主识别路线的智能车,在 专门设计的跑道上自动识别道路行驶,谁最快跑完全程而没有冲出跑道,谁就 是获胜者。 为了追求小车的高速和稳定的目的,人们对人工智能与机器人技术,汽车 技术,自动控制技术各方面都进行了更广泛、更深入的层面展开研究 ,这样无疑 对学术研究和生产应用都有很强的实际意义。比赛涉及到的专业知识有自动控 制、模式识别、传感技术、汽车电子、电气、计算机、机械等多个学科,对学 生的知识融合和实践动手能力的培养有重大的意义,对高等学校控制及汽车电 子学科学术水平的提高,具有良好的长期推动作用 智能小车系统由HCS12微控制器、电源管理单元、路径识别电路、车速检测 模块、舵机控制单元和直流驱动电机控制单元组成。本系统以飞思卡尔公司的 16位微处理器MC9S12XS128为控制核心,并采用CodeWarrior软件编程和BDM作为 调试工具。运用反射式红外传感器进行道路信息采集,并采用PWM技术来控制舵 机的转向和电机转速。舵机控制主要采用PWM信号开环控制,而速度控制方面, 由数据表来设定速度,PID控制来调整速度。通过将总线频率超频到40M来更快 更准确地进行控制。各个部分经过MCU的协调处理,能够以较快的速度在指定的 轨迹上行驶,在进弯道之前能够提前减速并改变角度,达到平滑过弯和减小路 程的效果。 本报告分为六个章节:第一章为引言介绍;第二章主要介绍了智能车机械 设计与安装;第三章主要介绍了智能车硬件电路设计;第四章为智能车软件设 计;第五章为智能车技术参数说明;第六章为总结。
单片机(飞思卡尔)课程设计报告书

课程设计报告课程设计名称:系:学生:班级:学号:成绩:指导教师:开课时间:学年学期目录第一章系统概要 (1)1.1 系统背景 (1)第二章系统硬件设计 (2)2.1 系统原理图 (2)2.2 单片机(MCU)模块 (3)2.2.1 MC9S08AW60单片机性能概述 (3)2.2.2 部结构简图 (3)2.3 串行通信模块 (4)2.3.1 MAX232引脚图 (4)2.3.2 串行通信的电路原理 (5)2.4 液晶显示模块 (6)第三章系统软件设计 (8)3.1 MCU方(C)程序 (8)3.1.1串行通信子程序 (14)3.1.2 LCD子程序 (18)第四章系统测试 (21)第五章总结展望 (24)5.1 总结 (24)5.2 展望 (24)参考文献 (24)第一章系统概要1.1 系统背景单片机(MCU)的基本定义是:在一块芯片上集成了中央处理器(CPU)、存储器(RAM/ROM等)、定时器/计数器及多种输入输出(I/O)接口的比较完整的数字处理系统。
单片机自1976年由Intel公司推出MCS-48开始,迄今已有二十多年了。
由于单片机集成度高、功能强、可靠性高、体积小、功耗地、使用方便、价格低廉等一系列优点,目前已经渗入到人们工作和生活的方方面面,几乎“无处不在,无所不为”。
单片机的应用领域已从面向工业控制、通讯、交通、智能仪表等迅速发展到家用消费产品、办公自动化、汽车电子、PC机外围以及网络通讯等广大领域。
Freescale的S08系列8位MCU由于稳定性高、开发周期短、成本低、型号多样、兼容性好被广泛应用。
HC08是Freescale的08系列之一S08表示增强型HC08,它是在HC08基础上发展起来的,兼容HC08系列。
S08是2004年左右推出8位MCU,资源丰富,功耗低,性价比很高,是08系列MCU发展趋势,其性能与许多16位MCU相当。
MC9S08AW60是低成本、高性能8位微处理器S08家族中的成员,本次课程设计就是以该芯片为基础,来进行嵌入式的设计。
飞思卡尔单片机教学课件

THANKS
具体实现方法:首先需要将LED灯连接到单片机的某个I/O端口上,然后在程序 中配置该I/O端口的输出模式,通过循环语句控制LED灯的亮灭状态,从而实现 LED闪烁的效果。
按键输入程序
按键输入程序是单片机编程中常见的应用之一,通过编实现方法:首先需要将按键连接到单片机的某个I/O端口 上,然后在程序中配置该I/O端口的输入模式,通过检测该 I/O端口的电平变化来判断按键是否被按下,从而实现按键输 入的功能。
随着物联网和嵌入式系统 的发展,对单片机的功耗 要求越来越高,低功耗设 计成为未来的重要趋势。
多核处理器
为了提高处理能力和效率, 单片机将向多核处理器方 向发展,实现更复杂的功 能和更高的性能。
无线连接
无线连接技术的发展,使 得单片机能够更好地与外 部设备进行通信和控制, 扩展了应用范围。
飞思卡尔单片机的未来
IAR Embedded Workbench: 另一款流行的单片机开发软件,
提供丰富的工具链。
MPLAB X IDE:适用于XC8和 XC16系列单片机的开发环境,
由Microchip公司出品。
03 飞思卡尔单片机编程实 践
LED闪烁程序
LED闪烁程序是单片机编程的基础实践之一,通过编写程序控制LED灯的亮灭, 可以帮助学生理解单片机的I/O端口操作和程序执行流程。
更高效的生产工艺
更智能的算法支持
随着半导体技术的不断发展,飞思卡 尔单片机的生产工艺将更加高效,性 能和集成度更高。
随着人工智能和机器学习技术的发展, 飞思卡尔单片机将集成更智能的算法, 实现更高级的功能和应用。
更丰富的外设接口
为了满足各种应用需求,飞思卡尔单 片机将提供更丰富的外设接口,如 USB、HDMI等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
天职师大期末必考关于Codewarrior 中的 .prm 文件网上广泛流传的一篇文章讲述的是8位飞思卡尔单片机的内存映射,这几天,研究了一下Codewarrior 5.0 prm文件,基于16位单片机MC9S12XS128,一点心得,和大家分享。
有什么错误请指正。
来源:(/s/blog_60281b700100gbp6.html) - 关于Codewarrior 中的 .prm 文件_LiangXiangTai_新浪博客正文:关于Codewarrior 中的.prm 文件要讨论单片机的地址映射,就必须要接触.prm文件,本篇的讨论基于Codewarrior 5.0 编译器,单片机采用MC9S12XS128。
通过项目模板建立的新项目中都有一个名字为“project.prm”的文件,位于ProjectSettings->Linker Files文件夹下。
一个标准的基于XS128的.prm文件起始内容如下:.prm文件范例:NAMESENDSEGMENTSRAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;ROM_4000 = READ_ONLY DATA_NEAR IBCC_NEAR 0x4000 TO 0x7FFF;ROM_C000 =READ_ONLY DATA_NEAR IBCC_NEAR 0xC000 TO 0xFEFF;//OSVECTORS = READ_ONLY 0xFF10 TO 0xFFFF;EEPROM_00 =READ_ONLY DATA_FAR IBCC_FAR 0x000800 TO 0x000BFF;EEPROM_01 =READ_ONLY DATA_FAR IBCC_FAR 0x010800 TO 0x010BFF;READ_ONLY DATA_FAR IBCC_FAR 0x020800 TO 0x020BFF;EEPROM_03 =READ_ONLY DATA_FAR IBCC_FAR 0x030800 TO 0x030BFF;EEPROM_04 =READ_ONLY DATA_FAR IBCC_FAR 0x040800 TO 0x040BFF;EEPROM_05 =READ_ONLY DATA_FAR IBCC_FAR 0x050800 TO 0x050BFF;EEPROM_06 =READ_ONLY DATA_FAR IBCC_FAR 0x060800 TO 0x060BFF;EEPROM_07 =READ_ONLY DATA_FAR IBCC_FAR 0x070800 TO 0x070BFF;PAGE_F8 =READ_ONLY DATA_FAR IBCC_FAR 0xF88000 TO 0xF8BFFF;PAGE_F9 =READ_ONLY DATA_FAR IBCC_FAR 0xF98000 TO 0xF9BFFF;READ_ONLY DATA_FAR IBCC_FAR 0xFA8000 TO 0xFABFFF;PAGE_FB =READ_ONLY DATA_FAR IBCC_FAR 0xFB8000 TO 0xFBBFFF;PAGE_FC =READ_ONLY DATA_FAR IBCC_FAR 0xFC8000 TO 0xFCBFFF;PAGE_FE =READ_ONLY DATA_FAR IBCC_FAR 0xFE8000 TO 0xFEBFFF; ENDPLACEMENT_PRESTART,STARTUP,ROM_VAR,STRINGS,VIRTUAL_TABLE_SEGMENT,//.ostext,DEFAULT_ROM, NON_BANKED,COPYINTO ROM_C000 ;OTHER_ROM INTO PAGE_FE, PAGE_FC, PAGE_FB, PAGE_FA, PAGE_F9, PAGE_F8;//.stackstart,SSTACK,//.stackend,PAGED_RAM,DEFAULT_RAMINTO RAM;DISTRIBUTE DISTRIBUTE_INTOROM_4000, PAGE_FE, PAGE_FC, PAGE_FB, PAGE_FA,PAGE_F9, PAGE_F8;CONST_DISTRIBUTE DISTRIBUTE_INTOROM_4000, PAGE_FE, PAGE_FC, PAGE_FB, PAGE_FA, PAGE_F9, PAGE_F8;DATA_DISTRIBUTE DISTRIBUTE_INTORAM;//.vectors INTO OSVECTORS;ENDENTRIES//_vectab OsBuildNumber _OsOrtiStackStart _OsOrtiStartENDSTACKSIZE 0x100VECTOR 0 _Startup//VECTOR 0 Entry//INIT Entry1 .prm文件组成结构按所含的信息的不同.prm文件有六个组成部分构成,这里仅讨论和内存空间映射关系紧密的三个部分,其他的不做讨论。
·SEGMENTS… END定义和划分芯片所有可用的内存资源,包括程序空间和数据空间。
一般我们将程序空间定义成ROM,把数据空间定义成RAM,但这些名字都不是系统保留的关键词,可以由用户随意修改。
用户也可以把内存空间按地址和属性随意分割成大小不同的块,每块可以自由命名。
例如同样是RAM,可以使用不同的属性,使其有复位后变量清零和不清零之分。
关于内存划分的具体方法在后面详解。
·PLACEMENT… END将指派源程序中所定义的各种段,如数据段DATA_SEG、CONST_SEG和代码段CODE_SEG 被具体放置到哪一个内存块中。
它是将源程序中的定义描述和实际物理内存挂钩的桥梁。
·STACKSIZE定义系统堆栈长度,其后给出的长度字节数可以根据实际应用需要进行修改。
堆栈的实际定位取决于RAM内存的划分和使用情况。
默认的情况下,堆栈放在RAM区域的起始部分。
当然,堆栈的定义不只有这种方式,还可以使用STACKTOP关键字。
后面将详细讨论。
2内存划分的具体方式由SEGMENTS开始到END为止,中间可以添加任意多行内存划分的定义,每一行用分号结尾。
定义行的语法型式为:[块名] = [属性1] [属性2] ,… ,[属性n] [起始地址] TO [结束地址];其中,· “块名”的定义和C语言变量定义相同,是以英文字母开头的一个字符串,用户可以自己任意定义块名。
· “属性”用户是不能自己定义的,因为属性名指定了上面所说的“块名”所对应的不同的内存类型和访问方式,而不同物理内存的类型和访问方式是一定的。
对于“属性1”,Codewarrior 5.0中可以有三种不同的类型,对于只读的Flash-ROM区属性一定是READ_ONLY,对于可读写的RAM区属性可以是READ_WRITE,也可以是NO_INIT。
它们两者的关键区别是ANSI-C的初始化代码会把定位在READ_WRITE块中的所有全局和静态变量自动清零,而NO_INIT块中的变量将不会被自动清零。
当然只是复位时不清零,掉电时还是清零的,但是对于单片机系统,变量在复位时不被自动清零这一特性有时是很关键的,在某些应用中有特殊的用途。
对于“属性2 …属性n”,根据上面给出的.prm的范例文件可以看出来,可能的形式有“DATA_FAR”、“DATA_NEAR”、“IBCC_FAR”、“IBCC_NEAR”四种类型。
其中,“DATA_FAR”和“DATA_NEAR”相对应,当内存区域包含变量或者是常量时(通常是RAM、Flash和EEPROM),必须指明上面两种属性中的一种,由于涉及到内存的分页,可以这样理解:“DATA_FAR”属性指定的内存块为可以保存数据的非固定页,而“DATA_NEAR”属性指定的内存块为可以保存数据的固定页;同理“IBCC_FAR”和“IBCC_NEAR”相对应,当内存区域包含代码时(Flash和EEPROM),必须指明上面两种属性中的一种,“IBCC_FAR”属性指定的内存块为可以保存代码的非固定页,而“IBCC_NEAR”属性指定的内存块为可以保存代码的固定页讨论到这里,细心的读者已经发现,在上面的.prm文件范例中,RAM的属性有“DATA_FAR”和“DATA_NEAR”两种,Flash的属性中也是四种都有,但是EEPROM中却只有“DATA_FAR”和“IBCC_FAR”两种,这正好验证了上一篇文章(飞思卡尔16位单片机的资源配置)中所提到的,RAM、Flash中都有固定页,但是EEPROM中全部是非固定页。
·起始地址和结束地址决定了一内存块的物理位置,对于固定页,用4位16进制数表示,而对于非固定页,则用6位16进制表示,多出来的两位其实是寄存器EPAGE、RPAGE或PPAGE的值,可见,对于分页的资源,是通过寄存器(EPAGE、RPAGE或PPAGE)和16位的地址总线的组合来进行寻址的。
“TO”是系统保留的关键字,必须大写。
下面,根据上面范例提供的内容,举几个例子:例1RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;上面这句话的意思是:分配0x2000-0x3FFF的区域的块名为“RAM”(当然可以定义别的名称),由上一篇文章而知,这一区域的物理内存的性质为RAM,属性应该为“READ_WRITE”,并且这一区域中的两页都为固定页,所以为“DATA_NEAR”。
例2将8K字节RAM的后面4K字节定义成非自动清零的数据保留区,则应如下定义:SEGMENTS……RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x2FFF;RAM_NO_INIT = NO_INIT DATA_NEAR 0x3000 TO 0x3FFF;……END注意,各部分RAM的分配地址不应该存在重叠的部分,否则会发生错误。
例3EEPROM_00 = READ_ONLY DATA_FAR IBCC_FAR 0x000800 TO 0x000BFF;XS128单片机中的EEPROM由Data-Flash模拟,所以属性为READ_ONLY。
EEPROM全部为非固定页,所以用“DATA_FAR”、“IBCC_FAR”。
后面的起始地址和结束地址分别为6位的16进制数,前两位的“00”实质指的是EEPROM分页寄存器EPAGE的值为0x00。
用SEGMENTS只是从单片机的物理内存这一角度对其进行空间划分。