完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我单独写了一个1602与温度模块的检测程序,显示与测温都是正常,直流电机部分换一个普通主函数也是可以用的
现在我把两个综合起来,结果出现了问题【电机也不再转动,温度显示不再变化,总是就显示一个数字15.6,而且其中的1还是乱码】 感觉自己没看到哪里问题,有点尴尬,希望大家慷慨赐教,微笑~ #include #include #include #define uint unsigned int #define uchar unsigned char uchar code table[]="Temp is:"; uchar code table1[]={"A2 dangwei:"}; ***it DQ=P1^7; //连接DS18B20 ***it rs=P2^6; //连接1602 RS脚 ***it rw= P2^5; //连接1602 的R/W脚,可选择是否编译 ***it en=P2^7; //连接1602 E脚 uchar tpl***,tpm***; // 温度值低位、高位字节 uint temp; ***it en1=P1^0; ***it s1=P1^1; ***it s2=P1^2; uchar t=0; uchar m1=0; uchar m2=0; uchar tmp1,tmp2; void motor(uchar index, char speed) { if(speed>=-100 && speed<=100) { if(index==1) { m1=abs(speed); if(speed<0) { s1=0; s2=1; } else { s1=1; s2=0; } } } } void delay(uint z) //延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } /*******************产生复位脉冲初始化DS18B20**************/ void reset(void) { uint i; DQ=0; i=100; while(i--); DQ=1;// 产生上升沿 i=4; while(i--); } /********************* 等待应答脉冲*********************/ void wait(void) { uint i; while(DQ); while(~DQ); // 检测到应答脉冲 i=4; while(i--); } bit readbit(void) { uint i; bit b; DQ=0; i++; DQ=1; i++;i++;// 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效 b=DQ; i=10; while(i--); return (b); } /******************* 读取数据的一个字节**************************/ uchar readbyte(void) { uchar i,j,b; b=0; for(i=0;i<8;i++) { j=readbit(); b=(j<<7)|(b>>1); } return(b); } /******************写数据的一个字节,满足写1和写0的时隙要求************/ void writebyte(uchar b) { uint i; uchar j; bit btmp; for(j=0;j<8;j++) { btmp=b&0x01; b=b>>1; // 取下一位(由低位向高位) if(btmp) { DQ=0; i++;i++; DQ=1; i=10; while(i--);// 整个写1时隙不低于60us } else { DQ=0; i=10; while(i--); // 保持低在60us到120us之间 DQ=1; i++;i++; } } } /************************* 启动温度转换********************/ void convert(void) { reset();// 产生复位脉冲,初始化DS18B20 wait();//等待DS18B20给出应答脉冲 writebyte(0xcc);// skip rom 命令 writebyte(0x44);// convert T 命令 } /********************* 读取温度值****************************/ uint readtemp(void) { float tt; reset(); wait(); delay(1); writebyte(0xcc);// skip rom 命令 writebyte(0xbe);// read scratchpad 命令 tpl***=readbyte();// 温度值低位字节(其中低4位为二进制的"小数"部分) tpm***=readbyte();// 高位值高位字节(其中高5位为符号位) temp=tpm***; temp<<=8; temp=temp|tpl***; tt=temp*0.0625; temp=tt*10+0.5; return (temp); } void write1602_com(uint com)//1602写命令 { rs=0; rw=0; P0=com; delay(5); en=1; delay(5); en=0; } void write1602_date(uchar date)//1602写数据 { rs=1; rw=0; P0=date; delay(5); en=1; delay(5); en=0; } void init1602(void) //1602初始化 { write1602_com(0x38);//设置显示模式 write1602_com(0x0c);//设置开显示,不显示光标 write1602_com(0x06);//写一个字符后地址加一 write1602_com(0x01);//显示清0 } void display(uint temp) //显示函数 { uchar a1,a2,a3,a4; a1=temp/100; a2=temp%100; a3=a2/10; a4=a2%10; write1602_com(0x80+0x40+0x09);//第一行第9个位置显示温度的十位、个位和小数点后一位 write1602_date(a1+0x30); delay(1); write1602_date(a3+0x30); delay(1); write1602_date('.'); delay(1); write1602_date(a4+0x30); delay(1); } void display1() { uchar num; write1602_com(0x80+0x01); // 在第一行开头显示“Welcome to” for(num=0;num<11;num++) { write1602_date(table1[num]); delay(5); } write1602_com(0x80+0x40); //在第二行开头显示“TEMP IS” for(num=0;num<8;num++) { write1602_date(table[num]); delay(5); } write1602_com(0x80+0x40+0x0d); write1602_date(0xdf); //显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码 write1602_date(0x43); //显示"C"符号,0x43是液晶屏字符库里大写C的地址码 } void main() { TMOD=0x02; TH0=0x9B; TL0=0x9B; EA=1; ET0=1; TR0=1; init1602(); //1602初始化 convert(); delay(1000);// 启动温度转换,需要750ms readtemp(); // 读取温度 while(1) { display1(); convert(); display(readtemp()); if(readtemp() <= 200) { write1602_com(0x80 + 0x0d); write1602_date(0+0x30); motor(1,0); } if(readtemp() > 200 && readtemp() <= 240) { write1602_com(0x80 + 0x0d); write1602_date(1+0x30); motor(1,30); } if( readtemp > 240 && readtemp <= 280 ) { write1602_com(0x80 + 0x0d); write1602_date(2+0x30); motor(1,60); } if( readtemp() > 280 && readtemp() <= 320 ) { write1602_com(0x80 + 0x0d); write1602_date(3+0x30); motor(1,90); } delay(500); } } void timer0() interrupt 1 { if(t==0) { tmp1=m1; } if(t if(t>=100) t=0; } |
|
相关推荐
5个回答
|
|
那肯定是程序的问题了啊
|
|
|
|
|
|
|
|
楼主问题找到了吗
|
|
|
|
|
|
|
|
ds18b20对时序的要求要非常的高,你在进行测温的时候把总中断关了试试,不要让中断影响测温。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-使用AHT20进行环境监测之AHT20传感器介绍
828 浏览 0 评论
824 浏览 0 评论
861 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
836 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
1292 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11824 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-29 21:07 , Processed in 0.686646 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号