PICAXE - DS18B20 temperaturgivare till LCD (4 / 7 steg)
Steg 4: Programmet
Nedan är programmet klistras in i. I princip kan du följa hur det fungerar genom att läsa programmet kommentarer. Mer erfarna programmerare kommer förmodligen vet hur att skriva enklare och effektivare kod. Vad kan jag säga, detta är mitt första försök och det verkar fungera.
"*** TemperatureSensor.bas ***
"Detta program körs på en PICAXE - 20 X 2 4 MHz som lyder temperaturen från en
"DS18B20 temperaturgivare & skickar det till en HD44780 kompatibel 16 x 2 LCD-display.
'
"Utvecklats av Simon Carter den 10 mars, 2013.
"*** Konstanter ***
symbol EnablePin = C.7 ' LCD aktivera pin ansluten till C.7
symbol RegSelPin = C.4 ' LCD registrera Selelect pin ansluten till C.4
symbol TempPin = C.1 ' temperatur sensordata kopplade till C.1
"*** Variabler ***
symbol char = b0 "karaktär skickas till LCD
symbol index = b1 "används som räknaren i för-Next loopar
symbol degc = b2 "temperatur värdet från DS18B20 sensorn
symbol intgval = b3 ' används för att tillfälligt hålla varje heltalsvärde från numret från sensorn
symbol degflag = b4 ' en flagga som används när man arbetar med negativa temperaturområden. 0 = postive sortiment, 1 = negativt urval
symbol degf = b5 "används för att hålla grader farenheight värden
"*** Direktiven ***
#com 3' ange hämta port
#picaxe 20 x 2' ange processor
#no_data "spara tid nedladdning
#terminal off "inaktivera terminal-fönster
"*** Tabell ***
Tabell 0, ("temperatur")
"*** Huvudprogrammet ***
dirsB = % 11111111' set alla portB stift som resultat
dirsC = % 10111001' ange C.6 och C.2, C.1 som insatsvaror
pullup % 00000010' Aktivera C.6 inre pullup motstånd
"*** Initiera LCD ***
Pausa 200' paus 200 mS LCD initiering enligt HD44780 specifikationer
char = 56' setup för 8 bitar, 2 rader & 5 X 8 display
GOSUB CmdLCD ' skicka instruktioner till LCD
char = 12' display på markören av
GOSUB CmdLCD ' skicka instruktioner till LCD
char = 1' tydlig display, åka hem till linje 1 av LCD-skärm
GOSUB CmdLCD ' skicka instruktioner till LCD
vänta 1
"*** Skicka text -"Temperatur"till linje 1 av LCD ***
för index = 0 till 15
readtable index, char "läsa tecken i tabellen
GOSUB TxtLCD ' Skicka text i tabellen till LCD
Nästa index
"*** Huvudloop - Läs DS18B20 sensor ***
göra
char = 194' flytta markören till början av raden två
GOSUB CmdLCD ' Skicka anvisningen till LCD
readtemp TempPin, degc "Läs temperatur värdet fått från DS18B20 sensorn på pin C1.0
Pausa 800' paus > 750 mS för sensor enligt DS18B20 specifikationer
"degc = 24 infoga temperatur testvärden här om du vill kontrollera koden funktion
degflag = 0' reset flaggan till 0 dvs antar positiva temperaturområde till att börja med
GOSUB BelowZeroC ' check för under noll temperaturer
GOSUB IntgOnly "extrahera 10's och 1 heltal från DS18B20 data
GOSUB DegCsign ' generera deg C tecken
GOSUB CheckFlag ' Kontrollera om affärer med temperaturer i intervallet minus och justera degc värde
GOSUB BelowZeroF ' check för under noll temperaturer
GOSUB DegFsign ' check för under noll temperaturer
"generera deg F tecken
loop
"*** Subrutiner ***
CmdLCD:
låg RegSelPin "ställa in LCD för ett kommandobyte
gå till LoadLCD
TxtLCD: "Ställ in LCD för text byte
hög RegSelPin
LoadLCD:; utföra lastning byte i LCD
outpinsB = röding "Ladda byte till outpinsB
pulsout EnablePin, 1' Ladda byte på LCD
returnera
LoadIntgLCD: "utföra lastning temperatur text byte som har konverterats till ett heltal
hög RegSelPin "ställa in LCD för text byte
outpinsB = intgval ' Ladda byte till outpinsB
pulsout EnablePin, 1' utföra lastning byte i LCD
returnera
IntgOnly: "100's, 10 och 1: s heltal från DS18B20 data
för index = 2 till 0 steg -1 "Ställ in index till extraktet 100-tals heltal första sedan 10: s heltal sedan 1
Låt intgval = degc gräva index "användning gräva funktionen för att extrahera heltal
om intgval = 0 och index = 2 sedan låta intgval = % 00100000 ' tom någon ledande "0" på displayen
annars om intgval = 0 så låt intgval = % 00110000' konvertera heltal till LCD teckenkoder
annars om intgval = 1 så låt intgval = % 00110001
annars om intgval = 2 sedan låta intgval = % 00110010
annars om intgval = 3 så låt intgval = % 00110011
annars om intgval = 4 sedan låta intgval = % 00110100
annars om intgval = 5 sedan låta intgval = % 00110101
annars om intgval = 6 sedan låta intgval = % 00110110
annars om intgval = 7 sedan låta intgval = % 00110111
annars om intgval = 8 sedan låta intgval = % 00111000
annars om intgval = 9 sedan låta intgval = % 00111001
endif
GOSUB LoadIntgLCD ' utföra lastning temperatur text byte som har konverterats till ett heltal
Nästa index
returnera
DegCsign: ' skapa grader C text på displayen
intgval = % 11011111' ange tecken skickas till LCD till "Graden" teckenkoden
GOSUB LoadIntgLCD ' Skicka tecken till LCD
intgval = % 01000011' ange tecken skickas till LCD till "C" teckenkoden för Celsius
GOSUB LoadIntgLCD ' Skicka tecken till LCD
intgval = % 00100000' ange tecken skickas till LCD till "" teckenkoden för ett mellanslag före farenheight värdet
GOSUB LoadIntgLCD ' Skicka tecken till LCD
returnera
DegFsign: ' skapa grader F text på displayen
intgval = % 11011111' ange tecken skickas till LCD till "Graden" teckenkoden
GOSUB LoadIntgLCD ' Skicka tecken till LCD
intgval = % 01000110' ange tecken skickas till LCD till "F" teckenkoden för Farenheight
GOSUB LoadIntgLCD ' Skicka tecken till LCD
returnera
intgval = % 00100000' ange tecken skickas till LCD till "" teckenkoden för ett mellanslag efter farenheight värde att rensa när minus-tecken används
GOSUB LoadIntgLCD ' Skicka tecken till LCD
intgval = % 00100000' ange tecken skickas till LCD till "" teckenkoden för ett mellanslag efter farenheight värde att rensa när intgval > 100 används
GOSUB LoadIntgLCD ' Skicka tecken till LCD
DegFcalc: "få ut Farenheight för positiva Farenheight avläsningar
degC = degc * 9 / 5 + 32' beräkna Farenheight värde från Celsius värde
GOSUB IntgOnly ' börja process för att utvinna 100's, 10 och 1: s heltal för Farenheight värde
debug
returnera
DegFcalcPos: "härleda Farenheight värde för positiva Farenheight avläsningar när celcius är negativt
degC = degc * 9/5' beräkna Farenheight värde från Celsius värde
degC = 32-degc "beräkna Farenheight värde från Celsius värde
GOSUB IntgOnly ' börja process för att utvinna 100's, 10 och 1: s heltal för Farenheight värde
returnera
DegFcalcNeg: "få ut Farenheight för negativa Farenheight avläsningar
degC = degc * 9/5-32' beräkna Farenheight värde från Celsius värde
GOSUB IntgOnly ' börja process för att utvinna 100's, 10 och 1: s heltal för Farenheight värde
returnera
MinusSign:
intgval = "-" ' ange tecknet skickas till LCD till "minustecknet" teckenkoden
GOSUB LoadIntgLCD
returnera
BelowZeroC: "kolla för under noll grader C
Välj ärende degc
fallet 0 till 125' ignorera detta fall - temperaturen i positiva normalområdet
fall 129 till 183' de fall celsius är i intervallet minus skicka ett minustecken tecken till LCD
degC = degc-128 "korrekt för DSDS18B20 att MSB till"1"eller 128 för minus temperaturförhållandet
degflag = 1' ange flaggan anger negativa temperaturförhållandet
GOSUB MinusSign ' de fall celsius är i intervallet minus skicka ett minustecken tecken till LCD
endselect
returnera
BelowZeroF:
Välj ärende degc
fallet 0 till 124' ignorera detta fall - temperaturen i positiva normalområdet
GOSUB DegFcalc
fall 129 till 146' de fall där endast celsius är i intervallet minus
degC = degc-128 "korrekt för DSDS18B20 att MSB till"1"eller 128 för minus temperatur conditio
GOSUB DegFcalcPos
fallet 147 till 183' de fall där farenheight är i intervallet minus skicka ett minustecken tecken till LCD
degC = degc-128 "korrekt för DSDS18B20 att MSB till"1"eller 128 för minus temperaturförhållandet
GOSUB MinusSign ' de fall där farenheight är i intervallet minus skicka ett minustecken tecken till LCD
GOSUB DegFcalcNeg
endselect
returnera
CheckFlag:
om degflag = 1 så låt degc = degc + 128' Reset korrigeringen för DSDS18B20 att MSB till "1" eller 128 för minus temperaturförhållandet
endif
returnera