77范文网 - 专业文章范例文档资料分享平台

MSP430F249的定时器计数器(7)

来源:网络收集 时间:2019-04-21 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

别的项目中,除非仔细地理顺函数关系,然后寻找并复制每一段函数。

合理的方法是将一个大程序划分为若干个小的 C 文件。在单片机程序中,最常用的划分方法是按硬件功能划分,将每个功能模块做成独立的 C 文件。例如一个项目中会用到定时器B、16 位 AD 转换器、LCD 显示、键盘,可以划分为 4 个文件:TB.C、ADC16.C、LCD.C、Key.C。属于每个功能模块的函数写在相应的文件中,然后在相应头文件中声明对外引申的函数与全局变量。

做好文件划分和管理之后,每个文件都不会很长,如果需要修改或调试某个函数,打开相应模块的 C 文件,很容易找到。打开相应的头文件还可查看函数列表。这些代码还能被重复使用。假设另一项目也用到 LCD 显示器,只要把 LCD.C 和 LCD.h 文件复制并添加到新工程内即可调用各种 LCD 显示函数,避免了重复劳动。

Main.c主文件

#include #include \#define M1 10

unsigned int cap1,N1;

long width[10]={0,0,0,0,0,0,0,0,0,0}; char m=0;

char led_buf[] = {0,0,0,0,0,0}; //显示缓冲区 long data;

const char table[]=\const char table1[]=\

void data_to_buf(unsigned long data2) // 值送显示缓冲区函数 {

unsigned char i; for (i=0;i<6;i++) {

led_buf[i] = table[data2];//低位在前 data2=data2/10; }

for(i=5;i>0;i--)

{if(led_buf[i]=='0')

led_buf[i]=' ';//数字前面的零不显示 else break; } }

void main() {

char num, k1;

WDTCTL=WDTPW+WDTHOLD; //关闭看门狗 BCSCTL2 = SELS+DIVS0+DIVS1; // SMCLK = XT2

P4SEL|=0x01; //P4.0作为捕获模块功能的输入端输入方波 P5DIR=0xFF; //设置P5口为输出

31

P6DIR=0xFF; //设置P6口为输出 lcdinit();

// TBCCTL0=0; // 捕获源为P4.0,即CCI0A(也是CCI0B)

TBCCTL0|=CM_1+SCS+CAP+CCIE; //上升沿捕获,同步捕获,工作在捕获模式+中断允许 TBCTL|=TBSSEL_2+MC_2+ TBIE; //选择时钟SMCLK+连续计数模式+中断允许 write_com(0x80); // 显示第一行字 for(num=0;num<10;num++) write_data(table1[num]); _EINT();

while(1) {

data=0;

for(k1=0;k1

data_to_buf(data); //数据送显示缓冲区 write_com(0x80+0x40); // 第二行显示频率 for(num=0;num<6;num++)

write_data(led_buf[5-num]); } } }

#pragma vector=TIMERB0_VECTOR

__interrupt void TimerB0(void)//定时器TB的CCR0的中断:用于检测脉冲上升与下降沿 {

if(TBCCTL0&CM1) //捕获到下降沿 {

width[m++]=65536*N1+TBCCR0-cap1; //记录下结束时间 N1=0;

TBCCTL0=CM_1+SCS+CAP+CCIE;//+TBCLR; //改为上升沿捕获:CM1置0,CM0置1

if(m==M1) m=0; }

else if(TBCCTL0&CM0) //捕获到上升沿 { cap1=TBCCR0; N1=0;

TBCCTL0=CM_2+SCS+CAP+CCIE;//+TBCLR; //改为下降沿捕获:CM0置0,CM1置1

} }

32

// Timer_B7 Interrupt Vector (TBIV) handler #pragma vector=TIMERB1_VECTOR __interrupt void Timer_B(void) {

switch( TBIV ) {

case 14: N1++; break; // 溢出 } }

Lcd.c文件

#include

#define lcdrs_0 P6OUT&=~BIT0;//P6.0=0 命令 #define lcdrs_1 P6OUT|=BIT0;//P6.0=1 数据

#define lcden_0 P6OUT&=~BIT2;//P6.2=0 关闭 LCD 使能 #define lcden_1 P6OUT|=BIT2;//P6.2=1 打开 LCD 使能

void delay(unsigned int z) {

unsigned int i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); }

void write_com(char com) // 写入 {

lcdrs_0; //LCD 选择输入命令

P5OUT=com; // 向 P0 口输入命令 delay(5); // 延时

lcden_1; // 打开 LCD 使能 delay(5); // 一个高脉冲 lcden_0; // 关闭 LCD 使能 }

void write_data(char dataout) {

lcdrs_1; // 设置为输入数据

P5OUT=dataout; // 将数据赋给 P0 口 delay(5); // 延时 lcden_1; // 置高 delay(5); // 高脉冲

lcden_0; // 置低 完成高脉冲 }

void lcdinit() {

lcden_0;

write_com(0x38); // 设置 16x2 显示 5x7 点阵, 8 位数据接口

33

write_com(0x0c); // 设置开始显示 不显示光标 write_com(0x06); // 写一个字符后地址指针加 1 write_com(0x01); // 显示清零 数据指针清零 }

Lcd.h头文件

extern void delay(unsigned int z); extern void write_com(char com); extern void write_data(char dataout); extern void lcdinit();

3)仿真与结果分析

图5.22 输入信号参数设置

34

LCD1LM016LVSSVDDVEERSRWE456RSEN123P50P51P52P53P54P55P56P577891011121314D0D1D2D3D4D5D6D7U112131415161718192021222324252627P1.0/TACLK/CAOUTP1.1/TA0P1.2/TA1P1.3/TA2P1.4/SMCLKP1.5/TA0P1.6/TA1P1.7/TA2P4.0/TB0P4.1/TB1P4.2/TB2P4.3/TB3P4.4/TB4P4.5/TB5P4.6/TB6P4.7/TBCLK363738394041424344454647484950515960612345610711896462P50P51P52P53P54P55P56P57RSP61ENP63P64P65P66P67U1(P4.0/TB0)P2.0/ACLK/CA2P5.0/UCB1STE/UCA1CLKP2.1/TAINCLK/CA3P5.1/UCB1SIMO/UCB1SDAP2.2/CAOUT/TA0/CA4P5.2/UCB1SOMI/UCB1SCLP2.3/CA0/TA1P5.3/UCB1CLK/UCA1STEP2.4/CA1/TA2P5.4/MCLKP2.5/ROSC/CA5P5.5/SMCLKP2.6/ADC12CLK/CA6P5.6/ACLKP2.7/TA0/CA7P5.7/TBOUTH/SVSOUTP3.0/UCB0STE/UCA0CLKP3.1/UCB0SIMO/UCB0SDAP3.2/UCB0SOMI/UCB0SCLP3.3/UCB0CLK/UCA0STEP3.4/UCA0TXD/UCA0SIMOP3.5/UCA0RXD/UCA0SOMIP3.6/UCA1TXD/UCA1SIMOP3.7/UCA1RXD/UCA1SOMIXT2OUTXT2INRST/NMITCKTDI/TCLKTDO/TDITMSMSP430F249P6.0/A0P6.1/A1P6.2/A2P6.3/A3P6.4/A4P6.5/A5P6.6/A6P6.7/A7/SVSINVEREF+VREF+VREF-/VEREF-XINXOUTAVCCAVSSC1XT2OUT20pFX2C220pF8MHzXT2IN282930313233343552535857555456X132768Hz 图5.23 实例5.5仿真结果图

第5章思考题与练习

1. msp430f249定时/计数器的时钟源有哪些?预分频器的作用是什么? 2. msp430f249定时/计数器的定时范围是多少?

3. 在msp430f249单片机中,假设SMCLK=8MHz,ACLK=32768Hz。要求编程实现为定时器A配置时钟源和工作模式,从P1.0输出周期1s的方波信号,无需CPU干预。

4. 编程实现使用msp430f249的定时/计数器产生周期50ms、占空比30%的PWM信号,并在proteus上完成仿真。

5. 使用定时器A对外部输入的脉冲信号进行计数,当计满100次时,定时器A暂停计数且蜂鸣器响1s,然后定时器A又从0开始计数,两位LED数码管能够实时显示当前计数值。

6. 设计一个30s倒计时器,用两位数码管显示,要求使用定时器B作为秒计时器。

7. 使用定时器B设计一个分频器,用两位数码管显示分频系数,按K1键分频系数递增,按K2键分频系数递减,分频值1~10。

8. 使用定时器B设计一个占空比可调的PWM信号发生器,按K1键占空比以10%递增,按K2键占空比以10%递减。

35

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库MSP430F249的定时器计数器(7)在线全文阅读。

MSP430F249的定时器计数器(7).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/608186.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: