单片机原理及应用_第九讲_MSP430单片机液晶控制器和ADC
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机原理及应用
第九讲 MSP430单片机液晶控制器和ADC
报告人:
实验内容
实验一:段码LCD循环显示0到6
实验二:DAC输出正弦波
实验三:
基础:
使DAC0输出正弦波频率为300Hz,在LCD上显示频率。
提高:
用按键控制DAC0输出正弦波频率为在100Hz—1000Hz循环输出,步进值为100Hz,并在LCD上显示频率。
实验步骤
步骤:
(1) 将PC 和板载仿真器通过USB 线相连;
(2) 打开CCS 集成开发工具,选择样例工程或自己新建一个工程,修改代码;
(3) 选择对该工程进行编译链接,生成.out 文件。
然后选择,将程序下载到实验板中。
程序下载完毕之后,可以选择全速运行程序,也可以选择
单步调试程序,选择F3 查看具体函数。
也可以程序下载之后,按下,软件界面恢复到原编辑程序的画面。
再按下实验板的复位键,运
行程序。
(调试方式下的全速运行和直接上电运行程序在时序有少许差别,建议上电运行程序)。
关键代码:
实验一:
int main()
{
int i,j;
WDTCTL = WDTPW + WDTHOLD;// Stop WDT
Init_TS3A5017DR(); // Configure TS3A5017DR IN1 and IN2 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<msp430f6638.h>
#include<math.h>
#define PI 3.1415926
int sin_table[360];
int *sin_data_pr;
double i=0;
int j;
void main(void)
{
WDTCTL = WDT_MDLY_0_064; // WDT ~61us interval timer SFRIE1 = WDTIE; // Enable WDT interrupt
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); // Enter LPM0
DAC12_0DAT=*sin_data_pr++;
if (sin_data_pr >= &sin_table[360])
{
sin_data_pr = &sin_table[0];
}
// Positive ramp
DAC12_0DAT &= 0xFFF; // Modulo 4096
}
}
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer (void)
{
__bic_SR_register_on_exit(CPUOFF); // Clear LPM0 bits from 0(SR) }
实验三:
基础:
int main(void) {
WDTCTL = WDT_MDLY_0_064; // WDT ~61us interval timer
Init_TS3A5017DR(); // Configure TS3A5017DR IN1 and IN2
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; // Enable WDT interrupt
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); // Enter LPM0
DAC12_0DAT=*sin_data_pr++;
if (sin_data_pr >= &sin_table[52])
{
sin_data_pr = &sin_table[0];
}
// Positive ramp
DAC12_0DAT &= 0xFFF; // Modulo 4096
}
}
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer (void)
{
__bic_SR_register_on_exit(CPUOFF); // Clear LPM0 bits from 0(SR)
}
提高:
#define circnt100 1388
#define circnt200 694
#define circnt300 462
#define circnt400 348
#define circnt500 278
#define circnt600 232
#define circnt700 198
#define circnt800 174
#define circnt900 154
#define circnt1000 138
int sin_table[180];
int *sin_data_pr;
double i=0;
int j;
const int cnt_table[] =
{circnt100,circnt200,circnt300,circnt400,circnt500,circnt600,circnt700,circ nt800,circnt900,circnt1000};
int cnt_flg = 0;
void SetVcoreUp (unsigned int);
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // close watchdog
//---------p2.6--------------
P2REN |= BIT6; // Enable P2.6 internal resistance
P2OUT |= BIT6; // Set P2.6 as pull‐Up resistance
P2IES |= BIT6; // P2.6 Hi/Lo edge
P2IFG &= ~BIT6; // P2.6 IFG cleared
P2IE |= BIT6; // P P2.6 interrupt enabled
/*P2REN |= BIT7; // Enable P2.6 internal resistance
P2OUT |= BIT7; // Set P2.6 as pull‐Up resistance
P2IES |= BIT7; // P2.6 Hi/Lo edge
P2IFG &= ~BIT7; // P2.6 IFG cleared
P2IE |= BIT7; // P P2.6 interrupt enabled*/
//---------enable LCD------------
Init_TS3A5017DR(); // Configure TS3A5017DR IN1 and IN2
Init_lcd(); // LCD初始化
Backlight_Enable(); // 打开背光
LcdGo(1); // 打开液晶模块
LCD_Clear(); // 清屏
LCDMEM[5] = char_gen[0];
LCDMEM[4] = char_gen[0];
LCDMEM[3] = char_gen[1];
//----------config sine list------------
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;
//---------- enable SMCLK as 8MHz--------------
P4DIR |= BIT1; // P4.1 output
P1DIR |= BIT0; // ACLK set out to pins
P1SEL |= BIT0;
P3DIR |= BIT4; // SMCLK set out to pins
P3SEL |= BIT4;
// Increase Vcore setting to level3 to support fsystem=25MHz
// NOTE: Change core voltage one level at a time..
SetVcoreUp (0x01);
SetVcoreUp (0x02);
SetVcoreUp (0x03);
UCSCTL3 = SELREF_2; // Set DCO FLL reference = REFO
UCSCTL4 |= SELA_2; // Set ACLK = REFO
__bis_SR_register(SCG0); // Disable the FLL control loop
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
UCSCTL1 = DCORSEL_7; // Select DCO range 50MHz operation
UCSCTL2 = FLLD_1 + 762; // Set DCO Multiplier for 25MHz
// (N + 1) * FLLRef = Fdco
// (762 + 1) * 32768 = 25MHz
// Set FLL Div = fDCOCLK/2
__bic_SR_register(SCG0); // Enable the FLL control loop
// Worst‐case settling time for the DCO when the DCO ran ge bits have been // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in
5xx
// UG for optimization.
// 32 x 32 x 25 MHz / 32,768 Hz ~ 780k MCLK cycles for DCO to settle __delay_cycles(782000);
// Loop until XT1,XT2 & DCO stabilizes ‐ In this case only DCO has to stabilize do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
//-----------enable timerA CCR0 us SMCLK--------------
TA0CCTL0 = CCIE; // CCR0 interrupt enabled
TA0CCR0 = cnt_table[0];
TA0CTL = TASSEL_2 + MC_1 + TACLR; //use SMCLk as setting 25MHz
for (;;)
{
__bis_SR_register(CPUOFF + GIE); // Enter LPM0
DAC12_0DAT=*sin_data_pr++;
if (sin_data_pr >= &sin_table[180])
{
sin_data_pr = &sin_table[0];
}
// Positive ramp
DAC12_0DAT &= 0xFFF; // Modulo 4096
}
}
void SetVcoreUp (unsigned int level)
{
PMMCTL0_H = PMMPW_H; // Open PMM registers for write
// Set SVS/SVM high side new level
SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;
// Set SVM low side to new level
SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;
while ((PMMIFG & SVSMLDLYIFG) == 0); // Wait till SVM is settled
PMMIFG &= ~(SVMLVLRIFG + SVMLIFG); // Clear already set flags
PMMCTL0_L = PMMCOREV0 * level; // Set VCore to new level
if ((PMMIFG & SVMLIFG))
while ((PMMIFG & SVMLVLRIFG) == 0); // Wait till new level reached
// Set SVS/SVM low side to new level
SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;
// Lock PMM registers for write access
PMMCTL0_H = 0x00;
}
//--------timerA interruption---------
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF);
}
//-------bottom interruption----------
#pragma vector=PORT2_VECTOR
__interrupt void Port_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];
}
else LCDMEM[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种驱动方法
静态
‐mux
‐mux
‐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)
实验中遇到的问题
无。