|
本帖最后由 abcfanyuan 于 2012-7-13 15:16 编辑
程序如下:
#include <msp430x14x.h>
#include "ADC.h"
#define uchar unsigned char
uchar dis_code[12] = {0x3f,0x06,0x5b,0x4f,0x66, //段码表
// 0 1 2 3 4 对应内容
0x6D,0x7D,0x07,0x7F,0x6F,0x80,0xFF};
// 5 6 7 8 9 .
uchar ge,shi,bai,qian;
uchar s[20],q[100];
void Display(uchar wei ,uchar dat);
int k=0,j;
unsigned int count=0;
//--------------------------------------------------------------------------------
void delay_ms(unsigned long ms) // 延时毫秒@12M,ms最大值255
{
uchar i;
while(ms--)
for(i = 0; i < 124; i++);
}
void Ds_num(int g)
{
int n;
n=g;
for(uchar i=0;i<3;i++)
{
qian=n/1000;
Display(4,qian);
bai=n/100%10;
Display(3,bai);
shi=n/10%10;
Display(2,shi);
ge=n%10;
Display(1,ge);
}
}
void Display(uchar wei ,uchar dat)
{
switch(wei)
{
case 4:
P4OUT = dis_code[dat];//dis_code[dis_0]; // 取个位的段码
P3OUT &= ~BIT0; // 开第一个显示(P3.0口控制个位数码管)
delay_ms(5); // 延时nms使四位数码管动态显示时能看清
P3OUT |= BIT0;
P4OUT =0;
break;
case 3:
P4OUT = dis_code[dat]; // 取个位的段码
P3OUT &= ~BIT1; // 开第二个显示(P3.1口控制个位数码管)
delay_ms(5); // 延时nms使四位数码管动态显示时能看清
P3OUT |= BIT1;
P4OUT =0;
break;
case 2:
P4OUT = dis_code[dat]; // 取个位的段码
P3OUT &= ~BIT2; // 开第三个显示(P3.2口控制个位数码管)
delay_ms(5); // 延时nms使四位数码管动态显示时能看清
P3OUT |= BIT2;
P4OUT =0;
break;
case 1:
P4OUT = dis_code[dat]; // 取个位的段码
P3OUT &= ~BIT3; // 开第四个显示(P3.3口控制个位数码管)
delay_ms(5); // 延时nms使四位数码管动态显示时能看清
P3OUT |= BIT3;
P4OUT =0;
break;
default:
break;
}
}
//---------------------------------------------------------------------
void Init_ADCScan(void)
{
//ADC12初始化----------------------
//单通道,单次采样模式
P6SEL |= BIT0;//使能A/D通道 A0
ADC12CTL0 &=~(ENC);
ADC12CTL0 = ADC12ON + SHT0_2+REFON+REF2_5V; //开ADC12内核和设置SHIT0=2(N=4)
ADC12CTL1 |= SHP; //SAMPCON信号选择为采样定时器输出
ADC12CTL1 |= CSTARTADD_0; //定义单次转换地址
ADC12MCTL0 = 0x10;
// ADC12MCTL0 = SREF_2; // 使用外部参考电压 Vr+ = VeREF+
ADC12IE|=BIT0;
ADC12CTL0 |= ENC; //ADC转换允许
ADC12CTL0 |= ADC12SC;
}
void Init_CLK(void)
{
unsigned int iq0;
BCSCTL1&=~0X00; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2
_EINT(); //打开全局中断控制,若不需要打开,可以屏蔽本句
}
void main(void)
{
// 停止WDT
WDTCTL = WDTPW + WDTHOLD;
Init_CLK();
Init_ADCScan();
//_EINT();
// 将P4设置为I/O口
P4SEL = 0x00;
// 将P4设置为输出方向
P4DIR = 0xFF;
// 将P4口输出全高
P4OUT = 0xFF;
// 将P3设置为I/O口
P3SEL = 0x00;
// 将P3设置为输出方向
P3DIR |= 0x0F;
// 关所有数码管
P3OUT |= 0x0F;
//ceshi
P1DIR=0;
P1SEL=1;
//P1SEL=0;
P1DIR=BIT7;
for(;;)
{
Ds_num(count);
}
}
#pragma vector=ADC_VECTOR
__interrupt void ADC12(void)
{
uchar i;
if(P1OUT&BIT7) P1OUT &=~(BIT7);
else P1OUT |=BIT7;
//while((ADC12IFG & BIT0)==0);
s[j]=ADC12MEM0;
j++;
if(j>20)
{
//count=0;
ADC12CTL0 &= ~(ENC);
j=0;
for(i=0;i<20;i++)
{
count+=s;
}
count=count/20;
ADC12IFG &=~ BIT0;
}
ADC12CTL0 |= ADC12SC+ENC;
程序是按照书上和网上的一些程序,自己配置的。用数码管显示采样的电压值。但有时候是无法跳入中断,有时候是无法进入中断,。
现在有如下几个问题:
1,ADC12CTL0 &= ~(ENC); 在中断函数中能不能关掉ADC中断?
2,ADC12IFG &=~ BIT0; 中断标志位不是软件复位么?这里需要不?
3,ADC12IE&=~BIT0; 如果写在中断函数中是否可以关掉ADC中断?
4,这个函数中断为什么无法跳出中断?
谢谢大家,希望大家帮小弟看看呀、
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|