📄 8.1.bas
字号:
'***********************************************************************
'本程序实现红外遥控流水灯花样,LCD显示时间,当时温度 ,按键实验和ADC测量
'程序语言:BASCOM-AVR
'编译版本BASCOM-AVR 1.11.8.5
'程序编译、仿真通过
'***********************************************************************
$regfile = "m16def.dat" ' 定义目标单片机是ATmega88
$crystal = 8000000
$baud = 9600
'/////LCD1602 定义//////// ////////
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Lcd = 16 * 2
Dim S As String * 16
'//////////定时器中断定义//////////
Config Timer2 = Timer , Prescale = 1024 ' 定义单片机时钟周期是1000000Hz
Enable Interrupts '允许全局中断 'timer0中断溢出时间=200ms
Enable Timer2
On Timer2 Timer2_isr
Timer2 = &H00
'////////////////////////端口定义///////////////////////////
Config Portc = Output
Config 1wire = Porta.0
Config Rc5 = Pina.3
'Config Adc = Single , Prescaler = Auto ,
'Dim W1 As Long , Channe1 As Byte , V1 As String * 10
'///////////////////////////////////////////变量定义////////////////////////////
Dim N As Byte '流水灯花样控制相关
Dim M As Byte
Dim A As Byte : A = 0
Dim Tcounter As Byte : Tcounter = 0
'////////////////////温度变量相关///////////////////////
Deflcdchar 1 , 4 , 10 , 17 , 4 , 31 , 2 , 4 , 8 '自定义中文字符"今"
Deflcdchar 2 , 31 , 4 , 31 , 4 , 12 , 10 , 18 , 17 '自定义中文字符"天"
Deflcdchar 3 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32 '自定义中文字符"℃"
Declare Sub Ds18b20(i As Byte , C(2) As Byte , T As Word , Wendu As Single)
Dim I As Byte
Dim C(2) As Byte
Dim T As Word
Dim Wendu As Single
Cls
Cursor Off
Do
1wreset '单总线初始化
1wwrite &HCC '主机向单总线器件发送跳过ID码指令
1wwrite &H44 '主机向单总线发送温度转换指令
Waitms 800 '精度不同时间也不同,9位93.75ms,10位187.5ms,11位375ms,12位750ms
1wreset '单总线初始化
1wwrite &HCC '主机向单总线器件发送跳过ID码指令
1wwrite &HBE '主机向单总线发送读取RAM指令
For I = 1 To 2
C(i) = 1wread() '将用数组C(i)保存温度数据的前两个字节
Next
1wwrite &HCC
'256*0.0625=16
'T = C(2) * 255 '16℃以内的温度值放在C(1)中, 每16℃一个进位放在C(2)中 ,
'T = T + C(1)
Call Ds18b20(i , C(2) , T , Wendu )
Incr A
If A <= 4 Then
On A Gosub Huayang0 , Huayang1 , Huayang2 , Huayang3 , Huayang4
Else
A = 0
End If
Loop
End
'//////////////定时器2中断服务程序控制花样运行方式///////////////
Timer2_isr:
Timer2 = &H00
Tcounter = Tcounter + 1
If Tcounter > 100 Then
If N = 7 Then
M = 1
Else
If N = 0 Then M = 0
End If
If M = 0 Then
Incr N
Else
If M = 1 Then
Decr N
End If
Enable Interrupts
End If
Tcounter = 0
End If
Return
'///////////////花样//////////////////
Huayang0:
Select Case N
Case 0
Portc = &HFE
Case 1
Portc = &HFD
Case 2
Portc = &HFB
Case 3
Portc = &HF7
Case 4
Portc = &HEF
Case 5
Portc = &HDF
Case 6
Portc = &HBF
Case 7
Portc = &H7F
End Select
Return
Huayang1:
Select Case N
Case 0
Portc = &B00000001
Case 1
Portc = &B00000010
Case 2
Portc = &B00000100
Case 3
Portc = &B00001000
Case 4
Portc = &B00010000
Case 5
Portc = &B00100000
Case 6
Portc = &B01000000
Case 7
Portc = &B10000000
End Select
Return
Huayang2:
Select Case N
Case 0
Portc = &B00111111
Case 1
Portc = &B11001111
Case 2
Portc = &B11110011
Case 3
Portc = &B11111100
Case Else
N = 0
End Select
Return
Huayang3:
Select Case N
Case 0
Portc = &B01111110
'
Case 1
Portc = &B10111101
Case 2
Portc = &B11011011
Case 3
Portc = &B11100111
Case 4
Portc = &B11011011
Case 5
Portc = &B10111101
Case Else
N = 0
End Select
Return
Huayang4:
Select Case N
Case 0
Portc = &B10101010
Case 1
Portc = Not Portc
Case Else
N = 0
End Select
Return
Sub Ds18b20(i As Byte , C(2) As Byte , T As Word , Wendu As Single)
T = C(2) * 255 '16℃以内的温度值放在C(1)中, 每16℃一个进位放在C(2)中 ,
T = T + C(1)
Cls '显示温度值
Locate 1 , 5
Lcd "DS18B20"
Locate 2 , 1
Lcd Chr(1) ; Chr(2) ; " T="
Locate 2 , 6
If C(2) > 15 Then '负温度判断
T = Not T
T = T + 1
Lcd "-" ;
Else
Lcd "+" ;
End If
Wendu = T * 0.0625 '精度为0.0625
Lcd Wendu ; Chr(3) ; "C"
'Waitms 100
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -