久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3972|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91国内外精品自在线播放 | 亚洲aⅴ | 国产91观看| 国产精品国产亚洲精品看不卡15 | 久久99精品久久久久久国产越南 | 无码一区二区三区视频 | 国产日韩久久 | 一级片子 | 国产成人精品免费 | 91久久久久久久久久久 | 午夜在线电影网 | 欧美高清一区 | 性天堂网 | 亚洲区一区二区 | www.一区二区三区 | 亚洲精品乱码久久久久久9色 | 精品久久久久久久久久久久久久久久久 | 国产精品一区二区久久久久 | 一区亚洲| 免费99精品国产自在在线 | 国产精品久久国产精品 | 免费看片在线播放 | 美国av毛片 | 久久久国产一区二区三区 | 在线观看中文视频 | 欧美一级片久久 | av国产精品 | 国产午夜精品久久久久免费视高清 | 成人亚洲视频 | 欧美视频 亚洲视频 | 精品亚洲一区二区 | 中文字幕免费视频 | 亚洲精品久久久久久一区二区 | 美国一级片在线观看 | 日韩在线一区二区 | 久久黄色网 | 91国内在线观看 | 99精品亚洲国产精品久久不卡 | 欧美一级黄色片 | 日本免费一区二区三区 | 在线免费黄色小视频 |