单片机综合实验论文.docx
《单片机综合实验论文.docx》由会员分享,可在线阅读,更多相关《单片机综合实验论文.docx(16页珍藏版)》请在冰豆网上搜索。
单片机综合实验论文
模拟测速系统及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第五版王刚杨巨峰译电子工业出版社