万年历课程设计报告 联系客服

发布时间 : 星期日 文章万年历课程设计报告更新完毕开始阅读

{

DQ =1; // 先将数据线拉高 _nop_(); //等待一个机器周期

DQ = 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序 dat>>=1;

_nop_(); //等待一个机器周期

DQ = 1; //将数据线\人为\拉高,为单片机检测DS18B20的输出电平作准备 for(time=0;time<2;time++)

; //延时约6us,使主机在15us内采样 if(DQ==1)

dat|=0x80; //如果读到的数据是1,则将1存入dat else

dat|=0x00;//如果读到的数据是0,则将0存入dat //将单片机检测到的电平信号DQ存入r[i] for(time=0;time<8;time++)

; //延时3us,两个读时序之间必须有大于1us的恢复期 }

return(dat); //返回读出的十进制数据 }

/***************************************************** 函数功能:向DS18B20写入一个字节数据 入口参数:dat

***************************************************/ void WriteOneChar(uchar dat) {

uchar i=0;

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

DQ =1; // 先将数据线拉高 _nop_(); //等待一个机器周期

DQ=0; //将数据线从高拉低时即启动写时序 DQ=dat&0x01; //利用与运算取出要写的某位二进制数据, //并将其送到数据线上等待DS18B20采样 for(time=0;time<10;time++)

;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样 DQ=1; //释放数据线 for(time=0;time<1;time++)

;//延时3us,两个写时序间至少需要1us的恢复期 dat>>=1; //将dat中的各二进制位数据右移1位 }

for(time=0;time<4;time++)

; //稍作延时,给硬件一点反应时间 }

25

/***************************************************** 函数功能:显示没有检测到DS18B20

***************************************************/ void display_error(void) {

uchar i;

WriteAddress(0x00); //写显示地址,将在第1行第1列开始显示 i = 0; //从第一个字符开始显示

while(Error[i] != '\\0') //只要没有写到结束标志,就继续写 {

WriteData(Error[i]); //将字符常量写入LCD i++; //指向下一个字符

delaynms(100); //延时100ms较长时间,以看清关于显示的说明 }

while(1) //进入死循环,等待查明原因 ; }

/***************************************************** 函数功能:显示温度的小数点

***************************************************/ void display_dot(void) {

WriteAddress(0x80+0x40+0x03); //写显示地址,将在第2行第10列开始显示

WriteData('.'); //将小数点的字符常量写入LCD

delaynms(50); //延时1ms给硬件一点反应时间 }

/***************************************************** 函数功能:显示温度的单位(Cent)

***************************************************/ void display_cent(void) {

WriteAddress(0x80+0x40+0x05); //写显示地址,将在第2行第13列开始显示

WriteData(0xdf);

WriteAddress(0x80+0x40+0x06); WriteData('C'); }

/***************************************************** 函数功能:显示温度的整数部分 入口参数:x

***************************************************/ void display_temp1(unsigned char x) {

26

uchar j,k,l; //j,k,l分别储存温度的百位、十位和个位 j=x/100; //取百位 k=(x0)/10; //取十位

l=x; //取个位

WriteAddress(0x80+0x40); //写显示地址,将在第2行第7列开始显示 WriteData(digit[j]); //将百位数字的字符常量写入LCD WriteData(digit[k]); //将十位数字的字符常量写入LCD WriteData(digit[l]); //将个位数字的字符常量写入LCD delaynms(50); //延时1ms给硬件一点反应时间 }

/***************************************************** 函数功能:显示温度的小数数部分 入口参数:x

***************************************************/ void display_temp2(uchar x) {

WriteAddress(0x80+0x40+0x04); //写显示地址,将在第2行第11列开始显示 WriteData(digit[x]); //将小数部分的第一位数字字符常量写入LCD delaynms(50); //延时1ms给硬件一点反应时间 }

/***************************************************** 函数功能:做好读温度的准备

***************************************************/ void ReadyReadTemp(void) {

Init_DS18B20(); //将DS18B20初始化

WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 for(time=0;time<100;time++)

; //温度转换需要一点时间 Init_DS18B20(); //将DS18B20初始化 WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位 }

/******************************************* 向1302写一个字节

*******************************************/ void input_BYTE(uchar dat) {

uchar i; ACC=dat;

for(i=8;i>0;i--) {

27

T_IO=ACC0; T_CLK=1; T_CLK=0;

ACC=(ACC>>1); } }

/******************************************* 1302读出一个字节

*******************************************/ uchar output_BYTE() {

uchar i;

for(i=8;i>0;i--) {

ACC=(ACC>>1); ACC7=T_IO; T_CLK=1; T_CLK=0; }

return (ACC); }

/******************************************* 写数据

*******************************************/ void write_1302(uchar add,uchar dat) {

T_RST=0; T_CLK=0; T_RST=1;

input_BYTE(add); input_BYTE(dat); T_CLK=1; T_RST=0; }

/******************************************* 读数据

*******************************************/ uchar read_1302(uchar add) {

uchar inf; T_RST=0; T_CLK=0; T_RST=1;

input_BYTE(add);

28