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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5683|回復: 6
打印 上一主題 下一主題
收起左側

新人求助~~溫度傳感器跟單片機的連接和單片機與PC機的連接

[復制鏈接]
跳轉到指定樓層
樓主
ID:118291 發表于 2016-5-4 09:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本人正在做溫度檢測系統,現在需要溫度傳感器和單片機連接中的AD轉換模塊和單片機與PC機連接時的串口通訊模塊的C語言程序,哪位大神能幫幫忙?萬分感謝~
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:82765 發表于 2016-5-4 10:47 | 只看該作者
提示: 作者被禁止或刪除 內容自動屏蔽
回復

使用道具 舉報

板凳
ID:117677 發表于 2016-5-4 14:25 | 只看該作者
我有那個程序 好使的

回復

使用道具 舉報

地板
ID:117677 發表于 2016-5-4 14:27 | 只看該作者
/***********************************************************
程序功能:STC12C5A60S2自帶ADC采集電壓信號+DS18B20溫度傳感器+LCD1602液晶顯示
MCU型號: STC12C5A60S2
晶振頻率:11.0892MHz
整理時間:2012年4月25號
************************************************************/

#include"STC12c5a60s2.h" //頭文件在STC公司主頁上下載
#include "intrins.h"
//sfr P4        = 0XC0;
//sfr ADC_CONTR = 0XBC;
//sfr ADC_RES   = 0XBD;
sfr ADC_LOW2  = 0XBE;
//sfr P1ASF     = 0X9D;

typedef unsigned char BYTE;
typedef unsigned int WORD;

#include "1602.h"
#include "DS18B20.h"

#define ADC_POWER   0X80
#define ADC_FLAG    0X10
#define ADC_START   0X08
#define ADC_SPEEDLL 0X00
#define ADC_SPEEDL  0X20
#define ADC_SPEEDH  0X40
#define ADC_SPEEDHH 0X60
unsigned char vr[17],vl[14];
unsigned int V1,V3;
void InitADC();
void Delay(WORD n);
WORD GetADCResult(BYTE ch);
void DisplayADCResult(int num);
void DisplayTemperature(int num);
unsigned char temp;
char qian=0,bai=0,shi=0,ge=0;
BYTE ly_dis[4];//定義顯示緩沖區
unsigned int AD_get(unsigned char channel)
{
        ADC_CONTR=0x88|channel;    //開啟AD轉換1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG   ADC_START CHS2 CHS1 CHS0
        _nop_(); _nop_(); _nop_(); _nop_();//要經過4個CPU時鐘的延時,其值才能夠保證被設置進ADC_CONTR 寄存器
        while(!(ADC_CONTR&0x10));    //等待轉換完成
                ADC_CONTR&=0xe7;      //關閉AD轉換,ADC_FLAG位由軟件清0
        return(ADC_RES*4+ADC_RESL);   //返回AD轉換完成的10位數據(16進制)
}
float AD_work(unsigned char channel)
{
        float AD_val;     //定義處理后的數值AD_val為浮點數
        unsigned char i;
        for(i=0;i<10;i++)
                AD_val+=AD_get(channel); //轉換10次求平均值(提高精度)
        AD_val/=10;
        AD_val=(AD_val*5)/1024; //AD的參考電壓是單片機上的5v,所以乘5即為實際電壓值
        return AD_val;
}
void UsartConfiguration()  //工作方式一 計數器工作方式2 波特率4800
{
        SCON=0X50;               
        TMOD=0X20;               
        PCON=0X80;                       
        TH1=0XF3;                               
        TL1=0XF3;
        TR1=1;                               
}
void chuankou_send(int num);//串口初始化 不加int型參數串口不好用
void main()
{       
        WORD i=0;
        float tt;
        int ltemp;
        LCDInit();
        UsartConfiguration();
        DisplayListChar(0, 0, "Temp:");
        while(1)
        {
               
                if(i==0)
                        tmpchange();              //溫度轉換
                if(i==100)
                {
                        tt=tmp()*0.0625;          //得到真實十進制溫度值,因為DS18B20
                                                                //可以精確到0.0625度,所以讀回數據的最低位代表的是0.0625度。
                          ltemp=tt*10+0.5;           //放大十倍,這樣做的目的將小數點后第一位也轉換為可顯示數字,同時進行一個四舍五入操作。

                        if(ltemp<0)
                        {                //判斷第一位顯示整數還是負號
                                ly_dis[0]=0xbf;
                                ltemp=0-ltemp;       
                        }
                        else
                        ly_dis[0]=ltemp/1000;//顯示百位值
                        ltemp=ltemp%1000;
                        ly_dis[1]=ltemp/100;        //顯示溫度十位值
                        ltemp=ltemp%100;
                        ly_dis[2]=ltemp/10;                //顯示溫度個位值
                        ly_dis[3]=ltemp%10;                //顯示小數點后一位
                }
                i++;
                if(i==150)
                {
                        DisplayADCResult(0);
                        i=0;
                }                       
                DisplayTemperature(6);        //調用顯示
//                 chuankou_send(0);               
        }
}

void DisplayADCResult(int num)
{
        V1=AD_work(6)*10000;   //采集上電位器的AD數據,保留4位小數
        V3=AD_work(5)*10000;   //采集下電位器的AD數據,保留4位小數
        vr[7]=V1%10+'0';      vr[6]=V1/10%10+'0';   vr[5]=V1/100%10+'0';
        vr[4]=V1/1000%10+'0'; vr[3]='.';            vr[2]=V1/10000%10+'0';  
        vr[1]=':';            vr[0]='X';          
       
        vr[16]=V3%10+'0';       vr[15]=V3/10%10+'0';   vr[14]=V3/100%10+'0';
        vr[13]=V3/1000%10+'0';  vr[12]='.';            vr[11]=V3/10000%10+'0';  
        vr[10]=':';             vr[9]='S';                            vr[8]=' ';
        //DisplayOneChar(0,1,vr[0]);
        DisplayOneChar(1,1,vr[1]);
//        SBUF=vr[1];
//        while(!TI);
//        TI=0;
        DisplayOneChar(2,1,vr[2]);
//        SBUF=vr[2];
//        while(!TI);
//        TI=0;
        DisplayOneChar(3,1,vr[3]);
//        SBUF=vr[3];
//        while(!TI);
//        TI=0;
        DisplayOneChar(4,1,vr[4]);
//        SBUF=vr[4];
//        while(!TI);
//        TI=0;
        DisplayOneChar(5,1,vr[5]);
//        SBUF=vr[5];
//        while(!TI);
//        TI=0;
        DisplayOneChar(6,1,vr[6]);
//        SBUF=vr[6];
//        while(!TI);
//        TI=0;
        DisplayOneChar(7,1,vr[7]);
//        SBUF=vr[7];
//        while(!TI);
//        TI=0;
        DisplayOneChar(8,1,vr[9]);       
//        SBUF=vr[9];
//        while(!TI);
//        TI=0;
        DisplayOneChar(9,1,vr[10]);
//        SBUF=vr[10];
//        while(!TI);
//        TI=0;
        DisplayOneChar(10,1,vr[11]);
//        SBUF=vr[11];
//        while(!TI);
//        TI=0;       
        DisplayOneChar(11,1,vr[12]);
//        SBUF=vr[12];
//        while(!TI);
//        TI=0;
        DisplayOneChar(12,1,vr[13]);
//        SBUF=vr[13];
//        while(!TI);
//        TI=0;
        DisplayOneChar(13,1,vr[14]);
//        SBUF=vr[14];
//        while(!TI);
//        TI=0;
        DisplayOneChar(14,1,vr[15]);
//        SBUF=vr[15];
//        while(!TI);
//        TI=0;       
        DisplayOneChar(15,1,vr[16]);
//        SBUF=vr[16];
//        while(!TI);
//        TI=0;
        DisplayOneChar(16,1,vr[0]);
//        SBUF=vr[0];
//        while(!TI);
//        TI=0;

                                                                                        //DisplayOneChar();
//        qian=GetADCResult(Channel)/1000;
//        bai=GetADCResult(Channel)%1000/100;
//        shi=GetADCResult(Channel)%1000%100/10;
//        ge=GetADCResult(Channel)%10;
//        if(0==qian)
//        DisplayOneChar(5,1,' ');
//        else
//        DisplayOneChar(5,1,table[qian]);
//
//        if(0==bai&&0==qian)
//        DisplayOneChar(6,1,' ');
//        else
//        DisplayOneChar(6,1,table[bai]);
//
//        DisplayOneChar(7,1,table[shi]);
//        DisplayOneChar(8,1,table[ge]);
//       
//        DisplayOneChar(9, 1, 'v');
//               
}

void DisplayTemperature(int num)        //溫度加串口
{
        if(0==ly_dis[0])
        DisplayOneChar(5, 0, ' ');
        else
        DisplayOneChar(5, 0, table[ly_dis[0]]);
        SBUF='T';
        while(!TI);
        TI=0;
        SBUF=':';
        while(!TI);
        TI=0;
        DisplayOneChar(6, 0, table[ly_dis[1]]);
        SBUF=table[ly_dis[1]];
        while(!TI);
        TI=0;
        DisplayOneChar(7, 0, table[ly_dis[2]]);
        SBUF=table[ly_dis[2]];
        while(!TI);
        TI=0;
        DisplayOneChar(8, 0,'.');
        SBUF='.';
        while(!TI);
        TI=0;
    DisplayOneChar(9, 0, table[ly_dis[3]]);
        SBUF=table[ly_dis[3]];
        while(!TI);
        TI=0;
        DisplayOneChar(10, 0, 0xdf);
        DisplayOneChar(11, 0, 'C');
        SBUF=' ';
        while(!TI);
        TI=0;
        SBUF='\n';
        while(!TI);
        TI=0;
//        Delay(2);                                        //延時后刷新數據過慢 所以注釋掉
}

WORD GetADCResult(BYTE ch)
{
        ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        while(!(ADC_CONTR&ADC_FLAG));
        ADC_CONTR&=~ADC_FLAG;

        return ADC_RES*4+ADC_LOW2;
}

void InitADC()
{
        P1ASF = 0XFF;
        ADC_RES = 0;
        ADC_CONTR = ADC_POWER|ADC_SPEEDLL;
        Delay(2);
}

void Delay(WORD t)
{
        WORD x;
        while(t--)
        {
                x = 5000;
                while(x--);
        }
}
//void chuankou_send(int num)        不好用
//{
//        SBUF='T';
//        while(!TI);
//        TI=0;
//        SBUF=':';
//        while(!TI);
//        TI=0;
//        SBUF=table[ly_dis[1]];
//        while(!TI);
//        TI=0;
//        SBUF=table[ly_dis[2]];
//        while(!TI);
//        TI=0;
//        SBUF='.';
//        while(!TI);
//        TI=0;
//        SBUF=table[ly_dis[3]];
//        while(!TI);
//        TI=0;
////        SBUF=vr[1];
////        while(!TI);
////        TI=0;
////        SBUF=vr[2];
////        while(!TI);
////        TI=0;
////        SBUF=vr[3];
////        while(!TI);
////        TI=0;
////        SBUF=vr[4];
////        while(!TI);
////        TI=0;
////        SBUF=vr[5];
////        while(!TI);
////        TI=0;
////        SBUF=vr[6];
////        while(!TI);
////        TI=0;
////        SBUF=vr[7];
////        while(!TI);
////        TI=0;
////        SBUF=vr[8];
////        while(!TI);
////        TI=0;
////        SBUF='S';
////        while(!TI);
////        TI=0;
////        SBUF=vr[10];
////        while(!TI);
////        TI=0;       
////        SBUF=vr[11];
////        while(!TI);
////        TI=0;
////        SBUF=vr[12];
////        while(!TI);
////        TI=0;
////        SBUF=vr[13];
////        while(!TI);
////        TI=0;
////        SBUF=vr[14];
////        while(!TI);
////        TI=0;
////        SBUF=vr[15];
////        while(!TI);
////        TI=0;
////        SBUF=vr[16];
////        while(!TI);
////        TI=0;
////        SBUF=vr[0];
////        while(!TI);
////        TI=0;
//        SBUF='\n';
//        while(!TI);
//        TI=0;
//        Delay(2);
//}
回復

使用道具 舉報

5#
ID:117677 發表于 2016-5-4 14:27 | 只看該作者
sbit LCD_RS=P2^6;//定義引腳
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
#define LCD_Data P0

/********宏定義***********************************************************/
#define Busy    0x80 //用于檢測LCD狀態字中的Busy標識


/********數據定義*************************************************************/
code BYTE table[]={48,49,50,51,52,53,54,55,56,57};         //0_9 ascii碼的數字

/********函數聲明*************************************************************/
void WriteDataLCD(BYTE WR_DATA);                                        //寫數據
void WriteCommandLCD(BYTE WCLCD);                //寫命令
void WriteCommandLCD1(BYTE WCLCD);                //寫命令
void busy_check(void);                                                //讀狀態
void LCDInit(void);                                                                                //初始化
void DisplayOneChar(BYTE X, BYTE Y, BYTE DData);                        //相應坐標顯示字節內容
void DisplayListChar(BYTE X, BYTE Y, BYTE code *DData);        //相應坐標開始顯示一串內容
//void delay1MS(uint t)
//{
//        uint i,j;
//        for(i=0;i<t;i++)
//        for(j=0;j<935;j++);
//}

/*初始化*/       
void LCDInit(void)
{
        WriteCommandLCD(0x38);//不檢測忙信號
        WriteCommandLCD(0x08);         //關閉顯示
        WriteCommandLCD(0x01);         //顯示清屏
        WriteCommandLCD(0x06);         //顯示光標移動設置
        WriteCommandLCD(0x0C);         //顯示開及光標設置
}

/*按指定位置顯示一串字符*/       
void DisplayListChar(BYTE X, BYTE Y, BYTE code *DData)
{
        BYTE ListLength;
        ListLength = 0;
        X &= 0xF;
        Y &= 0x1;                                 //限制X不能大于15,Y不能大于1
        while (DData[ListLength]>=0x20)
        { //若到達字串尾則退出
                   if (X <= 0xF){                 //X坐標應小于0xF
                     DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
                     ListLength++;
                     X++;
            }
          }
}

/*按指定位置顯示一個字符*/       
void DisplayOneChar(BYTE X, BYTE Y, BYTE DData)
{
        X &= 0xF;
        Y &= 0x1;                                //限制X不能大于15,Y不能大于1
        if (Y)
         X |= 0x40;                 //當要顯示第二行時地址碼+0x40;
       
        X |= 0x80;                         //算出指令碼
        WriteCommandLCD(X); //發送地址碼
        WriteDataLCD(DData);
}

/***********寫指令********************************************************/       
void WriteCommandLCD(BYTE WCLCD)
{       
        busy_check();
        LCD_Data = WCLCD;
        LCD_RS = 0;
        LCD_RW = 0;
        LCD_E = 1;        
        LCD_E = 0;
}

/***********寫數據********************************************************/       
void WriteDataLCD(BYTE WR_DATA)
{
        busy_check(); //檢測忙
        LCD_Data = WR_DATA;
        LCD_RS = 1;
        LCD_RW = 0;
        LCD_E = 1;
        LCD_E = 0;
}

//檢測忙信號
void busy_check(void)
{
        LCD_Data = 0xFF;
        LCD_E = 0;
        LCD_RS = 0;
        LCD_RW = 1;
        LCD_E = 1;
        while (LCD_Data & Busy);
        LCD_E = 0;
}


回復

使用道具 舉報

6#
ID:117677 發表于 2016-5-4 14:28 | 只看該作者
/********IO引腳定義***********************************************************/

sbit DS=P2^4;           //定義DS18B20接口




/*************延時子函數 *******************************************/
void delayb(WORD count)
{
  WORD i;
  while(count)
  {
    i=200;
    while(i>0)
    i--;
    count--;
  }
}

/*************DS18B20初始化*******************************************/
void dsreset(void)
{
  WORD i;
  DS=0;
// i=103;
i=1000;
  while(i>0)i--;
  DS=1;
// i=4;
i=40;
  while(i>0)i--;
}

/*************讀一位*************************************************/
bit tmpreadbit(void)
{
   WORD i;
   bit dat;
   DS=0;
   i++;          //小延時一下
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
   DS=1;
   i++;i++;
   dat=DS;
  // i=8;
  i=96;
   while(i>0)i--;
   return (dat);
}

/*************讀一個字節*************************************************/
BYTE tmpread(void)
{
  BYTE i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
    j=tmpreadbit();
    dat=(j<<7)|(dat>>1);   //讀出的數據最低位在最前面,這樣剛好//一個字節在DAT里
  }
  return(dat);             //將一個字節數據返回
}

/*************寫一個字節*************************************************/
void tmpwritebyte(BYTE dat)
{
  WORD i;
  BYTE j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
    if(testb)     // 寫1部分
    {
      DS=0;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
      DS=1;
     // i=8;
                i=96;
          while(i>0)i--;
    }
    else
    {
      DS=0;       //寫0部分
     // i=8;
                 i=96;
          while(i>0)i--;
      DS=1;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
        i++;i++;
    }
  }
}

/***********發送溫度轉換命令***********************************************/
void tmpchange(void)
{
  dsreset();             //初始化DS18B20
  delayb(1);             //延時
  tmpwritebyte(0xcc);  // 跳過序列號命令
  tmpwritebyte(0x44);  //發送溫度轉換命令
}

/***********獲得溫度*******************************************************/
int tmp()
{
  int temp;
  BYTE a,b;
  dsreset();
  delayb(1);

  tmpwritebyte(0xcc);  
  tmpwritebyte(0xbe);   //發送讀取數據命令

  a=tmpread();          //連續讀兩個字節數據
  b=tmpread();
  temp=b;
  temp<<=8;
  temp=temp|a;                 //兩字節合成一個整型變量。
  return temp;     //返回溫度值

}

回復

使用道具 舉報

7#
ID:118291 發表于 2016-5-5 09:28 | 只看該作者
cjjcjj1 發表于 2016-5-4 10:47
你好!溫度傳感器是18B20嗎?原理圖有了嗎?顯示是液晶還是數碼管?程序可以完成

顯示是在PC機的LabVIEW軟件里顯示的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲二区在线 | 久久精品久久久久久 | 在线一区二区三区 | 亚洲天堂久久新 | 影音先锋欧美资源 | 久久999 | 午夜视频免费网站 | 中文福利视频 | 欧美中文一区 | 久久天堂 | 91在线精品秘密一区二区 | 亚洲精品久久久久中文字幕二区 | 久久精品亚洲精品国产欧美kt∨ | 国产高清精品一区二区三区 | 日韩一级精品视频在线观看 | 婷婷激情综合 | 美女久久久久 | 中文字幕一区二区三区在线视频 | 做a视频 | 91天堂网| 在线视频一区二区 | 麻豆久久久久久久久久 | 日韩激情在线 | 免费麻豆视频 | 日韩成人免费 | 91免费观看| 久久久久久久综合色一本 | 亚洲一区二区在线播放 | 青青草原综合久久大伊人精品 | 国产精品一区二区在线 | 免费观看色 | 女同久久另类99精品国产 | 国产成人一区在线 | 中文字幕一区二区三区乱码在线 | 中文字幕第一页在线 | 亚洲成人精品一区二区 | 亚洲欧美中文日韩在线v日本 | 二区av| 老司机免费视频 | 亚洲欧美久久 | 亚洲一区二区视频 |