找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3674|回复: 4
打印 上一主题 下一主题
收起左侧

求助:使用STC12C5A60S2做一个温湿度控制 使用单片机AD转换显示错误

[复制链接]
跳转到指定楼层
楼主
ID:129827 发表于 2016-7-9 18:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序如下,新手求高手指教,要被弄疯了

#include<reg51.h>
#include <intrins.h>
#include"temp.h"

sfr AUXR1=0xA2;
sfr adc_contr=0xbc;//adc控制寄存器,不可位寻址,用或运算来设置
sfr adc_res=0xbd;//转换结果寄存器,高八位
sfr adc_low2=0xbe;//转换结果寄存器,低两位
sfr p1asf=0x9d;//设置p1的那一口为输入口,不可位寻址.

//以下都是控制寄存器的各位地址
#define adc_power 0x80;//adc电源,第7位
#define adc_flag 0x10;//转换结束标志位,第4位
#define adc_start 0x08;//转换开始,第3位
#define adc_speedll 0x00;//速度位,第5,6位
#define adc_speedl 0x20;
#define adc_speedh 0x40;
#define adc_speedhh 0x60;
#define adc_chs 0x04;//输入通道为第p1.0,1,2,3三位可设置p10-p17
//位定义完成

//--定义使用的IO--//
#define  GPIO_KEY P0            //键盘用P0口
sbit OUT=P2^0;                    //风机运行输出
sbit OUT2=P2^1;                    //压缩机运行输出
sbit DIO = P3^0;                //串行数据输入
sbit RCLK  = P3^1;                //时钟脉冲信号——上升沿有效
sbit SCLK = P3^2;                //打入信号————上升沿有效


//--定义全局变量--//
unsigned char code fseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code segbit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
uchar code Temp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//--声明全局函数--//
void LcdDisplay(int);
void LcdDisplay2(int);
void DigDisplay();
void DigDisplay2();
void Outv(int);
int Ds18b20ReadTemp();
int Ds18b20ReadTemp2();
int Ds18b20ReadTemp3();
unsigned char Key_Scan();
void main (void);                    // 主函数
void LED4_Display (int temp);        // LED显示
void LED4_Display2 (int sd);        // LED显示
void LED_OUT(uchar X);                // LED单字节串行移位函数
unsigned char code LED_0F[];        // LED字模表
void Delay(unsigned char a1,b1,c1);
unsigned int AD();
uint adc_finished;//转换结束标志


/*******************************************************************************
* 函 数 名         : Delay1ms
* 函数功能           : 延时函数
* 输    入         : 无
* 输    出         : 无
******************************************************************************/
void Delay1ms(uint c)

{
    unsigned char a,b;
    for(;c>0;c--)
        for(b=43;b>0;b--)
            for(a=127;a>0;a--);
   
}
void Delay(unsigned char a1,b1,c1)
{
unsigned char a,b,c;
for(a=0;a<a1;a++)
for(b=0;b<b1;b++)
for(c=0;c<c1;c++);
}
/*******************************************************************************
* 函 数 名         : main
* 函数功能           : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

                           
void main()
{
    while(1)
    {        
    unsigned char  keyNum,k,c;
    int i,d,b,e,j;
    uint x,y;
    i=0x0369;
    c=0xfe;
        
    while (1)
    {   
        b=Ds18b20ReadTemp();
        d=Ds18b20ReadTemp2();
        e=AD();
        x=100;
        y=10;
      while(x)
      {
        x--;
       while(y)
       {
        y--;
        Outv(b);
        if (e>i)
        {
         OUT2=1;
        }
        else
        {
        OUT2=0;
        }        
        keyNum = Key_Scan();//扫描键盘
        if(keyNum == 0xff)
        {k=c;}
        else
        {k=keyNum;}
        if (k ==0xfe)     //有按键按下
        {
        j=5;
        while(j>0)
        {j--;LED4_Display (b);}
        c =0xfe;
        }
        if (k ==0xfd)     //有按键按下
        {
        j=5;
        while(j>0)
        {j--;LED4_Display (d);}
        c =0xfd;
        }
        if (k ==0xfb)     //有按键按下
        {
        j=5;
        while(j>0)
        {j--;LED4_Display2 (e);}
        c =0xfb;
        }
        }
        }
      }
    }     
}
/*******************************************************************************
* 函 数 名         : 脉冲输出
* 函数功能           : 主函数
* 输    入         : 无
* 输    出         : V
*******************************************************************************/

                           
void Outv(int temp)
{
    int i;
    if(temp>0)
    {
    i=temp*0.0625*50;
    if(i>300)
    {
    OUT=0;
    }
    else
    {
    OUT=0;
    Delay1ms(i);
    OUT=1;
    }
    }
    else
    {OUT=0;}
}

              
/*******************************************************************************
* 函 数 名         : Key_Scan()
* 函数功能           : 扫描键盘
* 输    入         : 无
* 输    出         : 读取到的键值
*******************************************************************************/

unsigned char Key_Scan()
{
    unsigned char keyValue ,i; //保存键值

    keyValue=0xff;
    //--检测按键1--//
    if (GPIO_KEY != 0xFF)        //检测按键K1是否按下
    {
        Delay1ms(10);    //消除抖动

        if (GPIO_KEY != 0xFF)    //再次检测按键是否按下
        {
            keyValue = GPIO_KEY;
            i = 0;
            while ((i<5) && (GPIO_KEY != 0xFF))     //检测按键是否松开
            {
                Delay1ms(1);
                i++;
            }
        }
    }

    return keyValue;   //将读取到键值的值返回
}
/*******************************************************************************
* 函 数 名         : LED4_Display (int temp)
* 函数功能           : LED显示读取到的温度
* 输    入         :
* 输    出         : 无
*******************************************************************************/
void LED4_Display (int temp)
{
    unsigned char code *led_table;          // 查表指针
    uchar i,j;
    float tp;
    //显示第4位   
    if(temp< 0)                //当温度值为负数
      {
    i =0xbf;
    LED_OUT(i);            
    LED_OUT(0x08);        

    RCLK = 0;                       
    RCLK = 1;
    //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
        temp=temp-1;
        temp=~temp;
        tp=temp;
        temp=tp*0.0625*100+0.5;   
        //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
        //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
        //算由?.5,还是在小数点后面。
      }
     else
      {            
        i =0xff;
        LED_OUT(i);            
        LED_OUT(0x08);        
        RCLK = 0;                       
        RCLK = 1;
        tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
        //如果温度是正的那么,那么正数的原码就是补码它本身
        temp=tp*0.0625*100+0.5;   
        //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
        //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
        //算加上0.5,还是在小数点后面。
    }
    //显示第3位
    led_table = LED_0F + temp % 10000 / 1000;
    i = *led_table;
   
    LED_OUT(i);            
    LED_OUT(0x04);   

    RCLK = 0;
    RCLK = 1;
    //显示第2位
    led_table = LED_0F + temp % 1000 / 100;
    j = *led_table;
    i =j & 0x7f;
    LED_OUT(i);        
    LED_OUT(0x02);        

    RCLK = 0;
    RCLK = 1;
    //显示第1位
    led_table = LED_0F + temp % 100 / 10;
    i = *led_table;

    LED_OUT(i);            
    LED_OUT(0x01);        

    RCLK = 0;
    RCLK = 1;

}
/*******************************************************************************
* 函 数 名         : LED4_Display2 (int temp)
* 函数功能           : LED显示读取到的湿度
* 输    入         :
* 输    出         : 无
*******************************************************************************/
void LED4_Display2 (uchar sd)
{
    unsigned char code *led_table2;          // 查表指针
    uchar i;
    uchar sdc;
    sdc=(sd-80)*100/327;
    //显示第4位   
    led_table2 = LED_0F + (sdc % 10000 / 1000);
    i = *led_table2;
   
    LED_OUT(i);            
    LED_OUT(0x08);        

    RCLK = 0;                       
    RCLK = 1;

    //显示第3位
    led_table2 = LED_0F + (sdc % 1000 / 100);
    i = *led_table2;
   
    LED_OUT(i);            
    LED_OUT(0x04);   

    RCLK = 0;
    RCLK = 1;
    //显示第2位
    led_table2 = LED_0F + (sdc % 100 / 10);
    i = *led_table2;

    LED_OUT(i);
    LED_OUT(0x02);        
   
    RCLK = 0;
    RCLK = 1;
    //显示第1位
    led_table2 = LED_0F + (sdc % 10);
    i = *led_table2;

    LED_OUT(i);
    LED_OUT(0x01);            
   
    RCLK = 0;
    RCLK = 1;

}
/*******************************************************************************
* 函 数 名         : LED_OUT(uchar X)
* 函数功能           : LED段选
* 输    入         :
* 输    出         : 无
*******************************************************************************/
void LED_OUT(uchar X)
{
    uchar i;
    for(i=8;i>=1;i--)
    {
        if (X&0x80) DIO=1; else DIO=0;
        X<<=1;
        SCLK = 0;
        SCLK = 1;
    }
}

unsigned char code LED_0F[] =
{// 0     1      2       3    4     5      6       7    8     9      A       b    C    d      E    F    -
    0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
};

//
void adcinit()//adc初始化函数
{
p1asf=0x10;//设置p10 为ad转换输入口
AUXR1&=0xfb;
adc_contr=0xe0;//打开电源,设最高速度
//adc_contr=adc_power|adc_speedh|adc_chs;//电源X0000000,速度0XX00000
//通道:00000XXX

Delay1ms(5);
adc_contr|=adc_chs;//设置频道

}

unsigned int AD()
{
unsigned char sd=0;
adcinit();
adc_res=0;
adc_low2=0;
adc_contr|=adc_start;//启动ad转换,置1为起动,转换结束后自动置0
while(adc_finished==0)
   {
   adc_finished=adc_contr&adc_flag;//检测是否转换结束,没结束一直等
   }

   adc_contr=adc_contr&0xef;//转换结束标志清零

   sd=adc_res*5*100/1024;
   return sd;
   }

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:129827 发表于 2016-7-9 18:27 | 只看该作者
有没有高手指点呀,弄了几天了实在找不到原因,都快弄疯了!
回复

使用道具 举报

板凳
ID:60379 发表于 2016-7-9 19:09 | 只看该作者
AD转很简单的,这里有完美的例程和视频。虽是STC15,但程序与STC12完全相同,切莫当面错过。
http://pan.baidu.com/share/home?uk=4077802723&view=share#category/type=0

回复

使用道具 举报

地板
ID:129827 发表于 2016-7-10 00:17 | 只看该作者
无量寿经 发表于 2016-7-9 19:09
AD转很简单的,这里有完美的例程和视频。虽是STC15,但程序与STC12完全相同,切莫当面错过。
http://pan.b ...

我是按照技术手册这么编程的而且看了你的介绍,依然有问题,实在不懂究竟错在哪里了
回复

使用道具 举报

5#
ID:55565 发表于 2016-9-26 16:39 | 只看该作者
你看下是不是你的头文件定义错了,应该是stc12C5A60S2的头文件才行吧。官网可以下载到。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表