ds18b20C程序proteus仿真.docx

上传人:b****4 文档编号:4189337 上传时间:2022-11-28 格式:DOCX 页数:12 大小:139.82KB
下载 相关 举报
ds18b20C程序proteus仿真.docx_第1页
第1页 / 共12页
ds18b20C程序proteus仿真.docx_第2页
第2页 / 共12页
ds18b20C程序proteus仿真.docx_第3页
第3页 / 共12页
ds18b20C程序proteus仿真.docx_第4页
第4页 / 共12页
ds18b20C程序proteus仿真.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

ds18b20C程序proteus仿真.docx

《ds18b20C程序proteus仿真.docx》由会员分享,可在线阅读,更多相关《ds18b20C程序proteus仿真.docx(12页珍藏版)》请在冰豆网上搜索。

ds18b20C程序proteus仿真.docx

ds18b20C程序proteus仿真

DS18B20测温显示,proteus仿真。

 

Writtenbyjinsongliang

具体程序如下

Main.c:

#include

#include"lib51v3.c"

#include"18b20.c"

#include"segv3.c"

voidmain(void)

{

unsignedchardisp[5]={10,0,0,14,2};

signedchartemp=0;

while

(1)

{

/*1、读取温度值*/

temp=Get_Temputer();

//2、显示前处理*/

if(temp<0)

{disp[0]=13;

temp=-temp;

disp[1]=temp/10;

disp[2]=temp%10;

}

else

{disp[0]=temp/100;

disp[1]=temp/10-disp[0]*10;

disp[2]=temp%10;

if(!

disp[0])//百位数不为0则显示,若要显示0,可将其注释掉

disp[0]=10;

}

//3、显示*/

Seg_Display(disp);

}

}

 

Lib51v3.c

voidDelay_Nus(unsignedcharn)

{

while(n--);

//for(;n>0;n--);

}

 

18b20.c:

/******************************************************************

时序很重要,移植时注意延时函数

******************************************************************/

#defineB20_PORTP1//此处可以设置I/O口

#defineB20_CHANNEL0

#defineR_B20_CHANNEL()B20_PORT&(1<

#defineW_B20_CHANNEL_1()B20_PORT|=(1<

#defineW_B20_CHANNEL_0()B20_PORT&=~(1<

#defineSKIP_ROM0xCC

#defineTEMPUTER_CONVERT0x44

#defineREAD_ROM0xBE

 

//one

/*

初始化函数,失败会返回1,初始化过程见注释

若单片机读到了数据线上的低电平“0”后,还要做延时,

其延时的时间从单片机发出的高电平算起最少要480微秒。

之后单片机将数据线再次拉高到高电平“1”后结束。

*/

staticunsignedcharInit_18b20(void)

{

unsignedcharx=0;

W_B20_CHANNEL_1();//1、从单片机拉高数据线开始

Delay_Nus(8);//6*nusecondslib51v3.c

W_B20_CHANNEL_0();

Delay_Nus(81);

W_B20_CHANNEL_1();//2、单片机拉低数据线480us以上,拉高数据线,释放

Delay_Nus(14);//3、之后ds18b20,15~60us以后反应,拉高数据线

x=R_B20_CHANNEL();//4、单片机读取数据线

if(x)

returnx;

Delay_Nus(20);

returnx;//x=0代表复位成功

}

 

//two

staticvoidWrite_18b20(unsignedcharw_data)

{

unsignedchari;

unsignedchartemp;

for(i=0;i<8;i++)

{

W_B20_CHANNEL_1();

temp=w_data&(1<<0);

W_B20_CHANNEL_0();//单片机从高到低,拉低1us以上,并在15us内产生写间隙

B20_PORT=temp<

Delay_Nus(7);//15~60us内18B20采样

w_data>>=1;

}

W_B20_CHANNEL_1();

Delay_Nus(4);

}

 

//three

staticunsignedcharRead_18b20(void)

{

unsignedchari;

unsignedchartemp;

unsignedcharr_data=0x00;

for(i=0;i<8;i++)

{

r_data>>=1;

W_B20_CHANNEL_1();

W_B20_CHANNEL_0();//从高到低15us内,再到高,产生读间隙

Delay_Nus

(1);

W_B20_CHANNEL_1();

temp=B20_PORT<<(7-B20_CHANNEL);//读数据,从低位开始

temp&=(1<<7);

r_data+=temp;

Delay_Nus(8);//整个读一位过程在60~120us

}

W_B20_CHANNEL_1();

returnr_data;

}

//four

/*

若要读出当前的温度数据我们需要执行两次工作周期,

第一个周期为复位、跳过ROM指令、执行温度转换存储器操作指令、等待500uS温度转换时间。

紧接着执行第二个周期为复位、跳过ROM指令、执行读RAM的存储器操作指令、读数据

(最多为9个字节,中途可停止,只读简单温度值则读前2个字节即可)

*/

signedcharGet_Temputer(void)//读取温度值,返回的带符号字符型-55到+127;128无法显示,初始化失败会显示00.C

{

unsignedchartem_h,tem_l;

signedchartemp;

if(Init_18b20()==0)//复位18b20

{

Write_18b20(SKIP_ROM);//跳过ROM

Write_18b20(TEMPUTER_CONVERT);//温度变换

}

else

returntemp=0;

//Delay_Nus(100);

if(Init_18b20()==0)//复位18b20

{

Write_18b20(SKIP_ROM);//跳过ROM

Write_18b20(READ_ROM);//读暂存存储器

}

else

returntemp=0;

tem_l=Read_18b20();//读数据

tem_h=Read_18b20();

/*

只要高字符的低四位和低字符的高四位,温度范围0~99,temp为补码,直接由unsignedchar赋值给signedchar内容不变,代表的值改变

*/

temp=(tem_h<<4)+(tem_l>>4);

returntemp;

}

 

Segv3.c:

#defineCOMMON_ANODIC0//共阳数码管

#defineCOMMON_CATHODAL1//共阴数码管

#defineSEG_CATEGORY0//选择共阳数码管

 

#defineSEG8_A~(1<<0)//段A亮时为0,属共阳数码管

#defineSEG8_B~(1<<1)

#defineSEG8_C~(1<<2)

#defineSEG8_D~(1<<3)

#defineSEG8_E~(1<<4)

#defineSEG8_F~(1<<5)

#defineSEG8_G~(1<<6)

#defineSEG8_DP~(1<<7)

#defineSEG8_CHAR_0~(SEG8_G&SEG8_DP)

#defineSEG8_CHAR_1~(SEG8_A&SEG8_D&SEG8_E&SEG8_F&SEG8_G&SEG8_DP)

#defineSEG8_CHAR_2~(SEG8_C&SEG8_F&SEG8_DP)

#defineSEG8_CHAR_3~(SEG8_E&SEG8_F&SEG8_DP)

#defineSEG8_CHAR_4~(SEG8_A&SEG8_D&SEG8_E&SEG8_DP)

#defineSEG8_CHAR_5~(SEG8_B&SEG8_E&SEG8_DP)

#defineSEG8_CHAR_6~(SEG8_B&SEG8_DP)

#defineSEG8_CHAR_7~(SEG8_D&SEG8_E&SEG8_F&SEG8_G&SEG8_DP)

#defineSEG8_CHAR_8~SEG8_DP

#defineSEG8_CHAR_9~(SEG8_E&SEG8_DP)

#defineSEG8_CHAR_~0

#defineSEG8_CHAR_E~(SEG8_B&SEG8_C&SEG8_DP)

#defineSEG8_CHAR_R~(SEG8_A&SEG8_B&SEG8_C&SEG8_D&SEG8_F&SEG8_DP)

#defineSEG8_CHAR_SUB~(SEG8_A&SEG8_B&SEG8_C&SEG8_D&SEG8_E&SEG8_F&SEG8_DP)

//#defineSEG8_CHAR_A

//#defineSEG8_CHAR_B

#defineSEG8_CHAR_C~(SEG8_B&SEG8_C&SEG8_G&SEG8_DP)

//#defineSEG8_CHAR_D

//#defineSEG8_CHAR_F

//#defineSEG8_CHAR_H

#ifSEG_CATEGORY==COMMON_ANODIC

staticconstunsignedcharSEG8_CODE[]={

SEG8_CHAR_0,

SEG8_CHAR_1,

SEG8_CHAR_2,

SEG8_CHAR_3,

SEG8_CHAR_4,

SEG8_CHAR_5,

SEG8_CHAR_6,

SEG8_CHAR_7,

SEG8_CHAR_8,

SEG8_CHAR_9,

SEG8_CHAR_,//SEG8_CODE[10]

SEG8_CHAR_E,//SEG8_CODE[11]

SEG8_CHAR_R,//SEG8_CODE[12]

SEG8_CHAR_SUB,//SEG8_CODE[13]

SEG8_CHAR_C//SEG8_CODE[14]

};

#else

staticconstunsignedcharSEG8_CODE[]={

~SEG8_CHAR_0,

~SEG8_CHAR_1,

~SEG8_CHAR_2,

~SEG8_CHAR_3,

~SEG8_CHAR_4,

~SEG8_CHAR_5,

~SEG8_CHAR_6,

~SEG8_CHAR_7,

~SEG8_CHAR_8,

~SEG8_CHAR_9,

~SEG8_CHAR_,//SEG8_CODE[10]

~SEG8_CHAR_E,//SEG8_CODE[11]

~SEG8_CHAR_R,//SEG8_CODE[12]

~SEG8_CHAR_SUB,//SEG8_CODE[13]

~SEG8_CHAR_C//SEG8_CODE[14]

};

#endif

 

#defineSEG8_SLECT_PORTP3//此处可以设置I/O口

#defineBIT00

#defineBIT11

#defineBIT22

#defineBIT33

#defineSEG8_BIT0_ON()SEG8_SLECT_PORT|=(1<

#defineSEG8_BIT0_OFF()SEG8_SLECT_PORT&=~(1<

#defineSEG8_BIT1_ON()SEG8_SLECT_PORT|=(1<

#defineSEG8_BIT1_OFF()SEG8_SLECT_PORT&=~(1<

#defineSEG8_BIT2_ON()SEG8_SLECT_PORT|=(1<

#defineSEG8_BIT2_OFF()SEG8_SLECT_PORT&=~(1<

#defineSEG8_BIT3_ON()SEG8_SLECT_PORT|=(1<

#defineSEG8_BIT3_OFF()SEG8_SLECT_PORT&=~(1<

#defineSEG8_CODE_PORTP2//此处可以设置I/O口

voidSeg_Display(char*p)

{

unsignedchartemp[4];

temp[0]=SEG8_CODE[*p++];

temp[1]=SEG8_CODE[*p++];

temp[2]=SEG8_CODE[*p++];

temp[3]=SEG8_CODE[*p++];

if(*p<4)

#ifSEG_CATEGORY==COMMON_ANODIC

temp[*p]&=SEG8_DP;

#else

temp[*p]|=~SEG8_DP;

#endif

{

unsignedchari;

for(i=0;i<150;i++)

{

SEG8_CODE_PORT=temp[0];

SEG8_BIT0_ON();

Delay_Nus(6);//lib51v1.c

SEG8_BIT0_OFF();

SEG8_CODE_PORT=temp[1];

SEG8_BIT1_ON();

Delay_Nus(6);

SEG8_BIT1_OFF();

SEG8_CODE_PORT=temp[2];

SEG8_BIT2_ON();

Delay_Nus(6);

SEG8_BIT2_OFF();

SEG8_CODE_PORT=temp[3];

SEG8_BIT3_ON();

Delay_Nus(6);

SEG8_BIT3_OFF();

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1