单片机原理及应用第九讲MSP430单片机液晶控制器和ADC.docx
《单片机原理及应用第九讲MSP430单片机液晶控制器和ADC.docx》由会员分享,可在线阅读,更多相关《单片机原理及应用第九讲MSP430单片机液晶控制器和ADC.docx(13页珍藏版)》请在冰豆网上搜索。
单片机原理及应用第九讲MSP430单片机液晶控制器和ADC
单片机原理及应用
第九讲MSP430单片机液晶控制器和ADC
报告人:
实验内容
实验一:
段码LCD循环显示0到6
实验二:
DAC输出正弦波
实验三:
基础:
使DAC0输出正弦波频率为300Hz,在LCD上显示频率。
提高:
用按键控制DAC0输出正弦波频率为在100Hz—1000Hz循环输出,步进值为100Hz,并在LCD上显示频率。
实验步骤
步骤:
(1)将PC和板载仿真器通过USB线相连;
(2)打开CCS集成开发工具,选择样例工程或自己新建一个工程,修改代码;
(3)选择
对该工程进行编译链接,生成.out文件。
然后选择
,将程序下载到实验板中。
程序下载完毕之后,可以选择
全速运行程序,也可以选择
单步调试程序,选择F3查看具体函数。
也可以程序下载之后,按下
,软件界面恢复到原编辑程序的画面。
再按下实验板的复位键,运
行程序。
(调试方式下的全速运行和直接上电运行程序在时序有少许差别,建议
上电运行程序)。
关键代码:
实验一:
intmain()
{
inti,j;
WDTCTL=WDTPW+WDTHOLD;//StopWDT
Init_TS3A5017DR();//ConfigureTS3A5017DRIN1andIN2
Init_lcd();//LCD初始化
Backlight_Enable();//打开背光
LcdGo
(1);//打开液晶模块
LCD_Clear();//清屏
while
(1)
{
for(i=0;i<6;i++)//Display"0123456"
{
for(j=0;j<6;j++)
{
LCDMEM[j]=char_gen[i];
}
delay_ms(1000);
}
}
}
实验二:
#include
#include
#definePI3.1415926
intsin_table[360];
int*sin_data_pr;
doublei=0;
intj;
voidmain(void)
{
WDTCTL=WDT_MDLY_0_064;//WDT~61usintervaltimer
SFRIE1=WDTIE;//EnableWDTinterrupt
for(j=0;j<360;j++)
{
i+=PI/180;
sin_table[j]=(int)((sin(i)+1)*2048);
}
sin_data_pr=&sin_table[0];
DAC12_0CTL0=DAC12IR+DAC12SREF_0+DAC12AMP_5+DAC12ENC+DAC12CALON+DAC12OPS;
P5DIR=BIT1;//打开扬声器的运放
P5OUT&=~BIT1;
for(;;)
{
__bis_SR_register(CPUOFF+GIE);//EnterLPM0
DAC12_0DAT=*sin_data_pr++;
if(sin_data_pr>=&sin_table[360])
{
sin_data_pr=&sin_table[0];
}
//Positiveramp
DAC12_0DAT&=0xFFF;//Modulo4096
}
}
#pragmavector=WDT_VECTOR
__interruptvoidwatchdog_timer(void)
{
__bic_SR_register_on_exit(CPUOFF);//ClearLPM0bitsfrom0(SR)
}
实验三:
基础:
intmain(void){
WDTCTL=WDT_MDLY_0_064;//WDT~61usintervaltimer
Init_TS3A5017DR();//ConfigureTS3A5017DRIN1andIN2
Init_lcd();//LCD初始化
Backlight_Enable();//打开背光
LcdGo
(1);//打开液晶模块
LCD_Clear();//清屏
LCDMEM[0]=char_gen[3];
LCDMEM[1]=char_gen[0];
LCDMEM[2]=char_gen[0];
SFRIE1=WDTIE;//EnableWDTinterrupt
for(j=0;j<52;j++)
{
i+=PI/26;
sin_table[j]=(int)((sin(i)+1)*2048);
}
sin_data_pr=&sin_table[0];
DAC12_0CTL0=DAC12IR+DAC12SREF_0+DAC12AMP_5+DAC12ENC+DAC12CALON+DAC12OPS;
P5DIR=BIT1;//打开扬声器的运放
P5OUT&=~BIT1;
for(;;)
{
__bis_SR_register(CPUOFF+GIE);//EnterLPM0
DAC12_0DAT=*sin_data_pr++;
if(sin_data_pr>=&sin_table[52])
{
sin_data_pr=&sin_table[0];
}
//Positiveramp
DAC12_0DAT&=0xFFF;//Modulo4096
}
}
#pragmavector=WDT_VECTOR
__interruptvoidwatchdog_timer(void)
{
__bic_SR_register_on_exit(CPUOFF);//ClearLPM0bitsfrom0(SR)
}
提高:
#definecircnt1001388
#definecircnt200694
#definecircnt300462
#definecircnt400348
#definecircnt500278
#definecircnt600232
#definecircnt700198
#definecircnt800174
#definecircnt900154
#definecircnt1000138
intsin_table[180];
int*sin_data_pr;
doublei=0;
intj;
constintcnt_table[]={circnt100,circnt200,circnt300,circnt400,circnt500,circnt600,circnt700,circnt800,circnt900,circnt1000};
intcnt_flg=0;
voidSetVcoreUp(unsignedint);
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//closewatchdog
//---------p2.6--------------
P2REN|=BIT6;//EnableP2.6internalresistance
P2OUT|=BIT6;//SetP2.6aspull‐Upresistance
P2IES|=BIT6;//P2.6Hi/Loedge
P2IFG&=~BIT6;//P2.6IFGcleared
P2IE|=BIT6;//PP2.6interruptenabled
/*P2REN|=BIT7;//EnableP2.6internalresistance
P2OUT|=BIT7;//SetP2.6aspull‐Upresistance
P2IES|=BIT7;//P2.6Hi/Loedge
P2IFG&=~BIT7;//P2.6IFGcleared
P2IE|=BIT7;//PP2.6interruptenabled*/
//---------enableLCD------------
Init_TS3A5017DR();//ConfigureTS3A5017DRIN1andIN2
Init_lcd();//LCD初始化
Backlight_Enable();//打开背光
LcdGo
(1);//打开液晶模块
LCD_Clear();//清屏
LCDMEM[5]=char_gen[0];
LCDMEM[4]=char_gen[0];
LCDMEM[3]=char_gen[1];
//----------configsinelist------------
for(j=0;j<180;j++)
{
i+=PI/90;
sin_table[j]=(int)((sin(i)+1)*2000);
}
sin_data_pr=&sin_table[0];
DAC12_0CTL0=DAC12IR+DAC12SREF_0+DAC12AMP_5+DAC12ENC+DAC12CALON+DAC12OPS;
//----------enableSMCLKas8MHz--------------
P4DIR|=BIT1;//P4.1output
P1DIR|=BIT0;//ACLKsetouttopins
P1SEL|=BIT0;
P3DIR|=BIT4;//SMCLKsetouttopins
P3SEL|=BIT4;
//IncreaseVcoresettingtolevel3tosupportfsystem=25MHz
//NOTE:
Changecorevoltageonelevelatatime..
SetVcoreUp(0x01);
SetVcoreUp(0x02);
SetVcoreUp(0x03);
UCSCTL3=SELREF_2;//SetDCOFLLreference=REFO
UCSCTL4|=SELA_2;//SetACLK=REFO
__bis_SR_register(SCG0);//DisabletheFLLcontrolloop
UCSCTL0=0x0000;//SetlowestpossibleDCOx,MODx
UCSCTL1=DCORSEL_7;//SelectDCOrange50MHzoperation
UCSCTL2=FLLD_1+762;//SetDCOMultiplierfor25MHz
//(N+1)*FLLRef=Fdco
//(762+1)*32768=25MHz
//SetFLLDiv=fDCOCLK/2
__bic_SR_register(SCG0);//EnabletheFLLcontrolloop
//Worst‐casesettlingtimefortheDCOwhentheDCOrangebitshavebeen
//changedisnx32x32xf_MCLK/f_FLL_reference.SeeUCSchapterin5xx
//UGforoptimization.
//32x32x25MHz/32,768Hz~780kMCLKcyclesforDCOtosettle
__delay_cycles(782000);
//LoopuntilXT1,XT2&DCOstabilizes‐InthiscaseonlyDCOhastostabilize
do
{
UCSCTL7&=~(XT2OFFG+XT1LFOFFG+DCOFFG);
//ClearXT2,XT1,DCOfaultflags
SFRIFG1&=~OFIFG;//Clearfaultflags
}while(SFRIFG1&OFIFG);//Testoscillatorfaultflag
//-----------enabletimerACCR0usSMCLK--------------
TA0CCTL0=CCIE;//CCR0interruptenabled
TA0CCR0=cnt_table[0];
TA0CTL=TASSEL_2+MC_1+TACLR;//useSMCLkassetting25MHz
for(;;)
{
__bis_SR_register(CPUOFF+GIE);//EnterLPM0
DAC12_0DAT=*sin_data_pr++;
if(sin_data_pr>=&sin_table[180])
{
sin_data_pr=&sin_table[0];
}
//Positiveramp
DAC12_0DAT&=0xFFF;//Modulo4096
}
}
voidSetVcoreUp(unsignedintlevel)
{
PMMCTL0_H=PMMPW_H;//OpenPMMregistersforwrite
//SetSVS/SVMhighsidenewlevel
SVSMHCTL=SVSHE+SVSHRVL0*level+SVMHE+SVSMHRRL0*level;
//SetSVMlowsidetonewlevel
SVSMLCTL=SVSLE+SVMLE+SVSMLRRL0*level;
while((PMMIFG&SVSMLDLYIFG)==0);//WaittillSVMissettled
PMMIFG&=~(SVMLVLRIFG+SVMLIFG);//Clearalreadysetflags
PMMCTL0_L=PMMCOREV0*level;//SetVCoretonewlevel
if((PMMIFG&SVMLIFG))
while((PMMIFG&SVMLVLRIFG)==0);//Waittillnewlevelreached
//SetSVS/SVMlowsidetonewlevel
SVSMLCTL=SVSLE+SVSLRVL0*level+SVMLE+SVSMLRRL0*level;
//LockPMMregistersforwriteaccess
PMMCTL0_H=0x00;
}
//--------timerAinterruption---------
#pragmavector=TIMER0_A0_VECTOR
__interruptvoidTIMER0_A0_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF);
}
//-------bottominterruption----------
#pragmavector=PORT2_VECTOR
__interruptvoidPort_2(void)
{
__bic_SR_register_on_exit(CPUOFF);
cnt_flg++;
if(cnt_flg>=10)cnt_flg=0;
LCD_Clear();//清屏
LCDMEM[5]=char_gen[0];
LCDMEM[4]=char_gen[0];
if(cnt_flg==9)
{
LCDMEM[3]=char_gen[0];
LCDMEM[2]=char_gen[1];
}
elseLCDMEM[3]=char_gen[cnt_flg+1];
TA0CCR0=cnt_table[cnt_flg];
P2IFG&=~BIT6;
__bis_SR_register(CPUOFF+GIE);
}
实验现象分析:
实验一:
LCD显示屏上循环显示0到6,每次显示都为6个相同的数字,现象对应的代码为:
实验二:
实验板上扬声器放出周期为64us*360=0.023s的正弦波信号。
实验三:
基础:
用示波器测量P7.6信号,测出信号频率为300HZ左右,LCD面板上显示为300。
提高:
按下按键,信号频率按要求改变,同时LCD也显示出信号频率对应值。
思考题
1、MSP430系列单片机液晶驱动模块有哪些驱动方法?
答:
4种驱动方法:
静态
2‐mux
3‐mux
4‐mux
2、MSP430系列单片机液晶驱动模块包括哪些功能结构?
答:
功能结构:
具有显示缓存器
所需的SEG、COM信号自动产生
多种扫描频率
每个闪烁段都有独立的闪烁存储器
稳压电荷泵
软件实现反向控制
显示缓存器可作为一般存储器
3、MSP430系列单片机液晶驱动模块显示缓存有什么特
点?
和普通的存储单元有什么不同?
答:
特点:
液晶显示缓存器各个位与液晶的段一一对应。
存储位置位则可以点亮对
应的液晶段,存储位复位液晶段变暗。
段、公共极输出控制能够自动从显示
缓存器读取数据,送出相应信号到液晶玻璃片上。
因为不同器件驱动液晶的
段数不同,所以液晶显示缓存器的数量也不一样。
数量越大,驱动能力越强
,显示的内容就越多。
不同:
显示缓存器可作为一般存储器,但一般存储单元存储位置位不可以点亮液晶段。
4、常见液晶显示的类型有哪些?
答:
段式液晶
字符式液晶
图形式液晶
5、MSP430系列单片机液晶驱动模块有哪些特点?
答:
具有显示缓存器
所需的SEG、COM信号自动产生
多种扫描频率
每个闪烁段都有独立的闪烁存储器
稳压电荷泵
软件实现反向控制
显示缓存器可作为一般存储器
4种驱动方法
静态
2‐mux
3‐mux
4‐mux
6、简述DAC的主要性能参数。
答:
分辨率(n):
DAC转换器使用的位数,D/A转换器模拟输出电压可能被分离
的等级数。
输入数字量位数越多,分辨率越高。
所以,在实际应用中,
常用数字量的位数表示D/A转换器的分辨率。
转换速度:
转换速率(SR)——在大信号工作状态下模拟电压
的变化率。
建立时间(tset)——当输入的数字量发生变化时,输出
电压变化到相应稳定电压值所需时间。
最短可达0.1μS。
单调性:
转换器的模拟输出值与数字输入值同增同减.
偏移误差:
当输入的数字量为0时,DAC输出的模拟量的大小。
温度系数:
在输入不变的情况下,输出模拟电压随温度变
化产生的变化量。
一般用满刻度输出条件下温度每升
高1℃,输出电压变化的百分数作为温度系数。
7、简述MSP430单片机DAC12模块的特点。
答:
12位单调输出
8位或12位电压输出分辨率
可编程的时间对能量的消耗
内部或外部参考电压
二进制或二进制补码形式
具有自校验功能
多路DAC同步更新
可直接用存储器存储(DMA)
实验中遇到的问题
无