. . ..
RST=1;
_nop_(); _nop_();
Write_Ds1302_Byte(address); for (i=0;i<8;i++) //循环8次 读取数据
{
if(SDA) temp|=0x80; SCK=0; temp>>=1;
_nop_();
_nop_();
_nop_();
SCK=1;
}
RST=0;
_nop_();
_nop_(); RST=0; SCK=0; _nop_(); _nop_(); _nop_(); _nop_(); SCK=1; _nop_(); _nop_(); SDA=0; _nop_();
_nop_();
.v
//每次传输低字节
//右移一位 //以下为DS1302复位的稳定时间
.. ..
第八章 单片机常用总线讲解
}
/******************************************************************/ /* 读时钟数据 */
/******************************************************************/ void Read_RTC(void) //读取 日历 {
unsigned char i,*p;
p=read_rtc_address; //地址传递 for(i=0;i<7;i++) {
l_tmpdate[i]=Read_Ds1302(*p); p++; } }
/******************************************************************/ /* 设定时钟数据 */
/******************************************************************/ void Set_RTC(void) {
unsigned char i,*p,tmp; for(i=0;i<7;i++)
//设定 日历
//分7次读取 秒分时日月周年
SDA=1; _nop_(); _nop_(); return (temp);
//返回
{ //BCD处理
}
tmp=l_tmpdate[i]/10;
l_tmpdate[i]=l_tmpdate[i]; l_tmpdate[i]=l_tmpdate[i]+tmp*16;
. . ..
Write_Ds1302(0x8E,0X00); p=write_rtc_address; for(i=0;i<7;i++) {
Write_Ds1302(*p,l_tmpdate[i]); p++;
//传地址
//7次写入 秒分时日月周年
}
}
Write_Ds1302(0x8E,0x80);
/******************************************************************/ /* 定时器中断函数 */
/******************************************************************/ void tim(void) interrupt 1 using 1
//中断,用于数码管扫描 {
static unsigned char i,num; TH0=0xf5; TL0=0xe0;
P0=table[l_tmpdisplay[i]]; switch(i)
{
case 0:LS138A=0; LS138B=0; LS138C=0; break;
//查表法得到要显示数字的数码段
case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break;
case 4:LS138A=0; LS138B=0; LS138C=1; break; case 5:LS138A=1; LS138B=0; LS138C=1; break; case 6:LS138A=0; LS138B=1; LS138C=1; break; case 7:LS138A=1; LS138B=1; LS138C=1; break;
}
.v .. ..
第八章 单片机常用总线讲解
}
i++; if(i==8) { i=0; num++;
if(10==num) //隔段时间读取1302的数据。时间间隔可以调整 { }
ReadRTC_Flag=1; //使用标志位判断 num=0; }
8.3 单总线协议
8.3.1 单总线的介绍
单总线技术是美国Dallas半导体公司近年推出的新技术。它将地址线、数据线、控制线合为1根信号线,允许在这根信号线上挂接数百个单总线器件芯片。基于单总线的每个芯片内部均有1个出厂前被光刻好的64位ROM序列号,它可以看作是该芯片的地址序列码。开始8位是产品类型标号,如DS18B20为28H,DS2450为20H等;接着的48位是该芯片自身的序列号,用以保证在同类芯片中的唯一性;最后8位是前面56位的循环冗余校验码,以确保数据传输的可靠性。光刻ROM的作用是使每个\单总线\器件的地址都各不相同,这是定位和寻址器件实现单总线测控功能的前提条件,并以此为依据实现1根总线上挂接多个\单总线\芯片。芯片内部集成有收发控制电路和电源存储电路。与微处理器的接口非常简单,可节省大量的引线和逻辑电路。芯片的耗电量很小,从总线上\偷\一点电(空闲时几μW,工作时几mW)存储在片内的电容中就可正常工作,一般不用另附电源。最可贵的是这些芯片在检测点已把被测信号数字化了,因此在单总线上传送的是数字信号,这使得系统的抗干扰性能好、可靠性高、传输距离远。
单总线技术具有节省I/O口线资源、结构简单、成本低廉、便于总线扩展和维护等优点,因此,在分布式测控系统中有着广泛应用。 8.3.2单总线实例应用(DS18B20)
. . ..
使用DS18B20温度传感器设计温控系统项目实现功能:使用TX-1C实验板上的DSI18B20温度传感器设计温控系统,要求如下:
(1)在前三个数码管上显示当前采集到的环境温度(O-99.9℃)。
(2)当环境温度低于27℃时,蜂鸣器开始以慢“滴”声报警,并且伴随P1.0口发光二极管闪烁〔模拟开启制热设备);当环境温度继续降低并低于25℃时,蜂鸣器以快“滴”声报警,并且伴随P1.0和P1.1口发光二极管一起闪烁(模拟加大制热设备功率)。
(3)当环境温度高于30℃时,蜂鸣器开始以慢“滴”声报警,并且伴随P1.2口发光二极管闪烁(模拟开启制冷设备);当环境温度继续升高并高于32℃时,蜂鸣器以快“滴”声报警,并且伴随P1.2和P1.3口发光二极管一起闪烁(模拟加大制冷设备功率)。
(4)用串口将采集到的温度数据实时发送至上位机,在上位机软件上显示当前温度值(关于上位机软件的编写请参考本篇第十一章(VB内容)。
关于温度变化的实现,大家可参考以下方法:室温通常在28℃左右,用手捏住温度传感器可使其温度上升,用温度低的物体接触温度传感器可使其温度降低,或在温度传感器上淋点水,然后对着温度传感器吹气可以使温度迅速下降,大家也可想其他办法使温度传感器周围温度在25℃-32℃变化。 温度传感器概述:
温度传感器是各种传感器中最常用的一种,早期使用的是模拟温度传感器,如热敏电阻,随着环境温度的变化,它的阻值也发生线性变化,用处理器采集电阻两端的电压,然后根据某个公式就可计算出当前环境温度。随着科技的进步,现代的温度传感器已经走向数字化,外形小,接口简单,广泛应用在生产实践的各个领域,为我们的生活提供便利。随着现代仪器的发展,微型化、集成化、数字化正成为传感器发展的一个重要方向。美国DALLAS半导体公司推出的数字化温度传感器DS18B20采用单总线协议,即与单片机接口仅需占用一个I/O端口,无须任何外部元件,直接将环境温度转化成数字信号,以数字码方式串行输出,从而大火简化了传感器与微处理器的接口。
图8-22至8-29所示为一些温度传感器实物图。
.v .. ..
单片机常用总线讲解
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)