原创 [博客大赛]MSP430学习笔记_430单片机实现的数字电压表程序

2013-6-6 10:48 13143 13 18 分类: MCU/ 嵌入式

 

#include<msp430f14x.h>
#define   uint  unsigned int
#define   uchar unsigned char
/******************************************define  lcd******/
#define LCD_CS   BIT2
#define LCD_DAT  BIT4
#define LCD_SCK  BIT3
#define  WR  BIT2
#define  RS  BIT1
/************************************************************/
 
uchar charge=0;
uchar SYNCH=0xfe;  //LCD显示同步字
static uchar adc_flag=0;
static uchar time_flag=0;
static uchar count=0;
uint AD_TEMP=0;
float AD=0;
void int_clk()
{
    uchar i;
    BCSCTL1&=~XT2OFF;  //打开XT振荡器
    BCSCTL2|=SELM1+SELS;//MCLK 8M and SMCLK 1M  
    do
{
        IFG1 &= ~OFIFG;                 //清除振荡错误标志 
        for(i = 0; i < 100; i++)
 _NOP(); //延时等待
        }
    while ((IFG1 & OFIFG) != 0); //如果标志为1继续循环等待
    IFG1&=~OFIFG;
}
 
void get_clk()
{
  P6DIR|=LCD_SCK;  
   _NOP();
  P6OUT&=~LCD_SCK;  
  _NOP();
  _NOP();
  _NOP();
  _NOP();
  _NOP();  
  P6OUT|=LCD_SCK; 
  _NOP();
  _NOP();
  _NOP();
  _NOP();
  _NOP();
  _NOP();
  _NOP();   
}
void inport(uchar com,uchar dat)//com=1,rs=1,com=0,rs=0;
{
  uchar i,temp; 
  P6DIR|=LCD_DAT;
  P6DIR|=LCD_CS;
  P6OUT|=LCD_CS;
  temp=SYNCH;
  temp&=~WR;
  if(com)      temp|=RS;
  else         temp&=~RS;
  for(i=0;i<=7;i++)
    {
      if(temp<
      else             P6OUT&=~LCD_DAT;
      get_clk();
    }
  temp=dat&0xf0;
 for(i=0;i<=7;i++)
    {
      if(temp<
      else             P6OUT&=~LCD_DAT;
      get_clk();
    }
    temp=dat&0x0f;
    temp=temp<<4;
 for(i=0;i<=7;i++)
    {
      if(temp<
      else             P6OUT&=~LCD_DAT;
      get_clk();
    } 
 P6OUT|=LCD_DAT;
 P6OUT&=~LCD_CS;
}
print_string(uchar add,uchar *pt)
{
  uchar i;
  inport(0x00,add);
  for(i=0;;i++)
 {
    if(*pt=='\n') break;
    inport(0x01,*pt);
    pt++;
 }
}
print_han(uchar h_neima,uchar l_neima)\
{
 inport(0x01,h_neima);
 inport(0x01,l_neima); 
}
print_float(float data)
{
    uint temp;
    uchar a1,a2,a3,a4;
    temp=data*1000;
    a1=temp/1000;
    a2=(temp-a1*1000)/100;
    temp=(temp-a1*1000)-a2*100;
    a3=temp/10;
    a4=temp%10;
    inport(0x01,a1+0x30);  
    inport(0x01,'.');  
    inport(0x01,a2+0x30);  
    inport(0x01,a3+0x30);  
    inport(0x01,a4+0x30);  
}
void int_lcd()
{
  inport(0x00,0x30);
  inport(0x00,0x01);
  inport(0x00,0x02);
  inport(0x00,0x0c);
  inport(0x00,0x06);
}
int_adc()
{  
  P6SEL|=0x01;                              //选择AD通道
  ADC12CTL0|=ADC12ON+SHT0_2+REF2_5V+REFON; // //采样保持时间为16个ADC12CLK
  ADC12CTL1|=ADC12SSEL1+ADC12SSEL1;        //参考电压开启,选择2.5V
  ADC12MCTL0=0x10;                        // ref+=REF2_5V, channel = A0
  ADC12IE|=0x01;                            // 使能转换中断
  ADC12CTL0|=ENC;                          // 使能AD转换器
}
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
 while((ADC12CTL1&0X01)==1);//等待转换完
  adc_flag=1;
  AD_TEMP=ADC12MEM0;//设置ADC转换完标志,并且读取ADC值
 }
void int_timer()
{
  TACTL|=TASSEL1+TACLR+ID0+ID1;//选择SMCLK作为定时器的时钟,8分频
  TACTL|=MC0+TAIE;//增加模式,并且使能中断
  TACCR0=9999;//中断周期为10ms  
}
#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;//10ms中断标志加1
    default:break;
  }   
}
int main( void )
{  
  WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
  int_clk();  //系统时钟初始化
  int_adc();//初始化串口   
  int_lcd(); //初始化LCD
  int_timer(); //初始化TIMER
  _EINT();  //使能中断 
  while(1)
  {
    while(adc_flag==1)
    {    
        AD+=AD_TEMP;
        count++;
        if(count==100)
        {
        AD=AD/100;  
        AD=(AD*2.5/4096);      
        inport(0x00,0x80);  
        print_han(0xb5,0xe7);
        print_han(0xd1,0xb9);//电压
        inport(0x01,':');       
        print_float(AD);
        inport(0x01,'V');//显示电压值
         AD=0;
         count=0;
         AD_TEMP=0;//变量清零
       }
        adc_flag=0;//清中断标志        
       
    }
  }
 }
 
 
 
 
&0x80)>
&0x80)>
&0x80)>

文章评论5条评论)

登录后参与讨论

chen_zs2012_704941858 2013-6-9 23:02

:)

用户377235 2013-6-9 05:51

值得敬佩

chen_zs2012_704941858 2013-6-6 10:51

是返回为(void)空,无类型啊。。

fannifu_167533660 2013-6-6 09:27

int main( void ) 请问 主函数没有返回值,为什么定义为整形返回值。

用户343036 2013-6-3 18:30

虽然看着不复杂,但我觉得楼主如果能多一个流程图就更好~\(≧▽≦)/~啦啦啦,只支持原创,谢谢分享。
相关推荐阅读
chen_zs2012_704941858 2014-03-19 17:49
学习LabVIEW要记住的几句话
学习LabVIEW要记住的几句话1. LabVIEW是门程序设计语言,不是画图工具!2. 不要以为LabVIEW很简单,设计个庞大工程难度不亚于C++!3. 语言本身永远只是招式,请注意修炼内功:数据...
chen_zs2012_704941858 2014-01-24 23:46
【博客大赛】易络盟-飞思卡尔MCU大赛_KL25Z
【博客大赛】易络盟-飞思卡尔MCU大赛    Element14、Embest、Freescale三方联合推出的FRDM-KL...
chen_zs2012_704941858 2014-01-24 23:20
《深入理解Altera FPGA 应用设计》赠书已到,感谢EDNChina和coyoo博主
《深入理解Altera FPGA 应用设计》赠书已到,感谢EDNChina和coyoo博主         //深圳 ...
chen_zs2012_704941858 2014-01-20 20:08
【博客大赛】单片机软件抗干扰的几种常见方法
【博客大赛】单片机软件抗干扰的几种常见方法       在提高硬件系统抗干扰能力的同时,软件抗干扰以其设计灵活、节省硬件资源、可靠性好越来越受到重视。下面以MCS-51单片机系统为例,...
chen_zs2012_704941858 2014-01-19 21:19
【博客大赛】说说单片机、PSOC、FPGA之间的主要区别
【博客大赛】说说单片机、PSOC、FPGA之间的主要区别   现在的单片机一般是mcu+有限的固定的模拟或数字外围;FPGA是可编程数字外围电路;PSoC 相当于MCU+可编程模拟外围电路...
chen_zs2012_704941858 2014-01-19 16:13
你知道你的个人隐私在互联网上有多么的多不堪一击吗?
你知道你的个人隐私在互联网上有多么的多不堪一击吗?     //听着就恐怖,看着就可怕!我已经开始清理我在互联网的个人隐私了,你呢?   最近我废弃了两个加起来用了十几年的QQ...
我要评论
5
13
关闭 站长推荐上一条 /2 下一条