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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5873|回復: 6
收起左側

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

[復制鏈接]
ID:118291 發(fā)表于 2016-5-4 09:41 | 顯示全部樓層 |閱讀模式
本人正在做溫度檢測系統(tǒng),現(xiàn)在需要溫度傳感器和單片機連接中的AD轉換模塊和單片機與PC機連接時的串口通訊模塊的C語言程序,哪位大神能幫幫忙?萬分感謝~
回復

使用道具 舉報

ID:82765 發(fā)表于 2016-5-4 10:47 | 顯示全部樓層
提示: 作者被禁止或刪除 內容自動屏蔽
回復

使用道具 舉報

ID:117677 發(fā)表于 2016-5-4 14:25 | 顯示全部樓層
我有那個程序 好使的

回復

使用道具 舉報

ID:117677 發(fā)表于 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];//定義顯示緩沖區(qū)
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_();//要經(jīng)過4個CPU時鐘的延時,其值才能夠保證被設置進ADC_CONTR 寄存器
        while(!(ADC_CONTR&0x10));    //等待轉換完成
                ADC_CONTR&=0xe7;      //關閉AD轉換,ADC_FLAG位由軟件清0
        return(ADC_RES*4+ADC_RESL);   //返回AD轉換完成的10位數(shù)據(jù)(16進制)
}
float AD_work(unsigned char channel)
{
        float AD_val;     //定義處理后的數(shù)值AD_val為浮點數(shù)
        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()  //工作方式一 計數(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();              //溫度轉換
                if(i==100)
                {
                        tt=tmp()*0.0625;          //得到真實十進制溫度值,因為DS18B20
                                                                //可以精確到0.0625度,所以讀回數(shù)據(jù)的最低位代表的是0.0625度。
                          ltemp=tt*10+0.5;           //放大十倍,這樣做的目的將小數(shù)點后第一位也轉換為可顯示數(shù)字,同時進行一個四舍五入操作。

                        if(ltemp<0)
                        {                //判斷第一位顯示整數(shù)還是負號
                                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;                //顯示小數(shù)點后一位
                }
                i++;
                if(i==150)
                {
                        DisplayADCResult(0);
                        i=0;
                }                       
                DisplayTemperature(6);        //調用顯示
//                 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ù)據(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);
//}
回復

使用道具 舉報

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標識


/********數(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);                        //相應坐標顯示字節(jié)內容
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); //發(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;
}

//檢測忙信號
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;
}


回復

使用道具 舉報

ID:117677 發(fā)表于 2016-5-4 14:28 | 顯示全部樓層
/********IO引腳定義***********************************************************/

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




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

/*************讀一個字節(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ù)最低位在最前面,這樣剛好//一個字節(jié)在DAT里
  }
  return(dat);             //將一個字節(jié)數(shù)據(jù)返回
}

/*************寫一個字節(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ā)送溫度轉換命令***********************************************/
void tmpchange(void)
{
  dsreset();             //初始化DS18B20
  delayb(1);             //延時
  tmpwritebyte(0xcc);  // 跳過序列號命令
  tmpwritebyte(0x44);  //發(fā)送溫度轉換命令
}

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

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

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

}

回復

使用道具 舉報

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

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99精品视频在线 | 大香在线伊779 | 国产农村妇女精品一区 | 亚洲免费一区 | 成人在线视频一区 | 在线成人www免费观看视频 | 巨大黑人极品videos精品 | 欧美精品成人一区二区三区四区 | 国产成人久久精品 | 先锋av资源在线 | 在线高清免费观看视频 | 成人国产精品入口免费视频 | 久久av一区二区三区 | 亚洲国产成人在线视频 | 久久99精品久久久久婷婷 | 一区二区视频在线观看 | 中文字幕在线免费观看 | 东京av男人的天堂 | 羞羞羞视频 | av在线免费播放 | 黄色网址免费看 | 日韩午夜一区二区三区 | 成人av一区二区在线观看 | 国产免费让你躁在线视频 | www国产亚洲精品久久网站 | 成人av鲁丝片一区二区小说 | 一区二区av | 久久综合伊人 | 国产成人福利视频在线观看 | 久久y| 国产高清在线精品一区二区三区 | 国产精品三级久久久久久电影 | 人人干天天干 | 久久亚洲天堂 | 亚洲中国字幕 | 久久机热 | 国产精品欧美一区二区 | 狠狠干狠狠插 | 狠狠涩| 在线婷婷| 91久久精品国产91久久 |