飞思卡尔MC9S12单片机实验程序

合集下载

飞思卡尔MC9S12XS128单片机各模块使用方法及寄存器配置

飞思卡尔MC9S12XS128单片机各模块使用方法及寄存器配置

飞思卡尔MC9S12XS128单片机各模块使用方法及寄存器配置手把手教你写S12XS128程序--PWM模块介绍该教程以MC9S12XS128单片机为核心进行讲解,全面阐释该16位单片机资源。

本文为第一讲,开始介绍该MCU的PWM模块。

PWM 调制波有8个输出通道,每一个输出通道都可以独立的进行输出。

每一个输出通道都有一个精确的计数器(计算脉冲的个数),一个周期控制寄存器和两个可供选择的时钟源。

每一个P WM 输出通道都能调制出占空比从0—100% 变化的波形。

PWM 的主要特点有:1、它有8个独立的输出通道,并且通过编程可控制其输出波形的周期。

2、每一个输出通道都有一个精确的计数器。

3、每一个通道的P WM 输出使能都可以由编程来控制。

4、PWM 输出波形的翻转控制可以通过编程来实现。

5、周期和脉宽可以被双缓冲。

当通道关闭或PWM 计数器为0时,改变周期和脉宽才起作用。

6、8 字节或16 字节的通道协议。

7、有4个时钟源可供选择(A、SA、B、SB),他们提供了一个宽范围的时钟频率。

8、通过编程可以实现希望的时钟周期。

9、具有遇到紧急情况关闭程序的功能。

10、每一个通道都可以通过编程实现左对齐输出还是居中对齐输出。

1、PWM启动寄存器PWMEPWME 寄存器每一位如图1所示:复位默认值:0000 0000B图1 PWME 寄存器每一个PWM 的输出通道都有一个使能位P WMEx 。

它相当于一个开关,用来启动和关闭相应通道的PWM 波形输出。

当任意的P WMEx 位置1,则相关的P WM 输出通道就立刻可用。

用法:PWME7=1 --- 通道7 可对外输出波形PWME7=0 --- 通道7 不能对外输出波形注意:在通道使能后所输出的第一个波形可能是不规则的。

当输出通道工作在串联模式时(PWMCTL 寄存器中的CONxx置1),那么)使能相应的16位PWM 输出通道是由PWMEx 的高位控制的,例如:设置PWMCTL_CON01 = 1,通道0、1级联,形成一个16位PWM 通道,由通道 1 的使能位控制PWM 的输出。

飞思卡尔程序

飞思卡尔程序

飞思卡尔程序#include <hidef.h> /* common defines andmacros */#include <mc9s12dg128.h> /* derivativeinformation *///#include "PWM.h"//#include "AD.h"#include "control.h"#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"word AD_wData[9]; //全局变量存放 AD0,AD1,AD2的结果word sum[9]; //初始化时为求平均值,全白中,各个灯的FF次的电压和word avrg0[9]; //全白时各个灯的平均电压word summ[9];//初始化时为求平均值,全黑中,各个灯的FF次的电压和word avrg1[9]; //全黑时各个灯的平均电压word ss[9]; //实际采集来的各个灯的电压word s[9]; // 实际采集来的各个灯的电压word sum2[8];//用于存放两两灯电压之和word k; //用于存放比较出的最大值uint h=1500;//转角大小int flag = 0;//标志中间灯是否第一次在黑道附近int flagg=0;//标志0灯从哪边感应到黑道int flagg1=0;//标志8灯从哪边感应到黑道int flagg0=0;//标志是左边还是右边出道int j=0;dword i;dword m;dword s0;dword s1;dword p11=0;//以下四个变量用于记录黑道处于同一侧的时间dword p12=0;dword p21=0;dword p22=0;word max0[9]=0;//初始化时采集来的黑道的值int g=0;//为过滤算法使用word cha[9];//用来存放黑白电压差int ffgg0=0;//标志是否用中间板采的数据int ffgg1=0;//标志是否用中间板采的数据word sum0=0; //初始化时采集来9个灯的全白电压和//word sum1=0; //实际采集来的左4个灯的电压和//word sum22=0; //实际采集来的右4个灯的电压和int fla=0;//标志是出道还是入道void AD_Init();void PWM_Init();void PWM_Init1();//void PID();void AD_Init(void) //AD初始化{//控制寄存器2:上电,标志位快速清零,开中断ATD0CTL2 =(ATD0CTL2_ADPU_MASK|ATD0CTL2_AFFC_MASK|ATD0CTL2_ASCIE_MASK) ;ATD1CTL2 =(ATD1CTL2_ADPU_MASK|ATD1CTL2_AFFC_MASK|ATD1CTL2_ASCIE_MASK) ;//控制寄存器3:转换序列长度为3ATD0CTL3 =0x78;//(ATD0CTL3_S2C_MASK|ATD0CTL3_S1C_MASK);ATD1CTL3 =0x78;//(ATD1CTL3_S2C_MASK|ATD1CTL3_S1C_MASK);//控制寄存器4:ATD0CTL4 =(ATD0CTL4_SRES8_MASK|ATD0CTL4_PRS1_MASK|ATD0CTL4_PRS0_MASK) ;ATD1CTL4 =(ATD1CTL4_SRES8_MASK|ATD1CTL4_PRS1_MASK|ATD1CTL4_PRS0_MASK) ;//控制寄存器5:ATD0CTL5 =(ATD0CTL5_DJM_MASK|ATD0CTL5_SCAN_MASK|ATD0CTL5_MULT_MASK);ATD1CTL5 =(ATD1CTL5_DJM_MASK|ATD1CTL5_SCAN_MASK|ATD1CTL5_MULT_MASK); ATD0DIEN=0x00; // 禁止数字输入缓冲ATD1DIEN=0x00; // 禁止数字输入缓冲}#pragma CODE_SEG NON_BANKED //中断服务程序#pragma TRAP_PROCvoid interrupt 22 Int_AD0(void){AD_wData[0] = ATD0DR0; //将结果寄存器中的值存放到数组中AD_wData[1] = ATD0DR1; //将结果寄存器中的值存放到数组中AD_wData[2] = ATD0DR2; //将结果寄存器中的值存放到数组中AD_wData[3] = ATD0DR3;AD_wData[4] = ATD0DR4;AD_wData[5] = ATD0DR5;AD_wData[6] = ATD0DR6;AD_wData[7] = ATD0DR7;AD_wData[8] = ATD1DR0;}#pragma CODE_SEG DEFAULTword max(word a,word b,word c,word d,word e,wordf,word r,word w) {word maxx=0;if(a>maxx)maxx=a;if(b>maxx)maxx=b;if(c>maxx)maxx=c;if(d>maxx)maxx=d;if(e>maxx)maxx=e;if(f>maxx)maxx=f;if(r>maxx)maxx=r;if(w>maxx)maxx=w;return maxx;}void delay0(){for(i=0;i<0xFFFF;i++)for(m=0;m<0x05;m++);}void delay1(){for(i=0;i<0xFFFF;i++);// for(i=0;i<0xFFFF;i++);}void main(void){AD_Init(); //AD 初始化DDRB = 0xFF;DDRA_BIT6=0; //A_BIT6口作为第二块板左边传感器的输入口 DDRA_BIT7=0; //A_BIT7口作为第二块板右边传感器的输入口 PORTB = 0xFF;p=0;for(j=0;j<9;j++){AD_wData[j] = 0; //全局变量初始化sum[j]=0;avrg0[j]=0;avrg1[j]=0;summ[j]=0;}for(j=0;j<9;j++) {max0[j]=0;ss[j]=0;}for(j=0;j<8;j++)sum2[j]=0;EnableInterrupts; //开AD中断for(i=0;i<0xFFFF;i++);for(i=0;i<0xFF;i++) //只能是FF,防止下面sum溢出 {for(j=0;j<9;j++)//采集白道路信息{sum[j]=sum[j]+AD_wData[j];}}for(i=0;i<9;i++) {sum0=sum0+sum[i]/0xFF;avrg0[i]=sum[i]/0xFF;}PORTB=sum[0]/0xFF; //显示0通道采集到的值delay0();PORTB=0x00;//显示马上得进行黑道信息采集了delay1();for(j=0;j<9;j++){for(m=0;m<0xFF;m++){summ[j]=summ[j]+AD_wData[j];}avrg1[j]=summ[j]/0xFF;PORTB=avrg1[j]; //显示采来的黑道信息cha[j]=avrg1[j]-avrg0[j];delay0();PORTB=0x00; //显示马上得进行下一次黑道信息采集了 delay1();}PORTB=0x00;//灯全亮,提示车马上就可以跑了delay1();PWM_Init() ;PWM_Init1(1500,1,200);for(i=0;i<0xFFF;i++);// delay1();for(;;){int f=0;u3=100;if(flagk1==1){p21=0;flagk2=0;p11++;if(p11==0xFFF)flagkk1=1;}else if(flagk2==1){p11=0;flagk1=0;p21++;if(p21==0xFFF)flagkk2=1;}for(f=0;f<9;f++){s[f]=AD_wData[f];ss[f]=s[f]-(avrg0[f]-0x50); //当前值减去初始白道值,以便比较}for(f=0;f<8;f++)sum2[f]=ss[f]+ss[f+1]; //两两灯电压之和//减去1.6V防止溢出*******************if(AD_wData[0]<0xC0&& AD_wData[1]<0xC0&&AD_wData[2]<0xC0&&AD_wData[3]<0xC0&&AD_wData[4]<0xC0&&AD_wData[5]<0xC0&&AD_wData[6]<0xC0&&AD_wD ata[7]<0xC0&&AD_wData[8]<0xC0){if(sum2[0]<0xC0&&sum2[1]<0xC0&&sum2[2]<0xC0&&sum2[3]<0xC0&&sum2[4]<0xC0&&sum2[5]<0xC0&&sum2[6]<0xC0&&sum2[7]<0xD0){fla=1;if(flagg0==1){for(i=0;i<0xFF;i++);PWM_Init1(1140,u1,200);flagk1=1;flagkk2=0;for(;;){if(AD_wData[4]>0xB0||AD_wData[5]>0xB0||AD_wData[6]>0xB0|| AD_wData[7]>0xB0||AD_wData[8]>0xB0){flagg0=0;break;}}}else if(flagg0==2){for(i=0;i<0xFF;i++);PWM_Init1(1860,u1,200);flagk1=0;flagkk2=1;for(;;)if(AD_wData[0]>0xB0||AD_wData[1]>0xB0||AD_wData[2]>0xB0||AD_wData[3]>0xB0||AD_wData[4]>0xB0){flagg0=0;break;}}}else{}}else{if(s[0]-(avrg0[0]-0x13)<0x40 &&s[1]-(avrg0[1]-0x13)<0x40 &&s[2]-(avrg0[2]-0x13)<0x40 && s[3]-(avrg0[3]-0x13)<0x40 &&s[4]-(avrg0[4]-0x13)<0x40 && s[5]-(avrg0[5]-0x13)<0x40 &&s[6]-(avrg0[6]-0x13)<0x40 && s[7]-(avrg0[7]-0x13)<0x40 &&s[8]-(avrg0[8]-0x13)<0x40)///////////注意调整该值36***************{/* if(PORTA_BIT6!=0||PORTA_BIT7!=0){if(PORTA_BIT6!=0&&PORTA_BIT7==0)PWM_Init1(1900,200,1);else if(PORTA_BIT7!=0&&PORTA_BIT6==0)PWM_Init1(1100,200,1);}*/}else{k=max(sum2[0],sum2[1],sum2[2],sum2[3],sum2[4],sum2[5],sum2[ 6],sum2[7]);//谁两和最大,黑道就在谁两之间if(k==sum2[0]){p=0;flagg0=2;if(fla==1)control_11();else if(fla==0) control_1();}else{if(k==sum2[1]){p=0;p1=0;fla=0;control_2(s[1],s[2],ss[1],ss[2],cha[1],cha[2],avrg0[1],avrg 0[2]);}else{if(k==sum2[2]){p=0;p1=0;fla=0;control_3(s[2],s[3],ss[2],ss[3],cha[2],cha[3],avrg0[2],avrg 0[3]);}else{if(k==sum2[3]){p=0;p1=0;fla=0;control_4(s[3],s[4],ss[3],ss[4],cha[3],cha[4],avrg0[3],avrg 0[4]);}else{if(k==sum2[4]){fla=0;p1=0;control_5(s[4],s[5],ss[4],ss[5],cha[4],cha[5],avrg0[4],avrg 0[5]);}else{if(k==sum2[5]){fla=0;p1=0;control_6(s[5],s[6],ss[5],ss[6],cha[5],cha[6],avrg0[5],avrg 0[6]);}else{if(k==sum2[6]){p=0;p1=0;fla=0;control_7(s[6],s[7],ss[6],ss[7],cha[6],cha[7],avrg0[6],avrg 0[7]);}else{if(k==sum2[7]){p=0;flagg0=1;if(fla==0)control_8(); elseif(fla==1)control_88(); } else{}}}}}}}}}}}}。

飞思卡尔单片机S12使用方法及程序

飞思卡尔单片机S12使用方法及程序

飞思卡尔单片机S12使用方法及程序单片机简介: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口上去。

基于飞思卡尔MC9S12XEP的SPI程序

基于飞思卡尔MC9S12XEP的SPI程序

基于飞思卡尔MC9S12XEP的SPI程序#defineSPI_GLOBALS#include\#defineWrite_To_FlahDataSize15taticuint8_tDummy;//选中flahvoidSPICSLow(uint8_tChip){if(Chip==0){SPI_FLASH1_CS_LOW();//选中flah1}ele{SPI_FLASH2_CS_LOW();//选中flah2}}//不选voidSPICSHigh(uint8_tChip){if(Chip==0){SPI_FLASH1_CS_HIGH();//不选中flah1}ele{SPI_FLASH2_CS_HIGH();//不选中flah2}}//flah写使能voidSPIWriteEnable(uint8_tChip){//flah写除能voidSPIWriteDiable(uint8_tChip){SPICSLow(Chip);//bringthechoenchip'CSpindown//SPI初始化voidSPIInit(void){DDRP_DDRP0=1;DDRP_DDRP1=1;DDRP_DDRP2=1;DDRP_DDRP3=1;SPI_WP1_OFF();SPI_WP2_OFF();SPI_FLASH1_CS_HIGH();SPI_FLASH2_CS_HIGH();SPI2BR=(0<<4)|(0);//(0+1)某2^(0+1)=2,20M/2=10MSPI2CR1=0某50;//主机模式}//SPI读flah的IDSPI_E某Tuint16_tSPIReadID(uint8_tChip){uint16_tID;SPICSLow(Chip);//bringthechoenchip'CSpindownDummy=SPIReadWriteByte(SPI2,0某00);//writeAddr[16:23]//写24位地址Dummy=SPIReadWriteByte(SPI2,0某00);//writeAddr[8:15]Dummy=SPIReadWriteByte(SPI2,0某00);//writeAddr[0:7]((uint8_t某)&ID)[0]=SPIReadWriteByte(SPI2,SPI_CMD_DUMMY);//manufacturerID ((uint8_t某)&ID)[1]=SPIReadWriteByte(SPI2,SPI_CMD_DUMMY);//deviceIDreturnID;//returntheIDvalue}//SPI读flah状态uint8_tSPIReadSta(uint8_tChip){uint8_tSta;SPICSLow(Chip);//bringthechoenchip'CSpindownSta=SPIReadWriteByte(SPI2,SPI_CMD_DUMMY);//tatuSPICSHigh(Chip);//bringthechoenchip'CSpinhighreturnSta;//returnthetatuvalue}//等待芯片空闲(在执行Byte-Program,Sector-Erae,Block-Erae,Chip-Erae操作后voidSPIWaitBuy(uint8_tChip){SPICSLow(Chip);///----------------------------------------------------------------------------------------------------------//Function:SPIFlah初始化//Param://Return://note///----------------------------------------------------------------------------------------------------------SPI_E某TvoidSPIFlahInit(void){uint8_ti;uint16_tID;SPIInit();//memet(SPI_Flah_Info,0,izeof(SPI_Flah_Info));//for(i=0;i<SP I_MA某_CHIPS;i++){ID=SPIReadID(i);SPI_Flah_Info[i].DeviceID=ID;SPI_Flah_Info[i].Size=(uint32_t)8某1024某1024;SPI_Flah_Info[i].SectorSize=4某1024;SPI_Flah_Info[i].SectorPage=16;SPI_Flah_Info[i].BlockSize=(uint32_t)64某1024;SPI_Flah_Info[i].Block=128;SPI_Flah_Info[i].PageSize=256;SP I_Flah_Info[i].Page=65536;}}/某--------------------------------------------------------------------------------------------------------SPI收发送函数----------------------------------------------------------------------------------------------------------某/SPI_E某Tuint8_tSPIReadWriteByte(uint8_tSPI,uint8_tData){if(SPIcaeSPI0:while(SPI0SR_SPTEF==0);SPI0DRL=Data;while(SPI0SR_SPIF==0);returnSPI0DRL;break;caeSPI2:while(SPI2SR_SPTEF==0);SPI2DRL=Data;while(SPI2SR_SPIF==0);returnSPI2DRL;break;}}///----------------------------------------------------------------------------------------------------------//Function:把Chip号芯片的Adre位置开始Len长度的数据读取到Buf中//Param://Return://note///----------------------------------------------------------------------------------------------------------SPI_E某TvoidSPIRead(uint8_tChip,uint32_tAddre,uint8_t某Buf,uint32_tLen){uint32_ti;SPIWaitBuy(Chip);//判忙SPICSLow(Chip);//bringthechoenchip'CSpindownDummy=SPIReadWriteByte(SPI2,((uint8_t某)&Addre)[1]);//writeAddr[8:15]某)&Addre)[2]);//writeAddr[0:7]for(i=0;i<Len;i+=1){Buf[i]=SPIReadWriteByte(SPI2,SPI_CMD_DUMMY);//readdata}SPICSHigh(Chip);//bringthechoenchip'CSpinhigh}///----------------------------------------------------------------------------------------------------------//Function:向chip号芯片的Addre位置开始的区域写入长度为Len 的Buf内容//Param://Return://note///----------------------------------------------------------------------------------------------------------SPI_E某TvoidSPIWritePage(uint8_tChip,uint32_tAddre,uint8_tBuf[],uint32_ tLen){uint8_ti;SPIWriteEnable(Chip);SPICSLow(Chip);//bringthechoenchip'CSpindownDummy=SPIReadWriteByte(SPI2,((uint8_t某)&Addre)[0]);//write Addr[16:23]Dummy=SPIReadWriteByte(SPI2,((uint8_t某)&Addre)[1]);//writeAddr[8:15]某)&Addre)[2]);//writeAddr[0:7]for(i=0;iDummy=SPIReadWriteByte(SPI2,Buf[i]);//writethedatatobeent} SPICSHigh(Chip);//bringthechoenchip'CSpinhighSPIWaitBuy(Chip );//判忙}///----------------------------------------------------------------------------------------------------------//Function:擦除flah一个ector//Param://Return://note///----------------------------------------------------------------------------------------------------------SPI_E某TvoidSPIEraeSector(uint8_tChip,uint32_tAddre){SPIWriteEnable(Chip);//writeenableSPIWaitBuy(Chip);//判忙SPICSLow(Chip);//bringthechoenchip'CSpindownDummy=SPIReadWriteByte(SPI2,SPI_CMD_4K_ERASE);//write4K_Erae Dummy=SPIReadWriteByte(SPI2,((uint8_t某)&Addre)[1]);//writeAddr[8:15]Dummy=SPIReadWriteByte(SPI2,((uint8_t某)&Addre)[2]);//writeAddr[0:7]SPICSHigh(Chip);//bringthechoenchip'CSpinhighSPIWriteDiable(Chip);SPIWaitBuy(Chip);//判忙}///----------------------------------------------------------------------------------------------------------//Function:擦除flah一个block//Param://Return://note///----------------------------------------------------------------------------------------------------------SPI_E某TvoidSPIEraeBlock(uint8_tChip,uint32_tAddre){SPIWriteEnable(Chip);SPIWaitBuy(Chip);//判忙SPICSLow(Chip);//bringthechoenchip'CSpindownDummy=SPIReadWriteByte(SPI2,((uint8_t某)&Addre)[0]);//writeAddr[16:23]Dummy=SPIReadWriteByte(SPI2,((uint8_t某)&Addre)[1]);//writeAddr[8:15]Dummy=SPIReadWriteByte(SPI2,((uint8_t某)&Addre)[2]);//writeAddr[0:7]SPICSHigh(Chip);//bringthechoenchip'CSpinhighSPIWriteDiable(Chip);SPIWaitBuy(Chip);//判忙}///----------------------------------------------------------------------------------------------------------//Function:擦除flah整片芯片//Param://Return://note///----------------------------------------------------------------------------------------------------------SPI_E某TvoidSPIEraeChip(uint8_tChip){SPIWriteEnable(Chip);SPIWaitBuy(Chip);//判忙SPICSLow(Chip);Dummy=SPIReadWriteByte(SPI2,SPI_CMD_CHIP_ERASE);SPICSHigh(Chip);SPIWaitBuy(Chip);//判忙SPIWriteDiable(Chip);}/某----------------------------------------------------------------------------------------------------------向SPI_FlahBuf 里面写入数据------------------------------------------------------------------------------------------------------------某///SPI_E某TSPIWriteToBuf/某----------------------------------------------------------------------------------------------------------向SPI_FlahBuf 里面写入数据------------------------------------------------------------------------------------------------------------某/SPI_E某TvoidSPIWriteToBuf(uint8_tarray[],uint8_tarray_len){uint8_ti;for(i=0;i<array_len;i++)SPI_FlahBuf[i]=array[i];SPI2CR1_SPIE=1;//给SPI缓冲区写完数据,打开中断,将数据写入到Flah里面。

MC9S12XEP100开发板实验指导手册

MC9S12XEP100开发板实验指导手册
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 实验九 ECT 实验………………..…..…..….………………..………….………..............................................42 实验十 实时中断实验……….…….….…………..……..……….……….................................................44 实验十一 PIT 实验…………..………..…………………..………….……….................................................45 实验十二数码管实验……..………..…………………..………….……….................................................46 第 5 章 高级实验……………..…………………..……………..………….………..................................................47 实验一 数字电压表..…………………..……………..………….………....................................................47 实验二 数字秒表及定时器…..……………..………….……….........................................................48 实验三 蜂鸣器播放音乐……..……………..………….………............................................................50 实验四 汉显液晶实验…………..……………..………….………..........................................................51 实验五 ZX0802A 小液晶实验..………..……..………….……….........................................................53 实验六 遥控模块实验…………..……………..………….………..........................................................54 实验七 温度传感器实验………..……………..………….……….........................................................56 实验八 RS-485 总线实验……..…….………..………….………..........................................................58 实验九 LIN 总线实验……..……………...………….……….................................................................59 实验十 CAN 总线实验……..…………....………….……….................................................................63 实验十一 SAE-J1939 实验...………….……….….……….................................................................66 实验十二 SD 卡实验………....………….……….….……….................................................................67 实验十三 综合演示实验…....………………….….……….................................................................69 实验十四 双核协同工作实验………………….….………...............................................................70 实验十五 DFLASH 实验.…………..….…….….………….………..........................................................76

飞思卡尔MC9S12单片机实验程序

飞思卡尔MC9S12单片机实验程序
DDRB=0xff; //B口用于输出脉冲值
PORTB=0xff; //led灯全暗
TIOS=0x00; //设置定时器通道0为输入捕捉
TSCR1=0x80; //定时器使能
TSCR2=0x01; //设置自由计数器2分频,且禁止定时器溢出中断
TCTL4=0x02; //捕捉器仅下降沿捕捉
TIE=0x01; //允许定时器通道0的中断
}
}
void main(void) {
DDRB=0xff;
PORTB=0x00;
for(;;)
{
fun();
}
}
SCI
#include <hidef.h>
#include <mc9s12db128.h>
#pragma LINK_INFO DERIVATIVE "mc9s12db128b"
unsigned char pp=0xf0; //欲发送的数字
/*********串口初始化*********/
void init() {
DDRB=0xff;
PORTB=0xff; //开始led灯暗,即数据尚未接收
SCI0BD=52; //初始化波特率为9600
SCI0CR1=0x00; //八位无奇偶校验模式
SCI0CR2=0x2c; //接收中断允许
}
/**************写数据***********/
void interrupt 20 funck() {
unsigned char k;
k=read();
PORTB=~k;
}
SPI
不会,以后补充。
LED
#include <hidef.h> /* common defines and macros */

飞思卡尔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计数器冻结位。

MC9S12XS128例程

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 /* 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的中断向量号为20 byte 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,然后通过控制寄存器发出转换命令,即可实现转换。

飞思卡尔MC9S12XEP芯片的RS485程序实例

飞思卡尔MC9S12XEP芯片的RS485程序实例

#define RS485_GLOBALS#include "RS485.h"#include "clk.h"RS485_EXT void RS485_QUE_Int(){RS485_RXQUE_SCI1.Rear=0;RS485_RXQUE_SCI1.Front=0;RS485_RXQUE_SCI0.Rear=0;RS485_RXQUE_SCI0.Front=0;RS485_TXQUE_SCI0.Front=0;RS485_TXQUE_SCI0.Rear=0;RS485_TXQUE_SCI1.Front=0;RS485_TXQUE_SCI1.Rear=0;RS485_SCI1_Status=1;RS485_SCI0_Status=1;rs485Init( SCI0);rs485Init( SCI1);}/////////////////////////////////////////////////////////////////////////////// ///////RS485_EXT void rs485Init(uint8_t SCI){if(SCI<SCIX){switch(SCI){case SCI0:SCI0BDH = SCI0Baud_val>>8;SCI0BDL = SCI0Baud_val;SCI0CR1 = 0x00; //8个数据位无校验位SCI0CR2 = (0<<5) | (1<<3) | (1<<2);//SCI2CRC2 第5,3,2位置1 RIE TE RE break;case SCI1:SCI1BDH = SCI1Baud_val>>8;SCI1BDL = SCI1Baud_val;SCI1CR1 = 0x00; //8个数据位无校验位SCI1CR2 = (0<<5) | (1<<3) | (1<<2);//SCI4CRC2 第5,3,2位置1 RIE TE RE break;}}}/////////////////////////////////////////////////////////////////////////////// /////////功能:RS485_0发射、接收切换函数,Tx_Rx为Rx时,开启接收功能,为Tx时,开启发送功能//参数定义:Tx_Rx是用来对函数功能切换的,使输出脚电平的不同,来控制硬件的功能切换///////////////////////////////////////////////////////////////////////////////////// ////////////*/RS485_EXT void rs485_TxOrRx(uint8_t SCI,uint8_t Tx_Rx){DDR1AD0_DDR1AD07=1;DDR0AD0_DDR0AD07=1;if(SCI<SCIX){switch(SCI){case SCI0: if(Tx_Rx==1)PT1AD0_PT1AD07=1;elsePT1AD0_PT1AD07=0;break;case SCI1: if(Tx_Rx==1)PT0AD0_PT0AD07=1;elsePT0AD0_PT0AD07=0;break;}}}/*------------------------------------------------------------------------------------------功能:RS485发射函数参数定义:SCI用来选择RS485 1和0模块,array[]是要发射的数据数组名,也就是首地址。

飞思卡尔MC9S12XEP芯片的RS232程序

飞思卡尔MC9S12XEP芯片的RS232程序

#define RS232_GLOBALS#include "RS232.h"/*-------------------------------------------------------------------------------RS232_SCI2初始化---------------------------------------------------------------------------------*/RS232_EXT void RS232_Init(void){RS232_TXQUE_SCI2.Front=0;RS232_TXQUE_SCI2.Rear=0;RS232_RXQUE_SCI2.Front=0;RS232_RXQUE_SCI2.Rear=0;SCIInit( SCI2); //RS232波特率初始化}/*-------------------------------------------------------------------------------RS232_SCI2 选择发送数据方式,是查询发送还是中断发送---------------------------------------------------------------------------------*/RS232_EXT void RS232PutStr(uint8_t array[],uint8_t arrayLen,uint8_t Type) {uint8_t m,i ;if(Type){ for(i=0;i<arrayLen;i++)RS232_TXBuf_Write( array[i]);SCI2CR2_TIE=1;}elsefor(m=0;m<arrayLen;m++){while(!SCI2SR1_TDRE);SCI2DRL = array[m];}}/*------------------------------------------------------------------------------RS232_SCI2 向发送缓冲区写入数据函数--------------------------------------------------------------------------------*/RS232_EXT void RS232_TXBuf_Write(uint8_t TXData){uint8_t DataTemp;DataTemp = (uint8_t)((RS232_TXQUE_SCI2.Rear+1)% RS232_TXQUE_LEN);if(RS232_TXQUE_SCI2.Front!=DataTemp) //判断队列是否满,若不满,可以入列送出数据{RS232_TXQUE_SCI2.RS232_Bufs[ RS232_TXQUE_SCI2.Rear].Data = TXData; RS232_TXQUE_SCI2.Rear = DataTemp;}else{SCI2CR2_TIE=1;}}/*----------------------------------------------------------------------------------RS232_SCI2 读取接收缓存区里面的数据-----------------------------------------------------------------------------------*/RS232_EXT uint8_t RS232_RXBuf_Read(){uint8_t DataTemp;if( RS232_RXQUE_SCI2.Front!=RS232_RXQUE_SCI2.Rear) //缓冲区不空,可以读出数据{DataTemp = RS232_RXQUE_SCI2.RS232_Bufs[ RS232_RXQUE_SCI2.Front].Data;RS232_RXQUE_SCI2.Front=(uint8_t)((RS232_RXQUE_SCI2.Front+1)%RS232_TXQUE_LEN);return DataTemp;}else{ return 0xff; } //返回的数据无意义,为0xff,}/*--------------------------------------------------------------------------------RS232_SCI2 中断函数-----------------------------------------------------------------------------------*/RS232_EXT void RS232_SCI2_Interrupt(void){uint8_t Dummy,TDRE_flag,RDRF_flag,NextPointer;Dummy = SCI2SR1;TDRE_flag = 0x80&Dummy;RDRF_flag = 0x20&Dummy;if(RDRF_flag){NextPointer = (uint8_t)((RS232_RXQUE_SCI2.Rear+1)% RS232_TXQUE_LEN);if(RS232_RXQUE_SCI2.Front!= NextPointer ) //如果不满可以入列{RS232_RXQUE_SCI2.RS232_Bufs[ RS232_RXQUE_SCI2.Rear].Data= SCI2DRL;RS232_RXQUE_SCI2.Rear = NextPointer;}}if(TDRE_flag){if(RS232_TXQUE_SCI2.Front!=RS232_TXQUE_SCI2.Rear) //有新数据,则继续发送{SCI2DRL= RS232_TXQUE_SCI2.RS232_Bufs[ RS232_TXQUE_SCI2.Front].Data;RS232_TXQUE_SCI2.Front = (uint8_t)((RS232_TXQUE_SCI2.Front+1)%RS232_TXQUE_LEN);}else{ SCI2CR2_TIE=0;}}}/*---------------------------------------------------------------------------------发送数据函数,1.若果选择查询发送,则会将对应的数组以查询的方式发送出去2.如果选择中断的发送方式,则先将相应的数组写入到缓冲区,开启中断,则数据通过中断函数发送出去该函数已封装好,只需填写要发送的数组名,数组长度,发送方式,即可发送-----------------------------------------------------------------------------------*/RS232_EXT void RS232_TXData( uint8_t TXData[],uint8_t TXData_LEN,uint8_t Type){RS232PutStr(TXData,TXData_LEN,Type);}/*-----------------------------------------------------------------------------------接收数据函数,将接受缓冲区的数据写入到指定数组中。

MC9S12XS(DG)单片机--110108

MC9S12XS(DG)单片机--110108
② 软件条件 --------- 利用 CodeWarrior for 9S12 软件进行软件开发。
CodeWarrior开发平台上可用汇编,也可用C语言编程。
CodeWarrior的使用
六、9S12XS/DG 的开发样例
1. 9S12XS/DG 的工程组织与通用I/O口的控制 2. PWM 输出编程 3.模拟信号采集 4定时器的功能与使用 5. 9S12XS/DG 的存储器控制 6. SCI/SPI串行数据通信 8.
;定义五个字的存储区,首址为X2
若要对X2的第三字赋值,可用如下语句:
STX X2+2
②数字常数/字符串常数定义伪指令:
格式: [<label>:] DC [.<size>] <expression> [ ,<expression>]…
功能:在Flash区定义一个size×n 个字节的存储区。
例: C1: DC .B $25
Freescale
车模用单片机原理与使用
讲座
车模电路组成
显示电路
路径检测 速度检测 电源电路
MCU
数据输入 电路
舵机控制
电机 速度控制
内容
一、飞思卡尔车模用单片机性能 二、9S12XS/DG 的硬件资源 三、9S12XS/DG 的硬件系统 四、9S12XS/DG的指令系统 五、 9S12XS/DG 的开发平台 六、9S12XS/DG 的开发样例
;定义一字节常数,即C1= $25
C2: DC .W $2538 ;定义一字常数,即C2= $2538
③常数赋值伪指令: 格式: <label>: EQU <expression> <label>: SET <expression> 功能:定义<label> 等于的值<expression>的值。 注意: <expression> 要有确定的值。 例: PI: EQU 3

飞思卡尔单片机mc9s12dg128的pwm参考程序

飞思卡尔单片机mc9s12dg128的pwm参考程序

飞思卡尔单片机mc9s12dg128的pwm参考程序demon*********************************************************pwme=0x22;//通道01,45使能pwmpol=0x22;//通道01和45输出波形的起始极性为1pwmctl=0x50//通道01,45级联pwmclk=0x02;//通道01选择sa为时钟源pwmsla=0x04;//通道01时钟SA为3MHz(24/(2*4))pwmper01=60000//设置通道01的输出频率(50Hz)pwmper45=12000//设置通道45的输出频率(2KHz)}/***********************************************************pwm输出函数bydemon2021-5-12*程序描述;从输入参数到转向机和电机输出相应的PWM*参数:转向机方向:3300-5700转速:0-12000*********************************************************/voidpwm(intspeed,int direction)//pwm{pwm_uu初始();if(direction<3300)direction=3300;if(direction>5700)direction=5700;pwmdty01=dir ection;如果(速度>12000)速度=12000;pwmdty45=速度;}飞思卡尔单片机mc9s12dg128的io口初始化参检查程序demonportb=porta;}enableinterrupts;对于(;;){}/*永远等待*//*pleasemakesurethatyouneverleavethisfunction*/}飞思卡尔MCU MC9S12DG128 ad初始化参考程序voidad(void){wordt0=0;wordt1=0;wordt2=0;wordt3=0;wordt4=0;wordt5=0;wordt6=0;wordt7=0;while(atd0stat0_scf){t0=atd0dr0;ad00=(byte)(t0>>8);//高8位移到低8位且高8位为0t1=atd0dr1;ad01=(byte)(t1>>8);t2=atd0dr2;ad02=(byte)(t2>>8);t3=atd0dr3;ad03=(byte)(t3>>8);t4=atd0dr4;ad04=(byte)(t4>>8);t5=atd0dr5;ad05=(byte)(t5>>8);t6=atd0dr6;ad06=(byte)(t6>>8);t7=atd0dr7;ad07=(byte)(t7>>8);}。

飞思卡尔MC9S12C中文介绍以及简单编程编程

飞思卡尔MC9S12C中文介绍以及简单编程编程

C64 64K / 64k* 4K - 16MHz (25MHz option) 1 1 - 3-5V 31 - 60 1 8-ch 10-bit 48 / 52 / 80 C32 32K / 32K* 2K - 16MHz (25MHz option) 1 1 - 3-5V 31 - 60 1 8-ch 10-bit 48 / 52 / 80 GC32 32K 2K - 16MHz (25MHz option) 1 1 - 3-5V 31 - 60 0 8-ch 10-bit 48 / 52 / 80 GC16 16K 2K - 16MHz (25MHz option) 1 1 - 3-5V 31 - 60 0 8-ch 10-bit 48 / 52 / 80 TM Freescale Semiconductor Confidential and Proprietary Information. Freescale™ and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective owners. © Freescale Semiconductor, Inc. 2005. Slide 5 S12 C-系列更新… –市场表现出色,给人崭新印象的入门级 C-系列… –16 位的性能 8 位的价格 –弥补 S12 在$2.00 以下的缺憾 –3-5V 工作电压 – 封装从小型的 48 QFP (7x7mm) 到标准的 80 QFP (与 S12D & B 兼容) – 9S12C64/96/128 已经通过质量测试 –*ROM 系列 (所有 CAN 版本) 将使 S12 入门级更低 – ROM Production targeted for 3Q05 (all versions). Exact schedule TBD. – 不带 CAN 的 9S12GC16/32/64/128 量产,价格更低!与 C32/64/96 管脚兼容 应用范围: 车身控制,ABS,EPS,座椅控制,空调 TM Freescale Semiconductor Confidential and Proprietary Information. Freescale™ and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective owners. © Freescale Semiconductor, Inc. 2005. Slide 6 MC9S12Q 系列 Part No Flash ROM RAM CAN SCI SPI TIMER ADC PWM Package S12Q128 128k - 4k 1 1 1 6ch 16 bit 8ch 10bit 4 Ch 80, 52, 48 QFP S12Q96 96k - 3k 1 1 1 6ch 16 bit 8ch 10bit 4 Ch 80, 52, 48 QFP S12Q64 64k - 2k 1 1 1 6ch 16 bit 8ch 10bit - 52, 48 QFP S12Q32 32k - 1k 1 1 1 6ch 16 bit 8ch 10bit - 52, 48 QFP S12Q128 - 128k 4k 1 1 1 6ch 16 bit 8ch 10bit 4 Ch 80, 52, 48 QFP S12Q96 - 96k 3k 1 1 1 6ch 16 bit 8ch 10bit 4 Ch 80, 52, 48 QFP S12Q64 - 64k 2k 1 1 1 6ch 16 bit 8ch 10bit - 52, 48 QFP S12Q32 - 32k 1k 1 1 1 6ch 16 bit 8ch 10bit - 52, 48 QFP Q Family Q Family MCU’s MCU’s 特点/优点: •低成本 •基于 S12C-系列 •增强型 msCAN 12 •增强型 SCI 用于 LIN • SPI • 8 or 16 MHz Up to 4K RAM Up to 4K RAM Up to 128K Up to 128K FLASH/ROM FLASH/ROM

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电机测试程序

/*****************************************************************************/ //功能说明: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 */ }。

freescale 单片机MC9S12G128应用程序(PWM,Timer,ADC……)

freescale 单片机MC9S12G128应用程序(PWM,Timer,ADC……)

PWM应用程序/*程序实现功能:PP1口输出PWM方波程序说明:通过改变duty和period ,从而控制PWM周期和占空比duty cycle=duty/periodPWM frequency=1M/(2*period)(Fbus=24M,scla=24)*/#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */void SetBusClock_24MHZ(void);void PWMDisable(byte channel);void PWMEnable(byte channel);void PWMSinglePortSetting(byte channel ,byte period ,byte duty) ;void PWMsinglePortInitial(byte channel, byte clkab,byte clock, byte polarity,byte align) ; void Service_WD(void);void PWMGeneralInitial(byte prclk,byte scla,byte sclb,byte ctl);void PWMConcatenateSetting(byte channel,word period,word duty);void main(void){/* put your own code here *///总线时钟频率设置:24MSetBusClock_24MHZ();//对预分频时钟,分频时钟A,分频时钟B和控制寄存器的配置//0分频01级联PWMGeneralInitial(0,24,0,0x10);//PWM端口寄存器的配置// 1通道SA时钟起始高电平左对齐PWMsinglePortInitial(1,0,1,1,0);//PWM级联输出配置//50HZ 占空比12.5%PWMConcatenateSetting(1,10000,250);//EnableInterrupts;for(;;) {_FEED_COP(); /* feeds the dog */} /* loop forever *//* please make sure that you never leave main */}//*********************************************//函数名:PWMEnable//函数功能:PWM单个端口使能//函数参数:一个byte 类型channel 代表PWM通道号// 返回值:无//********************************************void PWMEnable(byte channel){if(channel>7) channel=7;PWME|=(1<<channel); //选择使能位}//**********************************************//函数名称:PWMDisable//函数功能:PWM单个端口禁止//函数参数:一个byte类型channel 代表PWM通道号//返回值:无//***********************************************void PWMDisable(byte channel){if(channel>7) channel=7;PWME&=~(1<<channel); //选择禁止位}//函数功能:启动看门狗void Service_WD(void){CPMUARMCOP=0x55;CPMUARMCOP=0xAA;}//函数功能:总线时钟设置void SetBusClock_24MHZ(void){CPMUOSC_OSCE=1; //enable osc/*时钟倍频:24MHz BusClock48MHz VCO48MHz PLL*/CPMUSYNR=0x00|0x05; //VCOFRQ[1:0],SYNDIV[5:0]CPMUREFDIV=0x20|0x03;//REFFRQ[1:0],REFDIV[3:0]CPMUPOSTDIV=0x00; //POSTDIV=0;while(!CPMUFLG_LOCK)//等待VCO稳定Service_WD(); //看门狗CPMUCLKS_PLLSEL=1;}//*********************************************//函数名称:PWMSinglePortSetting//函数功能:实现PWM周期寄存器和占空比寄存器通道的单独输出//函数参数:3个byte类型//参数1:channel代表了当前配置的PWM通道//参数2:period 周期配置参数/*Left aligned output (CAEx = 0) PWMx Period = Channel Clock Period * PWMPERxCenter Aligned Output (CAEx = 1) PWMx Period = Channel Clock Period * (2 * PWMPERx)*///参数3:duty 占空比配置参数/*Polarity = 0 (PPOL x =0) Duty Cycle = [(PWMPERx-PWMDTYx)/PWMPERx] * 100%Polarity = 1 (PPOLx = 1) Duty Cycle = [PWMDTYx / PWMPERx] * 100%*///返回值:无//**********************************************void PWMSinglePortSetting(byte channel ,byte period ,byte duty){if(channel>7) channel=7;PWMDisable(channel); //禁止该通道switch(channel){case 0:PWMPER0=period; //设置周期寄存器PWMDTY0=duty; //设置占空比寄存器break;case 1:PWMPER1=period; //设置周期寄存器PWMDTY1=duty; //设置占空比寄存器case 2:PWMPER2=period; //设置周期寄存器PWMDTY2=duty; //设置占空比寄存器break;case 3:PWMPER3=period; //设置周期寄存器PWMDTY3=duty; //设置占空比寄存器break;case 4:PWMPER4=period; //设置周期寄存器PWMDTY4=duty; //设置占空比寄存器break;case 5:PWMPER5=period; //设置周期寄存器PWMDTY5=duty; //设置占空比寄存器break;case 6:PWMPER6=period; //设置周期寄存器PWMDTY6=duty; //设置占空比寄存器break;case 7:PWMPER7=period; //设置周期寄存器PWMDTY7=duty; //设置占空比寄存器break;default:break;}PWMEnable(channel);}//*********************************************//函数名:PWMSinglePortInitial//函数功能:PWM端口寄存器的配置//函数参数:5个byte类型//参数1:channel 代表了当前配置的PWM通道//参数2:clkab 参数2,3决定了时钟源的选择//参数3: clock/*PWM Channel 0,1,4,5PCLKAB[0,1,4,5] PCLK[0,1,4,5] Clock Source Selection0 0 Clock A0 1 Clock SA1 0 Clock B1 1 Clock SBPWM Channel 2,3,6,7PCLKAB[2,3,6,7] PCLK[2,3,6,7] Clock Source Selection0 0 Clock B0 1 Clock SB1 0 Clock A1 1 Clock SA*///参数4:polarity PWM极性选择// 0 开始为低电平,周期计数开始为高电平// 1 开始为高电平,周期计数开始为低电平//参数5:align PWM对齐方式选择// 0 输出左对齐// 1 输出中心对齐//返回值:无//**********************************************void PWMsinglePortInitial(byte channel, byte clkab,byte clock, byte polarity,byte align) {if(channel>7) channel=7;//禁止该通道PWMDisable(channel);// PWM 时钟A/B 选择if(clkab==0) PWMCLKAB&=~(1<<channel);else PWMCLKAB|=(1<<channel);// PWM 时钟选择寄存器设置if(clock==0) PWMCLK&=~(1<<channel);else PWMCLK|=(1<<channel);//PWM 极性选择设置if(polarity==0) PWMPOL&=~(1<<channel) ;else PWMPOL|=(1<<channel);//PWM 对齐方式设置if(align==0) PWMCAE&=~(1<<channel);else PWMCAE|=(1<<channel);}//**********************************************************//函数名:PWMGeneralInitial//函数功能:对预分频时钟,分频时钟A,分频时钟B和控制寄存器的配置//函数参数:4个byte类型//参数1 prclk/*Clock A or Clock B Prescaler SelectsPCKA/B2 PCKA/B1 PCKA/B0 Value of Clock A/B0 0 0 Bus clock0 0 1 Bus clock / 20 1 0 Bus clock / 40 1 1 Bus clock / 81 0 0 Bus clock / 161 0 1 Bus clock / 321 1 0 Bus clock / 641 1 1 Bus clock / 128*///参数2:scla// Clock SA = Clock A / (2 * PWMSCLA)//参数3:sclb// Clock SB = Clock B / (2 * PWMSCLB)//参数4:ctl/*control[CON67,CON45,CON23,CON01,PSWAI,PFRZ]PWM级联控制寄存器CON67,CON45,CON23,CON010 单独一个通道1 两个通道级联PSWAI 0 等待模式禁止时钟输入1 等待模式允许时钟输入PFRZ 0 冻结模式允许PWM时钟输入1 冻结模式禁止PWM时钟输入//返回值:无*///**************************************************************void PWMGeneralInitial(byte prclk,byte scla,byte sclb,byte ctl){//禁止所有的PWM通道PWME=0x00;//设置预分频参数PWMPRCLK=prclk;//设置A分频参数PWMSCLA=scla;//设置B分频参数PWMSCLB=sclb;//级联配置PWMCTL=ctl;}//***********************************************************//函数名称:PWMConcatenateSetting//函数功能:PWM级联输出配置//函数参数:1个byte类型,2个word类型//参数1:channel代表了当前配置的PWM通道//参数2:period 周期配置参数/*Left aligned output (CAEx = 0) PWMx Period = Channel Clock Period * PWMPERxCenter Aligned Output (CAEx = 1) PWMx Period = Channel Clock Period * (2 * PWMPERx)*///参数3:duty 占空比配置参数/*Polarity = 0 (PPOL x =0) Duty Cycle = [(PWMPERx-PWMDTYx)/PWMPERx] * 100%Polarity = 1 (PPOLx = 1) Duty Cycle = [PWMDTYx / PWMPERx] * 100%*///返回值:无//**************************************************************void PWMConcatenateSetting(byte channel,word period,word duty){if(channel>7) channel=7;switch(channel){case 0:case 1:PWMDisable(0); //禁止通道0PWMDisable(1); //禁止通道1PWMPER01=period; //设置周期寄存器PWMDTY01=duty; //设置占空比寄存器PWMEnable(0); //使能通道0;PWMEnable(1); //使能通道1;break;case 2:case 3:PWMDisable(2); //禁止通道2PWMDisable(3); //禁止通道3PWMPER23=period; //设置周期寄存器PWMDTY23=duty; //设置占空比寄存器PWMEnable(2); //使能通道2;PWMEnable(3); //使能通道3;break;case 4:case 5:PWMDisable(4); //禁止通道4PWMDisable(5); //禁止通道5PWMPER45=period; //设置周期寄存器PWMDTY45=duty; //设置占空比寄存器PWMEnable(4); //使能通道4;PWMEnable(5); //使能通道5;break;case 6:case 7:PWMDisable(6); //禁止通道6PWMDisable(7); //禁止通道7PWMPER67=period; //设置周期寄存器PWMDTY67=duty; //设置占空比寄存器PWMEnable(6); //使能通道6;PWMEnable(7); //使能通道7;break;default:break;}}定时器应用程序#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */// 函数声明void OutputCompare_Init(void);;void Service_WD(void);void SetBusClock_24MHz(void);// 全局变量uint Timer7_Cnt=0;void main(void) {/* put your own code here */SetBusClock_24MHz();OutputCompare_Init();EnableInterrupts;for(;;) {_FEED_COP(); /* feeds the dog */} /* loop forever *//* please make sure that you never leave main */}void OutputCompare_Init(void){TSCR1_TEN = 0; /* Disable Timer module before adjusting registers. */ TIOS_IOS7 = 1; /* Set Channel 0 as output compare. */ TCTL1_OM7 = 0; /* Set channel 0 to toggle when a Timer match occurs. */ TCTL1_OL7 = 1; /* Set channel 0 to toggle when a Timer match occurs. */ TC7 = 0x4926; /* Set a value for channel 0 timer compare. */ TIE_C7I = 1; /* Enable channel 0 interrupt, handled by function TIM0ISR. */TSCR1_TSWAI = 1; /* Disables the timer module while in wait mode. */ TSCR1_TSFRZ = 1; /* Disables the timer counter while in freeze mode. */TSCR2_PR = 0x7; /* Set prescaler to divide by 128 */ TSCR2_TCRE = 1;TSCR1_TEN = 1; /* Timer Enable. *///中断周期:0x4926*128/24MHz = 100ms}#pragma CODE_SEG __NEAR_SEG NON_BANKEDvoid interrupt VectorNumber_Vtimch7 TIM7_ISR(void){Timer7_Cnt++;TFLG1 = TFLG1_C7F_MASK; /* Clear channel 0 flag. */}#pragma CODE_SEG DEFAULT// 看门狗void Service_WD(void){CPMUARMCOP = 0x55;CPMUARMCOP = 0xAA;}void SetBusClock_24MHz(void){CPMUOSC_OSCE = 1; /* enable ext osc *//*Initialise the system clock from a 16 MHz Crystal,24 MHz Bus CLK (48 MHz VCO, 48 MHz PLL)*/CPMUSYNR = 0x00 | 0x05; /* VCOFRQ[7:6], SYNDIV[5:0] */ CPMUREFDIV = 0x20 | 0x03; /* REFFRQ[7:6], REFDIV[3:0] */ CPMUPOSTDIV = 0x00; /* POSTDIV = 0 FPLL = FVCO */ while(!CPMUFLG_LOCK); /* wait for VCO to stabilize*/ Service_WD();CPMUCLKS_PLLSEL = 1; /* Switch clk to use PLL */}SCI应用程序#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */// 函数声明void SCI0_Init(void);void SCI0_BR(unsigned long br);void SCI0_SendByte(char ch);void Service_WD(void);void SetBusClock_24MHz(void);// 全局变量char SCI_Flag = 0;char SCI_Rev = 0;void main(void) {/* put your own code here */SetBusClock_24MHz();SCI0_BR(38400);SCI0_Init();EnableInterrupts;SCI0_SendByte(0x01);SCI0_SendByte(0x02);SCI0_SendByte(0x03);for(;;) {_FEED_COP(); /* feeds the dog */if(SCI_Flag==1) {SCI_Flag = 0;SCI0_SendByte(SCI_Rev);}} /* loop forever *//* please make sure that you never leave main */}void Service_WD(void){CPMUARMCOP = 0x55;CPMUARMCOP = 0xAA;}void SetBusClock_24MHz(void){CPMUOSC_OSCE = 1; /* enable ext osc *//*Initialise the system clock from a 16 MHz Crystal,24 MHz Bus CLK (48 MHz VCO, 48 MHz PLL)*/CPMUSYNR = 0x00 | 0x05; /* VCOFRQ[7:6], SYNDIV[5:0] */ CPMUREFDIV = 0x20 | 0x03; /* REFFRQ[7:6], REFDIV[3:0] */ CPMUPOSTDIV = 0x00; /* POSTDIV = 0 FPLL = FVCO */ while(!CPMUFLG_LOCK); /* wait for VCO to stabilize*/Service_WD();CPMUCLKS_PLLSEL = 1; /* Switch clk to use PLL */}//串口初始化void SCI0_Init(void){SCI0CR1 = 0x00; /* 8 Data Bits, 1 Start Bit, 1 Stop Bit, No Parity */SCI0CR2 = 0x2C; /* 使能接收中断;使能Tx,Rx *//* SCIASR1, SCIACR1, SCIACR2, SCISR1, SCISR2, SCIDRH & SCIDRL left at default values */ }//串口波特率设置void SCI0_BR(unsigned long br){uint brPrescaler;brPrescaler = (uint)(24000000 / (16 * br));/* Set the Baud Rate */SCI0BDH = (uchar)((brPrescaler>>8));SCI0BDL = (uchar)(brPrescaler);}//串口发送字节void SCI0_SendByte(char ch){/* check SCI transmit data register is empty */while(SCI0SR1_TDRE == 0);SCI0DRL = ch;}//串口中断#pragma CODE_SEG __NEAR_SEG NON_BANKEDvoid interrupt VectorNumber_Vsci0 SCI0_ISR(void){SCI0CR2_RIE=0;while(SCI0SR1_RDRF == 0);SCI_Rev = SCI0DRL;SCI_Flag = 1;SCI0CR2_RIE = 1;}#pragma CODE_SEG DEFAULTADC应用程序#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */// 函数声明void ADC_Init(void);uint ADC_GetValue(byte ch);void Service_WD(void);void SetBusClock_24MHz(void);void Delay(void);// 全局变量uint AD_Result;uint AD_Result2;void main(void) {/* put your own code here */SetBusClock_24MHz();ADC_Init();EnableInterrupts;for(;;) {_FEED_COP(); /* feeds the dog */AD_Result = ADC_GetValue(7);AD_Result2 = ADC_GetValue(0);} /* loop forever *//* please make sure that you never leave main */// AD初始化void ADC_Init(void){ATDCTL1 = 0x3F; /* 10-Bit resolution ,discharge before sampling. */ATDCTL3 = 0x88; /* Right Justified Data, Single conversion sequence */ATDCTL4 = 0xE1; /* 6 MHz, Notice: 12MHz Max ATD Clock, Fatdlk = FBUS/(2*(PRS+1)) *//* 26 ATD Clock cycles sample time */}// ADC通道采集uint ADC_GetValue(byte ch){ATDCTL5 = 0x0F & ch; /* Start Continuous Conversions on ch */while (!ATDSTAT0_SCF); /* wait for conversion sequence to complete */return ATDDR0;}// 看门狗void Service_WD(void){CPMUARMCOP = 0x55;CPMUARMCOP = 0xAA;}void SetBusClock_24MHz(void){CPMUOSC_OSCE = 1; /* enable ext osc *//*Initialise the system clock from a 16 MHz Crystal,24 MHz Bus CLK (48 MHz VCO, 48 MHz PLL)*/CPMUSYNR = 0x00 | 0x05; /* VCOFRQ[7:6], SYNDIV[5:0] */CPMUREFDIV = 0x20 | 0x03; /* REFFRQ[7:6], REFDIV[3:0] */CPMUPOSTDIV = 0x00; /* POSTDIV = 0 FPLL = FVCO */while(!CPMUFLG_LOCK); /* wait for VCO to stabilize*/ Service_WD();CPMUCLKS_PLLSEL = 1; /* Switch clk to use PLL */ }void Delay(void){uint dummy_ctr;for(dummy_ctr=0; dummy_ctr<0x007f;dummy_ctr++){;}}。

单片机课程设计报告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调试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;}}}。

MC9S12DG128实验系统使用手册

MC9S12DG128实验系统使用手册

MC9S12DG128实验系统使用手册目录第一章系统概述 (2)第二章硬件电路原理 (4)2.1子板硬件原理 (4)2.1.1、MCU引脚接口部分 (5)2.1.2、串口通信部分 (5)2.1.3、电源部分 (6)2.1.4、复位电路部分 (6)2.1.5、I/O端口电路部分 (7)2.1.6、晶振电路与BDM插头部分 (7)2.2母板硬件原理 (8)2.2.1、电源部分 (8)2.2.2、MC9S12DG128开发板与各接口部分 (9)2.2.3、串口通信部分 (11)2.2.4、LED数码管显示部分 (12)2.2.5、8位数字量输入输出部分 (13)2.2.6、红外发射接收部分 (14)2.2.7、LCD显示部分 (15)2.2.8、模拟量输入部分 (15)2.2.9、蜂鸣器和喇叭部分 (15)2.2.10、键盘输入部分 (16)2.2.11、继电器部分 (16)2.2.12、打印机部分 (17)2.2.13、CAN总线部分 (17)第三章 MC9S12DG128教学平台快速入门 (18)3.1硬件连接 (18)3.2软件应用 (20)第一章系统概述天津工业大学Freescale MCU/DSP研发中心开发的DG128实验系统,其功能基本上和美国MCUSLK系统相同,而且根据中国的教学情况重新设计了一些功能、力求达到更好的实验效果。

DG128实验系统由主板和独立的MCU子板构成。

DG128实验系统的主板插槽和美国的MCUSLK 系统相互兼容,主板的插槽可以插包括S12、S08、 HC08各系列MCU子板。

MCU子板可以单独调试运行,也可以插在主板上调试,充分利用主板丰富的硬件资源。

MC9S12DG128具有16位中央处理器(HCS12 CPU)、128KB Flash EEPROM、8KB RAM、2KB EEPROM,以及定时器通道、键盘中断和A/D通道等接口。

MC9S12DG128实验系统可以直接与CodeWarrior相连,具有下载程序、在线单步运行、断点调试、连续运行、修改寄存器和存储单元等特点,可以很方便的进行教学。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void init() {
DDRB=0xff;
PORTB=0xff;
DDRA=0xff; //将A,B口都定义为输出模式
k=0;
kk=0x01;
}
/***************延时程序****************/
void delay() {
unsigned int i;
for(i=0;i<500;i++);
定时器模块
1
定时器延时,中断点亮led灯
#include <hidef.h> /* common defines and macros */
#include <mc9s12db128.h> /* derivative information */
//void interrupt 8 aabreak(void); //此行可以注释掉*******
PWMPER0=0xfe; //选择周期
PWMDTY0=0xfe; //占空比
PWME=0x01; //启动通道0的pwm输出
}
void fun() {
if(PORTA_BIT5==1)
{
PORTB=0x00; //如果此时pwm输出高电平,则点亮led灯
} else {
PORTB=0xff; //如果此时pwm输出低电平,则熄灭led灯
void interrupt 20 funck() {
unsigned char k;
k=read();
PORTB=~k;
}
SPI
不会,以后补充。
LED
#include <hidef.h> /* common defines and macros */
#include <mc9s12db128.h> /* derivative information */
}
/****************显示程序***************/
void show() {
PORTB=num[k]; //输出段码
PORTA=kk; //输出位选
delay(); //延时显示
k++; //游标右移
if(k==4) { //看是否到了最后一位
k=0; //如果是的话重头开始
PWMPRCLK=0x77; //CLOCKA,CLOCKB分频
PWMCLK=0xff; //都选择CLOCKSA和CLOCKSB作为时钟源
PWMSCLA=0xff;
PWMSCLB=0xff; //再次分频、
PWMPOL=0xff; //设置pwm周期开始为高电平
PWMCAE=0x00; //选择左对齐方式
#pragma LINK_INFO DERIVATIVE "mc9s12db128b"
void init() {
DDRB=0xff; //定义B口为输出状态
PORTB=0x00; //led灯全部为暗
DDRA=0x00; //定义A口为接受状态
PWME=0x00; //首先禁止pwm输出
PWMCTL=0x00; //PWM不级联
TIE=0x01; //定时器0的中断使能
TIOS=0x01; //将定时器设置为输出比较状态
TCTL2=0x00; //定时器与引脚断开
TFLG1=0x01; //清中断标志位
TC0=0x00f0; //给定时器赋值
for(;;);
}
#pragma CODE_SEG NON_BANKED
void interrupt 8 aabreak(void)//中断号要正确,是中断8(从0通道开始算起的)
DDRB=0xff; //B口用于输出脉冲值
PORTB=0xff; //led灯全暗
TIOS=0x00; //设置定时器通道0为输入捕捉
TSCR1=0x80; //定时器使能
TSCR2=0x01; //设置自由计数器2分频,且禁止定时器溢出中断
TCTL4=0x02; //捕捉器仅下降沿捕捉
TIE=0x01; //允许定时器通道0的中断
unsigned int flag=0;
void main(void) {
EnableInterrupts;
TFLG1=0x01; //清中断标志位
DDRB=0xff;
PORTB=0xff; //将B口定义为输出,首先输出全0
TSCR1=0x80; //定时器使能,正常工作
TSCR2=0x01; //将定时器进行128分频最高位不要开********
}
/********主函数*********/
void main(void) {
init();
for(;;)
{
pulse();
}
}
/*******中断子函数******/
#pragma CODE_SEG NON_BANKED
void interrupt 8 count() {
TFLG1=0x01; //中断标志位清0
#pragma LINK_INFO DERIVATIVE "mc9s12db128b"
unsigned char num[4]={0xC0,0xF9,0xF8,0xF9}; //四位显示数字:0171
unsigned char k,kk;
/***************初始化函数**************/
void write(unsigned char n) {
SCI0SR1_TDRE=1; //数据传输到输出寄存器
SCI0DRL=n;
while(SCI0SR1_TC==0); //等待发送完毕
}
/**************读数据***********/
unsigned char read()
{
if(SCI0SR1_RDRF==1) { //如果数据有效,那么将读到的数据返回
/*********串口初始化*********/
void init() {
DDRB=0xff;
PORTB=0xff; //开始led灯暗,即数据尚未接收
SCI0BD=52; //初始化波特率为9600
SCI0CR1=0x00; //八位无奇偶校验模式
SCI0CR2=0x2c; //接收中断允许
}
/**************写数据***********/
TFLG1=0x01; //清除中断标志位
}
/*********用于产生脉冲*******/
void pulse() {
unsigned int i,j;
PORTA=0xff; //将A口输出高电平
for(i=0;i<10000;i++)
for(j=0;j<100;j++) ; //延时
PORTA=0x00; //使A口输出低电平
kk=0x01;
}else {
kk=kk<<1; //否则位选左移
}
}
/****************主程序******************/
void main(void)
{
init();
for(;;)
{
show();
}
}
{
TFLG1=0x01; //清中断标志位
if(flag==0) {
PORTB=0xaa;
flag=1;
} else{
PORTB=0x55;
flag=0;
}
TC0=0x00f0; //给定时器赋值
}
2
PORTA输出脉冲,有定时器通道0对脉冲进行计数,结果从PORTB输出。
#include <hidef.h> /* common defines and macros */
#include <mc9s12db128.h> /* derivative information */
unsigned int number=0; //脉冲计数初值为0
/***********初始化**********/
void init(){
EnableInterrupts;
DDRA=0xff; //将A口定义为输出,用于输出脉冲
return(SCI0DRL);
}
}
/*************主函数*************/
void main(void) {
EnableInterrupts;
init();
write(pp);
for(;;); //等待中断
}
/*************中断子程序************/
#pragma CODE_SEG NON_BANKED
}
}
void main(void) {
DDRB=0xff;
PORTB=0x00;
for(;;)
{
fun();
}
}
SCI
#include <hidef.h>
#include <mc9s12db128.h>
#pragma LINK_INFO DERIVATIVE "mc9s12db128b"
unsigned char pp=0xf0; //欲发送的数字
number++; //计数值加1
PORTB=~(number); //B口输出计数值
}
模数转换模块
(硬t;hidef.h> /* common defines and macros */
#include <mc9s12db128.h> /* derivative information */
相关文档
最新文档