基于MSP430时钟程序(详细版)
MSP430主系统时钟以及430的低功耗设置

LPM3_EXIT;//退出低功耗模式
}
tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!
BCSCTL1&=~XT2OFF;//~0x80
do
{
IFG1&=~OFIFG;//OFIFG为1表示外部晶体振荡器失效
for(i=0xff;i0;i--);//IFG1是InterruptFlag1
}
while((IFG1&OFIFG));//表示振荡器已经起振
BCSCTL2|=SELM_2;//#defineSELM_2(0x80)/*MCLKSourceSelect2:XT2CLK/LF
关闭外部中断:_DINIT();
430外部中断的模式
#include
main(void)
{
BCSCTL1=DIVA_2;//(0x20)/*ACLKDivider2:/4*/
WDTCTL=WDT_ADLY_1000;//直接将看门狗定时器变成定时器,定时
时间是1000毫秒
IE1=WDTIE;//打开定时器中断
P2DIR|=BIT3;
while(1)
{
unsignedinti;
_BIS_SR(LPM3_bits+GIE);//进入低功耗模式3,这种时候,cpu停止工
作,同时打开总的中断//_BIS_SR是一个本增函数,
//_BIS_SR()是一个本增函数,通过本函数可以对寄存器进行直接的操作
//这句话等价于_EINT();
//LPM3;
P2OUT&=~BIT3;//相当于把第五位输出0
for(i=180000;i0;i--);//延时
基于msp430单片机的数字时钟

摘要:日期时间显示器可以说是各种各样,随处可见,这里我们着重设计一款超低功耗的,显示内容较为丰富的日期时间显示器。
该日期时间显示器是基于MSP430单片机和LCD1602液晶显示器。
MSP430单片机最显著的特点是能够超低功耗运行,正是由于这一特点,用MSP430来做日期时间显示器,可以很有效地降低功耗,节约电能。
同时LCD1602是微功耗的液晶显示器,显示内容丰富。
目录摘要 (1)一、MSP430单片机最小系统 (3)二、LCD1602液晶显示器 (3)三、按键和闹铃 (6)四、主程序框图 (7)五、MSP430单片机的内部设置 (8)1、时钟系统与低功耗模式 (8)2、I/O口 (9)3、Basic Timer基础定时器 (10)一、MSP430单片机最小系统在传统的微处理器系统中,要让系统运行,至少要提供电源、时钟和复位信号,而在MSP430单片机中,内部就带有复位电路(BOR)、片内数控时钟源(DCO),因此只需外加电源即可构成可运行的最小系统。
由于内部DCO误差很大(20%),且受温度影响严重。
只适合为CPU运算提供时钟,或在对时间误图1差要求极其宽松的场合。
但是在这里我们要做日期时间显示器,就必须通过外部晶体作为时钟源。
MSP430单片机通常使用32.768kHz的手表晶振作为外部时钟。
MSP430最小系统设计如图1所示。
二、LCD1602液晶显示器LCD1602是工业字符型液晶,能够同时显示16×02即32个字符。
市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此表1HD44780写的控制程序可以很方便地应用于市场上大部分的字符型液晶。
字符型LCD通常有14个引脚线或16个引脚线,多出来的两条线是背光电源线VCC (15脚)和地线GND(16脚),其控制原理与14脚的LCD完全相同。
管脚具体定义如表1所示。
HD44780内置了DDRAM、CGROM和CGRAM。
MSP430时钟设置程序

MSP430时钟设置程序MSP430时钟设置程序1/void main (void){unsigned int i;WDTCL = WDTPW+WDTHOLD; //停止看门狗P5DIR = 0x10; //设置P5.4输出P5SEL = 0x10; //设置P5.4口为外围模块用作MCLK信号输出BCSCTL1 &= ~XT2OFF; //使TX2有效,TX2上电时默认为关闭的.do{IFG1 &= ~OFIFG; //清振荡器失效标志for(i= 0xff; i>;0; i--); //延时,待稳定.}while ((IFG1 & OFIFG)!=0); //若振荡器失效标志有效BCSCTL2 |= SELM1; //使MCLK = XT2for(;;);}2/#include ;void main(void){unsigned int i;WDTCTL = WDTPW + WDTHOLD; //停止看门狗BCSCTL1 |= XTS;//设置时基寄存器1,使ACLK = LFXT1 = HF XTAL,也就是高频模式.P2DIR|= 0x01; //设置P2.0方向寄存器为输出P2SEL |= 0x01; //设置P2.0口为外围模块用作ACLK信号输出P1DIR |= 0x02; //设置P1.1方向寄存器为输do{IFG1 &= ~OFIFG; //清振荡器失效标志for (i = 0xFF; i >; 0; i--); //延时,待稳定}while ((IFG1 & OFIFG)); //若振荡器失效标志有效? BCSCTL2 |= SELM_3;//设置时基寄存器2,使主时钟信号MCLK = LFXT1 (可靠的) for (;;) //无穷循环{P1OUT |= 0x02; // P1.1 = 1P1OUT &= ~0x02; // P1.1 = 0}}1-LFXT1CLK:低频/高频时钟源.由外接晶体振荡器,而无需外接两个振荡电容器.较常使用的晶体振荡器是32768HZ。
MSP430 CLK配置说明(十分详细)

do
{
IFG1 &= ~OFIFG; //清除晶振失败标志
BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振
ACLK MCLK SMCLK
(手表) (三种) (两种)
第二步相当于把所有系统所有时钟全部都配置好了,ACLK配置为XT1;MCLK(三种可选);SMCLK(两种---------------------- SMCLK(来源有两个,一个8M,一个OSC)
ACLK上电默认为XT1。MCLK,SMCLK上电默认为OSC
配置时钟过程:
第一步:
for (i = 0xFF; i > 0; i--); //等待8MHz晶体起振
}
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
第二步:
for (i = 0xFF; i > 0; i--); //等待8MHz晶体起振
}
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振
对应最简程序:(直接复制粘贴)
BCSCTL1 &= ~XT2OFF; //打开XT2高频晶体振荡器
do
{
IFG1 &= ~OFIFG; //清除晶振失败标志
|
XT2 8M HZ ------------------------------ MCLK(来源有三个,两个晶振,一个0SC)
MSP430单片机时钟程序的设计

MSP430单片机时钟程序的设计在430中,一个时钟周期=MCLK晶振的倒数。
如果MCLK是8M,则一个时钟周期为1/8us;一个机器周期=一个时钟周期,即430每个动作都能完成一个基本操作;一个指令周期=1~6个机器周期,具体根据具体指令而定。
另:指令长度,只是一个存储单位与时间没有必然关系。
MSP430根据型号的不同最多可以选择使用3个振荡器。
我们可以根据需要选择合适的振荡频率,并可以在不需要时随时关闭振荡器,以节省功耗。
这3个振荡器分别为:(1)DCO 数控RC振荡器。
它在芯片内部,不用时可以关闭。
DCO的振荡频率会受周围环境温度和MSP430工作电压的影响,且同一型号的芯片所产生的频率也不相同。
但DCO的调节功能可以改善它的性能,他的调节分为以下3个步骤a:选择BCSCTL1.RSELx确定时钟的标称频率;b:选择DCOCTL.DCOx在标称频率基础上分段粗调;c:选择DCOCTL.MODx的值进行细调。
(2)LFXT1 接低频振荡器。
典型为接32768HZ的时钟振荡器,此时振荡器不需要接负载电容。
也可以接450KHZ~8MHZ的标准晶体振荡器,此时需要接负载电容。
(3)XT2 接450KHZ~8MHZ的标准晶体振荡器。
此时需要接负载电容,不用时可以关闭。
低频振荡器主要用来降低能量消耗,如使用电池供电的系统,高频振荡器用来对事件做出快速反应或者供CPU进行大量运算。
当然高端430还有锁频环(FLL)及FLL+等模块,但是初步不用考虑那么多。
MSP430的3种时钟信号:MCLK系统主时钟;SMCLK系统子时钟;ACLK辅助时钟。
(1)MCLK系统主时钟。
除了CPU运算使用此时钟以外,外围模块也可以使用。
MCLK 可以选择任何一个振荡器所产生的时钟信号并进行1、2、4、8分频作为其信号源。
(2)SMCLK系统子时钟。
供外围模块使用。
并在使用前可以通过各模块的寄存器实现分。
MSP430时钟配置

MSP430 频率(时钟)配置MSP430时钟:1、在MSP430单片机中一共有四个时钟源:(1)LFXT1CLK,为低速/高速晶振源,通常接32.768kHz晶振(2)XT2CLK,可选高频振荡器,外接标准高速晶振,通常是接8Mhz,也可以接400kHz~16Mhz;(3)DCOCLK,数控振荡器,为内部时钟,由RC震荡回路构成,受温度和电压的影响较大;若外部不接稳定的晶振电路,直接由内部时钟工作,则会因环境变化而导致性能不稳定。
(4)VLOCLK,内部低频振荡器,12kHz标准振荡器。
(要得到标准的12k则必须外接32768等晶振)2、在MSP430单片机内部一共有三个时钟系统:(1)ACLK:辅助时钟,通常由LFXT1CLK或VLOCLK作为时钟源,可以通过软件控制更改时钟的分频系数;(2)MCLK:主时钟,为系统内核提供时钟,它可以通过软件从四个时钟源选择或者从四个时钟源分频后选择为主时钟;(3)SMCLK:子时钟,也是可以由软件选择时钟源。
3、MSP430的时钟设置包括3个寄存器,DCOCTL、BCSCTL1、BCSCTL2、BCSCTL3MOD0~MOD4: Modulation Bit,频率的微调。
一般不需要DCO的场合保持默认初始值就行了。
XT5V: 1.DIVA0~DIVA1:选择ACLK的分频系数。
DIVA=0,1,2,3,ACLK的分频系数分别是1,2,4,8;XTS: 选择LFXT1工作在低频晶体模式(XTS=0)还是高频晶体模式(XTS=1)。
XT2OFF: 控制XT2振荡器的开启(XT2OFF=0)与关闭(XT2OFF=1)。
正常情况下把XT2OFF复位就可以了.DCOR: 0,选择内部电阻;1,选择外部电阻DIVS0~DIVS1: DIVS=0,1,2,3对应SMCLK的分频因子为1,2,4,8SELS: 选择SMCLK的时钟源, 0:DCOCLK; 1:XT2CLK/LFXTCLK.DIVM0~1: 选择MCLK的分频因子, DIVM=0,1,2,3对应分频因子为1,2,4,8.SELM0~1: 选择MCLK的时钟源, 0,1:DCOCLK, 2:XT2CLK, 3:LFXT1CLK我用的时候一般都把SMCLK与MCLK的时钟源选择为XT2。
MSP430单片机秒表程序(完整)

MSP430单片机"秒表" 程序(完整)/*******************************************************基于MSP430F449单片机的秒表*功能:秒计时,8位数码管显示,包括小时、分钟、秒和毫秒*此程序同样适用于其他系列单片机*by:duyunfu1987******************************************************/#include "msp430x44x.h"#define DPYOUT P3OUT //数码管的段选输出口#define DPYCOM P2OUT //38译码器的ABC输入#define OPENOUT P2OUT |= BIT3 //74HC573使能锁存段选#define CLOSEOUT P2OUT &= ~BIT3//74HC573无效int hour,min,sec,ms; //缓冲区定义,小时、分钟、秒、毫秒int count = 0; //2ms计数,计到5时ms增1//共“阴”极数码管的码表unsigned char LED7CC[] ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//延时n(us)void delay_us(int n){ while(n-- >0)_NOP();}//延时n(ms)void delay_ms(int dms){ int i;while(dms-- >0){ for(i=0;i<250;i++);}}//初始化缓冲区与IO口void Init(){hour = 0;min = 0;sec = 0;ms = 0;P2SEL = 0;P3SEL = 0;P2DIR |= BIT0+BIT1+BIT2+ BIT3;//A B C 使能位P2DIR &= ~(BIT4+BIT5+BIT6); //按键P3DIR = 0xff;P3OUT = 0x00;}//8位数码管动态显示函数void display(){DPYOUT = 0;_NOP();DPYOUT = LED7CC[ms%10]; DPYCOM = 7;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[ms/10]; DPYCOM = 6;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[sec%10]|0x80; DPYCOM = 5;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[sec/10]; DPYCOM = 4;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[min%10]|0x80; DPYCOM = 3;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[min/10]; DPYCOM = 2;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[hour%10]|0x80; DPYCOM = 1;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[hour/10]; DPYCOM = 0;OPENOUT;CLOSEOUT;}//按键处理函数void key_deal(int key){switch(key){case 0x60: //START--开始计时{ BTCTL = BT_ADL Y_2;IE2 |= BTIE;_EINT();}break;case 0x50: //STOP -- 停止BTCTL |= BTHOLD; break;case 0x30: //CLEAR--缓冲区清零{ hour = 0;min = 0;sec = 0;ms = 0;}break;default : break;}display();}//主函数void main( void ){int key;// Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;FLL_CTL0 |= XCAP18PF;Init();while(1){if((key = P2IN & 0x70)!=0x70){delay_ms(10);if((key = P2IN & 0x70)!=0x70){ key_deal(key);}}display();}}//BT中断服务程序,2ms计时#pragma vector = BASICTIMER_VECTOR__interrupt void BT_ISR(){count ++;if(count == 5){ count = 0;ms ++;}if(ms == 100){ms = 0;sec ++;if(sec == 60){sec = 0;min ++;if(min == 60){min = 0;hour ++;if(hour == 24)hour = 0;}}}}。
基于MSP430单片机的电子时钟设计说明

基于MSP430单片机的电子时钟设计说明
一、需求分析
本设计的目标是基于MSP430单片机来设计一款电子时钟。
电子时钟
可以用来显示当前的时间,比如时、分、秒;同时还具有闹钟功能,即可
以设置每天一些时刻提醒用户,提醒用户做件事情。
设计时,要注意以下
几个方面:
1、时间流逝的准确性:电子时钟的核心功能是准确显示当前的时间,即时针、分针、秒针在正确地流逝;同时也要考虑时间的准确性,用户可
以设置任意时间,时钟计时要按照设置的时间进行计时。
2、系统稳定性:电子时钟的系统稳定性极其重要,不能因为短暂的
停电等扰动,导致系统失去稳定,时间乱跳。
3、外观设计:在外观设计方面,电子时钟要求具有精美、简约的外观,而且要求清晰显示时间内容,用户可以视觉上感受时间的运行,同时
操作简单,操作界面友好;同时,为了满足用户的要求,要能够设置闹钟,并且有红色指示灯和蜂鸣器来提醒。
二、设计要求
1、MSP430单片机:采用MSP430F169作为主控制器,芯片的16位CPU具有较强的数据处理能力,可以有效调整时间性能,满足电子时钟计
时要求。
2、时间及闹钟设置:采用4×4键盘模块作为时间及闹钟设置。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//****************************************/*基于msp430写的简易时钟程序,1602显示,可实现时间初始值设定,按键调整时间,时分秒走时等。
因为初学430,故而写个时钟熟悉一下各个模块,年月日等只用了静态数组显示,下次再用时钟芯片写个正式版,与大家分享,共同学习!*///*******************************************#include <msp430x14x.h>#include "lcd1602.h"#include "key.h"#define uint unsigned int#define uchar unsigned charuchar miaoflag=1;uchar fenflag=0;uchar shiflag=0;unsigned char table0[]="DYS-2013-08-03";//*****************定时器A初始化**************************void Timer_A_init(){TACTL=TASSEL0+TACLR;//设置定时器A控制寄存器,TASSEL0为选择辅助时钟aclk//TACLR为清除定时器A计数器CCTL0=CCIE; //设置捕获/比较控制寄存器;CCIE使能捕获比较中断CCR0=16384*2; //设置捕获/比较寄存器,初始值为16384,对于32768hz的频率来说,即为0.5s;TACTL |=MC0; //使记计模式为增模式;_EINT(); //使能中断,这是一个c编译器所支持的内部过程;}//***********************设定初始时间****************************void timeset_init()//初试时间设定11:11:11{miaoflag=11;fenflag=11;shiflag=11;}//*****************判断按键是否按下******************void anjian(void){while(1){//keyflag=0;delay2();if((P3IN&0x30)&&((P3IN&0x30)!=48)){delay2();if((P3IN&0x30)&&((P3IN&0x30)!=48)){switch(P3IN&0x30){case 16: fenflag++;//这部分可酌情添加按键以实现加减时分秒等break;case 32: shiflag++;break;default :break;}}}}}//******************主函数***************************************void main(){uchar flag;// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;lcd1602_init();Timer_A_init();key_init();display2(0x80,table0);timeset_init();anjian();}//********************中断函数*******************************#pragma vector=TIMERA0_VECTOR //430中断表达形式;__interrupt void Timer_A(void){uchar miaoge,miaoshi,fenge,fenshi,shishi,shige;miaoge=miaoflag%10+0x30;miaoshi=miaoflag/10+0x30;fenge=fenflag%10+0x30;fenshi=fenflag/10+0x30;shige=shiflag%10+0x30;shishi=shiflag/10+0x30;DisplayOneChar(7,1,miaoshi);DisplayOneChar(8,1,miaoge);DisplayOneChar(6,1,':');DisplayOneChar(5,1,fenge);DisplayOneChar(4,1,fenshi);DisplayOneChar(3,1,':');DisplayOneChar(2,1,shige);DisplayOneChar(1,1,shishi);miaoflag++;if(miaoflag==60){miaoflag=0;fenflag++;}if(fenflag==60){fenflag=0;shiflag++;}}//***************************************************8附录上述用到的几个自己写的头文件//key.h头文件#include <msp430x14x.h>#define uint unsigned int#define uchar unsigned charuchar keyflag;/*******************************************函数名称:delay功能:用于消抖的延时参数:无返回值:无********************************************/void delay2(void){uint tmp;for(tmp = 12000;tmp > 0;tmp--);}//*******************************void key_init(){P3DIR &=~(BIT5+BIT4);//按键P3.5、P3.4}//*************************************************//1602.h头文件//MSP430写的1602液晶显示程序2010-07-11 01:08//硬件连接P2 数据口P6.5---E P6.4---RW P6.3----RS#include"msp430x14x.h"#define uint unsigned int#define rw(x) P3OUT=(P3OUT&(~BIT6))|(x?BIT6:0);#define uchar unsigned char//**************延时***********************************void delay(uint z){uint t,y;for(t=z;t>0;t--)for(y=110;y>0;y--);}//*******写命令*****************************************void write_com(unsigned char com){P6OUT&=~BIT3;//作为RS选择端低电平有效rw(0);P2OUT=com;delay(1);P6OUT|=BIT5;delay(5);P6OUT&=~BIT5;}//*******写数据*************************************************** void write_data(unsigned char date){P6OUT|=BIT3;//作为RS选择端高电平有效劳rw(0);P2OUT=date;delay(1);P6OUT|=BIT5;//作为E选择端=1;delay(5);P6OUT&=~BIT5;}//********初始化******************************************void lcd1602_init(){P6DIR=0xff;//P3输出作控制口P6SEL=0;P6OUT=0x00;P6OUT&=~BIT5;//EP6OUT&=~BIT3;//RSP2DIR=0XFF;//P4输出作数据口//P2SEL=0; //P2OUT=0X00;write_com(0x38);//显示模式设置write_com(0x0c);//开显示,不显光标write_com(0x06);//数据地址指针write_com(0x01);//清屏_BIS_SR(GIE);//两个开总中断的方法随便用哪一个// _EINT();}//***************数组静态显示********************************** void display2(unsigned char x,unsigned char *p){unsigned char y=0; //y要给其初值0否则出乱码write_com(x);while(p[y]!=0x00){write_data(p[y]);y++;delay(15);}}//*************************************************void DisplayOneChar(uchar X,uchar Y,uchar DData){Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;write_com(X);write_data(DData);}//************************结束*********************************。