putin 发表于 2011-12-15 11:45:35

stc12c5a开发中遇到问题,求助大家!谢谢!

用数码管做了一个温度器,但运行过程中AD转化不了,不知道什么原因,求助大家!


#include "stc12c5a.h"          //包含STC12C5A60S2单片机寄存器定义文件
unsigned char data ge _at_ 0x30;    //四位七段数码管个位数据存放
unsigned char data shi _at_ 0x31;   //四位七段数码管十位数据存放
unsigned char data bai _at_ 0x32;   //四位七段数码管百位数据存放
unsigned char data qian _at_ 0x33;//四位七段数码管千位数据存放
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//个、十、千位七段数码管数字显示表
unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//百位七段数码管显示表,里面含小数点,即dp段永远被点亮
void main(void)
{
unsigned long i;
unsigned long K;
unsigned char status;
unsigned int y;
unsigned int a;
unsigned int b;
unsigned int c;
unsigned int d;
unsigned int e;
ge=table;
shi=table;
bai=table1;
qian=table;
        ADC_CONTR|=0x80;                      //开A/D转换电源,第一次使用时要打开内部模拟电源
        for (i=0;i<10000;i++);                //适当延时
        P1ASF=0x04;                     //选择P1.2作为A/D转换通道
        ADC_CONTR=0xEA;                 
        for (i=0;i<10000;i++);                 //适当延时
      status=0;
      while(status==0)
      {
          status=ADC_CONTR&0x10;   
      }
      ADC_CONTR&=0xE7;             //将ADC_FLAG清零
      e= ADC_RES;                  // 保存AD转化结果
      y=2569.002+10.5859375*e;   //AD转换后的结果于温度之间的函数关系
        a=y%10 ;                        //四位七段数码管个位数
      b=(y%100)/10;                   //四位七段数码管十位数
      c=(y%100)/100;                  //四位七段数码管百位数
      d=y/1000 ;                      //四位七段数码管千位数
      ge=table;                  //四位七段数码管个位显示数据
      shi=table;                   //四位七段数码管十位显示数据
      bai=table1;                  //四位七段数码管百位显示数据
      qian=table;                  //四位七段数码管千位显示数据

while(1)                        //七段数码管显示循环
      {      
      P2=0x0E;                           //选择四位七段数码管的千位
          P0=qian;                           //显示四位七段数码管的千位
   for (i=0;i<100;i++);
      P2=0x0D;                         //选择四位七段数码管的百位
          P0=bai;                        //显示四位七段数码管的百位
   for (i=0;i<100;i++);
       P2=0x0B;                        //选择四位七段数码管的十位
          P0=shi;                        //显示四位七段数码管的十位
   for (i=0;i<100;i++);
       P2=0x07;                         //选择四位七段数码管的个位
          P0=ge;                         //显示四位七段数码管的个位
   for (i=0;i<100;i++);

   }
}

putin 发表于 2012-2-7 23:06:55

回复【楼主位】putin
-----------------------------------------------------------------------

求帮忙!!!谢谢!!!

KEN_ZHOU 发表于 2012-2-9 10:17:48

精度处理互相矛盾,既然有LONG,为何不用十位的?还有ADC_RES能直接带如表达式?

putin 发表于 2012-2-12 23:27:26

回复【2楼】KEN_ZHOU
-----------------------------------------------------------------------
ADC_RES 好像可以直接带表达式,我看到一本参考书上面有类似的表达。
请问怎么修改?谢谢!

BXAK 发表于 2012-2-13 00:28:44

/* ADC操作『ADC_CONTR寄存器』常量定义 */
#define    ADC_POWER       0x80                  //ADC 电源控制位
#define    ADC_FLAG      0x10                  //ADC 完成标志
#define    ADC_START       0x08                  //ADC 启动控制位
#define    ADC_speed_LL    0x00                  //540 时钟
#define    ADC_speed_L   0x20                  //360 时钟
#define    ADC_speed_H   0x40                  //180 时钟
#define    ADC_speed_HH    0x60                  // 90 时钟
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:A/D转换初始化,P1.0、P1.1高阻模式,P1.0、P1.1口作为模拟功能A/D使用
      初次使用和更换 A/D 转换通道要适当延时(20uS~200uS), 使输入电压稳定。
      以后如果不更换 A/D 转换通道的话, 不需要加延时。
      如果输入电压信号源的内阻在10K以下,可不加延时。
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void AD_Init()
{
   P1M0 |= 0x03;    //P1.0、P1.1高阻模式
   P1M1 |= 0x03;            
ADC_RES = 0;
P1ASF = 0x03;    // P1.0、P1.1口作为模拟功能A/D使用
ADC_CONTR = ADC_POWER | ADC_speed_H ;//打开A/D电源 ,转换1次/270时钟,默认P1.0通道      
   YS14520us();            //开电源后延时
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:A/D转换程序
输入:通道号0~7
返回:8位转换值
说明:更换 A/D 转换通道要适当延时(20uS~200uS)
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
uint8 ADC(uint8 CHa)
{
s_uint8 CHb;

if(CHa != CHb)    //检测是否更换通道号
{
    ADC_CONTR &= 0xF8;    //清通道
ADC_CONTR |= CHa;    //更换通道
YS660us();                //更换 A/D 转换通道要适当延时(20uS~200uS)
}
CHb = CHa;    //保存此次通道号

   ADC_CONTR |= ADC_START;       //ADC_START = 1启动 AD 转换,转换结束ADC_START = 0
NOP12();    //经过4个时钟延时后,才能够正确读到ADC_CONTR控制寄存器的值
while(!(ADC_CONTR & 0x10));
   ADC_CONTR &= ~ADC_FLAG;       //清0 ADC_FLAG 位, 停止A/D转换
   return ADC_RES;               //返回转换结果
}

void main(void)
{
uint8Value,TL431;
    uint16 Voltage;

Init_1602();
Send(0,0x01); //清屏
AD_Init();

while(1)
{
Value = ADC(0);
TL431 = ADC(1);
Voltage = 250*Value/TL431;

// 显示 测量电压值
Set_xy(0,0);
Send(1,0);
Send(1,1);
Send(1,':');
Send(1,' ');
Send(1,'0'+ Voltage/100);
Send(1,'.');
Send(1,'0'+ Voltage/10%10);
Send(1,'0'+ Voltage%10);
Send_S("V");

// 显示 测量转换值 : 基准源转换值
          Set_xy(9,1);   
Send(1,'0'+ Value/100);
Send(1,'0'+ Value/10%10);
Send(1,'0'+ Value%10);
Send(1,':');
Send(1,'0'+ TL431/100);
Send(1,'0'+ TL431/10%10);
Send(1,'0'+ TL431%10);
YSms(10);
}
}
页: [1]
查看完整版本: stc12c5a开发中遇到问题,求助大家!谢谢!