沈阳工业大学本科生毕业设计(论文)
ES = 1; }
/*--------------------------------------------------*/ //函数名称:DataChang
//功能描述:将压力、温度数据处理后存入串口发送数据缓冲区等待发送 //入口参数:压力、温度值 //返回值:无
void DataChang(unsigned int Dis,unsigned int Tem) { }
unsigned char h,l; h=Dis/256; l=Dis%6; Send_Buf[2]=h; Send_Buf[3]=l; h=Tem/256; l=Tem%6; Send_Buf[4]=h; Send_Buf[5]=l;
源代码三:测压部分
#include \#include
uchar Adc0832(unsigned char channel) //AD转换,返回结果 {
uchar i=0; uchar j; uint dat=0; uchar ndat=0;
if(channel==0)channel=2; if(channel==1)channel=3; ADDI=1; _nop_(); _nop_();
ADCS=0;//拉低CS端
36
沈阳工业大学本科生毕业设计(论文)
_nop_(); _nop_();
ADCLK=1;//拉高CLK端 _nop_(); _nop_();
ADCLK=0;//拉低CLK端,形成下降沿1 _nop_(); _nop_();
ADCLK=1;//拉高CLK端 ADDI=channel&0x1; _nop_(); _nop_();
ADCLK=0;//拉低CLK端,形成下降沿2 _nop_(); _nop_();
ADCLK=1;//拉高CLK端 ADDI=(channel>>1)&0x1; _nop_(); _nop_();
ADCLK=0;//拉低CLK端,形成下降沿3 ADDI=1;//控制命令结束 _nop_(); _nop_(); dat=0; for(i=0;i<8;i++) {
dat|=ADDO;//收数据 ADCLK=1; _nop_(); _nop_();
ADCLK=0;//形成一次时钟脉冲 _nop_(); _nop_(); dat<<=1;
if(i==7)dat|=ADDO; }
for(i=0;i<8;i++)
37
沈阳工业大学本科生毕业设计(论文)
{ j=0;
j=j|ADDO;//收数据 ADCLK=1; _nop_(); _nop_();
ADCLK=0;//形成一次时钟脉冲 _nop_(); _nop_(); j=j<<7; ndat=ndat|j; if(i<7)ndat>>=1; }
ADCS=1;//拉低CS端 ADCLK=0;//拉低CLK端
ADDO=1;//拉高数据端,回到初始状态 dat<<=8; dat|=ndat;
return(dat); //return ad k }
源代码四:DS18B20部分
#include \#include
extern void delay(unsigned int i);
/**********************4*******************/ /*****************DS18B20******************/
void Init_Ds18b20(void) //DS18B20初始化 { }
DQ=0; //单片机拉低总线 delay(900); //精确延时,维持至少480us DQ=1; //释放总线,即拉高了总线
delay(400); //此处延时有足够,确保能让DS18B20发出存在脉冲。
38
沈阳工业大学本科生毕业设计(论文)
/*****************************************************************************************/
unsigned char Read_One_Byte(void) //读取一个字节的数据 从总线移出
{ 效。
_nop_(); _nop_();
_nop_(); //至少维持了1us,表示读时序开始
dat>>=1; //让从总线上读到的位数据,依次从高位移动到低位。 DQ=1; //释放总线,此后DS18B20会控制总线,把数据传输到总线上 delay(10); //延时7us,此处参照推荐的读时序图,尽量把控制器采样时间
放到读时序后的15us内的最后部分
}
/********************************************************/ void Write_One_Byte(unsigned char dat) {
unsigned char i=0; for(i=8;i>0;i--) {
DQ=0; //拉低总线 if(DQ) //控制器进行采样 {
dat|=0x80; //若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0 } }
return (dat);
delay(100); //此延时不能少,确保读时序的长度60us--很重要 unsigned char i=0; unsigned char dat=0; for(i=8;i>0;i--) {
DQ=0; //将总线拉低,要在1us之后释放总线
//单片机要在此下降沿后的15us内读数据才会有
//读数据时,数据以字节的最低有效位先
39
沈阳工业大学本科生毕业设计(论文)
}
/***********************************************************************/ unsigned int Get_Tmp(void) //获取温度 {
unsigned int temp; float t;
unsigned char a=0,b=0;
Init_Ds18b20(); //初始化 Write_One_Byte(0xcc); //忽略ROM指令 Write_One_Byte(0x44); //温度转换指令 Init_Ds18b20(); //初始化 Write_One_Byte(0xcc); //忽略ROM指令
Write_One_Byte(0xbe); //读读RAM的存储器指令 a=Read_One_Byte(); //读取到的第一个字节为温度LSB b=Read_One_Byte(); //读取到的第二个字节为温度MSB temp=b; //先把高八位有效数据赋于temp
temp<<=8; //把以上8位数据从temp低八位移到高八位 temp=temp|a; //两字节合成一个整型变量 t=temp*0.0625; //得到真实十进制温度值
//因为DS18B20可以精确到0.0625度 //所以读回数据的最低位代表的是0.0625度 temp=t*10+0.5; //此处放大十倍
//这样做的目的将小数点后第一位也转换为
//临时中间变量
_nop_();
nop_(); //至少维持了1us,表示写时序(包括写0时序或写1时序)开始 DQ=dat&0x01; //从字节的最低位开始传输
//指令dat的最低位赋予给总线,必须在拉低总 //因为15us后DS18B20会对总线采样。
delay(100); //必须让写时序持续至少60us ----很重要 DQ=1; //写完后,必须释放总线, dat>>=1;
//因为15us后DS18B20会对总线采样。 delay(2); }
线后的15us内,
40