基于单片机的创新向“日”葵课程设计说明书(编辑修改稿)内容摘要:
or(time=0。 time1。 time++)。 //延时 3us,两个写时序间至 少需要 1us 的恢 dat=1。 //将 dat 中的各二进制位数据右移 1 位 } for(time=0。 time4。 time++)。 //稍作延时 ,给硬件一点反应时间 } //函数功能:做好读温度的准备 void ReadyReadTemp(void) { Init_DS18B20()。 //将 DS18B20 初始化 WriteOneChar(0xCC)。 // 跳过读序号列号的操作 WriteOneChar(0x44)。 // 启动温度转换 ys(200)。 //转换一次需要延时一段时间 Init_DS18B20()。 //将 DS18B20 初始化 WriteOneChar(0xCC)。 //跳过读序号列号的操作 WriteOneChar(0xBE)。 //读取温度寄存器 ,前两个分别是温度的低位和高 } char dwd() //读取温度,返回温度值 { char wd。 8daf1edaa73b6134ace81237ddec3732 第 13 页 unsigned char TL,TH,TN,TD。 //储存暂存器的温度低位 flag=0。 ReadyReadTemp()。 //读温度准备 TL=ReadOneChar()。 //先读的是温度值低位 TH=ReadOneChar()。 //接着读的是温度值高位 if((THamp。 0xf8)!=0x00)//判断高五位 得到温度正负标志 { flag=1。 TL=~TL。 //取反 TH=~TH。 //取反 tltemp=TL+1。 //低位加 1 TL=tltemp。 if(tltemp255) TH++。 //如果低 8 位大于 255,向高 8 位进 1 TN=TH*16+TL/16。 //实际温度值 =(TH*256+TL)/16,即: TD=(TL%16)*10/16。 //计算温度的小数部分 , } TN=TH*16+TL/16。 //实际温度值 =(TH*256+TL)/16,即: TD=(TL%16)*10/16。 //计算温度的小数部分 ,将余数乘以 10 再除以 16 wd=TN+TD/。 if(flag==1) wd=wd。 return wd。 //(wd%1)*10 为小数位 } 电机驱动 unsigned char dj[]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}。 8daf1edaa73b6134ace81237ddec3732 第 14 页 void ys(unsigned int z) { unsigned int x。 unsigned int y。 for(x=z。 x0。 x) for(y=114。 y0。 y)。 } // 电机程序 void djzd(unsigned char k,bit c) //转过的角度 =K*16*360/128,c 代表正反 转 { unsigned char i,j,temp。 if(c==1) { for(j=0。 j(k*16)。 j++) for(i=0。 i8。 i++) { P1=dj[i]。 ys(5)。 } } Else { for(j=0。 j(k*16)。 j++) for(i=8。 i0。 i) { temp=i1。 8daf1edaa73b6134ace81237ddec3732 第 15 页 P1=dj[temp]。 ys(5)。 } } } 时钟读取 sbit rst=P3^7。 sbit clk=P3^3。 sbit din=P3^4。 //函数功能:延时若干微秒 void delaynus(unsigned char n) { unsigned char i。 for(i=0。 in。 i++)。 } //函数功能:向 1302 写一个字节数据 void Write1302(unsigned char dat) { unsigned char i。 SCLK=0。 //拉低 SCLK,为脉冲上升沿写入数据做好准备 delaynus(2)。 //稍微等待,使硬件做好准备 for(i=0。 i8。 i++) //连续写 8 个二进制位数据 { DATA=datamp。 0x01。 delaynus(2)。 //取出 dat 的第 0 位数据写入 1302 8daf1edaa73b6134ace81237ddec3732 第 16 页 SCLK=1。 delaynus(2)。 //上升沿写入数据 SCLK=0。 //重新拉低 SCLK,形成脉冲 dat=1。 //将 dat 的各数据位右移 1 位,准备写入 下一个数 } } //函数功能:根据命令字,向 1302 写一个字节数据 void WriteSet1302(unsigned char Cmd,unsigned char dat) { RST=0。 //禁止数据传递 SCLK=0。 //确保写数居前 SCLK 被拉低 RST=1。 delaynus(2)。 //启动数据传输 Write1302(Cmd)。 //写入命令字 Write1302(dat)。 //写数据 SCLK=1。 //将时钟电平置于高电平状态 RST=0。 //禁止数据传递 } //函数功能:从 1302 读一个字节数据 unsigned char Read1302(void) { unsigned char i,dat。 delaynus(2)。 //稍微等待,使硬件做好准备 for(i=0。 i8。 i++) //连续读 8 个二进制位数据 { dat=1。 if(DATA==1) //如果读出的数据是 1 dat|=0x80。 //将 1 取出,写在 dat 的最高位 SCLK=1。 delaynus(2)。 //将 SCLK 置于高电平,为下降沿读出 8daf1edaa73b6134ace81237ddec3732 第 17 页 SCLK=0。 delaynus(2)。 //拉低 SCLK,形成脉冲下降沿 } i=dat/16。 i=i*10+dat%16。 return i。 //将读出的数据返回 } //函数功能:根据命令字,从 1302 读取一个字节数据 unsigned char ReadSet1302(unsigned char Cmd) { unsigned char dat。 RST=0。 //拉低 RST SCLK=0。 //确保写数居前 SCLK 被拉低 RST=1。 //启动数据传输 Write1302(Cmd)。 //写入命令字 dat=Read1302()。 //读出数据 SCLK=1。 //将时钟电平置于已知状态 RST=0。 //禁止数据传递 return dat。 //将读出的数据返回 } /***************************************************** 函数功能: 1302 进行初始化设置 *****。基于单片机的创新向“日”葵课程设计说明书(编辑修改稿)
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。