完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
求助。我移植别的程序里的18b20模块,打算自己做个温度显示的功能出来先,在proteus仿真一上电 就显示 27,然后一直不动.。 下面是代码~
#include "reg52.h" #define uint unsigned int #define uchar unsigned char uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x40}; uchar code smg_we[]={0x7f,0xbf,0xdf,0xef}; ***it dq=P3^5; uchar temperature,flag_300ms; void delay_1ms(uint q) { uint i,j; for(i=0;i for(j=0;j<120;j++); } /***********************小延时函数*****************************/ void delay_uint(uint q) { while(q--); } /***********************18b20初始化函数*****************************/ void init_18b20() { bit q; dq = 1; //把总线拿高 delay_uint(1); //15us dq = 0; //给复位脉冲 delay_uint(80); //750us dq = 1; //把总线拿高 等待 delay_uint(10); //110us q = dq; //读取18b20初始化信号 delay_uint(20); //200us dq = 1; //把总线拿高 释放总线 } /*************写18b20内的数据***************/ void write_18b20(uchar dat) { uchar i; for(i=0;i<8;i++) { //写数据是低位开始 dq = 0; //把总线拿低写时间隙开始 dq = dat & 0x01; //向18b20总线写数据了 delay_uint(5); // 60us dq = 1; //释放总线 dat >>= 1; } } /*************读取18b20内的数据***************/ uchar read_18b20() { uchar i,value; for(i=0;i<8;i++) { dq = 0; //把总线拿低读时间隙开始 value >>= 1; //读数据是低位开始 dq = 1; //释放总线 if(dq == 1) //开始读写数据 value |= 0x80; delay_uint(5); //60us 读一个时间隙最少要保持60us的时间 } return value; //返回数据 } /*************读取温度的值 读出来的是小数***************/ uint read_temp() { uint value; uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序 init_18b20(); //初始化18b20 write_18b20(0xcc); //跳过64位ROM write_18b20(0x44); //启动一次温度转换命令 delay_uint(50); //500us init_18b20(); //初始化18b20 write_18b20(0xcc); //跳过64位ROM write_18b20(0xbe); //发出读取暂存器命令 EA = 0; low = read_18b20(); //读温度低字节 value = read_18b20(); //读温度高字节 EA = 1; value <<= 8; //把温度的高位左移8位 value |= low; //把读出的温度低位放到value的低八位中 value *= 0.0625; //转换到温度值 return value; //返回读出的温度 } void display(uchar value)//显示子函数 { P2=smg_we[0]; P1=table[0]; delay_1ms(2); P2=smg_we[1]; P1=table[0]; delay_1ms(2); P2=smg_we[2]; P1=table[value/10%10]; delay_1ms(2); P2=smg_we[3]; P1=table[value%10]; delay_1ms(2); } //void display(uchar value) //{ // uchar i; // for(i=0;i<8;i++) // { // P2=smg_we; // P1=table; // } //} void time_init() { EA = 1; //开总中断 TMOD = 0X01; //定时器0、定时器1工作方式1 ET0 = 1; //开定时器0中断 TR0 = 1; //允许定时器0定时 TH0=(65536-50000)/256; TL0=(65536-50000)%256; } void main() { time_init(); while(1) { if(flag_300ms ==1) { flag_300ms = 0; temperature=read_temp; display(temperature); } } } void time0_int() interrupt 1 { static uchar value; TH0=(65536-50000)/256; TL0=(65536-50000)%256; value ++; display(temperature); //数码管显示函数 if(value % 6 == 0) { flag_300ms = 1; //300ms value = 0; } } 另外,在别的程序里有配套的电路仿真图,我试了一下是成功的,所以这个18B20的初始化之类的时序应该是没有问题的,晶振调了之后也没有变。求大神帮我看看是哪里出了问题 |
|
相关推荐
4个回答
|
|
|
P2 位选,P1 段选
|
|
|
|
|
|
挺急的 帮帮忙
|
|
|
|
|
|
自己调试一下呗
|
|
|
|
|
|
单片机型号选对不 temperature=read_temp;的read_temp后面有个()
|
|
|
|
|
只有小组成员才能发言,加入小组>>
1599 浏览 0 评论
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
4738 浏览 0 评论
4229 浏览 9 评论
3822 浏览 16 评论
4398 浏览 1 评论
4211浏览 3评论
2380浏览 0评论
3394浏览 0评论
1158浏览 0评论
2843浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 06:59 , Processed in 0.821300 second(s), Total 80, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3500