飞思卡尔单片机各种功能程序.docx

上传人:b****5 文档编号:3409498 上传时间:2022-11-22 格式:DOCX 页数:15 大小:18.95KB
下载 相关 举报
飞思卡尔单片机各种功能程序.docx_第1页
第1页 / 共15页
飞思卡尔单片机各种功能程序.docx_第2页
第2页 / 共15页
飞思卡尔单片机各种功能程序.docx_第3页
第3页 / 共15页
飞思卡尔单片机各种功能程序.docx_第4页
第4页 / 共15页
飞思卡尔单片机各种功能程序.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

飞思卡尔单片机各种功能程序.docx

《飞思卡尔单片机各种功能程序.docx》由会员分享,可在线阅读,更多相关《飞思卡尔单片机各种功能程序.docx(15页珍藏版)》请在冰豆网上搜索。

飞思卡尔单片机各种功能程序.docx

飞思卡尔单片机各种功能程序

流水灯四种效果:

#include/*commondefinesandmacros*/

#include

#include/*derivativeinformation*/

#pragmaLINK_INFODERIVATIVE"mc9s12xdp512"

#include"main_asm.h"/*interfacetotheassemblymodule*/

unsignedchartemp;

//unsignedcharpa@0x200;

//unsignedcharpb@0x202;

unsignedcharkey;

staticvoiddelay(void){

volatileunsignedlongi;

for(i=0;i<100000;i++);

}

staticunsignedcharrandom;

staticvoidRandom(void){

random=(unsignedchar)rand();

}

voideffect1(){

unsignedcharc;

for(c=0;c<=6;c++){

delay();

PORTB=~(1<

}

for(c=7;c>=1;c--){

delay();

PORTB=~(1<

}

}

voideffect2(){

unsignedcharc;

for(c=0;c<=6;c++){

delay();

PORTB=~(3<

}

for(c=7;c>=1;c--){

delay();

PORTB=~(3<

}

}

voideffect3(){

unsignedcharc,t=0xfe;

for(c=0;c<=7;c++){

PORTB=t;

delay();

t<<=1;

}

}

voideffect4(){

unsignedcharc,t=0;

for(c=0;c<=7;c++){

PORTB=t;

delay();

t=(t<<1)+1;;

}

}

voidmain(void){

unsignedcharx;

DDRA=0xf0;

DDRB=0xff;

for(;;){

x=PORTA&0x03;

switch(x){

case0:

effect1();break;

case1:

effect2();break;

case2:

effect3();break;

case3:

effect4();break;

}

}/*waitforever*/

/*pleasemakesurethatyouneverleavethisfunction*/

}

//行列反转法

unsignedcharkey_scan()//键盘扫描函数

{unsignedcharx,row=4,col=4,key=16;

PUCR|=0x01;//等同于PUCR=PUCR|0x01,PUCR寄存器的第0位设置为1,即允许PORTA端口的上拉电阻。

PUCR寄存器的解释参见书本P113

DDRA=0x0f;//行线PA0-PA3设置为输出,列线PA4-PA7设置为输入DDRA寄存器知识参见书本P113数据方向寄存器

PORTA=0xf0;//0bxxxx0000,四条行线PA0-PA3输出四个0,相当于四条行线接地

x=PORTA&0xf0;//读取四条列线的值,并保留高4位,清除低4位的值

if(x!

=0xf0)//如果四条列线不全为1,则说明有按键按下

{

switch(x)

{

case0xe0:

col=1;break;//按键在第1列

case0xd0:

col=2;break;//按键在第2列

case0xb0:

col=3;break;//按键在第3列

case0x70:

col=4;break;//按键在第4列

}

//以下开始行列反转,输入变输出,输出变输入。

即行线PA0-PA3设为输入,列线PA4-PA7设为输出

DDRB=0xf0;//行线PA0-PA3设为输入,列线PA4-PA7设为输出

PORTA=0x0f;//0b0000xxxx,四条列线PA4-PA7输出四个0,相当于四条列线接地

x=PORTA&0x0f//读取四条行线的值,并保留低4位,清除高4位的值

if(x!

=0x0f)//如果四条行线不全为1,则说明有按键按下

{switch(x)

{

case0x0e:

row=1;break;//按键在第1行

case0x0d:

row=2;break;//按键在第2行

case0x0b:

row=3;break;//按键在第3行

case0x07:

row=4;break;//按键在第4行

}

key=(row-1)*4+col-1;//求出键号:

0-15的整数

}

}

returnkey;//如果没有按键按下,则函数返回的key=16;

}

main()

{unsignedcharkeyno;

while

(1)

{

keyno=key_scan();//调用键盘扫描函数获取是否有按键按下,是哪个按键按下

if(keyno<16)//keyno<16有按键按下,keyno=16则表明无按键按下

switch(keyno)

{case0:

//每一个按键按下后要实现什么功能,程序写在这。

case1:

case2:

case3:

case4:

case5:

case6:

case7:

case8:

case9:

case10:

case11:

case12:

case13:

case14:

case15:

}

}

}

//行扫描法1

unsignedcharkey_scan()

{unsignedcharx,i,temp,row=4,col=4,key=16;

//PUCR|=0x01;//等同于PUCR=PUCR|0x01,PUCR寄存器的第0位设置为1,即允许PORTA端口的上拉电阻。

PUCR寄存器的解释参见书本P113

DDRA=0x0f;//行线PA0-PA3设置为输出,列线PA4-PA7设置为输入DDRA寄存器知识参见书本P113数据方向寄存器

PORTA=0xf0;//0bxxxx0000,四条行线PA0-PA3输出四个0,相当于四条行线接地

x=PORTA&0xf0;//读取四条列线的值,并保留高4位,清除低4位的值

if(x!

=0xf0)//如果四条列线不全为1,则说明有按键按下

{

switch(x)

{

case0xe0:

col=1;break;//按键在第1列

case0xd0:

col=2;break;//按键在第2列

case0xb0:

col=3;break;//按键在第3列

case0x70:

col=4;break;//按键在第4列

}

//以下开始从第1行到第4行逐行判断按键是否在该行

temp=0b11111110;

for(i=1;i<=4;i++)//i代表正在判断按下的按键是否是在第i行

{

PORTA=temp;//第i行所在的行线输出0,其他三条行线输出1

x=PORTA&0xf0;//读取四条列线的值,并保留高4位,清除低4位的值

if(x!

=0xf0)//如果四条列线不全为1,则说明按键就在第i行,否则表明按键不在该行,则准备扫描下一行

{row=i;

key=(row-1)*4+col-1;//求出按键

returnkey;//退出key_scan函数

}

temp=(temp<<1)+1;//按键不在该行,则改变temp的值,为扫描下一行做准备。

}

}

returnkey;//如果没有按键按下,程序才回执行到这,此时key为初值16;

}

main()

{unsignedcharkeyno;

while

(1)

{

keyno=key_scan();//调用键盘扫描函数获取是否有按键按下,是哪个按键按下

if(keyno<16)//keyno<16有按键按下,keyno=16则表明无按键按下

switch(keyno)

{case0:

//每一个按键按下后要实现什么功能,程序写在这。

case1:

case2:

case3:

case4:

case5:

case6:

case7:

case8:

case9:

case10:

case11:

case12:

case13:

case14:

case15:

}

}

}

PWM模块:

voidPWM_Init(void)

{

PWME=0x00;//禁止PWM模块

PWMPRCLK=0x06;//CLOCKA的预分频设置为6,分频系数64

PWMSCLA=125;//SA的分频因子设置为125,分频系数250

PWMCLK=0x01;//通道0选择SA作为PWM时钟

PWMPER0=200;//通道0周期寄存器设置为200

PWMDTY0=100;//通道0占空比寄存器设置

PWMPOL=0x01;//PWM输出先为高电平,之后变为低电平

PWMCAE=0x00;//左对齐输出

PWMCTL=0x00;//不级联

PWME=0x01;//使能PWM通道0

}

voidmain(void){

byteLedCnt=0;

setbusclock();

PWM_Init();

for(;;)

{

}

}

voidinterrupt0_Startup(void){

INIT_SP_FROM_STARTUP_DESC();//初始化堆栈指针SP

main();

}

输入捕捉(求占空比):

#include/*commondefinesandmacros*/

#include"derivative.h"/*derivative-specificdefinitions*/

#include

#include

unsignedintx,y;

unsignedlongintn,Th,Tl;

unsignedchart,a;

voidTIM_Init()

{

TSCR1=0x00;

TSCR2=0x84;

TIOS_IOS0=0;

TCTL4=0x01;

TIE_C0I=0x01;

TSCR1|=0x80;//启动定时器

}

#pragmaCODE_SEG_NEAR_SEGNONBANKED

voidinterrupt8TIM_Tie()

{

y=x;

x=TC0;

if(TCTL4==0x02)

Th=(x-y+(n<<16))*t;

if(TCTL4==0x01)

Tl=(x-y+(n<<16))*t;

TFLG1|=0x01;//写1清零

n=0;

a=TCTL4;

a=~a&0x03;

TCTL4=a;

}

#pragmaCODE_SEG_NEAR_SEGNONBANKED

voidinterrupt16TIM_Tof()

{

n++;

TFLG2|=0x80;//写1清零

}

voidmain(void){

TIM_Init();

for(;;){

//_FEED_COP();/*feedsthedog*/

}/*loopforever*/

/*pleasemakesurethatyouneverleavemain*/

}

电子时钟(包含串口通信和定时器):

//知识点1:

串口初始化、串口数据收发及数据处理

//2:

定时器如何实现指定的定时时间

#include

#include

#include"IO_Map.h"

//#include"derivative.h"

//globalvariablesdefinitions

staticintwaittime=5;

staticunsignedcharredButtonDown=FALSE,blueButtonDown=FALSE;

staticlongabsoluteTime=0;

unsignedintcount=0;

unsignedchartime[3]={0,0,0};

unsignedcharcmd_buf[8];

unsignedcharpos=0;

staticconstcharsegs[]={~0x3f,~0x06,~0x5b,~0x4f,~0x66,~0x6d,~0x7d,~0x07,~0x7f,~0x6f};

//staticconstchar//segss[]={~0xbf,~0x86,~0xdb,~0xcf,~0xe6,~0xed,~0xfd,~0x87,~0xff,~0xef};

//#pragmaCODE_SEGDEFAULT

staticvoidWriteToSCI0(constchar*text){

while(*text!

='\0'){

while(!

(SCI0SR1&0x80));//waitforoutputbufferempty

SCI0DRL=*text++;

}

}

voidexecute_cmd()

{unsignedchartmp[3];

if((cmd_buf[0]=='t')&&(pos==7))

{

tmp[0]=(cmd_buf[1]-'0')*10+cmd_buf[2]-'0';

tmp[1]=(cmd_buf[3]-'0')*10+cmd_buf[4]-'0';

tmp[2]=(cmd_buf[5]-'0')*10+cmd_buf[6]-'0';

if((tmp[0]<24)&&(tmp[1]<60)&&(tmp[2]<60))

{

time[0]=tmp[0];

time[1]=tmp[1];

time[2]=tmp[2];

}

}

pos=0;

}

//*

#pragmaCODE_SEG__NEAR_SEGNON_BANKED

voidinterrupt20SCI0_ISR(void){

unsignedcharrc;

rc=SCI0SR1;//dummyreadtoclearflags

rc=SCI0DRL;//dataread

if(rc!

=0x0d)

cmd_buf[pos++]=rc;

else

execute_cmd();

SCI0DRL=rc;

}

#pragmaCODE_SEG__NEAR_SEGNON_BANKED

voidsetbusclock(void)

{

CLKSEL=0X00;//disengagePLLtosystem

PLLCTL_PLLON=1;//turnonPLL

SYNR=0x00|0x01;//VCOFRQ[7:

6];SYNDIV[5:

0]

//fVCO=2*fOSC*(SYNDIV+1)/(REFDIV+1)fVCO=2*fOSC*2/2=2*fOSC

//fPLL=fVCO/(2×POSTDIV)fPLL=fVCO;

//fBUS=fPLL/2fBUS=fPLL/2=fosc;

//VCOCLKFrequencyRangesVCOFRQ[7:

6]

//32MHz<=fVCO<=48MHz00

//48MHz

//Reserved10

//80MHz

REFDV=0x80|0x01;//REFFRQ[7:

6];REFDIV[5:

0]

//fREF=fOSC/(REFDIV+1)

//REFCLKFrequencyRangesREFFRQ[7:

6]

//1MHz<=fREF<=2MHz00

//2MHz

//6MHz

//fREF>12MHz11

//pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;

POSTDIV=0x00;//4:

0,fPLL=fVCO/(2xPOSTDIV)

//IfPOSTDIV=$00thenfPLLisidenticaltofVCO(dividebyone).

_asm(nop);//BUSCLOCK=16M

_asm(nop);

while(!

(CRGFLG_LOCK==1));//whenpllissteady,thenuseit;

CLKSEL_PLLSEL=1;//engagePLLtosystem;

}

voidinterrupt26MDC_ISR(void)//定时器MDC模块中断服务程序,当定时时间到时自动执行该程序

{

MCFLG|=0X80;//MCFLG_MCZF=1;

count++;

if(count%10==0)

{

count=0;

time[2]++;

if(time[2]>=60)

{

time[2]=0;

time[1]++;

if(time[1]>=60)

{

time[1]=0;

time[0]++;

if(time[0]>=24)

time[0]=0;

}

}

}

}

//*/

#pragmaCODE_SEGDEFAULT

staticvoidSCI0Init(void){

SCI0BDL=(unsignedchar)((16000000UL/*OSCfreq*//2)/9600/*baudrate*//16/*factor*/);

SCI0CR2=0x2C;

}

voidMDC_Init(){

unsignedchari;

MCCTL=0b11101111;//MCZI=1,MODMC=1,RDMCL=1,ICLAT=0,FLMC=1,MCEN=0,MCPR1-0=0b11(16分频)

MCCNT=10000;//定时10000us=10ms

//MCCTL_MCEN=1;

}

voidmain(void){

unsignedchartmp;

DDRA=0xFF;

DDRB=0xFF;

DDRE=0xFF;

DDRP=0xFF;

DDRM=0xFF;

DDRT=0xFF;

PORTA=0xFF;

PORTB=0xFF;

PORTE=0xFF;

PTP=0xFF;

PTM=0xFF;

PTT=0xFF;

setbusclock();

//startTimeBase();

SCI0Init();

MDC_Init();

WriteToSCI0("\n\n***TimerDemo***\n");

WriteToSCI0("\nEnter't123456'tosettimeto12:

34:

56\n");

INTCR_IRQEN=0;//屏蔽IRQ中断

EnableInterrupts;//使能全局中断

for(;;){

if(time[2]!

=tmp)//if秒钟数有更新

{

tmp=time[2];

PORTA=segs[time[0]/10];

PORTB=segs[time[0]%10]&0x7f;

PORTE=segs[time[1]/10];

PTP=segs[time[1]%10]&0x7f;

PTM=segs[time[2]/10];

PTT=segs[time[2]%10];

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 交通运输

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1