找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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

使用道具 舉報(bào)

沙發(fā)
ID:82765 發(fā)表于 2016-5-4 10:47 | 只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
回復(fù)

使用道具 舉報(bào)

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

回復(fù)

使用道具 舉報(bào)

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

#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];//定義顯示緩沖區(qū)
unsigned int AD_get(unsigned char channel)
{
        ADC_CONTR=0x88|channel;    //開啟AD轉(zhuǎn)換1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG   ADC_START CHS2 CHS1 CHS0
        _nop_(); _nop_(); _nop_(); _nop_();//要經(jīng)過4個(gè)CPU時(shí)鐘的延時(shí),其值才能夠保證被設(shè)置進(jìn)ADC_CONTR 寄存器
        while(!(ADC_CONTR&0x10));    //等待轉(zhuǎn)換完成
                ADC_CONTR&=0xe7;      //關(guān)閉AD轉(zhuǎn)換,ADC_FLAG位由軟件清0
        return(ADC_RES*4+ADC_RESL);   //返回AD轉(zhuǎn)換完成的10位數(shù)據(jù)(16進(jìn)制)
}
float AD_work(unsigned char channel)
{
        float AD_val;     //定義處理后的數(shù)值A(chǔ)D_val為浮點(diǎn)數(shù)
        unsigned char i;
        for(i=0;i<10;i++)
                AD_val+=AD_get(channel); //轉(zhuǎn)換10次求平均值(提高精度)
        AD_val/=10;
        AD_val=(AD_val*5)/1024; //AD的參考電壓是單片機(jī)上的5v,所以乘5即為實(shí)際電壓值
        return AD_val;
}
void UsartConfiguration()  //工作方式一 計(jì)數(shù)器工作方式2 波特率4800
{
        SCON=0X50;               
        TMOD=0X20;               
        PCON=0X80;                       
        TH1=0XF3;                               
        TL1=0XF3;
        TR1=1;                               
}
void chuankou_send(int num);//串口初始化 不加int型參數(shù)串口不好用
void main()
{       
        WORD i=0;
        float tt;
        int ltemp;
        LCDInit();
        UsartConfiguration();
        DisplayListChar(0, 0, "Temp:");
        while(1)
        {
               
                if(i==0)
                        tmpchange();              //溫度轉(zhuǎn)換
                if(i==100)
                {
                        tt=tmp()*0.0625;          //得到真實(shí)十進(jìn)制溫度值,因?yàn)镈S18B20
                                                                //可以精確到0.0625度,所以讀回?cái)?shù)據(jù)的最低位代表的是0.0625度。
                          ltemp=tt*10+0.5;           //放大十倍,這樣做的目的將小數(shù)點(diǎn)后第一位也轉(zhuǎn)換為可顯示數(shù)字,同時(shí)進(jìn)行一個(gè)四舍五入操作。

                        if(ltemp<0)
                        {                //判斷第一位顯示整數(shù)還是負(fù)號(hào)
                                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;                //顯示溫度個(gè)位值
                        ly_dis[3]=ltemp%10;                //顯示小數(shù)點(diǎn)后一位
                }
                i++;
                if(i==150)
                {
                        DisplayADCResult(0);
                        i=0;
                }                       
                DisplayTemperature(6);        //調(diào)用顯示
//                 chuankou_send(0);               
        }
}

void DisplayADCResult(int num)
{
        V1=AD_work(6)*10000;   //采集上電位器的AD數(shù)據(jù),保留4位小數(shù)
        V3=AD_work(5)*10000;   //采集下電位器的AD數(shù)據(jù),保留4位小數(shù)
        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);                                        //延時(shí)后刷新數(shù)據(jù)過慢 所以注釋掉
}

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);
//}
回復(fù)

使用道具 舉報(bào)

5#
ID:117677 發(fā)表于 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狀態(tài)字中的Busy標(biāo)識(shí)


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

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

/*初始化*/       
void LCDInit(void)
{
        WriteCommandLCD(0x38);//不檢測忙信號(hào)
        WriteCommandLCD(0x08);         //關(guān)閉顯示
        WriteCommandLCD(0x01);         //顯示清屏
        WriteCommandLCD(0x06);         //顯示光標(biāo)移動(dòng)設(shè)置
        WriteCommandLCD(0x0C);         //顯示開及光標(biāo)設(shè)置
}

/*按指定位置顯示一串字符*/       
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)
        { //若到達(dá)字串尾則退出
                   if (X <= 0xF){                 //X坐標(biāo)應(yīng)小于0xF
                     DisplayOneChar(X, Y, DData[ListLength]); //顯示單個(gè)字符
                     ListLength++;
                     X++;
            }
          }
}

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

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

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

//檢測忙信號(hào)
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;
}


回復(fù)

使用道具 舉報(bào)

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

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




/*************延時(shí)子函數(shù) *******************************************/
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++;          //小延時(shí)一下
        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);
}

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

/*************寫一個(gè)字節(jié)*************************************************/
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++;
    }
  }
}

/***********發(fā)送溫度轉(zhuǎn)換命令***********************************************/
void tmpchange(void)
{
  dsreset();             //初始化DS18B20
  delayb(1);             //延時(shí)
  tmpwritebyte(0xcc);  // 跳過序列號(hào)命令
  tmpwritebyte(0x44);  //發(fā)送溫度轉(zhuǎn)換命令
}

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

  tmpwritebyte(0xcc);  
  tmpwritebyte(0xbe);   //發(fā)送讀取數(shù)據(jù)命令

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

}

回復(fù)

使用道具 舉報(bào)

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

顯示是在PC機(jī)的LabVIEW軟件里顯示的
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表