亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
新人求助~~溫度傳感器跟單片機的連接和單片機與PC機的連接
[打印本頁]
作者:
chen。chen
時間:
2016-5-4 09:41
標題:
新人求助~~溫度傳感器跟單片機的連接和單片機與PC機的連接
本人正在做溫度檢測系統,現在需要溫度傳感器和單片機連接中的AD轉換模塊和單片機與PC機連接時的串口通訊模塊的C語言程序,哪位大神能幫幫忙?萬分感謝~
作者:
cjjcjj1
時間:
2016-5-4 10:47
提示:
作者被禁止或刪除 內容自動屏蔽
作者:
東木和孟婆
時間:
2016-5-4 14:25
我有那個程序 好使的
作者:
東木和孟婆
時間:
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);
//}
作者:
東木和孟婆
時間:
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;
}
作者:
東木和孟婆
時間:
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; //返回溫度值
}
作者:
chen。chen
時間:
2016-5-5 09:28
cjjcjj1 發表于 2016-5-4 10:47
你好!溫度傳感器是18B20嗎?原理圖有了嗎?顯示是液晶還是數碼管?程序可以完成
顯示是在PC機的LabVIEW軟件里顯示的
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1