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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1343|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

51單片機檢測4~20mA PT100傳感器程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:731890 發(fā)表于 2024-1-1 20:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本例程采用宏晶的STC8G1K08單片機來檢測輸出類型為4~20mA PT100傳感器的程序,在檢測中使用XPT2046作為AD的檢測芯片,XPT2046具有4路12位的AD檢測輸入端,因此最大可檢測4路傳感器,本例程中我們只使用了其中1路。檢測時使用了中值濾波算法。先看一下XPT2046的驅(qū)動程序:

/****************************************************************************
*函數(shù)名:SPI_Write
*輸  入:dat:寫入數(shù)據(jù)
*輸  出:無
*功  能:使用SPI寫入數(shù)據(jù)
****************************************************************************/

void SPI_Write(uchar dat)
{
        uchar i;
        CLK = 0;
        delay_us(2);
        for(i=0; i<8; i++)
        {
                DIN = dat >> 7;          //放置最高位
                dat <<= 1;
                CLK = 0;                        //上升沿放置數(shù)據(jù)
                delay_us(2);
                CLK = 1;
    delay_us(2);
        }
}
/****************************************************************************
*函數(shù)名:SPI_Read
*輸  入:無
*輸  出:dat:讀取 到的數(shù)據(jù)
*功  能:使用SPI讀取數(shù)據(jù)
****************************************************************************/

uint SPI_Read(void)
{
        uint i, dat=0;
        CLK = 0;
        delay_us(2);
        for(i=0; i<12; i++)                //接收12位數(shù)據(jù)
        {
                dat <<= 1;
                CLK = 1;
                delay_us(2);
                CLK = 0;
    delay_us(2);
                dat|= DOUT;

        }
        return dat;        
}

/****************************************************************************
*函數(shù)名:Read_AD_Data
*輸  入:cmd:讀取的X或者Y
*輸  出:endValue:最終信號處理后返回的值
*功  能:讀取觸摸數(shù)據(jù)
****************************************************************************/
uint Read_AD_Data(uchar cmd)
{
        uint AD_Value;
        CS  = 0;
        delay_us(2);
        CLK = 0;
        delay_us(2);
        SPI_Write(cmd);
        delay_us(6);//延時等待轉(zhuǎn)換結(jié)果        
        CLK = 1;          //發(fā)送一個時鐘周期,清除BUSY
        delay_us(2);
        CLK = 0;
        delay_us(2);
        AD_Value=SPI_Read();
        CS = 1;
        return AD_Value;        
}

下面是它的頭文件:
#ifndef          __XPT2046_H_
#define   __XPT2046_H_

#include        "STC8G.H"
#include "delay.h"
#include<intrins.h>


//---定義使用的IO口---//
sbit DOUT = P1^0;          //輸出
sbit CLK  = P3^4;          //時鐘
sbit DIN  = P3^6;          //輸入
sbit CS   = P3^5;          //片選

uint Read_AD_Data(uchar cmd);
uint SPI_Read(void);
void SPI_Write(uchar dat);

#endif


以下是主程序:
#include "STC8G.H"
#include "delay.h"
#include "uart1.h"
#include "XPT2046.h"

#define voltage 5.00
#define ncnt   127                             //采集次數(shù)必須為奇數(shù)

float sum=0;                                                                //浮點型溫度值
float val=0;                                                                //AD采集到的電壓值
unsigned int temd;                                                                                //排序中間轉(zhuǎn)換變量
unsigned int temp;                                                                                //用取取緩存中的中間值
xdata unsigned int value_buf[ncnt];                          //AD采集存儲緩存
int wendu;                                                                   //整數(shù)型溫度變量
char count, i,j;                                                //排序計數(shù)變量
unsigned char puf[6];


void main()
{

        P_SW1 = 0x10;//RXD/P3.0, TXD/P3.1
        Uart1_Init();
  P1M0 = 0x00;                 //設(shè)置為準雙向口
        P1M1 = 0X00;
        P3M0 = 0x70;                 //設(shè)置為推挽輸出
        P3M1 = 0X00;

  while(1)
        {
                //temp = Read_AD_Data(0x94);//AIN0
                //temp = Read_AD_Data(0xD4);//AIN1
                //temp = Read_AD_Data(0xA4);//AIN2
                //temp = Read_AD_Data(0xE4);//AIN3
               
                for (count=0; count<ncnt; count++)                                                                    //連續(xù)采集ncnt次
                {
                 value_buf[count]= Read_AD_Data(0x94);             //將采集到的數(shù)據(jù)存到value_buf中
                }
                        for (j=0;j<ncnt-1;j++)                                                                                                     //將采集到的數(shù)據(jù)從小到大排列
                        {
                                for (i=0;i<ncnt-j;i++)                                                        //通過for循環(huán)排列數(shù)據(jù)
                                {
                                        if (value_buf[ i] > value_buf[i+1])                                          //如果前一個元素大于后一個元素
                                        {
                                                temd = value_buf[ i];                                                      //則將大的元素賦值給temd
                                                value_buf[ i] = value_buf[i+1];                                            //將小值賦給前一個元素
                                                value_buf[i+1] = temd;                                                    //將大值賦給后一個元素
                                        }
                                }
                        }
                        
                temp=value_buf[(ncnt-1)/2];                                                                                                   //取緩存中的中間值        
                val=temp*voltage/4096.0;                                                                                                   //算出當前電壓,5.01是AD基準值,跟據(jù)實際電壓自行修改
                sum=((250.00*val)/2.40)-112.50;                                                                     //根據(jù)公式計算出當前溫度,公式: T=(250/2.4)*V-112.5
                wendu=(int)(sum*10);                                                                                                                          //將浮點數(shù)*10轉(zhuǎn)換為整數(shù)型數(shù)據(jù)
               
                if(wendu&0x8000)                                                                                                                                    //如果溫度為負值
                {
                        wendu=((~wendu)&0x7fff)+1;                                                                                          //則取反加1
                        puf[0]='-';                                                                                                                                 //加上負數(shù)標志位'-'
                }        
                else if((wendu/1000)==0){
                        puf[0]=' ';
                }else puf[0]=wendu/1000+0x30;
               
                if(((wendu/1000)==0)&&((wendu%1000/100)==0))                          //如果最高兩位都為0
                        puf[1]=' ';                                                                                                                                                    //則不顯示
                else puf[1]=wendu%1000/100+0x30;                                                        //否則正常顯示數(shù)
               
                puf[2]=wendu%1000%100/10+0x30;
                puf[3]='.';
                puf[4]=wendu%1000%100%10+0x30;
   // Uart1_SendString(puf);
               
                //Uart1_SendChar(temp/256);
                //Uart1_SendChar(temp%256);
                delay_ms(300);
                }
}

原理圖: 無
仿真: 無
Keil代碼: PT00串口.7z (29.44 KB, 下載次數(shù): 25)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区精品自拍 | 成人久久久久久久久 | caoporn国产精品免费公开 | 四虎成人在线播放 | 伊人久久成人 | 精品一二三 | 综合色久 | 久久国产精品91 | 操久久 | 成人高清在线视频 | 久久久久免费精品国产小说色大师 | 日韩成人影院 | 91视频电影| 丁香综合| 日韩久草| 国产人成精品一区二区三 | 久久久精品网站 | 色免费视频| 日韩一二区| 亚洲福利 | 91 在线| 精品国产一区一区二区三亚瑟 | 国产精品国产成人国产三级 | 久久精品国产v日韩v亚洲 | 国产91久久精品一区二区 | 久久www免费视频 | 一区二区三区四区视频 | 天天爽一爽 | 欧美性生活一区二区三区 | av av在线| 国产高清视频在线观看播放 | 日本三级做a全过程在线观看 | 一级毛片成人免费看a | 国产精品亚洲一区二区三区在线观看 | 精品国产91| 成人中文字幕在线 | 欧洲国产精品视频 | 久久久毛片 | 91精品久久久久 | 午夜视频在线播放 | 男女那个视频 |