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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4093|回復(fù): 4
收起左側(cè)

求助:使用STC12C5A60S2做一個(gè)溫濕度控制 使用單片機(jī)AD轉(zhuǎn)換顯示錯(cuò)誤

[復(fù)制鏈接]
ID:129827 發(fā)表于 2016-7-9 18:26 | 顯示全部樓層 |閱讀模式
程序如下,新手求高手指教,要被弄瘋了

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

sfr AUXR1=0xA2;
sfr adc_contr=0xbc;//adc控制寄存器,不可位尋址,用或運(yùn)算來(lái)設(shè)置
sfr adc_res=0xbd;//轉(zhuǎn)換結(jié)果寄存器,高八位
sfr adc_low2=0xbe;//轉(zhuǎn)換結(jié)果寄存器,低兩位
sfr p1asf=0x9d;//設(shè)置p1的那一口為輸入口,不可位尋址.

//以下都是控制寄存器的各位地址
#define adc_power 0x80;//adc電源,第7位
#define adc_flag 0x10;//轉(zhuǎn)換結(jié)束標(biāo)志位,第4位
#define adc_start 0x08;//轉(zhuǎn)換開(kāi)始,第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三位可設(shè)置p10-p17
//位定義完成

//--定義使用的IO--//
#define  GPIO_KEY P0            //鍵盤(pán)用P0口
sbit OUT=P2^0;                    //風(fēng)機(jī)運(yùn)行輸出
sbit OUT2=P2^1;                    //壓縮機(jī)運(yùn)行輸出
sbit DIO = P3^0;                //串行數(shù)據(jù)輸入
sbit RCLK  = P3^1;                //時(shí)鐘脈沖信號(hào)——上升沿有效
sbit SCLK = P3^2;                //打入信號(hào)————上升沿有效


//--定義全局變量--//
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};

//--聲明全局函數(shù)--//
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);                    // 主函數(shù)
void LED4_Display (int temp);        // LED顯示
void LED4_Display2 (int sd);        // LED顯示
void LED_OUT(uchar X);                // LED單字節(jié)串行移位函數(shù)
unsigned char code LED_0F[];        // LED字模表
void Delay(unsigned char a1,b1,c1);
unsigned int AD();
uint adc_finished;//轉(zhuǎn)換結(jié)束標(biāo)志


/*******************************************************************************
* 函 數(shù) 名         : Delay1ms
* 函數(shù)功能           : 延時(shí)函數(shù)
* 輸    入         : 無(wú)
* 輸    出         : 無(wú)
******************************************************************************/
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++);
}
/*******************************************************************************
* 函 數(shù) 名         : main
* 函數(shù)功能           : 主函數(shù)
* 輸    入         : 無(wú)
* 輸    出         : 無(wú)
*******************************************************************************/

                           
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();//掃描鍵盤(pán)
        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;
        }
        }
        }
      }
    }     
}
/*******************************************************************************
* 函 數(shù) 名         : 脈沖輸出
* 函數(shù)功能           : 主函數(shù)
* 輸    入         : 無(wú)
* 輸    出         : 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;}
}

              
/*******************************************************************************
* 函 數(shù) 名         : Key_Scan()
* 函數(shù)功能           : 掃描鍵盤(pán)
* 輸    入         : 無(wú)
* 輸    出         : 讀取到的鍵值
*******************************************************************************/

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

    keyValue=0xff;
    //--檢測(cè)按鍵1--//
    if (GPIO_KEY != 0xFF)        //檢測(cè)按鍵K1是否按下
    {
        Delay1ms(10);    //消除抖動(dòng)

        if (GPIO_KEY != 0xFF)    //再次檢測(cè)按鍵是否按下
        {
            keyValue = GPIO_KEY;
            i = 0;
            while ((i<5) && (GPIO_KEY != 0xFF))     //檢測(cè)按鍵是否松開(kāi)
            {
                Delay1ms(1);
                i++;
            }
        }
    }

    return keyValue;   //將讀取到鍵值的值返回
}
/*******************************************************************************
* 函 數(shù) 名         : LED4_Display (int temp)
* 函數(shù)功能           : LED顯示讀取到的溫度
* 輸    入         :
* 輸    出         : 無(wú)
*******************************************************************************/
void LED4_Display (int temp)
{
    unsigned char code *led_table;          // 查表指針
    uchar i,j;
    float tp;
    //顯示第4位   
    if(temp< 0)                //當(dāng)溫度值為負(fù)數(shù)
      {
    i =0xbf;
    LED_OUT(i);            
    LED_OUT(0x08);        

    RCLK = 0;                       
    RCLK = 1;
    //因?yàn)樽x取的溫度是實(shí)際溫度的補(bǔ)碼,所以減1,再取反求出原碼
        temp=temp-1;
        temp=~temp;
        tp=temp;
        temp=tp*0.0625*100+0.5;   
        //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
        //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
        //算由?.5,還是在小數(shù)點(diǎn)后面。
      }
     else
      {            
        i =0xff;
        LED_OUT(i);            
        LED_OUT(0x08);        
        RCLK = 0;                       
        RCLK = 1;
        tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
        //如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
        temp=tp*0.0625*100+0.5;   
        //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
        //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
        //算加上0.5,還是在小數(shù)點(diǎn)后面。
    }
    //顯示第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;

}
/*******************************************************************************
* 函 數(shù) 名         : LED4_Display2 (int temp)
* 函數(shù)功能           : LED顯示讀取到的濕度
* 輸    入         :
* 輸    出         : 無(wú)
*******************************************************************************/
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;

}
/*******************************************************************************
* 函 數(shù) 名         : LED_OUT(uchar X)
* 函數(shù)功能           : LED段選
* 輸    入         :
* 輸    出         : 無(wú)
*******************************************************************************/
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初始化函數(shù)
{
p1asf=0x10;//設(shè)置p10 為ad轉(zhuǎn)換輸入口
AUXR1&=0xfb;
adc_contr=0xe0;//打開(kāi)電源,設(shè)最高速度
//adc_contr=adc_power|adc_speedh|adc_chs;//電源X0000000,速度0XX00000
//通道:00000XXX

Delay1ms(5);
adc_contr|=adc_chs;//設(shè)置頻道

}

unsigned int AD()
{
unsigned char sd=0;
adcinit();
adc_res=0;
adc_low2=0;
adc_contr|=adc_start;//啟動(dòng)ad轉(zhuǎn)換,置1為起動(dòng),轉(zhuǎn)換結(jié)束后自動(dòng)置0
while(adc_finished==0)
   {
   adc_finished=adc_contr&adc_flag;//檢測(cè)是否轉(zhuǎn)換結(jié)束,沒(méi)結(jié)束一直等
   }

   adc_contr=adc_contr&0xef;//轉(zhuǎn)換結(jié)束標(biāo)志清零

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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:129827 發(fā)表于 2016-7-9 18:27 | 顯示全部樓層
有沒(méi)有高手指點(diǎn)呀,弄了幾天了實(shí)在找不到原因,都快弄瘋了!
回復(fù)

使用道具 舉報(bào)

ID:60379 發(fā)表于 2016-7-9 19:09 | 顯示全部樓層
AD轉(zhuǎn)很簡(jiǎn)單的,這里有完美的例程和視頻。雖是STC15,但程序與STC12完全相同,切莫當(dāng)面錯(cuò)過(guò)。
http://pan.baidu.com/share/home?uk=4077802723&view=share#category/type=0

回復(fù)

使用道具 舉報(bào)

ID:129827 發(fā)表于 2016-7-10 00:17 | 顯示全部樓層
無(wú)量壽經(jīng) 發(fā)表于 2016-7-9 19:09
AD轉(zhuǎn)很簡(jiǎn)單的,這里有完美的例程和視頻。雖是STC15,但程序與STC12完全相同,切莫當(dāng)面錯(cuò)過(guò)。
http://pan.b ...

我是按照技術(shù)手冊(cè)這么編程的而且看了你的介紹,依然有問(wèn)題,實(shí)在不懂究竟錯(cuò)在哪里了
回復(fù)

使用道具 舉報(bào)

ID:55565 發(fā)表于 2016-9-26 16:39 | 顯示全部樓層
你看下是不是你的頭文件定義錯(cuò)了,應(yīng)該是stc12C5A60S2的頭文件才行吧。官網(wǎng)可以下載到。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区视频 | 国产高潮好爽受不了了夜夜做 | 啪啪精品| 玩丰满女领导对白露脸hd | 欧美亚洲国产一区二区三区 | 国产精品第2页 | www.99精品| 黄色大全免费看 | 精品欧美一区二区三区久久久 | 欧美性大战久久久久久久蜜臀 | 国产精品中文字幕在线 | 国产精品资源在线观看 | 亚洲精品一区二区冲田杏梨 | 在线午夜 | 国产成人精品一区二区三 | 一级黄色片美国 | 久在线视频| 涩涩视频网站在线观看 | 在线看av网址 | 国产精品久久久久久福利一牛影视 | 黄色香蕉视频在线观看 | 亚洲国产一区二区在线 | 国产精品乱码一区二三区小蝌蚪 | 亚洲一区二区三区免费在线观看 | 久久精品91 | 日本欧美在线 | 奇米超碰 | www.jizzjizz | 久久一二 | 不卡的av一区| 亚洲高清视频在线观看 | 国产在线观看 | 伊人网国产 | 91精品久久久久久久久久入口 | 国产一区精品在线 | 亚洲精品一区二区 | 青青草华人在线视频 | 一级毛片视频 | 欧美日韩综合视频 | 日韩和的一区二区 | 在线欧美a|