1. 程序如下:
#include <msp430x26x.h>
#include "math.h"
#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long int
uint tta1 = 0;
uint data1 = 0;
uint data2 = 0;
uint count = 0;
long float total = 0;
ulint output = 0;
uchar chuan1[] = {0XCC,0X33,0XC3,0X3C};
uchar chuan2[]={0XAA,0XC0,0X00,0X00,0X63,0X05,0X00,0X0A,0X00,0X0A,0XF8,0X00,0X00,0X1F};
uchar chuan3[]={0XCC,0X33,0XC3,0X3C,0XAA,0XC1,0X08,0X00,0X00,0X01,0XCC,0X33,0XC3,0X3C};
//串口0发送函数
void UART0_send_data(uchar data0)
{
while(!(IFG2&UCA0TXIFG));
UCA0TXBUF = data0;
}
//时钟初始化
void sys_clock_init (void) //万用表侧时钟正常
{int i;
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 &= ~XT2OFF;
BCSCTL2 |= SELM_2 + SELS + DIVS_1;
BCSCTL3 |= XT2S_2;
while((IFG1&OFIFG))
{
IFG1 &= ~OFIFG;
for(i=0;i<0xff;i++);
}
P5DIR = 0X70;
P5SEL = 0X70;
P1SEL = 0X10; //p1.4设置为外围模式,smclk
P1DIR = 0X10;
}
//串口初始化
void sys_UART0_init(void) //串口与液晶屏通讯正常
{
UCA0CTL1 |= UCSSEL_2;
UCA0BR0=34;
UCA0BR1=0;
UCA0MCTL |= UCBRS2 + UCBRS1;
UCA0CTL1 &= ~UCSWRST;
UCA0MCTL &= ~UCOS16;
P3DIR |= 0X10;
P3SEL |= 0X10;
// __bis_SR_register(GIE);
_BIS_SR(GIE);
}
//采样IO口初始化
void sys_IO_init()
{
P1IE |= 0X08; //p1.3中断允许开启
P1IES |= 0X08; //p1.3下降沿触发中断
P1IFG &= ~0X08; //清除中断标志
P1OUT &= ~0X20;
P1OUT |= 0X20; //ADC_RST,先8364复位,再置位
P1DIR |= 0XF5; //p1的012 456位设置为输出方向
P1OUT &= ~0X01; //清零,cs片选信号
P1OUT |= 0X04; //置1,8364读取信号停止
P1OUT &= ~0X40; //HOLDA B C=0
P2DIR |= 0X87; //p2的012和7位设置为输出
P2OUT &= ~0X07; //P2.0 1 2,设置读取模式为0,CHA0输出
P2OUT |= 0X80;
__bis_SR_register(GIE);
}
//定时器A初始化
void sys_TimerA_init(void)
{
TACCR0 = 200;
TACCTL0 |= CCIE;
TACTL |= TASSEL_2 + MC_1; //ta2,即p1.4产生5k方波
}
//主函数
void main (void)
{
uint i,j,k;
WDTCTL = WDTPW + WDTHOLD;
sys_clock_init();
sys_UART0_init();
sys_TimerA_init();
sys_IO_init();
while(1) //液晶界面切换程序。
{
for(i=0;i<21;i++)
{
UART0_send_data(0XAA);
UART0_send_data(0X70);
UART0_send_data(i);
for(j=0;j<4;j++)
UART0_send_data(chuan1[j]);
for(j=0xffff;j>0;j--)
for(k=0;k<5;k++);
}
}
}
#pragma vector = PORT1_VECTOR
__interrupt void PORT_1 (void) //进入中断,用指示灯闪烁表明EOC信号是否产生
{
count++;
if(count == 600)
{
P2OUT ^= 0X80;
count=0;
}
P1IFG &= ~0X08;
/*
uchar i;
uint c ,d;
P1IFG &= ~0X08; //中断标志清零
count++;
P1OUT ^= 0X04; //P1.2取反(变为低电平)
for(i=0;i<10;i++); //延时,等待读取数据
data1 = P4IN;
P1OUT ^= 0x04; //p1.2取反(变为高电平)
P1OUT ^= 0x04; //p1.2取反(变为低电平)
for(i=0;i<5;i++); //延时,等待读取数据
data2 = P4IN;
total += pow(data2*256+data1,2);
if(count==5000)
{
P2OUT ^= 0X80;
output = sqrt(total/2500);
d = output % 255*4;
c = output /255*4;
for(i=0;i<14;i++)
UART0_send_data(chuan2[i]);
UART0_send_data(0X00);
UART0_send_data(0X00);
UART0_send_data(c);
UART0_send_data(d);
for(i=0;i<14;i++)
UART0_send_data(chuan3[i]);
count=0;
}
P1OUT ^= 0X04; //p1.2取反(高电平),停止读取数据
*/
}
#pragma vector = TIMERA0_VECTOR //万用表测HOLDX信号1khz正常
__interrupt void Timer_A(void)
{
tta1++;
if(tta1 == 10)
{
P1OUT ^= 0X40; //HOLDA HOLDB HOLDC 使用p1.6共同控制
tta1 = 0;
}
}
2 测试EOC信号是否输出:将msp430f2619单片机的P1.3脚接EOC。如果产生中断,则p2.7即led闪烁。
3. 实验:一直没有看到led闪烁。
4. 中断是否相应:将clk接入p1.3,led闪烁正常。