📄 ds18b30.lst
字号:
1: #include"pic18fxx2.h"
2: #include"lcd.h"
3: #define uch unsigned char
4: uch dis4[17]="DIGITALVOLTMETER";
5:
6: uch dis5[17]="temper .00c ";
7: uch t;
8:
9: #define DQ RC4 //定义18B20数据端口
10: #define DQ_DIR TRISC4 //定义18B20D口方向寄存器
11: #define DQ_HIGH() DQ_DIR =1 //设置数据口为输入
12: #define DQ_LOW() DQ = 0; DQ_DIR = 0 //设置数据口为输出
13: unsigned char TLV=0 ; //采集到的温度高8位
14: unsigned char THV=0; //采集到的温度低8位
15: unsigned char TZ=0; //转换后的温度值整数部分
16: unsigned char TX=0; //转换后的温度值小数部分
17: //------------------------------------------------
18: //延时函数
19: void delay(char i)
20: {
21: while(i--);
22: }
23: //------------------------------------------------
24: //系统初始化函数
25: void init()
26: {
27: ADCON1=0X07; //设置A口为普通数字口
28: TRISD=0X00; //设置D口方向为输出
29: }
30: //复位DS18B20函数
31: reset(void)
32: {
33: char presence=1;
34: while(presence)
35: {
36: DQ_LOW() ; //主机拉至低电平
37: delay(195); //延时503us
38: DQ_HIGH(); //释放总线等电阻拉高总线,并保持15~60us
39: delay(30); //延时70us
40: if(DQ==1) presence=1; //没有接收到应答信号,继续复位
41: else presence=0; //接收到应答信号
42: delay(169); //延时430us
43: }
44: }
45:
46: //-----------------------------------------------
47: //写18b20写字节函数
48: void write_byte(uch val)
49: {
50: uch i;
51: uch temp;
52: for(i=8;i>0;i--)
53: {
54: temp=val&0x01; //最低位移出
55: DQ_LOW();
56: ;
57: ;
58: ;
59: ;
60: ; //从高拉至低电平,产生写时间隙
61: if(temp==1) DQ_HIGH(); //如果写1,拉高电平
62: delay(27); //延时63us
63: DQ_HIGH();
64: ;
65: ;
66: val=val>>1; //右移一位
67: }
68: }
69:
70: //------------------------------------------------
71: //18b20读字节函数
72: uch read_byte(void)
73: {
74: uch i;
75: uch value=0; //读出温度
76: static bit j;
77: for(i=8;i>0;i--)
78: {
79: value>>=1;
80: DQ_LOW();
81: ;
82: ;
83: ;
84: ;
85: ;
86: ; //6us
87: DQ_HIGH(); //拉至高电平
88: ;
89: ;
90: ;
91: ;
92: ; //4us
93: j=DQ;
94: if(j) value|=0x80;
95: delay(27); //63us
96: }
97: return(value);
98: }
99:
100: //-------------------------------------------------
101: //启动温度转换函数
102: uch get_temp()
103: {
104: //int i;
105: DQ_HIGH();
106: reset(); //复位等待从机应答
107: write_byte(0XCC); //忽略ROM匹配
108: write_byte(0X44); //发送温度转化命令
109: DQ_HIGH();
110: reset(); //再次复位,等待从机应答
111: write_byte(0XCC); //忽略ROM匹配
112: write_byte(0XBE); //发送读温度命令
113: TLV=read_byte(); //读出温度低8
114: THV=read_byte(); //读出温度高8位
115: DQ_HIGH();
116: if(THV>0x07)
117: {TLV=~TLV+1;
118: THV=~THV;
119: t=1;
120: }
121: else
122: t=0; //释放总线
123: TZ=(TLV>>4)|(THV<<4); //温度整数部分
124: TX=TLV<<4; //温度小数部分
125: ;
126: ;
127: return TZ;
128: }
129: void main()//主程序
130: {
131: //uchar t1,t2,t3;
132: char z,n,l;
133: init();
134: ADCON1=0X0E;
135: INTCON=0X00;
136: //INTCON2=0X40;
137: //INTCON3=0X00;
138: TRISD=0X00;
139: lcd_init();
140: while(1)
141: {
142:
143: lcd_pos(0); //设置显示位置为第一行的第1个字符
144: z = 0;
145: while(dis4[z] != '\0')
146: { //显示字符"DIGITALVOLTMETER"
147: lcd_wdat(dis4[z]);
148: z++;
149: }
150:
151: lcd_pos(0x40); //设置显示位置为第二行第1个字符
152: z = 0;
153: while(dis5[z] != '\0')
154: {
155: lcd_wdat(dis5[z]); //显示字符" VOLTAGE: . V "
156: z++;
157: }
158:
159: n=get_temp();
160: l=wr(n);
161: lcd_pos(0x47);
162: lcd_wdat(l);
163: //lcd_pos(0x48);
164: //lcd_wdat(d5);
165: }
166: }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -