ds1621温度传感器仿真程序:
rem Main.bas file generated by New Project wizard
rem
rem Created: 周三 10月 25 2023
rem Processor: ATmega88
rem Compiler: BASCOM-AVR
rem Write your code here
$regfile = "m88def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 30
$framesize = 40
'$baud = 19200 '定义通用异步收发设备BAUD速率
Config Clockdiv = 1 ' 确保芯片以8 MHz运行
Config Scl = Portc.5 ' 使用i2c引脚
Config Sda = Portc.4
Config Twi = 400000 ' i2c 速度
I2cinit
$lib "i2c_twi.lbx" ' 不使用模拟软I2C,使用硬TWI
$lib "glcdSSD1306-I2C.lib" ' 用这个特殊的lib覆盖默认lib
Config Graphlcd = Custom , Cols = 128 , Rows = 64 , Lcdname = "SSD1306"
' 声明用于温度存储的 RAM
Dim x As string *2 '*/-符号
Dim I2ctemp As byte '温度存储
Dim I2ctemp1 As byte
'这里使用软件模拟 I2C 例程
' 配置要用于I2C总线的引脚
'Config Scl = Portd.2 '串行时钟SCL
'Config Sda = Portd.3 '串行数据SDA
'I2cinit
' 声明常量 - I2C 芯片地址
Const Ds1621wr = &B10010000 '写入Ds1621传感器
Const Ds1621rd = &B10010001 '读取Ds1621传感器
Const TH_XIANZI = 100 '上限温度(达到上限温度DS1624的TOUT脚输出高电平)。
Const TL_XIANZI = 85 '下限温度(达到下限温度DS1624的TOUT脚输出低电平)。
'*********************************************************
' 初始化Ds1621
I2cstart '发送启动条件
I2cwbyte Ds1621wr '总线主机发送DS1621地址;R/W=0.
'访问配置寄存器(&HAC 地址字节)
I2cwbyte &HAC '主机发送访问配置命令协议.
'设置连续转换(&H02 命令字节)
I2cwbyte &H02
I2cstop '发送停止条件
Waitms 25 '停止后等待一段时间
I2cstart ''发送启动条件
I2cwbyte Ds1621wr '总线主机发送DS1621地址;R/W=0.
'访问TH(&Ha1 命令字节)
I2cwbyte &Ha1 '总线主机发送访问TH(高温)寄存器。命令.
I2cwbyte TH_XIANZI '总线主机发送限制TH(高温)寄存器为上限°C的第一个字节数据
I2cwbyte &H00 '总线主机发送限制TH(高温)寄存器为上限°C的第二字节数据。
I2cstop
Waitms 25
I2cstart
I2cwbyte Ds1621wr
I2cwbyte &Ha2 '总线主站发送访问 TL(低温)寄存器 命令。
I2cwbyte TL_XIANZI '总线主机发送TL(低温)寄存器下限温度°C的第一个字节数据。
I2cwbyte &H00 '总线主机发送TL(低温)寄存器下限温度°C的第二个字节数据.
I2cstop
Waitms 25
I2cstart
I2cwbyte Ds1621wr
I2cwbyte &Hee '总线主机发送启动转换T命令协议。
I2cstop
Waitms 25
'初始化结束
'********************************************************
'获取当前温度
Do
I2cstart
I2cwbyte Ds1621wr
I2cwbyte &HAA '读取温度(和 HAA 命令字节)
I2cstop
Waitms 25
I2cstart
I2cwbyte Ds1621rd '芯片将提供寄存器内容
'I2crbyte I2ctemp , Ack
I2crbyte I2ctemp , Nack
I2cstop
'判断温度值正负符号
if i2ctemp<=255 and i2ctemp>=201 then gosub fwd
if i2ctemp>=0 and i2ctemp<=128 then gosub zwd
if i2ctemp=0 then gosub zxz
Waitms 25
gosub xswd:
Waitms 25
Loop
end
'******************************************************
fwd: '计算负温度值
i2ctemp1=256-i2ctemp
x="-"
return
zwd: '计算正温度值
i2ctemp1=i2ctemp
x="+"
return
zxz: '零中性值没有+-属性
i2ctemp1=i2ctemp
x=" "
return
'********************************************************
xswd: '显示温度
Setfont Arial_16x18
Lcdat 1 , 2 ,chr(128);chr(129);chr(130);":"; '显示“温度值”字符串。
Lcdat 4, 36 , x; Str(i2ctemp1) ; chr(127);" "; '显示:温度值,+、-值符号,摄氏度符号。
Setfont font8x8TT
Lcdat 8 , 16 ,"DS1621_I2C"
return
'******************************************************
$include "../12.font" ' 字体文件
$include "../font8x8TT.font"
|