| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1735 人关注过本帖
标题:[求助]这是用C++写的控制DS18B20温度传感器的代码 请问 如何转换成用C#来控 ...
只看楼主 加入收藏
xzhxzh
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-9-5
收藏
 问题点数:0 回复次数:5 
[求助]这是用C++写的控制DS18B20温度传感器的代码 请问 如何转换成用C#来控制
1#include <reg51.H>
2#include<intrins.h>
3#include <math.H> //要用到取绝对值函数abs()
4//通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值, 目前显示范围: -55~ +125度
5sbit wela = P2^7; //数码管位选
6sbit dula = P2^6; //数码管段选
7sbit ds = P2^2;
8int tempValue;
9
10//0-F数码管的编码(共阴极)
11unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
12 0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
13//0-9数码管的编码(共阴极), 带小数点
14unsigned char code tableWidthDot[]={0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd,
15 0x87, 0xff, 0xef};
16
17//延时函数, 对于11.0592MHz时钟, 例i=10,则大概延时10ms.
18void delay(unsigned int i)
19{
20 unsigned int j;
21 while(i--)
22 {
23 for(j = 0; j < 125; j++);
24 }
25}
26
27//初始化DS18B20
28//让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动
29void dsInit()
30{
31 //对于11.0592MHz时钟, unsigned int型的i, 作一个i++操作的时间大于为8us
32 unsigned int i;
33 ds = 0;
34 i = 100; //拉低约800us, 符合协议要求的480us以上
35 while(i>0) i--;
36 ds = 1; //产生一个上升沿, 进入等待应答状态
37 i = 4;
38 while(i>0) i--;
39}
40
41void dsWait()
42{
43 unsigned int i;
44 while(ds);
45 while(~ds); //检测到应答脉冲
46 i = 4;
47 while(i > 0) i--;
48}
49
50//向DS18B20读取一位数据
51//读一位, 让DS18B20一小周期低电平, 然后两小周期高电平,
52//之后DS18B20则会输出持续一段时间的一位数据
53bit readBit()
54{
55 unsigned int i;
56 bit b;
57 ds = 0;
58 i++; //延时约8us, 符合协议要求至少保持1us
59 ds = 1;
60 i++; i++; //延时约16us, 符合协议要求的至少延时15us以上
61 b = ds;
62 i = 8;
63 while(i>0) i--; //延时约64us, 符合读时隙不低于60us要求
64 return b;
65}
66
67//读取一字节数据, 通过调用readBit()来实现
68unsigned char readByte()
69{
70 unsigned int i;
71 unsigned char j, dat;
72 dat = 0;
73 for(i=0; i<8; i++)
74 {
75 j = readBit();
76 //最先读出的是最低位数据
77 dat = (j << 7) | (dat >> 1);
78 }
79 return dat;
80}
81
82//向DS18B20写入一字节数据
83void writeByte(unsigned char dat)
84{
85 unsigned int i;
86 unsigned char j;
87 bit b;
88 for(j = 0; j < 8; j++)
89 {
90 b = dat & 0x01;
91 dat >>= 1;
92 //写"1", 将DQ拉低15us后, 在15us~60us内将DQ拉高, 即完成写1
93 if(b)
94 {
95 ds = 0;
96 i++; i++; //拉低约16us, 符号要求15~60us内
97 ds = 1;
98 i = 8; while(i>0) i--; //延时约64us, 符合写时隙不低于60us要求
99 }
100 else //写"0", 将DQ拉低60us~120us
101 {
102 ds = 0;
103 i = 8; while(i>0) i--; //拉低约64us, 符号要求
104 ds = 1;
105 i++; i++; //整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us了
106 }
107 }
108}
109
110//向DS18B20发送温度转换命令
111void sendChangeCmd()
112{
113 dsInit(); //初始化DS18B20, 无论什么命令, 首先都要发起初始化
114 dsWait(); //等待DS18B20应答
115 delay(1); //延时1ms, 因为DS18B20会拉低DQ 60~240us作为应答信号
116 writeByte(0xcc); //写入跳过序列号命令字 Skip Rom
117 writeByte(0x44); //写入温度转换命令字 Convert T
118}
119
120//向DS18B20发送读取数据命令
121void sendReadCmd()
122{
123 dsInit();
124 dsWait();
125 delay(1);
126 writeByte(0xcc); //写入跳过序列号命令字 Skip Rom
127 writeByte(0xbe); //写入读取数据令字 Read Scratchpad
128}
129
130//获取当前温度值
131int getTmpValue()
132{
133 unsigned int tmpvalue;
134 int value; //存放温度数值
135 float t;
136 unsigned char low, high;
137 sendReadCmd();
138 //连续读取两个字节数据
139 low = readByte();
140 high = readByte();
141 //将高低两个字节合成一个整形变量
142 //计算机中对于负数是利用补码来表示的
143 //若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的value
144 tmpvalue = high;
145 tmpvalue <<= 8;
146 tmpvalue |= low;
147 value = tmpvalue;
148
149 //使用DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度
150 t = value * 0.0625;
151 //将它放大100倍, 使显示时可显示小数点后两位, 并对小数点后第三进行4舍5入
152 //如t=11.0625, 进行计数后, 得到value = 1106, 即11.06 度
153 //如t=-11.0625, 进行计数后, 得到value = -1106, 即-11.06 度
154 value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5
155 return value;
156}
157
158unsigned char const timeCount = 3; //动态扫描的时间间隔
159//显示当前温度值, 精确到小数点后一位
160//若先位选再段选, 由于IO口默认输出高电平, 所以当先位选会使数码管出现乱码
161void display(int v)
162{
163 unsigned char count;
164 unsigned char datas[] = {0, 0, 0, 0, 0};
165 unsigned int tmp = abs(v);
166 datas[0] = tmp / 10000;
167 datas[1] = tmp % 10000 / 1000;
168 datas[2] = tmp % 1000 / 100;
169 datas[3] = tmp % 100 / 10;
170 datas[4] = tmp % 10;
171 if(v < 0)
172 {
173 //关位选, 去除对上一位的影响
174 P0 = 0xff;
175 wela = 1; //打开锁存, 给它一个下降沿量
176 wela = 0;
177 //段选
178 P0 = 0x40; //显示"-"号
179 dula = 1; //打开锁存, 给它一个下降沿量
180 dula = 0;
181
182 //位选
183 P0 = 0xfe;
184 wela = 1; //打开锁存, 给它一个下降沿量
185 wela = 0;
186 delay(timeCount);
187 }
188 for(count = 0; count != 5; count++)
189 {
190 //关位选, 去除对上一位的影响
191 P0 = 0xff;
192 wela = 1; //打开锁存, 给它一个下降沿量
193 wela = 0;
194 //段选
195 if(count != 2)
196 {
197 /**//* if((count == 0 && datas[count] == 0)
198 || ((count == 1 && datas[count] == 0) && (count == 0 && datas[count - 1] == 0)))
199 {
200 P0 = 0x00; //当最高位为0时, 不作显示
201 }
202 else*/
203 P0 = table[datas[count]]; //显示数字
204 }
205 else
206 {
207 P0 = tableWidthDot[datas[count]]; //显示带小数点数字
208 }
209 dula = 1; //打开锁存, 给它一个下降沿量
210 dula = 0;
211
212 //位选
213 P0 = _crol_(0xfd, count); //选择第(count + 1) 个数码管
214 wela = 1; //打开锁存, 给它一个下降沿量
215 wela = 0;
216 delay(timeCount);
217 }
218}
219
220void main()
221{
222 unsigned char i;
223
224 while(1)
225 {
226 //启动温度转换
227 sendChangeCmd();
228 //显示5次
229 for(i = 0; i < 40; i++)
230 {
231 display(tempValue);
232 }
233 tempValue = getTmpValue();
234 }
235}
搜索更多相关主题的帖子: 温度传感器 数码 include 代码 
2007-09-28 10:25
xzhxzh
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-9-5
收藏
得分:0 
[讨论]回复:(xzhxzh)[求助]这是用C++写的控制DS18B20温度...
请问哪位搞过 控制温度传感器?

2007-09-28 10:28
hsm0309
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-9-16
收藏
得分:0 
我也不知道

2007-09-29 14:49
xzhxzh
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-9-5
收藏
得分:0 

此附件里面是通过通过串口控制温度传感器DS18B20的代码 有兴趣的看看哇


附件: 游客没有浏览附件的权限,请 登录注册

2007-10-02 16:35
xzhxzh
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-9-5
收藏
得分:0 
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
//清除相片文件(服务器)
DataSet ds = bc.GetDataSet("select * from [file] where fileID='" + this.GridView1.DataKeys[e.RowIndex].Value.ToString() + "'", "file");
DataRow[] row = ds.Tables[0].Select();
foreach (DataRow rs in row) //将检索到的数据逐一,循环添加到Listbox1中
{
FileInfo file = new FileInfo(Server.MapPath(rs["Path"].ToString()));
file.Delete();
}
//清除数据
bc.ExecSQL("delete from [file] where fileID='" + this.GridView1.DataKeys[e.RowIndex].Value.ToString() + "'");
GridView1.DataSource = bc.GetDataSet("select * from [file]", "[file]");
GridView1.DataBind();
}

2007-11-04 10:52
xzhxzh
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-9-5
收藏
得分:0 
DataRow[] row = ds.Tables[0].Select() 是什么用意呢?
DataSet ds = bc.GetDataSet("select * from [file] where fileID='" + this.GridView1.DataKeys[e.RowIndex].Value.ToString() + "'", "file");
DataRow[] row = ds.Tables[0].Select();
请问这两句怎么解释? 用DataRow的目的是什么呢?

[此贴子已经被作者于2007-11-4 10:55:17编辑过]


2007-11-04 10:53
快速回复:[求助]这是用C++写的控制DS18B20温度传感器的代码 请问 如何转换成用C ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036361 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved