单片机综合实验论文.docx

上传人:b****3 文档编号:27465532 上传时间:2023-07-01 格式:DOCX 页数:16 大小:115.53KB
下载 相关 举报
单片机综合实验论文.docx_第1页
第1页 / 共16页
单片机综合实验论文.docx_第2页
第2页 / 共16页
单片机综合实验论文.docx_第3页
第3页 / 共16页
单片机综合实验论文.docx_第4页
第4页 / 共16页
单片机综合实验论文.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

单片机综合实验论文.docx

《单片机综合实验论文.docx》由会员分享,可在线阅读,更多相关《单片机综合实验论文.docx(16页珍藏版)》请在冰豆网上搜索。

单片机综合实验论文.docx

单片机综合实验论文

模拟测速系统及LCD显示

摘要:

在设定的时间段内,计算在该时间段内的脉冲数,达到模拟测速的效果。

首先,采用PIT定时器设定定时宽度;然后,在PIT计数结束时使用中断,使用变量来统计改时间内采集到的脉冲数,并使PIT重新开始定时;最后,在LCD1602上显示该变量数目。

本实验采用PIT定时器、中断使能的方式,达到模拟测速的要求。

关键词:

PIT定时器,中断,LCD1602,MC9S12XS128芯片

1、引言

1.1MC9S12XS128芯片

PWM模块

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

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

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

定时器模块

基本的定时器模块由1个增强的可编程预分频器驱动的可编程计数器、8个输入捕捉/输出比较通道和1个脉冲累加器组成。

定时器模块一共有8个引脚,其中脉冲累加器与第7号通道的引脚是共用的。

A/D转换

模拟信号依次通过抽样和保持(S/H)电路和模拟转换器(A/D)后转换为数字格式。

抽样和保持电路以均匀间隔对模拟信号进行抽样,并且在每个抽样运算后在足够的时间内保持抽样值恒定,以保证输出值可以被A/D转换器精确转换。

下一步是通过模数转换器将抽样和保持电路的输出转换为数字形式。

模数转换器的输出通常表示为二进制编码的形式。

转换精度由分辨率来表示,它由离散级数量决定。

比如,对一个以二进制形式编码的长度为N位的长的输出,有效地离散级数量是2的N次方,分辨率为离散数量级的倒数。

12中A/D转换共有两个方块,每个方块各有8个输入通道,使用时应以标头ATD0或ATD1标识。

1.2LCD1602

工业字符型液晶,能够同时显示16x02即32个字符。

(16列2行)

注:

为了表示的方便,后文皆以1表示高电平,0表示低电平。

1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。

它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。

1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。

 

2、系统设计

2.1硬件设计

设计图框

设定时间内计算脉冲数下一段单位时间

 

2.2软件设计

流程图

开始

初始化

输入输出端口的确定

确定LCD中各个块的显示位置及其内容(除速度块)

For

 

设定定时器宽度

输出显示

调用中断内容速度计算

小灯切换闪烁

 

程序编写

#include/*commondefinesandmacros*/

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

#defineepPTT_PTT3

#definerwPTT_PTT2

#definersPTT_PTT1

intencoder_cnt,i1,j;//定义全局变量

/*************************************************************/

/*初始化锁相环*/

/*************************************************************/

voidPLL_32M(void)//BUSCLOCK=32MHZ,PLLCLOCK=64MHZ

{

CLKSEL&=0x7f;//setOSCCLKassysclk时钟选择寄存器

PLLCTL&=0x8F;//DisablePLLcircuit环控制寄存器

CRGINT&=0xDF;中断

SYNR=0x43;

REFDV=0x81;//PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz,fbus=32M

PLLCTL=PLLCTL|0x70;//EnablePLLcircuit

asmNOP;

asmNOP;

while(!

(CRGFLG&0x08));//PLLCLKisLockedalready

CLKSEL|=0x80;//setPLLCLKassysclk

}

/*************************************************************/

/*PIT定时*/

/*************************************************************/

voidPIT_inits(void)//定时间断初始化函数1ms定时间断设置

{

PITCFLMT_PITE=0;//关PIT

PITCE_PCE0=1;//定时器通道0使能

PITMTLD0=32-1;//8位定时器初值设定,32分频,在32MHzBusClock下,为1MHz。

即1us

PITLD0=1000-1;//16位定时器初值设定。

1000*1us=1ms

PITINTE_PINTE0=1;//定时器间断通道0间断使能

PITCFLMT_PITE=1;//使能PIT

}

/*************************************************************/

/*初始化累加器*/

/*************************************************************/

voidPAI_inits(void)

{

PACTL=0x50;//始能脉冲累加器,累加上升沿

}

 

//////////////////////////////////////////////////////////////

voidPWM_Init(void)

{

PWME_PWME3=0x00;//PWWisdisabled禁止

PWMPRCLK=0x33;//0b00110011A=B=24M/8=3M时钟预分频寄存器设置

PWMSCLA=150;//SA=A/2/150=10k时钟设置

PWMSCLB=150;//SB=B/2/15=10k时钟设置

PWMCTL=0x00;//noconcatenation控制寄存器设置

PWMCLK_PCLK3=1;//PWM3-----SB时钟源的选择

PWMPOL_PPOL3=1;//Duty=HighTime极性设置

PWMCAE_CAE3=0;//left-aligned对齐方式设置

PWMPER3=4;//Frequency=SB/250=40周期寄存器设置

PWMDTY3=2;//Dutycycle=50%占空比寄存器设置

PWME_PWME3=1;//enable使能

}

/////////////////////////////////////////////

unsignedinta,b,c;

unsignedchardis1[]={"MoNiCeSu-_-#"};

unsignedchardis2[3];

unsignedcharw[]={"speed:

"};

unsignedcharscales[]={"n/dt"};

bytelcd_bz(void);//判忙

//////////////////////////////////////

voiddelay(unsignedcharms)////延迟函数

{

unsignedinti;

while(ms--)

{

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

}

}

///////////////////////////////////////////

bytelcd_bz(void)//判忙函数

{

byteresult;

DDRB=0X00;

rs=0;

rw=1;

ep=1;

result=(byte)(PORTB&0x80);

ep=0;

returnresult;

}

//////////////////////////////////////////

voidlcd_wcmd(unsignedcharcmd)//初始化

{

while(lcd_bz());//判LCD是否忙碌

DDRB=0XFF;

rs=0;

rw=0;

ep=0;

PORTB=cmd;

ep=1;

ep=0;

}

///////////////////////////////////////////

voidlcd_pos(unsignedcharpos)//初始化

{

lcd_wcmd(pos|0x80);

}

//////////////////////////////////////////////

voidlcd_wdat(unsignedchardat)//初始化

{

while(lcd_bz());//判断LCD是否忙碌

DDRB=0XFF;

rs=1;

rw=0;

ep=0;

PORTB=dat;

ep=1;

ep=0;

}

////////////////////////////////////////////////

voidlcd_init(void)//lcd初始化清屏

{

PTT_PTT0=0;

lcd_wcmd(0x38);

delay

(1);

lcd_wcmd(0x0c);

delay

(1);

lcd_wcmd(0x06);

delay

(1);

lcd_wcmd(0x01);

delay

(1);

}

voidGPIO_INITS_1(void)

{

DDRK|=0X88;

}

//////////////////////////////////////////////

voidmain(void)//主函数

{

unsignedinti;1出0入

GPIO_INITS_1();

DDRB=0XFF;DB0-DB7B0-B7入

DDRT=0X7F;//根据连线端口选择T7口01111111===0x7F

lcd_init();//初始化LCD

delay(10);

//////////

lcd_pos(0x00);//设置第一行显示位置

i=0;

while(dis1[i]!

='\0')

{

lcd_wdat(dis1[i]);//显示第一行字符

i++;

}

/////////

lcd_pos(0x40);//设置speed显示位置

i=0;

while(w[i]!

='\0')

{

lcd_wdat(w[i]);

i++;

}

//////

lcd_pos(0x4b);//n/dt显示位置

i=0;

while(scales[i]!

='\0')

{

lcd_wdat(scales[i]);//显示n/dt字符

i++;

}

//////

DisableInterrupts;

PLL_32M();//PLL倍频

PIT_inits();//PIT初始化

PAI_inits();

PWM_Init();

EnableInterrupts;

///////

for(;;)

{

PITMTLD0=32-1;//8位定时器初值设定,32分频,在32MHzBusClock下,为1MHz。

即1us

PITLD0=65535;//设置定时宽度

delay(10);

1a=(j-j%100)/100;//j为中断函数里面的值

2b=(j%100-j%10)/10;

3c=j%10;

dis2[0]=a+0x30;//看pdf数字0对应位置为001100001对应00110001

dis2[1]=b+0x30;

dis2[2]=c+0x30;

lcd_pos(0x47);//a显示位置

lcd_wdat(dis2[0]);//显示字符a

lcd_pos(0x48);//b显示位置

lcd_wdat(dis2[1]);//显示字符b

lcd_pos(0x49);//c显示位置

lcd_wdat(dis2[2]);//显示字符c

while(PACNT==0)//用小灯切换的速度为中断信号

{

PORTK_PK3=0;//单位时间越短,小灯切换速度越快

PORTK_PK7=1;

delay(10);

}

PORTK_PK3=1;

PORTK_PK7=0;

}

}

/*************************************************************/

/*中断函数*/

/*************************************************************/

#pragmaCODE_SEG__NEAR_SEGNON_BANKED

voidinterrupt66PIT0(void)//1ms

{

i1++;//中断执行程序

j=encoder_cnt=PACNT;//在主函数方便调用j值

PACNT=0;

PITTF_PTF0=1;

}

3、系统调试

3.1初步调试

采用该编写方法,程序跑错位,出错

dis2[0]=a+0x30;

dis2[1]=b+0x30;

dis2[2]=c+0x30;

i=0;

while(dis2[i]!

='\0')

{lcd_wdat(dis2[i]);//显示字符

i++;

}

改进:

dis2[0]=a+0x30;//看pdf数字0对应位置为001100001对应00110001

dis2[1]=b+0x30;

dis2[2]=c+0x30;

lcd_pos(0x47);//a显示位置

lcd_wdat(dis2[0]);//显示字符a

lcd_pos(0x48);//b显示位置

lcd_wdat(dis2[1]);//显示字符b

lcd_pos(0x49);//c显示位置

lcd_wdat(dis2[2]);//显示字符c

LCD出现闪烁,忽亮忽暗

分析:

LCD排针接口松动

改进:

用电烙铁重新焊锡排针

3.2成功调试

4、总结

使用MC9S12XS128芯片,进行模拟测速实验,由单位时间内的脉冲数来反映模拟速度,而单位时间则是设定的时间宽度,由宽度不同而计数到不同的脉冲数目。

通过不断地调试运行,尝试各种个人任何想法,找出最稳定的设计方法。

只有想不到的,没有做不到的。

5、参考文献

1.LCD1602液晶完整中文资料

2.MC9S12XS128芯片英文数据手册(完整版)

3.最小系统板XS128-P112V3.0

4.C++primer第五版王刚杨巨峰译电子工业出版社

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

当前位置:首页 > 初中教育 > 中考

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

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