MSP430输入频率(c语言)
MSP430串口波特率的设置与计算

MSP430串口波特率的设置与计算
波特率是指每秒钟传输的位数,单位为波特(bps)。
在MSP430中,我们可以通过计算和设置分频器的值来实现不同的波特率。
下面是计算MSP430串口波特率的步骤:
1.确定MSP430的工作频率。
2.确定所需的波特率。
3.根据波特率和工作频率的关系,计算出分频系数的值。
4.将计算得到的分频系数的低8位和高8位写入UCAxBR0和UCAxBR1寄存器。
例如,假设MSP430的工作频率为16MHz,我们想要设置的波特率为9600bps,那么计算步骤如下:
1.工作频率为16MHz。
2. 波特率为9600bps。
4. 将BRx的值分解为低8位和高8位。
假设取整数部分为104,小数部分取0.1667乘以256,得到43、则UCAxBR0的值为43,UCAxBR1的值为0。
将这两个值写入寄存器即可设置波特率为9600bps。
需要注意的是,不同型号的MSP430可能有不同的时钟源和分频系数的范围。
在设置波特率时,应查阅相关的芯片手册或数据表,对相应的寄存器进行设置。
总结起来,MSP430串口波特率的设置与计算包括确定工作频率,确定所需波特率,计算分频系数,写入寄存器。
通过合适的设置,可以实现稳定和准确的串口通信。
MSP430频率计程序

这两天在搞频率计的问题,开始的时候思路很清晰,但是实现起来比较麻烦。
想测量一个方波的频率,有两种方法,一个是测频率,就是定时1S然后计数方波的高电平个数。
另一个是测周期法,就是测量方波的一个周期的时长,从而得到频率。
第一种方法很简单,下面讲讲我用的第二种方法。
思路是这样的,利用定时器的捕获功能,捕获方波的上升沿,将两次比较的值相减,就能得出两个上升沿之间定时器的计数值,然后处理一下计数值,就能得到正确的频率。
设置两个变量,一个是new_cap,一个是old_cap。
捕获得到新的TAR数值赋给new_cap,再将上一次捕获的数值赋给old_cap,然后两值相减就能得到一个周期的计数值。
(程序中将体现)最开始写的时候,显示的频率不对,今天改动了一下。
用定时器A1,然后比较TAIV的值再进行频率数值计算。
再将显示函数放在主函数里面循环就对了。
(昨天把显示函数放在中断里面了,不知道有啥关系不,知道的提示下,谢谢了)程序贴出来供大家参考//*****************************************************////*****P1.2为定时器A1的CCI1A输入端,信号从P1.2输入********////*****定时器时钟为SMCLK(DCO=1Mhz),不用分频*********////************ ————————————————*************////*****P1.0 ->|(比较器输入) |************////*****P1.1 ->|(LCDRS) P2.0|->D0*******////*****P1.2 ->|(定时器输入)<--- ~ | ~********////*****P1.3 ->|(LCDEN) | P2.7|->D7*****////*****P1.7 ->|(比较器输出)---- |*********////***********| msp30g2553 |********////***********| 制作人:wusong |*******////*********************************************//#include<msp430g2553.h>#include<1602.h>#define uchar unsigned char#define uint unsigned intuchar table[]={"frequency:"};uchar table_num[]={"0123456789"};uint new_cap,old_cap,cap_diff,fre;void LCD_display(){write_com(0x80);fre = 10000000/cap_diff;/////////////这个是将计数值转换为频率。
MSP430中文数据手册

MSP430混合信号微控制器数据手册产品特性●低电压范围:2.5V~5.5V●超低功耗——活动模式:330μA at 1MHz, 3V——待机模式:0.8μA——掉电模式(RAM数据保持):0.1μA●从待机模式唤醒响应时间不超过6μs●16位精简指令系统,指令周期200ns●基本时钟模块配置——多种内部电阻——单个外部电阻——32kHz晶振——高频晶体——谐振器——外部时钟源●带有三个捕获/比较寄存器的16位定时器(Timer_A)●串行在线可编程●采用保险熔丝的程序代码保护措施●该系列产品包括——MSP430C111:2K字节ROM,128字节RAM——MSP430C112:4K字节ROM,256字节RAM——MSP430P112:4K字节OTP,256字节RAM●EPROM原型——PMS430E112:4KB EPROM, 256B RAM●20引脚塑料小外形宽体(SOWB)封装,20引脚陶瓷双列直插式(CDIP)封装(仅EPROM)●如需完整的模块说明,请查阅MSP430x1xx系列用户指南(文献编号:SLAU049产品说明TI公司的MSO43O系列超低功耗微控制器由一些基本功能模块按照不同的应用目标组合而成。
在便携式测量应用中,这种优化的体系结构结合五种低功耗模式可以达到延长电池寿命的目的。
MSP430系列的CPU采用16位精简指令系统,集成有16位寄存器和常数发生器,发挥了最高的代码效率。
它采用数字控制振荡器(DCO),使得从低功耗模式到唤醒模式的转换时间小于6μs.MSP430x11x系列是一种超低功耗的混合信号微控制器,它拥有一个内置的16位计数器和14个I/0引脚。
典型应用:捕获传感器的模拟信号转换为数据,加以处理后输出或者发送到主机。
作为独立RF传感器的前端是其另一个应用领域。
DW封装(顶视图)可用选型功能模块图管脚功能简介:1.CPUMSP430的CPU采用16位RISC架构,具有高度的应用开发透明性。
MSP430单片机入门例程

MSP430单片机入门例程MSP430单片机是一款低功耗、高性能的16位单片机,广泛应用于各种嵌入式系统。
下面是一个简单的MSP430单片机入门例程,可以让大家初步了解MSP430单片机的基本使用方法。
所需材料:1、MSP430单片机开发板2、MSP430单片机编译器3、MSP430单片机调试器4、电脑和相关软件步骤:1、安装MSP430单片机编译器首先需要安装MSP430单片机的编译器,该编译器可以将C语言代码编译成MSP430单片机可以执行的机器码。
在安装编译器时,需要选择与您的单片机型号匹配的编译器。
2、编写程序下面是一个简单的MSP430单片机程序,可以让LED灯闪烁:c本文include <msp430.h>int main(void)本文P1DIR |= 0x01; //设置P1.0为输出while(1){P1OUT ^= 0x01; //反转P1.0的状态,LED闪烁__delay_cycles(); //延时一段时间,控制闪烁频率}本文上述程序中,首先定义了P1DIR寄存器,将P1.0设置为输出。
然后进入一个无限循环,在循环中反转P1.0的状态,使LED闪烁。
使用__delay_cycles()函数实现延时,控制LED闪烁频率。
3、编译程序使用MSP430单片机编译器将程序编译成机器码,生成可执行文件。
在编译时,需要注意选择正确的编译器选项和单片机型号。
4、调试程序使用MSP430单片机调试器将可执行文件下载到单片机中,并使用调试器进行调试。
在调试时,可以观察单片机的输出口状态和LED灯的闪烁情况,确保程序正常运行。
随着嵌入式系统的发展,MSP430单片机作为一种低功耗、高性能的微控制器,在各种应用领域中得到了广泛的应用。
为了更好地理解和应用MSP430单片机,我在学习过程中积累了一些经验,现在分享给大家。
MSP430单片机是一种超低功耗的微控制器,由德州仪器(Texas Instruments)推出。
Msp430频率计c语言代码实现

Msp430频率计c语言代码实现#include <msp430x14x.h>#define uint unsigned intuint i,f;unsigned char table[] = " Hz";//******************延时函数*******************************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){P3OUT&=~BIT0; //作为RS选择端低电平有效P3OUT&=~BIT1; //rw位置低P4OUT = com;delay(5);P3OUT|=BIT2; //E选择端置高电平;P3OUT&=~BIT2; //E置低电平}//*******************写数据********************************** void write_data(unsigned char date){P3OUT|=BIT0; //作为RS选择端高电平有效P3OUT&=~BIT1 ; //rw位置低P4OUT=date;delay(5);P3OUT|=BIT2; //E选择端置高电平;P3OUT&=~BIT2; //E置低电平}//********************初始化***********************************void init(){P3DIR=0xff; //P3输出作控制口P3SEL=0;P3OUT=0x00;P3OUT&=~BIT2; //EP3OUT&=~BIT0; //RSP4DIR=0XFF; //P4输出作数据口P4SEL=0;P4OUT=0X00;write_com(0x38); //显示模式设置write_com(0x0c); //开显示,不显光标write_com(0x06); //数据地址指针write_com(0x01); //清屏_BIS_SR(GIE); //开总中断}//********************液晶显示函数************************void display(unsigned char x,unsigned char *p){unsigned int NUM;write_com(x);for(NUM=0;NUM<10;NUM++){write_data(table[NUM]);}}//***********************主函数**************************************************void main(void){WDTCTL = WDT_ADLY_250; // WDT 250ms, ACLK, interval timer IE1 |= WDTIE; // Enable WDT interruptTACTL = TASSEL_0 + TACLR + TAIE + MC1; //定时器A选择外部时钟源,开中断,连续计数模式P1DIR &= ~BIT0; //P1.0输入P1SEL |= BIT0; //P1.0做定时器A的外部信号源输入端口_EINT(); //开总中断while(1){if(f != 0){IE1 &= ~WDTIE; //关看门狗中断table[0] = f/100000 + '0'; //设置液晶输出数组table[1] = f/10000 - 10*(f/100000) + '0';table[2] = f/1000 - 10*(f/10000) + '0';table[3] = f/100 - 10*(f/1000) + '0';table[4] = f/10 - 10*(f/100) + '0';table[5] = f - 10*(f/10) + '0';init();while(1){display(0x80,table); //液晶显示}}}}// Watchdog Timer interrupt service routine#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){i = TAR;f = 4*i;}。
MSP430单片机C语言的基本结构

第 1页/共 13 页
例 1:C 程序的基本结构。图 1 的例子基本说明了 C 程序的基本结构,不论你的程序是大还是小,头文件、 主函数总是需要的。注意图中红色的标注,可以帮助我们理解在程序中每条语句是怎样被执行的。
图 1. C 程序的基本结构 如果要打一个比较形象的比喻,上面这个小例子的基本结构就是通过 while(1)语句让 CPU 在那儿不停 地跑圈,一直不停地依次执行相同的任务:间隔地点亮红色和绿色 LED。如果画一张图的话,应该像图 2 所示。
图 3. C 程序中的宏定义和引用
第 3页/共 13 页
例 3:C 程序中函数的定义和调用。定义函数和调用函数是 C 语言最突出的特点之一,也最有挑战性,函 数的英文名称是 Function,字面意义上就是一个功能,数学里的函数不就是一个功能吗? y f ( x ) 6 x 2 , 就是完成了一个功能,一个抛物线的功能。 C 语言中,通过定义函数完成相应的功能,并通过在主函数 main( )中调用函数来实现其功能。在函数定义中还可以给函数传递参数(形参) ,函数中还可以有复杂的 数学运算及逻辑处理。函数可以有返回值,也可以没有返回值(只完成某些操作) 。在图 4 的示例中只定 义了几个简单的函数,没有传递参数,没有复杂的数学或逻辑运算,也没有返回值。很多情况下,有些函 数定义了,但在主函数中没有调用它,则这个函数是不起作用的。
第 13页/共 13 页
第 7页/共 13 页
以下各图示例了 430 的头文件中的宏定义,包括各寄存器的定义,寄存器中各位的定义等等。这些头 文件中的内容千万不要动,不要改变,否则会很麻烦的。除非你很清楚你在干什么。 (后面还有一些文字, 请耐心看到最后一页)
第 8页/共 13 页
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 C 程序

>>>>>>>>>>>BoardConfig.h<<<<<<<<<<<typedef unsigned char uchar;typedef unsigned int uint;//控制位的宏定义#define Ctrl_Out P3DIR |= BIT3 + BIT6 + BIT7;#define Ctrl_0 P3OUT &= ~(BIT3 + BIT6 + BIT7)#define SRCLK_1 P3OUT |= BIT7#define SRCLK_0 P3OUT &= ~BIT7#define SER_1 P3OUT |= BIT6#define SER_0 P3OUT &= ~BIT6#define RCLK_1 P3OUT |= BIT3#define RCLK_0 P3OUT &= ~BIT3//板上资源配置函数void BoardConfig(uchar cmd){uchar i;Ctrl_Out;Ctrl_0;for(i = 0; i < 8; i++){SRCLK_0;if(cmd & 0x80) SER_1;else SER_0;SRCLK_1;cmd <<= 1;}RCLK_1;_NOP();RCLK_0;}>>>>>>>>>>>cry1602.h<<<<<<<<<<<void DispNChar(unsigned char x,unsigned char y, unsigned char n,unsigned char *ptr); void LocateXY(unsigned char x,unsigned char y);void Disp1Char(unsigned char x,unsigned char y,unsigned char data);void LcdReset(void);void LcdWriteCommand(unsigned char cmd,unsigned char chk);void LcdWriteData( unsigned char data );void WaitForEnable(void);void Delay5ms(void);void Delay400ms(void);>>>>>>>>>>>cry1602.c<<<<<<<<<<<#include <msp430x14x.h>#include "cry1602.h"typedef unsigned char uchar;typedef unsigned int uint;/**************宏定义***************/#define DataDir P4DIR#define DataPort P4OUT#define Busy 0x80#define CtrlDir P3DIR#define CLR_RS P3OUT&=~BIT0; //RS = P3.0 #define SET_RS P3OUT|=BIT0;#define CLR_RW P3OUT&=~BIT1; //RW = P3.1#define SET_RW P3OUT|=BIT1;#define CLR_EN P3OUT&=~BIT2; //EN = P3.2#define SET_EN P3OUT|=BIT2;/*******************************************函数名称:DispNchar功 能:让液晶从某个位置起连续显示N个字符参 数:x--位置的列坐标y--位置的行坐标n--字符个数ptr--指向字符存放位置的指针返回值 :无********************************************/void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) {uchar i;for (i=0;i<n;i++){Disp1Char(x++,y,ptr[i]);if (x == 0x0f){x = 0;y ^= 1;}}}/*******************************************函数名称:LocateXY功 能:向液晶输入显示字符位置的坐标信息参 数:x--位置的列坐标y--位置的行坐标返回值 :无********************************************/void LocateXY(uchar x,uchar y){uchar temp;temp = x&0x0f;y &= 0x01;if(y) temp |= 0x40; //如果在第2行temp |= 0x80;LcdWriteCommand(temp,1);}/*******************************************函数名称:Disp1Char功 能:在某个位置显示一个字符参 数:x--位置的列坐标y--位置的行坐标data--显示的字符数据返回值 :无********************************************/void Disp1Char(uchar x,uchar y,uchar data){LocateXY( x, y );LcdWriteData( data );}/*******************************************函数名称:LcdReset功 能:对1602液晶模块进行复位操作参 数:无返回值 :无********************************************/void LcdReset(void){CtrlDir |= 0x07; //控制线端口设为输出状态 DataDir = 0xFF; //数据端口设为输出状态 LcdWriteCommand(0x38, 0); //规定的复位操作Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 1); //显示模式设置LcdWriteCommand(0x08, 1); //显示关闭LcdWriteCommand(0x01, 1); //显示清屏LcdWriteCommand(0x06, 1); //写字符时整体不移动LcdWriteCommand(0x0c, 1); //显示开,不开游标,不闪烁}函数名称:LcdWriteCommand功 能:向液晶模块写入命令参 数:cmd--命令,chk--是否判忙的标志,1:判忙,0:不判返回值 :无********************************************/void LcdWriteCommand(uchar cmd,uchar chk){if (chk) WaitForEnable(); // 检测忙信号?CLR_RS;CLR_RW;_NOP();DataPort = cmd; //将命令字写入数据端口 _NOP();SET_EN; //产生使能脉冲信号_NOP();_NOP();CLR_EN;}/*******************************************函数名称:LcdWriteData功 能:向液晶显示的当前地址写入显示数据参 数:data--显示字符数据返回值 :无********************************************/void LcdWriteData( uchar data ){WaitForEnable(); //等待液晶不忙SET_RS;CLR_RW;_NOP();DataPort = data; //将显示数据写入数据端口_NOP();SET_EN; //产生使能脉冲信号_NOP();_NOP();CLR_EN;}/*******************************************函数名称:WaitForEnable功 能:等待1602液晶完成内部操作参 数:无返回值 :无void WaitForEnable(void){P4DIR &= 0x00; //将P4口切换为输入状态CLR_RS;SET_RW;_NOP();SET_EN;_NOP();_NOP();while((P4IN & Busy)!=0); //检测忙标志CLR_EN;P4DIR |= 0xFF; //将P4口切换为输出状态}/******************************************* 函数名称:Delay5ms功 能:延时约5ms参 数:无返回值 :无********************************************/ void Delay5ms(void){uint i=40000;while (i != 0){i--;}}/******************************************* 函数名称:Delay400ms功 能:延时约400ms参 数:无返回值 :无********************************************/ void Delay400ms(void){uchar i=50;uint j;while(i--){j=7269;while(j--);}}>>>>>>>>>>>IIC.h<<<<<<<<<<<void Set_IO(void);void delay(void);void start(void);void stop(void);void mack(void);void mnack(void);unsigned char check(void);void write1(void);void write0(void);void write1byte(unsigned char wdata);unsigned char writeNbyte(unsigned char * outbuffer,unsigned char n); unsigned char read1byte(void);void readNbyte(unsigned char * inbuffer,unsigned char n); >>>>>>>>>>>IIC.c<<<<<<<<<<<#include <msp430x14x.h>typedef unsigned char uchar;typedef unsigned int uint;#define SCL_H P1OUT |= BIT1#define SCL_L P1OUT &= ~BIT1#define SDA_H P1OUT |= BIT0#define SDA_L P1OUT &= ~BIT0#define SCL_out P1DIR |= BIT1 //SCL设置为输出模式#define SDA_in P1DIR &= ~BIT0 //SDA改成输入模式#define SDA_out P1DIR |= BIT0 //SDA变回输出模式#define SDA_val P1IN&BIT0 //SDA的位值#define TRUE 1#define FALSE 0/*******************************************函数名称:Set_IO功 能:设置IIC对应IO为输出方向并输出高电平参 数:无返回值 :无********************************************/void Set_IO(void){SCL_out;SDA_out;SCL_H;SDA_H;}/******************************************* 函数名称:delay功 能:延时约100us的时间参 数:无返回值 :无********************************************/ void delay(void){uchar i;for(i = 0;i < 15;i++)_NOP();}/******************************************* 函数名称:start功 能:完成IIC的起始条件操作参 数:无返回值 :无********************************************/ void start(void){SCL_H;SDA_H;delay();SDA_L;delay();SCL_L;delay();}/******************************************* 函数名称:stop功 能:完成IIC的终止条件操作参 数:无返回值 :无********************************************/ void stop(void){SCL_H;SDA_L;delay();SDA_H;delay();}/*******************************************函数名称:check功 能:检查从机的应答操作参 数:无返回值 :从机是否有应答:1--有,0--无********************************************/ uchar check(void){uchar slaveack;SDA_in;SCL_H;delay();slaveack = SDA_val; //读入SDA数值SCL_L;delay();SDA_out;if(slaveack) return FALSE;else return TRUE;}/******************************************* 函数名称:write1功 能:向IIC总线发送一个1参 数:无返回值 :无********************************************/ void write1(void){SDA_H;delay();SCL_H;delay();SCL_L;delay();}/******************************************* 函数名称:write0功 能:向IIC总线发送一个0参 数:无返回值 :无********************************************/ void write0(void){SDA_L;delay();SCL_H;delay();SCL_L;delay();}/*******************************************函数名称:write1byte功 能:向IIC总线发送一个字节的数据参 数:wdata--发送的数据返回值 :无********************************************/void write1byte(uchar wdata){uchar i;for(i = 8;i > 0;i--){if(wdata & 0x80) write1();else write0();wdata <<= 1;}}>>>>>>>>>>>EEPROM.h<<<<<<<<<<<unsigned char Write_1Byte(unsigned char wdata,unsigned char dataaddress); unsigned char Write_NByte(unsigned char * outbuf,unsigned char n,unsigned char dataaddress);unsigned char Read_1Byte_currentaddress(void);unsigned char Read_NByte_currentaddress(unsigned char * readbuf,unsigned char n); unsigned char Read_1Byte_Randomaddress(unsigned char dataaddress);unsigned char Read_NByte_Randomaddress(unsigned char * readbuf,unsigned char n,unsigned char dataaddress);>>>>>>>>>>>EEPROM.c<<<<<<<<<<<#include "IIC.h"typedef unsigned char uchar;typedef unsigned int uint;#define deviceaddress 0xa0 //AT24C02的设备地址/*******************************************函数名称:delay_10ms功 能:延时约6ms,等待EEPROM完成内部写入参 数:无返回值 :无********************************************/void delay_10ms(void){uint i = 1000;while(i--);}/*******************************************函数名称:Write_1Byte功 能:向EEPROM中写入1个字节的数据参 数:Wdata--写入的数据dataaddress--数据的写入地址返回值 :写入结果:1--成功,0--失败********************************************/uchar Write_1Byte(uchar wdata,uchar dataaddress){start();write1byte(deviceaddress);if(check()) write1byte(dataaddress);else return 0;if(check()) write1byte(wdata);else return 0;if(check()) stop();else return 0;delay_10ms(); //等待EEPROM完成内部写入return 1;}/*******************************************函数名称:Write_NByte功 能:向EEPROM中写入N个字节的数据参 数:outbuf--指向写入数据存放首地址的指针n--数据个数,最大不能超过8,由页地址决定其最大长度dataaddress--数据写入的首地址返回值 :写入结果:1--成功,0--失败********************************************/uchar Write_NByte(uchar * outbuf,uchar n,uchar dataaddress){uchar flag;start();write1byte(deviceaddress); //写入器件地址if(check() == 1)write1byte(dataaddress); //写入数据字地址 elsereturn 0;if(check())flag=writeNbyte(outbuf,n);elsereturn 0;delay_10ms(); //等待EEPROM完成内部写入 if(flag) return 1;else return 0;}/*******************************************函数名称:Read_1Byte_currentaddress功 能:从EEPROM的当前地址读取1个字节的数据参 数:无返回值 :读取的数据********************************************/ uchar Read_1Byte_currentaddress(void){uchar temp;start();write1byte((deviceaddress|0x01));if(check())temp = read1byte();elsereturn 0;mnack();stop();return temp;}/*******************************************函数名称:Read_NByte_currentaddress功 能:从EEPROM的当前地址读取N个字节的数据参 数:readbuf--指向保存数据地址的指针n--读取数据的个数返回值 :读取结果:1--成功,0--失败********************************************/ uchar Read_NByte_currentaddress(uchar * readbuf,uchar n) {start();write1byte((deviceaddress|0x01));if(check())readNbyte(readbuf,n);elsereturn 0;return 1;}/*******************************************函数名称:Read_1Byte_Randomaddress功 能:从EEPROM的指定地址读取1个字节的数据参 数:dataaddress--数据读取的地址返回值 :读取的数据********************************************/uchar Read_1Byte_Randomaddress(uchar dataaddress){uchar temp;start();write1byte(deviceaddress);if(check())write1byte(dataaddress);elsereturn 0;if(check()){start();write1byte((deviceaddress|0x01));}elsereturn 0;if(check())temp = read1byte();elsereturn 0;mnack();stop();return temp;}/*******************************************函数名称:Read_NByte_Randomaddress功 能:从EEPROM的指定地址读取N个字节的数据参 数:readbuf--指向保存数据地址的指针n--读取数据的个数dataaddress--数据读取的首地址返回值 :读取结果:1--成功,0--失败********************************************/uchar Read_NByte_Randomaddress(uchar * readbuf,uchar n,uchar dataaddress) {start();write1byte(deviceaddress);if(check())write1byte(dataaddress);elsereturn 0;if(check()){start();write1byte(deviceaddress|0x01);}elsereturn 0;if(check())readNbyte(readbuf,n);elsereturn 0;return 1;}>>>>>>>>>>>ds1302.h<<<<<<<<<<< void delay(unsigned int time);void Reset_DS1302(void);void Write1Byte(unsigned char wdata);unsigned char Read1Byte(void);void W_Data(unsigned char addr, unsigned char wdata); unsigned char R_Data(unsigned char addr);void BurstWrite1302(unsigned char *ptr);void BurstRead1302(unsigned char *ptr);void BurstWriteRAM(unsigned char *ptr);void BurstReadRAM(unsigned char *ptr);void Set_DS1302(unsigned char *ptr);void Get_DS1302(unsigned char *ptr); >>>>>>>>>>>ds1302.c<<<<<<<<<<< #include <msp430x14x.h>typedef unsigned char uchar;typedef unsigned int uint;/**************宏定义***************/#define DS_RST BIT7 //DS_RST = P2.7#define DS_SCL BIT5 //DS_SCL = P2.5#define DS_SDA BIT6 //DS_SDA = P2.6#define DS_RST_IN P2DIR &= ~DS_RST#define DS_RST_OUT P2DIR |= DS_RST#define DS_RST0 P2OUT &= ~DS_RST#define DS_RST1 P2OUT |= DS_RST#define DS_SCL_IN P2DIR &= ~DS_SCL#define DS_SCL_OUT P2DIR |= DS_SCL#define DS_SCL0 P2OUT &= ~DS_SCL#define DS_SCL1 P2OUT |= DS_SCL#define DS_SDA_IN P2DIR &= ~DS_SDA#define DS_SDA_OUT P2DIR |= DS_SDA#define DS_SDA0 P2OUT &= ~DS_SDA#define DS_SDA1 P2OUT |= DS_SDA#define DS_SDA_BIT P2IN & DS_SDA/*******************************************函数名称:delay功 能:延时一段时间参 数:time--延时长度返回值 :无********************************************/ void delay(uint time){uint i;for(i=0;i<time;i++) _NOP();}/*******************************************函数名称:Reset_DS1302功 能:对DS1302进行复位操作参 数:无返回值 :无********************************************/ void Reset_DS1302(void){DS_RST_OUT; //RST对应的IO设置为输出状态DS_SCL_OUT; //SCLK对应的IO设置为输出状态 DS_SCL0; //SCLK=0DS_RST0; //RST=0delay(10);DS_SCL1; //SCLK=1}/*******************************************函数名称:Write1Byte功 能:对DS1302写入1个字节的数据参 数:wdata--写入的数据返回值 :无********************************************/ void Write1Byte(uchar wdata){uchar i;DS_SDA_OUT; //SDA对应的IO设置为输出状态 DS_RST1; //REST=1;for(i=8; i>0; i--){if(wdata&0x01) DS_SDA1;else DS_SDA0;DS_SCL0;delay(10);DS_SCL1;delay(10);wdata >>=1;}}/******************************************* 函数名称:Read1Byte功 能:从DS1302读出1个字节的数据参 数:无返回值 :读出的一个字节数据********************************************/ uchar Read1Byte(void){uchar i;uchar rdata=0X00;DS_SDA_IN; //SDA对应的IO设置为输入状态 DS_RST1; //REST=1;for(i=8; i>0; i--){DS_SCL1;delay(10);DS_SCL0;delay(10);rdata >>=1;if(DS_SDA_BIT) rdata |= 0x80;}return(rdata);}/******************************************* 函数名称:W_Data功 能:向某个寄存器写入一个字节数据参 数:addr--寄存器地址wdata--写入的数据返回值 :无********************************************/ void W_Data(uchar addr, uchar wdata){DS_RST0;DS_SCL0;_NOP();DS_RST1;Write1Byte(addr); //写入地址Write1Byte(wdata); //写入数据DS_SCL1;DS_RST0;}/*******************************************函数名称:R_Data功 能:从某个寄存器读出一个字节数据参 数:addr--寄存器地址返回值 :读出的数据********************************************/uchar R_Data(uchar addr){uchar rdata;DS_RST0;DS_SCL0;_NOP();DS_RST1;Write1Byte(addr); //写入地址rdata = Read1Byte(); //读出数据DS_SCL1;DS_RST0;return(rdata);}/*******************************************函数名称:BurstWrite1302功 能:以burst方式向DS1302写入批量时间数据参 数:ptr--指向时间数据存放地址的指针返回值 :读出的数据说 明:时间数据的存放格式是:秒,分,时,日,月,星期,年,控制 【7个数据(BCD格式)+1个控制】********************************************/void BurstWrite1302(uchar *ptr){uchar i;W_Data(0x8e,0x00); //允许写入DS_RST0;DS_SCL0;_NOP();DS_RST1;Write1Byte(0xbe); // 0xbe:时钟多字节写入命令for (i=8; i>0; i--){Write1Byte(*ptr++);}DS_SCL1;DS_RST0;W_Data(0x8e,0x80); // 禁止写入}/*******************************************函数名称:BurstRead1302功 能:以burst方式从DS1302读出批量时间数据参 数:ptr--指向存放时间数据地址的指针返回值 :无说 明:时间数据的存放格式是:秒,分,时,日,月,星期,年,控制 【7个数据(BCD格式)+1个控制】********************************************/void BurstRead1302(uchar *ptr){uchar i;DS_RST0;DS_SCL0;_NOP();DS_RST1;Write1Byte(0xbf); //0xbf:时钟多字节读命令for (i=8; i>0; i--){*ptr++ = Read1Byte();}DS_SCL1;DS_RST0;}/*******************************************函数名称:BurstWriteRAM功 能:以burst方式向DS1302的RAM中写入批量数据参 数:ptr--指向存放数据地址的指针返回值 :无说明 :共写入31个字节的数据********************************************/void BurstWriteRAM(uchar *ptr){uchar i;W_Data(0x8e,0x00); //允许写入DS_RST0;DS_SCL0;_NOP();DS_RST1;Write1Byte(0xfe); //0xfe:RAM多字节写命令for (i = 31; i>0; i--) //RAM共有31个字节{Write1Byte(*ptr++);}DS_SCL1;DS_RST0;W_Data(0x8e,0x80); //禁止写入}/*******************************************函数名称:BurstReadRAM功 能:以burst方式从DS1302的RAM中读出批量数据参 数:ptr--指向数据存放地址的指针返回值 :无说明 :共读出31个字节的数据********************************************/void BurstReadRAM(uchar *ptr){uchar i;DS_RST0;DS_SCL0;_NOP();DS_RST1;Write1Byte(0xff); //0xff:RAM的多字节读命令for (i=31; i>0; i--){*ptr++ = Read1Byte();}DS_SCL1;DS_RST0;}/*******************************************函数名称:Set_DS1302功 能:设置DS1302内部的时间参 数:ptr--指向存放数据地址的指针返回值 :无说明 :写入数据的格式:秒 分 时 日 月 星期 年 【共7个字节】 ********************************************/void Set_DS1302(uchar *ptr){uchar i;uchar addr = 0x80;W_Data(0x8e,0x00); //允许写入for(i =7;i>0;i--){W_Data(addr,*ptr++);addr += 2;}W_Data(0x8e,0x80); //禁止}/*********************************************************** 名称: Get_DS1302* 说明:* 功能: 读取DS1302当前时间* 调用: R_Data(uchar addr)* 输入: ucCurtime: 保存当前时间地址。
msp430的一些常用的C语言控制程序---RS232

msp430的一些常用的C语言控制程序---RS232//需要调试助手辅助才能观察到收或接的数据#include//void OSC_Init(void); void USATR0_Init(void);//void main(){WDTCTL = WDTPW + WDTHOLD;OSC_Init();USATR0_Init();_BIS_SR(GIE);//用调试助手可以检测,也可以结合按键观察到数据的传输}//void OSC_Init(void){BSCTL1 &= ~XT2OFF;//XT2 振荡器开启do //清OSCFault 标志{ IFG1 &= ~OFIFG; for (i=0xFF;i>0;i--); } while((IFG1&OFIFG));BSCTL2 |= (SELM_1 + SELS);//MCLK = XT2CLK,SMCLK = XT2CLK}//void USATR0_Init(void){P3SEL |= (BIT4 + BIT5);//选择端口的第二功能ME1 |= (UTXE0 + URXE0);//工作模式1,UART0 使能UCTL0 |= CHAR ;//发送字长,八位UTCTL0 |= (SSEL0 + SSEL1);//选择时钟源,用于确定波特率发生器的时钟源,选择辅助时钟ACLK,子系统时钟SMCLKUBR00 = 0x9F;//波特率选择寄存器低位UBR10 = 0x01;//波特率选择寄存器高位UMCTL0 = 0xB5;//波特率调整寄存器UCTL0 &= ~SWRST;//USATR 状态机初始化复位IE1 |= URXIE0;//允许USATR 中断}#pragma vector=UART0RX_VECTOR__interrupt void uart0_rx(void){while(!(IFG1 & UTXIFG0));//等待,看看接收寄存器里面是不是有数据TXBUF0 = RXBUF0;//将接收过来的数据在发出去}tips:感谢大家的阅读,本文由我司收集整编。
msp430的一些常用的C语言控制程序---ADC12(1)

msp430的一些常用的C语言控制程序---ADC12(1)说说关于AD 的程序吧:就写一下最简单的单通道单次采集吧://查询方式获取AD 值#include //我们的系统板子是msp430f149,所以得用这个头文件~void ADC_Init(void);unsigned ADC_Result;void main(void){ WDTCTL = WDTPW + WDTHOLD; ADC_Init(); while(1){ ADC12CTL0 |= ADC12SC;//ADC12SC 是当SAMPCON 由采样定时器产生,ADC12SC 由0 改为1 启动转换while(ADC12CTL1 & BIT0 == 1);//当ADC12BUSY == 1 时等待ADC_Result = ADC12MEM0;//这块可单步运行时在IAR 中观察到,或者有LED,可能对它处理一下显示~ }}//void ADC_Init(void) //初始化时钟{ P6DIR &= ~BIT6;//设置p6.6为输入,这个口和板子上的接口有关.对了,149 内置的是12 位AD,精度足够一般用了P6SEL |= BIT6; //选择P6.6 的第二功能口ADC12CTL0 = ADC12ON + REFON + SHT0_6 ;//AD 电源打开、参考电压打开、采样时间分频设置,一般6 或8 ADC12CTL0 &= ~REF2_5V; //选择1.5V 参考电压,这个因为采集到的电压值变化有关ADC12CTL1 |= SHP + CONSEQ_0+ SHS_0; //使用采样时钟,单通道单次采样ADC12MCTL0 = SREF_1 + INCH_6; //选择AD 参考电压和输入通道ADC12CTL0 |= ENC; //ADC 转化使能,此处一定得放在后面,要不结果容易出错} 这就是最简单的AD 采集了,430 还有另外三种模式,原理都差不多,就是多寄存器中的各位操作,这里我没有用中断模式,另外的三中模式得用中断方式来获得数据tips:感谢大家的阅读,本文由我司收集整编。
MSP430单片机C语言编程

TACTL |= MC0; //设置定时器工作模式为加计数到CCR0初值
P3DIR = 0XFF; //P3口为输出
P4DIR = 0XFF; //P4口为输出
P5DIR = 0XFF; //P5口为输出
P3OUT = 0X7E; //P3口输出为0111 1110
void main (void)
{
WDTCTL= WDTPW + WDTTMSEL+WDTSSEL;
IE1|=WDTIE;
P3DIR |=BIT7;
_EINT();
while(1);
}
interrupt[WDT_VECTOR] void WDT_interrupt (void)
P3DIR |=BIT7; //将P3.7设置为输出
_EINT(); //调用C430编译器内部函数,使能中断
while(1); //无限次循环
}
interrupt[TIMERA0_VECTOR] void Timer_A (void) //定时器A中断函数
{
P3OUT ^= BIT7; //P3.7位取反
右侧数码管与P4口相连,a~g,h对应P4.0~P4.7
(2)发光二极管
8 个发光二极管与P3 口连接
(3)按钮:
左侧8个按钮与P2口相连,引脚号标在按钮上方
右侧8个按钮与P1口相连,引脚号标在按钮上方
(4)P2.3引脚还是模拟比较器输入
(5)P6.0,P6.1引脚连接模拟量电位器,用于模拟量实验
//定义七段译码的共阳数码管显示数组
// hgfg dcba
如何使用C语言来编写MSP430的高质量代码

如何使用C语言来编写MSP430的高质量代码
微处理器一般用于特定环境和特定用途,出于成本、功耗和体积的考虑,一般都要求尽量节省使用资源,并且,由于微处理器硬件一般都不支持有符号数、浮点数的运算,且运算位有限,因此,分配变量时必须仔细。
另外要说明
的是,速度和存储器的消耗经常是2 个不可兼顾的目标,在多数情况下,编程
者必须根据实际情况作出权衡和取舍。
需要注意的事项如下:
1) 通常在满足运算需求的前提下,尽量选择为变量定义字节少的数据类型。
比如最常用的int 和char,int 是16 位的,char 是8 位的,如果没有必要,不要使用int,而且使用char 也最好使用unsigned char。
运行时,可以在变量窗口看到,使用类型为unsigned char 的变量是16 进制的格式,而使用int 的是十进制格式,如果char 没有定义为unsigned,会出现负号,如果没有必要的话,
在430 中是不需要负数的。
2) 尽量不用过长的数据类型,如long、long long 和double
3) MSP430 的C 编译器不支持位寻址,所以运算中尽量减少位操作,对
于只有是和否的变量,如果RAM 容量允许,则可分配为unsigned char 类型,可提高运算速度。
如果分配为某字节的某个位,可以减少存储器的消耗,但是
会降低运算速度
4) 避免使用浮点数,尽量使用定点数进行小数运算。
如果必须使用浮点数,则尽量用32 位的float,而不是64 位的double
5) 尽量将变量分配为无符号数据类型
6) 对于指针变量,如果声明后其值不再改变,则声明为const 类型,这。
IAR环境下的msp430c语言编程

IAR环境下的msp430c语言编程MSP430系列单片机实用C语言程序设计扩展的关键字1.asm也可以写成__asm。
功能是在C程序中直接嵌入汇编语言。
语法:asm(“string”);其中string必须是有效的汇编语句。
2.__interrupt放在函数前面,标志中断函数。
下面这段程序是异步串行口UART0的接收中断函数。
UART0RX_VECTOR为异步串行口UART0的接收中断向量。
举例:#pragma vector=UART0RX_VECTOR__interrupt void UART0_R(void) //UART0接收中断{TXBUF0=RXBUF0;}3.__monitor放在函数前面,功能是但这一函数执行的时候自动关闭中断。
应该尽量缩短这样的函数,否则,中断事件无法得到及时的响应。
4.__no_init放在全局变量前面,功能是使程序启动时不为变量赋初值。
5.__raw编译中断函数时,编译器会自动生成一段代码,首先保存当时所用到CPU内寄存器的内容,退出中断程序时再进行恢复。
将__raw放在中断函数前可以禁止保存CPU内寄存器的过程,当然退出时也不会恢复。
是否为中断函数使用此关键字要根据需要而定。
6.__regvar放在变量前面,作用是声明变量为寄存器变量。
可以用于整数、指针、32位浮点数以及只含有一个元素的结构和联合。
寄存器变量的地址只能为R4或者R5,也不能用指针指向这个寄存器变量,而且必须用__no_init禁止初始化。
如:__regvar __no_init unsigned char q0 @ __R4;其他不常用的关键字还有:__data16、__intrinsic、__noreturn、__root、__task、__word16。
内部函数本节将介绍内部函数的原型和功能。
1.__bcd_add_shortunsigned short __bcd_add_short(unsigned short, unsigned short);功能:两个16位BCD格式的数相加,返回和。
msp430最全的指令集

4)对应的SFR的中断位#define OFIFG 0x02#define OFIE 0x02九、SVSSVSCTL(0x0056) /* SVS Control */#define SVSFG (0x01) /* SVS Flag */#define SVSOP (0x02) /* SVS output (read only) */#define SVSON (0x04) /* Switches the SVS on/off */#define PORON (0x08) /* Enable POR Generation if Lo w Voltage */#define VLDON (0x10)#define VLDOFF (0x00)#define VLD_1_8V (0x10)十一、Timer A31)寄存器:TAIV (0x012E) 中断向量寄存器TACTL (0x0160) 控制寄存器CCTL0(0x0162) 捕获比较控制寄存器0CCTL1(0x0164) 捕获比较控制寄存器1CCTL2(0x0166) 捕获比较控制寄存器2TAR(0x0170) 寄存器CCR0(0x0172) 捕获比较寄存器0CCR1(0x0174) 捕获比较寄存器1CCR2(0x0176) 捕获比较寄存器22)TACTL中的各位SSEL1 SSEL0 输入信号TASSEL2 (0x0400) 未用0 0 TACLK(特定的外部信号)TASSEL1 (0x0200) 时钟选择0 1 ACLKTASSEL0 (0x0100) 时钟选择 1 0 MCLKID1 (0x0080) 输入信号分频:00 直通;01:2分频ID0 (0x0040) 与ID1一起:10 4分频11:8分频MC1 (0x0020) 两位一起:00 停止;01:增记数到CCR0;MC0 (0x0010) 模式控制:10 连续增记数,11 增记数到CCR0,减记数到0H;TACLR (0x0004) 定时器清除位TAIE (0x0002) 中断允许TAIFG (0x0001) 定时器溢出标志#define MC_0 (0*0x10u) /* Timer A mode control: 0 - Stop */#define MC_1 (1*0x10u) /* Timer A mode control: 1 - Up to C CR0 */#define MC_2 (2*0x10u) /* Timer A mode control: 2 - Continous up */#define MC_3 (3*0x10u) /* Timer A mode control: 3 - Up/Down */ #define ID_0 (0*0x40u) /* Timer A input divider: 0 - /1 */#define ID_1 (1*0x40u) /* Timer A input divider: 1 - /2 */#define ID_2 (2*0x40u) /* Timer A input divider: 2 - /4 */#define ID_3 (3*0x40u) /* Timer A input divider: 3 - /8 */#define TASSEL_0 (0*0x100u) /* Timer A clock source select: 0 - T ACLK */#define TASSEL_1 (1*0x100u) /* Timer A clock source select: 1 - ACLK */#define TASSEL_2 (2*0x100u) /* Timer A clock source select: 2 - SMCLK */#define TASSEL_3 (3*0x100u) /* Timer A clock source select: 3 - INCLK */3)捕获比较控制寄存器CCTLX对应的位CM1 (0x8000) 00 禁止01 上升沿捕获CM0 (0x4000) 10 下降沿捕获11 上升沿与下降沿都捕获CCIS1 (0x2000) CCIS0和CCIS1输入选择00 选择CCIXA;CCIS0 (0x1000) 01 选择CCIXB,10 GND 11 VCC SCS (0x0800) 0异步捕获 1 同步捕获SCCI (0x0400) 捕获比较输入信号与比较输出EQUX同步CAP (0x0100) 0 比较模式 1 捕获模式OUTMOD2 (0x0080)OUTMOD1 (0x0040)OUTMOD0 (0x0020)CCIE (0x0010) 1 允许中断 0 禁止中断CCI (0x0008) 捕获/比较输入信号选择OUT (0x0004)COV (0x0002)CCIFG (0x0001) 中断标志(与CCRX有关)#define OUTMOD_0 (0*0x20u) /* PWM output mode: 0 - output only */ #define OUTMOD_1 (1*0x20u) /* PWM output mode: 1 - set */#define OUTMOD_2 (2*0x20u) /* PWM output mode: 2 - PWM toggle/re set */#define OUTMOD_3 (3*0x20u) /* PWM output mode: 3 - PWM set/reset */#define OUTMOD_4 (4*0x20u) /* PWM output mode: 4 - toggle */#define OUTMOD_5 (5*0x20u) /* PWM output mode: 5 - Reset */#define OUTMOD_6 (6*0x20u) /* PWM output mode: 6 - PWM toggle/ set */#define OUTMOD_7 (7*0x20u) /* PWM output mode: 7 - PWM reset/s et */#define CCIS_0 (0*0x1000u) /* Capture input select: 0 - CCIxA */ #define CCIS_1 (1*0x1000u) /* Capture input select: 1 - CCIxB */ #define CCIS_2 (2*0x1000u) /* Capture input select: 2 - GND */#define CCIS_3 (3*0x1000u) /* Capture input select: 3 - Vcc */#define CM_0 (0*0x4000u) /* Capture mode: 0 - disabled */#define FSSEL_2 (0x0080) /* Flash clock select: 2 - SMCLK */#define FSSEL_3 (0x00C0) /* Flash clock select: 3 - SMCLK */#define BUSY (0x0001) /* Flash busy: 1 */#define KEYV (0x0002) /* Flash Key violation flag */#define ACCVIFG (0x0004) /* Flash Access violation flag */#define WAIT (0x0008) /* Wait flag for segment write */#define LOCK (0x0010) /* Lock bit: 1 - Flash is locked (read onl y) */#define EMEX (0x0020) /* Flash Emergency Exit */十三、比较器#define CACTL1 (0x0059) /* Comparator A Control 1 */#define CACTL2 (0x005A) /* Comparator A Control 2 */#define CAPD (0x005B) /* Comparator A Port Disable */#define CAIFG (0x01) /* Comp. A Interrupt Flag */#define CAIE (0x02) /* Comp. A Interrupt Enable */#define CAIES (0x04) /* Comp. A Int. Edge Select: 0:rising / 1: falling */#define CAON (0x08) /* Comp. A enable */#define CAREF0 (0x10) /* Comp. A Internal Reference Select 0 */ #define CAREF1 (0x20) /* Comp. A Internal Reference Select 1 */ #define CARSEL (0x40) /* Comp. A Internal Reference Enable */ #define CAEX (0x80) /* Comp. A Exchange Inputs */#define CAREF_0 (0x00) /* Comp. A Int. Ref. Select 0 : Off */ #define CAREF_1 (0x10) /* Comp. A Int. Ref. Select 1 : 0.25*Vcc */ #define CAREF_2 (0x20) /* Comp. A Int. Ref. Select 2 : 0.5*Vcc */ #define CAREF_3 (0x30) /* Comp. A Int. Ref. Select 3 : Vt*/#define CAOUT (0x01) /* Comp. A Output */#define CAF (0x02) /* Comp. A Enable Output Filter */#define P2CA0 (0x04) /* Comp. A Connect External Signal to C A0 : 1 */#define P2CA1 (0x08) /* Comp. A Connect External Signal to C A1 : 1 */#define CACTL24 (0x10)#define CACTL25 (0x20)#define CACTL26 (0x40)#define CACTL27 (0x80)#define CAPD0 (0x01) /* Comp. A Disable Input Buffer of Port Register .0 */#define CAPD1 (0x02) /* Comp. A Disable Input Buffer of Port Register .1 */#define CAPD2 (0x04) /* Comp. A Disable Input Buffer of Port Register .2 */#define CAPD3 (0x08) /* Comp. A Disable Input Buffer of Port Register .3 */#define CAPD4 (0x10) /* Comp. A Disable Input Buffer of Port Register .4 */#define CAPD5 (0x20) /* Comp. A Disable Input Buffer of Port Register .5 */#define CAPD6 (0x40) /* Comp. A Disable Input Buffer of Port Register .6 */#define CAPD7 (0x80) /* Comp. A Disable Input Buffer of Port Register .7 */十四、中断向量#define BASICTIMER_VECTOR (0 * 2u) /* 0xFFE0 Basic Timer */#define PORT2_VECTOR (1 * 2u) /* 0xFFE2 Port 2 */#define PORT1_VECTOR (4 * 2u) /* 0xFFE8 Port 1 */#define TIMERA1_VECTOR (5 * 2u) /* 0xFFEA Timer A CC1-2, TA */#define TIMERA0_VECTOR (6 * 2u) /* 0xFFEC Timer A CC0 */#define WDT_VECTOR (10 * 2u) /* 0xFFF4 Watchdog Timer */ #define COMPARATORA_VECTOR (11 * 2u) /* 0xFFF6 Comparator A */ #define NMI_VECTOR (14 * 2u) /* 0xFFFC Non-maskable */#define RESET_VECTOR (15 * 2u) /* 0xFFFE Reset [Highest Priori ty] */。
频率计(430单片机)

mp430定时器转的一些文章:--------------------------MSP430的定时器中有比较捕获的概念,刚刚接触非常生疏。
看了半天终于清楚:比较模式:这是定时器的默认模式,当在比较模式下的时候,与捕获模式相关的硬件停止工作,如果这个时候开启定时器中断,然后设置定时器终值(将终值写入TACCRx),开启定时器,当TAR的值增到TACCRx的时候,中断标志位CCIFGx 置一,同时产生中断。
若中断允许未开启则只将中断标志位CCIFGx置一。
例子:比较模式就像51单片机一样,要能够软件设置定时间隔来产生中断处理一些事情,如键盘扫描,也可以结合信号输出产生时序脉冲发生器,PWM信号发生器。
如:不断装载TACCRx,启动定时器,TAR和TACCRx比较产生中断处理。
捕获模式:利用外部信号的上升沿、下降沿或上升下降沿触发来测量外部或内部事件,也可以由软件停止。
捕获源可以由CCISx选择CCIxA,CCIxB,GND,VCC。
完成捕获后相应的捕获标志位CCIFGx置一捕获模式的应用:利用捕获源的来触发捕获TAR的值,并将每次捕获的值都保存到TACCRx 中,可以随时读取TACCRx的值,TACCRx是个16位的寄存器,捕获模式用于事件的精确定位。
如测量时间、频率、速度等例子:利用两次捕获的值来测量脉冲的宽度。
或捕获选择任意沿,CCISx=”11“(输入选择VCC),这样即当VCC与GND发生切换时产生捕获条件结合利用:异步通讯同时应用比较模式和捕获模式来实现UART异步通信。
即利用定时器的比较模式来模拟通讯时序的波特率来发送数据,同时采用捕获模式来接收数据,并及时转换比较模式来选定调整通信的接受波特率,达到几首一个字节的目的----------------------------------------利用MSP430单片机定时器A和捕获/比较功能模块结合使用,实现脉冲宽度的测量。
本例程用到了定时器A的CCI1A端口(例如MSP430F14X的P1.2引脚)作捕获外部输入的脉冲电平跳变,同时结合简单的软件算法就能实现脉冲宽度的测量。
MSP430C语言解析

北京理工大学
数据类型
数据类型
条件语句 开关语句 循环语句 返回语句
表达式语句(结构)
语句表达形式有3种(a、b、c):
a
if(条件表达式) 语句
b
if(条件表达式) 语句1
else 语句2
c
if(条件表达式) 语句1
else if(条件表达式) 语句2
数据类型的变量a;
联合数据类型与结构在形式上非常相似,但是数 据表示的含义和存储方式是完全不同的。结构类 型所占的内存空间是它的各成员所占空间之和, 而联合类型所占用的内存空间是它的需用字节数 最多的成员所占空间。
Union data { Int x; Float y; Char Z } a;
Int age;//年龄;整型; long number;//省份证号码,长整形;
struct birth data;
}
所谓联合类型,是指将不同的数据组织成一个整 体,他们在内存中间共同占用一个内存区域。
Union 联合名 {成员列表};
联合
Union data
{ int x; float y; char Z; } a; 定义了一个联合数据类型data,定义了这一联合
内部函数和外部函数
struct 结构名 {成员列表} ;
例如: Struct student {long int id;//学号,长整形 char name[20];//姓名,字符串 char sex;//性别; char address[40];//住址,字符串;
Int age;//年龄;整型; long number;//省份证号码,长整形;
形式参数说明
{
局部变量定义
MSP430 单片机C语言和汇编语言混合编程

MSP430 单片机C语言和汇编语言混合编程Mixing C and Assembler With the MSP430刘玉宏Liu,Yuhong摘要:为了发挥C语言和汇编语言各自的优点,二者需要相互调用函数。
本文首先介绍了MSP430单片机的C语言函数的参数传递规则,然后对C语言和汇编语言的混合编程进行了详细描述,最后给出应用实例。
关键字:MSP430单片机IAR C语言汇编语言混合编程中图分类号:TP368.1 文献标识码:AAbstract:In order to play the vritues of c and assembler language,they need to call each other’s function. This paper describes the rules of C-Compiler for passing variables between functions, mixing c and assembler with MSP430 in details,then gives an application example.Keyword:MSP430 MCU;IAR C-Compiler;Assembler Language;Mixing ProgrammingMSP430是一款16位的单片机,它具有超低功耗、丰富的片内外围模块、多样的可选型号、软件对硬件的灵活控制能力等优点。
因此特别适合于以电池为电源的应用场合或手持设备,目前在国内主要应用于三表系统和消防设备方面。
MSP430单片机的开发软件较常用的是IAR公司的IAR Embedded Workbench集成开发环境,它可以编辑、汇编和编译汇编语言和C语言源文件,并且其C语言和汇编语言具有相同格式的头文件,给开发带来了灵活性。
C语言具有编程简单,可以移植等优点,但是产生代码较长,对硬件的直接控制能力相对较弱;汇编语言产生的代码较小,控制硬件灵活,但是可读性差,移植困难,因此为了发挥各自优点,产生高速度、高效率的代码混合编程是最好的选择。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if(a==1) start=TAR; //==记录初始时间==
else if(a==2)
{
end=TAR; //==用start,end,overflow计算脉冲宽度==
P1SEL = BIT2; //==设置P1.2端口为功能模块使用,即:做捕获源==
TACTL = TASSEL_2+ID_3+TACLR+TAIE+MC1;//==定时器A时钟信号选择SMCLK,8分频,同时设置定时器A计数模式为连续增计模式==
CCTL1 = CM_1+SCS+CAP+CCIE; //==输入上升沿捕获,CCI0A为捕获信号源==
/*******************************************************
Author: Made by Xura
Date: 2008.8.28
程序描述:利用Timer_A捕获脉冲宽度
利用MSP430单片机定时器A和捕获/比较功能模块结合使用,实现脉冲宽度的测量
for(i=5000;i>0;i--);
} while(OFIFG&IFG1);
}
/*******************************************************
延时函数
*******************************************************/
数据处理
********************************************************************/
void process(void)
{
while(end<start);
//while(end<start)的话就让其一直等待下去,直到end>start
uint fy[7]; //==用于存放频率显示数据==
uint pd[7]; //==用于存放周期显示数据==
uint wh[6]; //==用于存放脉宽显示数据==
signed char i,j,temp,num;
unsigned char overflow;
const unsigned char zhouqi[]={"周期为:(us) "};
if((P4IN&0x0f)!=0x0f)
{
delay(5); //延迟20ms
if((P4IN&0x0f)!=0x0f)
{ j=1;
temp=P4IN&0x0f;
switch(temp)
{
case 0x0e: num=7;break;case 0x0d: num=8;break;
初始化时钟
*******************************************************/
void InitSys()
{
uchar i;
BCSCTL1 =CALBC1_8MHZ; //设定DCO为1MHZ
int main( void )
{
WDTCTL = WDTPW + WDTHOLD; //==关狗==
a=0; overflow=0;
InitSys(); //==初始化时钟,SMCLK,MCLK均为8M==
P1DIR |=0x01;
P1OUT=0;
P1DIR&=~BIT2;
_EINT(); //==开全局中断允许==
inot();
lcd_init();
lcd_wcmd(0x04);
lcd_pos(0x0f);
lcd_wdat('a');
while(1)
{
keyscan();
break;
case 10: //定时器溢出中断
overflow++;
break; //溢出计数加1*/
frequency=1000000/period;
frequency=frequency+0.04*frequency;
lcd_wcmd(0x04);
lcd_pos(0x4f);
do
{
lcd_wdat(0x30+frequency%10);
DCOCTL =CALBC1_8MHZ;
BCSCTL1 |=DIVA_3; //ACLK输入八分频
do //等待晶振稳定
{
IFG1 &=~OFIFG;
中断处理函数
*******************************************************************/
#pragma vector=TIMERA1_VECTOR //==定时器A中断处理==
__interrupt void timer_a(void)
P2OUT=0xf7;
if((P4IN&0x0f)!=0x0f)
{
delay(5); //延迟20ms
if((P4IN&0x0f)!=0x0f)
{ j=1;
temp=P4IN&0x0f;
switch(temp)
default:
break;
}
}
//....................... 键盘扫描程序..............
void keyscan()
{
int j=0;//是否有按键//
//***************扫描键盘***************//
void InitSys(); //==初始化时钟==
void keyscan();
/******************************************************************
主函数
******************************************************************/
lcd_pos(0x00);
lcd_wdat('C');
}
process();
}
}
/*******************************************************
if(num==1)
{
lcd_wcmd(0x04);
lcd'R');
}
else if(num==2)
{
lcd_wcmd(0x04);
a==0;
}
// width=abs(end-start);
/* if(width<100)width=32768-start+end;*/
}
const unsigned char us[]={"us "};
const unsigned char pinlv[]={"频率为:(Hz) "};
const unsigned char hz[]={"HZ "};
void process(void); //==函数声明==
void delay1(); //==延时函数==
{
case 0x0e: num=0;break;case 0x0d: num=14;break;
case 0x0b: num=13;break;case 0x07: num=15;break;
}
}
}
P2OUT=0xfb;
{
switch(TAIV) //==向量查询==
{ case 2: //==捕获中断==
if(CCTL1&CM0) //==捕获到上升沿==
{
/* CCTL1=(CCTL1&(~CM0))|CM1; //==更变设置为下降沿触发==*/
程序用到了定时器A的CCI1A端口(MSP430F14X的P1.2引脚)作捕获外部输入
的脉冲电平跳变,start,end,两个个变量来计算脉冲宽度
*******************************************************/
#include "msp430x22x4.h"
#include"1602 LCD.h"
#define uchar unsigned char
#define uint unsigned int
uint start,end,a;
uint width; //==用于存放脉宽==
uint period; //==用于存放周期==
uint frequency; //==用于存放频率==
case 0x0b: num=9; break;case 0x07: num=16;break;
}
}
}
P2OUT=0xfd;
if((P4IN&0x0f)!=0x0f)
{
delay(5); //延迟20ms
if((P4IN&0x0f)!=0x0f)
{ j=1;
temp=P4IN&0x0f;
switch(temp)
{
void delay1()
{
unsigned int i;