[单片机实验3-1《ds18b20温度测控实验指导书》150423

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实验7:芯片控制《ds18b20温度测控》1、硬件设计:据附录1:《ds18b20温度测试》电路图,在Protues软件中绘出硬件仿真电路。2、填空:软件设计,将附录2给出的《ds18b20温度测试》程序补充完整。3、仿真:编译程序,完成仿真。4、增加控制功能:当温度低于200C时,控制低温超限电机启动;当温度高于300C时,控制高温超限电机启动,并添加高、低、正常三种温度的LED指示电路及程序。附录1:《ds18b20温度测试》电路图ABCDEFGDPABCDEFGDPCS1CS2CS3CS4CS1CS2CS3CS4XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51X1CRYSTALC130pFC230pFR1100C31uFR210k234567891RP?RESPACK-8-20.0DQ2VCC3GND1U2DS18B20附录2:给出的《ds18b20温度测试》程序【填空】/*********************************************DS18B20温度测量*********************************************/#includereg51.h#defineucharunsignedchar#defineuintunsignedint【】DQ=P3^0;//单数据总线【】p20=P2^0;//位码C【-88.C】【】p21=P2^1;//位码8.【-88.C】【】p22=P2^2;//位码8【-88.C】【】p23=P2^3;//位码负号-【-88.C】)code【】tab[]={0XC0,0XF9,0XA4,0XB0,0X99,//0~9共阳段码0X92,0X82,0XF8,0X80,0X90};code【】tab1[]={0X40,0X79,0X24,0X30,0X19,//0~9共阳段码带小数点0X12,0X02,0X78,0X00,0X10};uchara,b,t,h;ucharbai,shi,ge,xiao;////////////////////////////////////////////////【】delay(unsignedinti){while(【】);}/******************复位函数******************1。初始化:单总线操作从初始化开始:1)请求:【单片机发送启动(复位)负脉冲:DQ=0,480us后,DQ=1】进入Rx接收模式操作:DQ:1-0(480us+)-12)响应:【单片机接收应答信号:收DQ=1(15~60us)-响应DQ=0(60~240us),说明有单线器件在线】操作:DS18B20检测到DQ上升沿后,延时15~60us,通过拉低总线60~240us,产生应答脉冲.DQ:1(15~60us)-0(60~240us)【DQ=0,初始化完成,即可2.ROM操作】*********************************************/bitint_DS18B20(void)//初始化函数【合理简化协议】{unsignedcharx=0;【】=1;//1)请求:【单片机发送启动负脉冲:DQ=0,480us】delay(8);//延时480us【】=0;//单片机拉低DQ------delay(80);//延时480us(略大于)|480us|【】=1;//拉高总线DQ-----delay(14);//84usx=【】;//延时片刻后读,如果x=0则初始化成功,x=1则初始化失败delay(20);returnx;//返回x=DQ}/******************************************1。写时隙【DQ=下降沿时产生】:数据线DQ送出下降沿时,产生写时隙(必须60us,各写时隙间保证1us的恢复时间)写1【DQ=0,15us后DQ=1】:主机将数据线DQ先拉低,然后释放15us后,将数据线DQ拉高;写0【DQ=0,60us】:主机将DQ拉低并至少保持60us以上.******************************************///写一个字节voidWrite(unsignedchardat)//dat=要写到DQ的8位数{unsignedchari=0;for(i=8;i0;i--)//写8位{【】=0;//从高电平拉至低电平时,下降沿产生写时隙【】=dat0x01;//写最低位:【第1次循环】DQ=dat&D0,高7位置0【第2次循环:DQ=dat.D1(已移到D0)高7位置0】delay(5);//写时隙都必须在60us以上【】=1;//15us后,将数据线DQ拉高dat=1;//【第1次循环】将已经写完毕的dat.D0移出丢弃。【第2次循环:将dat.D1移出丢弃】,...}delay(4);}/********************************************************2)读时隙【DQ=下降沿时产生】:(读时隙必须60us,各读时隙间保证1us的恢复时间)读DQ:送出DQ=1us负脉冲后,延时15us后读取DQ********************************************************///读一个字节Read(void)//返回dat=从DQ读8位{unsignedchari=0;unsignedchardat=0;for(i=8;i0;i--)//读8位{【】=0;//DQ从高电平拉至低电平时,产生读时隙60usdat=1;//已接收的各位:dat左移1位【先接收低位】【】=1;//DQ=0至少1us,将DQ拉高,15us后,读取DQ:if(【】)//读:若DQ=1,则:dat|=0x80;//令dat的D7置1,其它位不变:先读最低位【第1次循环】为D0,【第2次循环:为D1】...【第8次循环:为D7】delay(4);//延时,准备读下一位}return(dat);//返回读取的1个字节}//启动转换voidint__(void){while(int_DS18B20());//若int_DS18B20()返回1,则不断重新初始化Write(0xCC);//跳过读序列号【ROM操作】Write(0x44);//启动温度转换【RAM操作】}//*******【主函数:读温度-转换-显示】【7段码显示:另题讨论voidmain(void){uintcount=0;int__();//启动转换P2=【】;//LED全灭【共阳,位码=0】delay(2200);/************测试数码显示【7段码显示】for(count=0;count1000;count++)//开机显示全0【一会】{p20=1;//百位亮P0=tab[9];//显示0delay(20);p20=0;//百位灭p21=1;//十位亮P0=tab[8];//显示0delay(20);p21=0;//十位灭p22=1;//个位亮P0=tab[7];//显示0delay(0);p22=0;//个位灭p23=1;//末位亮P0=0xc6;//显示温度标志Cdelay(20);p23=0;//末位灭}*****************************************/while(1)//无限循环{delay(120);//可去掉while(int_DS18B20());//若int_DS18B20()返回1,则不断重新初始化Write(0xCC);//跳过读序号列号的操作Write(0xBE);//读取温度等9个寄存器,顺序读,前两个是温度a=Read();//读取温度值低位//a=返回的dat=从DQ读的8位b=Read();//读取温度值高位//b=返回的dat=从DQ读的8位if(b【】)//如果b大于127【温度为负值】小于0{a=~a;//取反【取补码】b=~b;//取反【取补码】a=a4;//低位右移4位,舍弃小数部分t=b4;//高位左移4位,舍弃符号位t=t|a;//把a合并到低位t+=1;//温度+1【取补码】无此句,负数显示高1度shi=t/10;//去掉个位:charshi低4位=十位数ge=t-shi*10;//温度个位=t减掉10位数的值for(count=0;count123;count++)//显示负温度值{if(t=10)//有百位{p20=1;//百位P0=0xBF;//负数符号delay(20);p20=0;p21=1;//十位P0=tab[shi];delay(20);p21=0;p22=1;//个位P0=tab1[ge];delay(20);p22=0;p23=1;//末位显示P0=0xc6;//显示温度标志Cdelay(20);p23=0;}else//无百位{p20=0;p21=1;//十位P0=0xBF;//负符号delay(20);p21=0;p22=1;//个位P0=tab1[ge];delay(20);p22=0;p23=1;//显示温度标志CP0=0xc6;delay(20);p23=0;}}}else//【温度为正值】{count=0;a=a【】4;//低位右移4位,舍弃小数部分t=b【】4;//高位左移4位,舍弃符号位t=t【】a;//高地位合并bai=t【】100;//取百位数shi=(t-bai*100)【】10;//取十位数ge=t-(bai*100+shi*10);//取个位数for(count=0;count123;count++)//【显示正温度值】{if(bai)//百位不是0?{p20=1;//百位P0=【】[bai];//显示百位数delay(20);p20=0;}elsep20=0;if(shi)//十位不是0?{p21=1;//十位P0=tab[【】];//显示十位数delay(20);p21=0;}p21=0;p22=1;//个位P0=【】[ge];//显示个位数delay(20);p22=0;p23=1;//小数点P0=0xc6;delay(20);p23=0;}}int__();//启动转换}}

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功