微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求救啊!小弟万分感谢。

求救啊!小弟万分感谢。

时间:10-02 整理:3721RD 点击:
求救啊!我刚写啦一个STC12C5A60S2的ADC转换用数码管显示的电压表程序 。但程序烧进以后芯片以后,没反应。求高手看看我的程序那里错啦,小弟万分感谢
#include <STC12C5AS60.h> //STC125A.h 头文件.
#include  <stdio.h>
#include   <intrins.h>
#define        uchar unsigned char;
#define uint  unsigned int;
float AD_val;                      //定义处理后的数值AD_val为浮点数
sbit DataPort=P0; //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;//                 位锁存
unsigned char TempData[8]; //存储显示值的全局变量
bit ReadTempFlag;//定义读时间标志
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
void AD_Init();
uint AD_Get( );
float AD_Chanl( );
void Display(unsigned char FirstBit,unsigned char Num);
void Init_Timer0( );
void DELAY_MS (unsigned int a);
void AD_Init( )
{
          P1ASF=0xff;                                          //P1口AD通道使用
          EA=1;                                //打开总中断
          EADC=1;                              //允许ADC中断
          ADC_RES=0;                                           //清零转换结果寄存器高8位
          ADC_RESL=0;                                          //清零转换结果寄存器低2位
          ADC_CONTR=0x80;                                  //开启AD电源
          DELAY_MS(2);                                            //等待2ms,让AD电源稳定
}
uint AD_Get( )
{
          ADC_CONTR |=0xc0;                                 //开启AD转换(P1.0)1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG   ADC_START CHS2 CHS1 CHS0
          _nop_(); _nop_(); _nop_(); _nop_();                //要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器
          while(!(ADC_CONTR&0x10));                         //等待转换完成
          ADC_CONTR&=0xe7;                                  //关闭AD转换,ADC_FLAG位由软件清0
          return((ADC_RES<<2)|ADC_RESL);                  //返回AD转换完成的10位数据(16进制)
}
float AD_Chanl( )
{  
      AD_val=AD_Get( );   
          AD_val=(AD_val*5*1000)/1024;      //AD的参考电压是单片机上的5v,所以乘5即为实际电压值
          return AD_val;                                           //高精度场合需要外接基准电压来得到MCU实际电压值VCC.
}
void main (void)
{                  
      unsigned int TempH,temp;
      Init_Timer0( );
      AD_Init( );
      while (1)         //主循环
      {

         if(ReadTempFlag==1)
      {
         ReadTempFlag=0;
         temp=AD_Chanl( );

      if(TempH/1000==0)
             TempData[0]=0;
          else
         TempData[0]=dofly_DuanMa[TempH/1000];
      if((TempH%1000)/100==0)
             TempData[1]=0;
          else
         TempData[1]=dofly_DuanMa[(TempH%1000)/100];
          if((((TempH%1000)%100)/10)==0)
             TempData[2]=0;
          else
             TempData[2]=dofly_DuanMa[((TempH%1000)%100)/10];
          if((((TempH%1000)%100)%10)==0)
             TempData[3]=0;
      else
             TempData[3]=dofly_DuanMa[((TempH%1000)%100)%10];
  }       
}
}
/*------------------------------------------------
显示函数,用于动态扫描数码管
输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
       static unsigned char i=0;
          
           DataPort=0;   //清空数据,防止有交替重影
       LATCH1=1;     //段锁存
       LATCH1=0;
       DataPort=dofly_WeiMa[i+FirstBit]; //取位码
       LATCH2=1;     //位锁存
           LATCH1=0;
       DataPort=TempData[i]; //取显示数据,段码
       LATCH1=1;     //段锁存
       LATCH1=0;
           i++;
       if(i==Num)
              i=0;

}
/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
       TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
       //TH0=0x00;              //给定初值
       //TL0=0x00;
       EA=1;            //总中断打开
       ET0=1;           //定时器中断打开
       TR0=1;           //定时器开关打开
}
/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
      static unsigned int num;
      TH0=(65536-2000)/256;                  //重新赋值 2ms
      TL0=(65536-2000)%256;
      Display(0,8);       // 调用数码管扫描
      num++;
      if(num==300)        //
      {
        num=0;
        ReadTempFlag=1; //读标志位置1
          }
}
void DELAY_MS (unsigned int a)
{
          unsigned int i;
          while( --a != 0)
         {
                for(i = 0; i < 600; i++);
         }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top