单片机C语言案例教程习题解答(5)

2019-03-22 20:39

}

Wbyte1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/ }

Gets1302() //把从DS1302读得的时间数据写入时间数组 {

uchar i;

uchar ucAddr=0x81;

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

Utime[i]=Rbyte1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */ ucAddr +=2; } }

b20reset() //18B20复位,初始化函数 {

uchar i; ds=0;

for(i=1;i<110;i++); ds=1;

for(i=1;i<10;i++); }

bit b20Rbit() //读1位函数 {

uchar i; bit dat;

ds=0;ds=0;ds=0;

ds=1;ds=1;ds=1;ds=1; dat=ds;

for(i=1;i<10;i++); return (dat); }

uchar b20Rbyte() //读1个字节 {

uchar i,j,dat; dat=0;

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

j=b20Rbit();

dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里

}

return(dat); }

b20Wbyte(uchar dat) //向18B20写一个字节数据 {

uint i; uchar j; bit testb;

for(j=1;j<=8;j++) {

testb=dat&0x01; dat=dat>>1;

if(testb) //写 1 {

ds=0; ds=0; ds=0; ds=1;

for(i=1;i<9;i++) ; } else {

ds=0; //写 0 for(i=1;i<9;i++) ; ds=1; ds=1; ds=1; } } }

b20Set() //DS18B20 开始获取温度并转换 {

b20reset(); delayx(1);

b20Wbyte(0xcc); // 写跳过读ROM指令 b20Wbyte(0x44); // 写温度转换指令 }

uint b20Get() //读取寄存器中存储的温度数据 {

uchar TL,TH; b20reset(); delayx(1);

b20Wbyte(0xcc); b20Wbyte(0xbe);

TL=b20Rbyte(); //读低8位 TH=b20Rbyte(); //读高8位 temp=TH; temp<<=8; temp|=TL; if(TH>0x07) {

c1b=0xbf; //设为负号'-'显示 temp=~temp+1;} else

c1b=0xc6; //设为字母'C'显示 temp=temp*6.25; temp=temp+5; temp=temp/10;

return temp; //temp是整型 }

//* ================ 打开 ISP,IAP 功能 ================= */ void ISP_IAP_enable(void) { EA = 0; /* 关中断 */ ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */ ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */ ISP_CONTR = ISP_CONTR | 0x80; /* ISPEN=1 */ }

/* =============== 关闭 ISP,IAP 功能 ================== */ void ISP_IAP_disable(void) { ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */ ISP_TRIG = 0x00; EA = 1; /* 开中断 */ }

/* ================ 公用的触发代码 ==================== */ void ISPgoon(void) { ISP_IAP_enable(); /* 打开 ISP,IAP 功能 */ ISP_TRIG = 0x46; /* 触发ISP_IAP命令字节1 */ ISP_TRIG = 0xb9; /* 触发ISP_IAP命令字节2 */ _nop_();

}

/* ==================== 字节读 ======================== */ unsigned char byte_read(unsigned int byte_addr) { ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址赋值 */ ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); ISP_CMD = ISP_CMD & 0xf8; /* 清除低3位 */ ISP_CMD = ISP_CMD | RdCommand; /* 写入读命令 */ ISPgoon(); /* 触发执行 */ ISP_IAP_disable(); /* 关闭ISP,IAP功能 */ return (ISP_DATA); /* 返回读到的数据 */ }

/* ================== 扇区擦除 ======================== */ void SectorErase(unsigned int sector_addr) { unsigned int iSectorAddr; iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */ ISP_ADDRH = (unsigned char)(iSectorAddr >> 8); ISP_ADDRL = 0x00; ISP_CMD = ISP_CMD & 0xf8; /* 清空低3位 */ ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3 */ ISPgoon(); /* 触发执行 */ ISP_IAP_disable(); /* 关闭ISP,IAP功能 */ }

/* ==================== 字节写 ======================== */ void byte_write(unsigned int byte_addr, unsigned char original_data) { ISP_ADDRH = (unsigned char)(byte_addr >> 8); /* 取地址 */ ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */ ISP_CMD = ISP_CMD | PrgCommand; /* 写命令2 */ ISP_DATA = original_data; /* 写入数据准备 */ ISPgoon(); /* 触发执行 */ ISP_IAP_disable(); /* 关闭IAP功能 */ }

time_set( )interrupt 0 {

unsigned int m,n,u,k,i; unsigned char *p; p=0x2000; u=mmhh[0]*2;

SectorErase(0x2000);//擦除扇区 for(m=0;m<=u;m++)

byte_write(p+m,mmhh[m]);//重新写入数据 m=23;u=59; while(s6!=0) {

if(m==24) m=0; if(u==60) u=0; if(u==-1) u=59; n=m*100+u;

for(i=1;i<=100;i++) Disp_led(n); if(s3==0) { for(i=0;i<100;i++) ; if(s3==0) m++;} if(s4==0) { for(i=0;i<100;i++) ; if(s4==0) u++;} if(s5==0) { for(i=0;i<100;i++) ; if(s5==0) u--; } }

Utime[0]=0; Utime[1]=u; Utime[2]=m; for(i=0;i<7;i++) {

k=Utime[i]/10;

Utime[i]=Utime[i]; Utime[i]=Utime[i]+16*k;

} Puts1302(); }


单片机C语言案例教程习题解答(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:“一任务双主三段七环节”翻转课堂教学模式探索实践 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: