别的项目中,除非仔细地理顺函数关系,然后寻找并复制每一段函数。
合理的方法是将一个大程序划分为若干个小的 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
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)在线全文阅读。
相关推荐: