20200516080358228.png (81.33 KB, 下載次數: 39)
下載附件
2020-5-16 13:49 上傳
#include <REG52.H> /*special function register declarations*/
#include <stdio.h> /*prototype declarations for I/O functions*/
#include <intrins.h>
#include <Absacc.h>
#include <string.h>
#include <ctype.h>
#define byte unsigned char
#define uchar unsigned char
#define word unsigned int
#define uint unsigned int
#define ulong unsigned long
#define BYTE unsigned char
#define WORD unsigned int
#define TRUE 1
#define FALSE 0
void initUart(void); /*初始化串口*/
void time(unsigned int ucMs); //延時單位:ms
void delay_50us(void); //延時50us
void delay_10us(void);
void delay_100us(void); //延時100us
/********************************************
*DS1820驅動程序
*版本:V1.0
*編程:飛揚
********************************************/
//引腳定義
sbit DS1820_DQ=P3^4; //單總線引腳
//函數聲明
bit ds1820_reset();
void ds1820_write_data(unsigned char ds1820_wdat);
unsigned char ds1820_read_data();
unsigned int read_temp(); //讀溫度數據函數
/************* main函數 **************/
void main(){
int wT=-110;
float f;
initUart(); /*初始化串行口*/
wT=read_temp(); //首次無效
time(1000);
do{
wT=read_temp();f=(float)wT/2;
printf("Temperature Measured Value of DS18S20=%g\n",f);
//輸出打印結果
time(1000);
}while(TRUE);
}
/**********************************************
*讀溫度數據函數
**********************************************/
unsigned int read_temp(){ //讀溫度數據函數
unsigned char data temperature[2]; //存放溫度數據
unsigned char i;
unsigned int wTemp;
ds1820_reset(); //復位
ds1820_write_data(0xcc); //跳過ROM命令
ds1820_write_data(0x44); //溫度轉換命令
ds1820_reset(); //復位
ds1820_write_data(0xcc); //跳過ROM命令
ds1820_write_data(0xbe); //讀DS1820溫度暫存器命令
for (i=0;i<2;i++){
temperature[ i]=ds1820_read_data();
}
ds1820_reset(); //復位,結束讀數據
wTemp=(wTemp);
}
/***********************************
*DS1820復位及存在檢測(通過存在脈沖可以判斷DS1820是否損壞)
*函數脈沖:DS1820_RESET()
*說明:函數返回一個位標量(0或1),flag=0存在,反之flag=1不存在
***********************************/
bit ds1820_reset(){
unsigned char i;
bit flag; //DS1820存在標志位
DS1820_DQ=0; //拉低總線
for(i=240;i>0;i--); //延時480us,產生復位脈沖
DS1820_DQ=1; //釋放總線
for(i=40;i>0;i--); //延時80us對總線采樣
flag=DS1820_DQ;
for(200;i>0;i--); //延時400us等待總線恢復
return(flag);
}
/************************************
*寫數據到DS1820
*函數名稱:ds1820_write_data()*
************************************/
void ds1820_write_data(unsigned char ds1820_wdat){
unsigned char i,j;
for(i=8;i>0;i--){
DS1820_DQ=0; //拉低總線,產生寫信號
for(j=2;j>0;j--); //延時4us
DS1820_DQ = ds1820_wdat&0x01; //發送1位
for(j=30;j>0;j--); //延時60us,寫時序至少要60us
DS1820_DQ = 1; //釋放總線,等待總線恢復
ds1820_wdat>>=1; //準備下一-位數據的傳送
}
}
/*************************************
*從DS1820中讀出數據
*函數名稱:ds1820_read_data ()
**************************************/
unsigned char ds1820_read_data() {
unsigned char i, j,ds1820_rdat;
for (i=8;i>0;i--) {
ds1820_rdat>>=1 ;
DS1820_DQ = 0; //拉低總線,產生讀信號
//for (j=2;j>0;j--); //延時 4us
delay_10us(); //延時10us
DS1820_DQ = 1; //釋放總線,準備讀數據
for(j=4;j>0;j--); //延時8us讀數據
if(DS1820_DQ == 1)
ds1820_rdat |= 0x80;
for(j=30; j>0; j--); //延時60us
DS1820_DQ = 1;//拉高總線,準備下一位數據的讀取
}
return (ds1820_rdat) ; //返回讀到的數據
}
/***********************************************
* 函數說明:延時5us,品振改變時只需要改變這一個函數
* 1.對于11.0592MHz 晶振而言,需要2個_nop_();
* 2. 對于22.1184MHz晶振而言,需要4個_nop_();
* 入口參數:無
* 返回:無
* 創建日期: 20010623
* 作者:張齊
*********************************************************/
void delay_5us(void)//延時5us,晶振改變時只用改變這一個函數!
{
_nop_();
_nop_();
//_nop_();
//_nop_();
}
/************ delay_50us ***************/
void delay_50us(void)//延時50us
{
unsigned char i;
for(i=0;i<4;i++)
{
delay_5us();
}
}
/******** 延時100us ******************/
void delay_100us(void)//延時100us
{
delay_50us();
delay_50us();
}
/*********** 延時單位:ms *******************/
void time(unsigned int ucMs)//延時單位:ms
{
unsigned char j;
while(ucMs>0){
for(j=0;j<10;j++) delay_100us();
ucMs--;
}
}
/*********初始化串行口波特率********/
void initUart (void) /* 初始化串行口波特率,使用定時器2*/
{
/*Setup the serial port for 9600 baud at 11. 0592MHz*/
SCON = 0x50; //串行口工作在工作方式1
RCAP2H= (65536- (3456/96))>>8;
RCAP2L= (65536- (3456/96))%8256;
T2CON=0x34; /*置位TI*/
TI=1;
}
求助:虛擬終端什么都沒有顯示
|