89c52控制ds1820释放总线是什么意思,是用单片机将总线拉高还是怎么样?

作者&投稿:夙货 (若有异议请与网页底部的电邮联系)
89c52控制ds1820释放总线是什么意思,是用单片机将总线拉高还是怎么样?~

1,释放总线一般就是指使管脚变为高阻态,这样就把总线空出来让其他器件用了。
2,对于51单片机,由于引脚内有上拉电阻,则释放总线代表对引脚写入1,这样总线被拉高,又很容易被其他器件的开集、开漏电路拉为低电平,也相当于空出总线让其他器件用。

我来回答吧,上个学期, 我做的课程设计就是基于单片机的数据温度计。

以下是我写出一程序,如果看不懂的话,就发邮件给我,amwjie72@163.com



#include
#include
#include
#include

#define uint unsigned int
#define uchar unsigned char

uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // 用于共阳 低电平有效 不带小数点
uchar table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; // 带小数点 用于第三位

sbit w1 =P2^7;
sbit w2 =P2^6;
sbit w3 =P2^5; //此处要用带小数点的共阳编码
sbit w4 =P2^4;
sbit dat=P3^5; //P3^5为DS18B20的数据线

void delay_ds18b20(uint t) reentrant; //用于ds18b20的延时程序
bit reset_ds18b20(void); //用于复位ds18b20
void wr_bit(bit i); //用于向ds18b20写入一个bit
void wr_byte(uchar d); //用于向ds18b20写入一个byte
uchar rd_bit(void); //用于从ds18b20读出一个bit
uchar rd_byte(void); //用于从ds18b20读出一个byte
void start_ds18b20(void) small; //用于启动ds18b20的温度转换
void read_temperature(); //用于读取ds18b20的温度
void shift(); //用于转换读取的温度值
void obtain_temp(); //更新一次温度值
void delay();

uchar temph; //保存温度高八位
uchar templ; //保存温度低八位
bit nagetiveflag; //如果此bit为1表示温度为负
uint integral; //转换温度的整数部分
uint radix_point; //转换温度的小数点部分


void main()
{





while(1)
{
if(nagetiveflag==1)
{
P0=0xbf;
}
else if(integral/100==0)
{
P0=0xff;
}
else
{
P0=table[integral/100];
}
w1=0;
delay();
w1=1;

if((integral%100)/10==0)
{
P0=0xff;
}
else
{
P0=table[(integral%100)/10];
}
w2=0;
delay();
w2=1;

P0=table1[integral%10];
w3=0;
delay();
w3=1;

P0=table[radix_point];
w4=0;
delay();
w4=1;

obtain_temp();


}


}
/*
///////////////////////////////
函数: delay_ds18b20
功能: ds18b20延时函数
参数: t 为定时时间长度
返回: 无
说明: 延时公式:15*t+15(近似),晶振12Mhz
//////////////////////////////
*/
void delay_ds18b20(uint t)reentrant
{
for( ;t>0;t--)
{
_nop_;_nop_;_nop_;_nop_;
}
_nop_;_nop_;
}

/*
///////////////////////////////
函数: reset_ds18b20
功能: 复位ds18b20
参数: 无
返回: 1:复位成功 0:复位失败
说明: 拉低总线至少480us;可用于检测ds18b20, 晶振12Mhz
//////////////////////////////
*/
bit reset_ds18b20()
{
bit ret=1;
dat=0; //拉低总线
delay_ds18b20(32); //为保险起见,延时495us
dat=1; //释放总线
delay_ds18b20(4); //需要等待15~60us ,这里延时75us,保证接收的是存在脉冲
ret=dat;
delay_ds18b20(14); //让ds18b20释放总线。
dat=1;
return(~ret);
}

/*
///////////////////////////////
函数: wr_bit
功能: 向ds18b20写入一个bit
参数: i
返回: 无
说明: 拉低总线至少1us;并在0~15us内向总线写入要写入的bit 持续60us, 晶振12Mhz
//////////////////////////////
*/
void wr_bit(bit i)
{
dat=0; //拉低总线产生写时序
_nop_();
_nop_();
dat=i; //延时大于1us,并在15us内写入数据
delay_ds18b20(3);//延时60us 等待ds18b20采样读取
dat=1; //释放总线
}
/*
///////////////////////////////
函数: wr_byte
功能: 向ds18b20写入一个byte
参数: d
返回: 无
说明: 通过调用wr_bit(bit i)从低往高位写
//////////////////////////////
*/
void wr_byte(uchar d)
{
uchar i=0;
while(i++<8)
{
wr_bit(d&0x01); //此处&为按位与,但结果会传给一个bit 所以不会产生错误
d>>=1;
}
}
/*
///////////////////////////////
函数: rd_bit
功能: 从ds18b20读出一个bit
参数: 无
返回: bit
说明: 总线从高拉低总线,持续至少1us以上,再释放总线。产生读时序
//////////////////////////////
*/
uchar rd_bit()
{
uchar retu;
dat=0; //拉低总线
_nop_;_nop_;
dat=1; //释放总线
_nop_;_nop_;
_nop_;_nop_;
retu=dat; //读取数据
delay_ds18b20(3);
dat=1; //释放总线
return retu;
}
/*
///////////////////////////////
函数: rd_byte
功能: 从ds18b20读出一个byte
参数: 无
返回: ucahr
说明: 通过调用8次rd_bit()达到读出一个byte
//////////////////////////////
*/
uchar rd_byte()
{
uchar i;
uchar da;
for(i=0;i<8;i++)
{
da>>=1; //选读最低位
if(rd_bit())//读出来的是0可不用做或运算
{
da|=0x80;
}
}
return da;
}

/*
///////////////////////////////
函数: start_ds18b20
功能: 启动ds18b20
参数: 无
返回: 无
说明: 复位后,写入0xcc跳过对rom的操作,并写入0x44来启动温度转换
//////////////////////////////
*/
void start_ds18b20() small
{
dat=1;
reset_ds18b20();
wr_byte(0xcc); //跳过对rom的操作
wr_byte(0x44); //启动温度转换
}
/*
///////////////////////////////
函数: read_temperature
功能: 读取温度
参数: 无
返回: 无
说明: 复位后,写入0xcc跳过对rom的操作,并写入0xbe来读取温度。读两个字节
//////////////////////////////
*/
void read_temperature()
{
int temp;
reset_ds18b20();
wr_byte(0xcc); //跳过对rom的操作
wr_byte(0xbe); //发读取命令
templ=rd_byte();
temph=rd_byte();
}
/*
///////////////////////////////
函数: shift
功能: 温度转换
参数: 无
返回: 无
说明: 在读出温度后,用来将温度信息转换为对应该的温度数值大小
radix_point为小数点部分 integral整数部分
//////////////////////////////
*/
void shift()
{
if(temph>15)
{
nagetiveflag=1;
}
else
{
nagetiveflag=0;
}
radix_point=((float)(templ&0x0f))/1.6;
integral=(temph&0x07)*16+(templ>>4);
}
/*
///////////////////////////////
函数: delay
功能: 动态扫描延时
参数: 无
返回: 无
说明: 无
//////////////////////////////
*/
void delay()
{
uint k,j;
for(k=50;k>0;k--)
for(j=5;j>0;j--);
}
/*
///////////////////////////////
函数: obtain_temp
功能: 复位DS18B20读取温度值并对其进行转换
参数: 无
返回: 无
说明: 更新radix_point(小数点部分) integral(整数部分)
//////////////////////////////
*/
void obtain_temp()
{
start_ds18b20();
read_temperature();
shift();
}

1,释放总线一般就是指使管脚变为高阻态,这样就把总线空出来让其他器件用了。
2,对于51单片机,由于引脚内有上拉电阻,则释放总线代表对引脚写入1,这样总线被拉高,又很容易被其他器件的开集、开漏电路拉为低电平,也相当于空出总线让其他器件用。


基于51单片机的温度控制器
这样就能做到温度控制了。\/\/安装目录下的EXE文件打开后可在电脑上显示当前温度值 include <reg52.h> define uchar unsigned char define uint unsigned int sbit DS=P1^0; \/\/define interface uint temp; \/\/ variable of temperature uchar flag1; \/\/ sign of the result positive or neg...

89s52给写个能定时7小时的程序
TIME1:JB SPL.3,DSXS ;转定时小时显示 JB SPL.4,DSXS ;转定时分钟显示 JB SPL.5,DSXS ;转...MOV P1,#00H ;P1口控制显示数据,此时显示小时十位数据 MOV P1,A CLR P2.7 ;P2口控制位置(低电平...; 0 1 2 3 4 5 6 7 8 9 F N END这个可以设定任意时间 追问 有简单一点的就好了 、上电...

...单片机ATmega8515读取RTC(DS1302)的时间信息的C语言程序,只要读秒...
这个是我画的单片机和DS1302的连接图,本人初学单片机,还有好多不懂,我想知道单片机通过这3个pins的连接是如何控制DS1302,从而读取时间信息的。求大神们给个C语言的程序,我现在完... 这个是我画的单片机和DS1302的连接图,本人初学单片机,还有好多不懂,我想知道单片机通过这3个pins的连接是如何控制DS1302,从而读取时...

51单片机 要求:数码管1、2位显示实际温度;4、5位显示设定温度;7、8位...
#include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int typedef unsigned char BYTE; sbit LCD_RS = P2^0; \/*定义LCD控制端口*\/ sbit LCD_RW = P2^1; sbit LCD_EN = P2^2; sbit SCLK = P1^0; \/\/DS1302时钟口P1.0 sbit IO = P1^1; \/\/DS1302...

求一份单片机答辩的题目和答案 我不是计算机专业的 简单点就行 拜托了...
(1)单片机的图形化编程方法探讨 (2)单片机应用编程技巧 (3)单片机自身的抗干扰若干措施 (4)单片机编音乐程序 (5)用89C51做直流稳压电源 (6)王款主流CMMB调谐器的特性比较 (7)红外遥控器控制的风扇温控器 (8)用单片机89S52制作计算器 (9)用单片机89C51制作程控交换机 (10)数据采集和记录系统单片机AT89C51 (11...

谁有LED12864显示,DS12C887时钟心片,AT89C52单片机的C语言程序,有的发...
if(mo==4||mo==6||mo==9||mo==11){max=30;mini=1;} \/\/每月30天的月份 } if(sel==1) {lcm_w_word("月份");address=8; max=12;mini=1;} \/\/月份8 if(sel==0) {lcm_w_word("年份");address=9; max=99;mini=0;} \/\/年份9 item=ds_read(address); \/\/读取DS12...

单片机使用80C52RC利用定时器0来做时钟。(晶振12MHz)。使用程序为最普遍...
理论上讲,是没有误差的,以前有学生问我说程序自身的耗时,会带来误差,其实不会的,只要你的程序写的合格,软件不会带来误差的,就这个时钟而言,如果用时标法写,主循环一次,可以保证在20个ms以内.但是,实际运行中,的确有误差,那么,我们来看一下误差的来源:我们运行的时钟有误差,软件没有误差,那么,很...

51单片机温度传感器ds18b20、lcd1602液晶C程序
void ds_getT(void);\/\/声明18B20获得温度显示值函数 \/*定义数码管段码===0-9===A-G===*\/ unsigned char a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};\/\/共阳极数码管的段码0 1 2 3 4 5 6 7 8 9 A B C D E F ...

关于51单片机若干的问题,急。。。
write_com(0x0c); \/\/取消光标闪烁 TR0=1; \/\/启动定时器使时钟走 } flag=0; write_ds(0,miao); write_ds(2,fen); write_ds(4,shi); write_ds(6,week); write_ds(7,day); write_ds(8,month); write_ds(9,year); \/\/ break; } } if(s1num!=0) \/\/只有功能键被按下后,增大和减小键...

C++做一个小游戏,有源代码的最好,谢谢
int r,c,alls[22][22],backstage[22][22]={0}; srand((int)time(0)); for(r=1;r<=Row...drawFrame(49, 4, 79, 9, '-', '|');\/\/ draw score frame drawFrame(49, 9, 79, 20, ...SetPos(52, 6); cout<<"得分:"; SetPos(52, 7); cout<<"称号:"; SetPos(52,10); cout...

和县15112008020: 89C52单片机 -
主父莘恒得: 我用过DS1302这个芯片,不仅有年月日时分秒,还有星期,因为这个芯片要用到外接的3V纽扣电池供电,在上电时会用主电源的5V,单片机用普通的IO口来实现读写时序就可以了相见c程序 http://hi.baidu.com/%D1%A7%CA%F5%BF%C6%BC%BC/blog/item/80b7c53ef8a2ec3571cf6c30.html

和县15112008020: 蓄电池智能监控系统怎么设计? -
主父莘恒得: 分布式蓄电池智能节点设计 摘 要:本文论述了基于CAN总线的蓄电池智能监控系统的实现,包括智能监控模块的软硬件结构,独立CAN控制器SJA1000的应用,数字式单总线温度检测单元,给出了串接电池电压检测的一种可行方案. 关键词:...

和县15112008020: 求温度传感器DS18b20与单片机at89c51连接,汇编程序?
主父莘恒得: TEMPER_L EQU 36H ;存放读出温度低位数据 TEMPER_H EQU 35H ;存放读出... 一线总线控制端口 ORG 0000H LJMP MAIN ORG 0100HMAIN: MOV SP,#70H LCALL ...

和县15112008020: 89c52+ds1302(时钟)+ds1820(温度)+12864(显示)程序 -
主父莘恒得: 我有89c52+ds1302(时钟)+ds1820(温度)+1602(显示)程序 和89c52+ds1302(时钟)+12864(显示)程序 都可以给你

和县15112008020: 有谁会写单片机程序的啊?我在做一个STC89C52RC单片机与DS18B20温度传感器及蜂鸣器的温度控制报警系统, -
主父莘恒得: ^参考一下下面的报警器程序吧,这是《PROTEUS仿真100例》中的. //名称:按键发音 #include<reg51.h> #define uchar unsigned char #define uint unsigned intsbit SPK=P1^0; sbit K1=P1^7;void Alarm(uchar t) {uchar i,j;for(i=0;i<200;i++){...

和县15112008020: STC89C52RC可以做几路PWM输出.如果可以,怎么实现?重点,几路 -
主父莘恒得: STC89C52RC内部并没有PWM电路,需要PWM输出,就只能用定时器来控制输出脉冲的宽度和占空比.这样的话,就只好用I/O引脚来模拟PWM波输出了,32个I/O脚都可以输出,加上新增的P4.4、P4.5、P4.6三个I/O脚,原则上可以用35路PWM输出.如果选用STC12C5A60S2系列单片机做输出PWM,就方便多了.内部增加了PWM控制寄存器,可以自动产生PWM脉冲输出,有两路的PWM输出,写程序很容易了,设置几个寄存器就行了.下图是STC12C5A60S2系列单片机的PWM功能介绍.

和县15112008020: 求基于89C52,lcd1602,ds18b20显示时间测温的C程序
主父莘恒得: #include&lt;reg51.h&gt; #define uchar unsigned char #define uint unsigned int sbit DQ=P3^5;//ds18b20与单片机连接口 sbit RS=P1^0; sbit RW=P1^1; sbit EN=P1^2; unsigned char code str1[]=; unsigned char code str2[]=; uchar data disdata[5]; uint...

和县15112008020: 89c52单片机求编程 -
主父莘恒得: #include<reg51.h> #define uchar unsigned char uchar num=0; sbit pulse=P1^0; void t0isr() interrupt 1{ num++; if(num<6)pulse=1; else pulse=0; if(num>80)num=0; } main() { TMOD=0x02; TH0=6; TL0=6; ET0=1; TR0=1; EA=1; while(1); }

和县15112008020: 89c52单片机怎么用4个针脚控制几个4相5线步进电机 -
主父莘恒得: 89c52单片机用4个针脚控制几个4相5线步进电机的方法:1、用两片74HC595,串转并,扩展出16个端口,可以控制4个步进电机;2、可以给同时几个驱动模块发电平,可以驱动无数个电机的,输出4路PWM,然后再用一片89C52.因为即使用专用的步进电机驱动芯片,也至少得2个IO控制一个电机.89C52是INTEL公司MCS-51系列单片机中基本的产品,它采用ATMEL公司CMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品.它结合了CMOS的高速和高密度技术及CMOS的低功耗特征,它基于标准的MCS-51单片机体系结构和指令系统.

和县15112008020: 单片机89c52如何控制多个数码管? -
主父莘恒得: 只想用P3口的话,必须另加控制元件. 1一种方法是用两个锁存器来锁存数码管的段码和位码,进行动态扫描显示. 2另一方法是,用P3口的4位接一个BCD译码器控制数码管的段码,再P3口的3位接一个3-8译码器来控制数码管的位进行动态扫描. 3再就是可以用P3口的两根串行线接串并转换IC,来驱动数码管.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网