⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 MSP430子程序集
💻 C
字号:
//功能:A/D转化实验,读取电位器中间管脚的电压,并把它显示在数码管上
//AD通道选择:A7
#include "msp430x14x.h"
#define   SHUMA_PORT_DIR  P5DIR//数码管数据口
#define   SHUMA_PORT_OUT  P5OUT
#define   SHUMA_1_LOW     P6OUT&=~BIT6//开数码管的第一位P6.6口控制数码管的第一位
#define   SHUMA_1_HIGH    P6OUT|=BIT6//灭第一位数码管
#define   SHUMA_2_LOW     P6OUT&=~BIT5//开数码管的第二位
#define   SHUMA_2_HIGH    P6OUT|=BIT5//灭数码管的第二位
#define   SHUMA_3_LOW     P6OUT&=~BIT4//开数码管的第三位
#define   SHUMA_3_HIGH    P6OUT|=BIT4//灭数码管的第三位
#define   SHUMA_4_LOW     P6OUT&=~BIT0//开数码管的第四位
#define   SHUMA_4_HIGH    P6OUT|=BIT0//灭数码管的第四位

#define   uchar  unsigned char
#define   uint   unsigned int

static uchar adc_flag=0;
int AD_TEMP=0; 
float AD=0;

void int_clk();//时钟初始化子程序声明
void int_timer();//定时器出使化
void int_adc();//出使化AD
void int_shuma_io();//数码管控制引脚初始化

const unsigned char tabl1[11]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0X20,0x38,0xff};
                // ;0  ,1   ,2   ,3  , 4,   5,   6    ,7   ,8  ,9 ,灭}数码管段码表,不带小数点
const uchar tabl2[10]={0x80,0x9b,0x42,0x0a,0x19,0x0c,0x04,0x9a,0x00,0x18};
                //数码管段码表2,带小数点的
//定时初始化
void int_timer()
{
  TACTL|=TASSEL1+TACLR+ID0+ID1+MC0+TAIE;//选择SMLK的8分频作为定时器的时钟,定时器为增加模式,并且使能中断
  TACCR0=4999;
}  
//子程序名:int_clk()
//功能:   时钟初始化子程序
void int_clk()
{
  unsigned char i;//定义局部变量i
  BCSCTL1&=~XT2OFF;//打开高频晶体震荡器
  BCSCTL2|=SELM1+SELS;//MCLK和SMCLK的时钟源都选择XT2CLK,即都是8MHZ
  do//(至少执行一次DO循环)
  {
    IFG1&=~OFIFG;//清除晶体震荡出错标志位
    for(i=0;i<100;i++)
      _NOP();//简单的延时等待
  }while((IFG1&OFIFG));//判断晶体震荡是否出错,如果还是出错,则继续执行DO循环
  IFG1&=~OFIFG;
}
//#############################
void int_shuma_io()
{
  SHUMA_PORT_DIR|=0XFF;//set P5 is out  设置控制数码管数据口的IO口为输出模式
  P6DIR|=BIT0+BIT4+BIT5+BIT6;
  P3DIR|=BIT0;//P3.0控制74HC573的OE,把这个口设置为输出
  P3OUT&=~BIT0;//使能74573,使得74573的输出随输入变化
}  
void delay(uchar i)
{
  uchar j;
  for(;i>0;i--)
  {  
    for(j=100;j>0;j--)
      _NOP();
  }  
}  
# pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
  switch(TAIV)
  {
    case 2:break;
    case 4:break;
    case 10:
           if(adc_flag==0)
           {ADC12CTL0|=ADC12SC;
            ADC12CTL0&=~ADC12SC;};
           break;
  default: break;
  }  
}  
//AD初始化
void int_adc()
{
   P6SEL|=0X80;//选择P6.7选择第二功能
   ADC12CTL0|=ADC12ON+SHT0_2+REF2_5V+REFON;//采样保持时间为16个ADC12CLK
   ADC12IE|=0X0080;//使能转换通道a7中断
   ADC12CTL1 |= SHP; //SAMPCON信号选择为采样时序电路产生的信号
   ADC12CTL1 |= CSTARTADD_7;//选择单次转换地址
   ADC12MCTL7 |= INCH_7;//选择转换通道为A7
   ADC12CTL0 |= ENC;//ADC转换允许

}  
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR(void)
{
  while((ADC12CTL1&0X01)==1);//等待转换完成
  adc_flag=1;
  AD_TEMP=ADC12MEM7;
}  
int main( void )
{ 
  WDTCTL = WDTPW + WDTHOLD;// Stop watchdog timer to prevent time out reset
  uint DISPLAY1;
  uint DISPLAY2;
  uint DISPLAY3;
  uint DISPLAY4;
  uint display;
  uchar count=0;
  int_clk();//初始化时钟
  int_adc();//AC初始化
  int_shuma_io();
  int_timer();
  _EINT();
  while(1)
  {
   while(adc_flag)
   {
     AD+=AD_TEMP;
     count++;
     if(count==100)
     {
       //AD=AD/100本来是要除100,但是为了取的ADC小数的后两位的BCD码还要在乘于100,所以就除10
       AD=(AD*2.5)/4096;
       display=AD;//程序写到这
       count=0;
       AD_TEMP=0;
       AD=0;
     }  
     adc_flag=0;
    } 
  
   DISPLAY1=display/1000%10;//计算电压的十位数据
   DISPLAY2=display/100%10;//计算电压的个位数据
   DISPLAY3=display/10%10;//得到小数的后一位
   DISPLAY4=display%10;//得到小数的后两位
   SHUMA_PORT_OUT=tabl1[DISPLAY1];
   SHUMA_1_LOW;
   delay(2);
   SHUMA_1_HIGH;
   SHUMA_PORT_OUT=tabl2[DISPLAY2];
   SHUMA_2_LOW;
   delay(2);
   SHUMA_2_HIGH;
   SHUMA_PORT_OUT=tabl1[DISPLAY3];
   SHUMA_3_LOW;
   delay(2);
   SHUMA_3_HIGH;
   SHUMA_PORT_OUT=tabl1[DISPLAY4];
   SHUMA_4_LOW;
   delay(2);
   SHUMA_4_HIGH;
  
  }  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -