'******************************************************************* ' Program name 8temperature ' Start Date 18nd.Mar.2010 ' Author Yoshio KATO ' Description : Used MCU ATtiny2313 ' : System Clock 8MHz Internal OSC ' : PORTD for AD converter '******************************************************************* $regfile = "attiny2313.dat" $crystal = 8000000 'internal clock 8MHz Dim I As Byte , J As Byte Dim Sensor As Byte Dim Addata As Word Dim Wk As Word Dim Temp_save As Word Dim Temp As Word Dim Wk1 As Byte Config Porta = &H03 Config Portb = &HFF Config Portd = &HFD Const Clk = 0 'PD0 Const Dout = 1 'PD1 Const Din = 2 'PD2 Const Cs = 3 'PD3 Const Temp_alarm = 500 'alarm1 temperature Const Relay = 1 'PA1 Const Sensor_no = 0 ' PA0 Const Minus = 7 ' PB7 Const Temp10 = 6 ' Temperature 10 degree Const Temp1 = 5 'Temperature 1 degree Const Temp01 = 4 'Temperature 0.1 degree Dim Segdata(12) As Byte Main: Stop Ac ' analog comparater power off '7segment data Segdata(1) = &HC0 ' 0 a,b,c,d,e,f Segdata(2) = &HF9 ' 1 b,c Segdata(3) = &HA4 ' 2 a,b,d,e,g Segdata(4) = &HB0 ' 3 a,b,c,d,g Segdata(5) = &H99 ' 4 b,c,f,g Segdata(6) = &H92 ' 5 a,c,d,f,g Segdata(7) = &H82 ' 6 a,c,d,e,f,g Segdata(8) = &HD8 ' 7 a,b,c,f Segdata(9) = &H80 ' 8 a,b,c,d,e,f,g Segdata(10) = &H90 ' 9 a,b,c,d,f,g Segdata(11) = &HBF ' munus only g segment Segdata(12) = &HFF ' No segment on Do 'ever loop For Sensor = 0 To 7 Gosub Getdata If Temp_save > Temp_alarm Then Set Porta.relay Else Reset Porta.relay End If For I = 1 To 100 'every 2 sec (4+4+4+4+4)*100=2000ms) Temp = Temp_save Wk = Sensor + 1 'display number of sencor Gosub Dispdata Reset Porta.sensor_no Waitms 4 If Temp < 0 Then 'minus Temp = Temp * -1 Wk = 10 Gosub Dispdata If Temp < 100 Then 'change minus position Reset Portd.temp10 Else Reset Portb.minus End If Waitms 4 Else Wk = 11 Gosub Dispdata End If Wk = Temp Mod 10 'temp 0.1 Gosub Dispdata Reset Portd.temp01 Waitms 4 Temp = Temp / 10 Wk = Temp Mod 10 Gosub Dispdata Reset Portd.temp1 Waitms 4 Temp = Temp / 10 Wk = Temp Mod 10 'Portb = Segdata(wk + 1) If Wk <> 0 Then 'if temperature less than 10 degree ,zero suppresion Gosub Dispdata Reset Portd.temp10 End If Waitms 4 Next I Next Sencor Loop End '******************************************************************* ' Out 7 segments data to PORTD ' Select digit by digit data '******************************************************************* Dispdata: Portb = &HFF Set Portd.temp01 Set Portd.temp1 Set Portd.temp10 Set Portb.minus Set Porta.sensor_no Waitus 100 Portb = Segdata(wk + 1) Return '******************************************************************* ' Get data from A/D converter '******************************************************************* Getdata: Reset Portd.cs 'A/D converter CS low Waitus 1 'waite 50micro second Set Portd.din 'start pulse high Gosub Clockout Set Portd.din 'signal mode high Gosub Clockout Wk1 = Sensor 'select A/D converter channel Shift Wk1 , Left , 5 For I = 1 To 3 'out D2,D1,D0 J = Wk1 And &H80 If J = 0 Then Reset Portd.din Else Set Portd.din End If Gosub Clockout Shift Wk1 , Left , 1 Next I Gosub Clockout 'sampling time Gosub Clockout 'null bit Addata = 0 'clear A/D data For I = 1 To 12 Shift Addata , Left , 1 'logical shift left 1 bit Reset Portd.clk 'clock low Waitus 1 'wait 50 micro second If Pind.dout = 1 Then 'check data bit Set Addata.0 'data bit is high End If Set Portd.clk 'clock high Waitus 1 'wait 50 micro second Next I Set Portd.cs 'cs high Temp_save = Addata - 600 Return '******************************************************************* ' Clock for A/D converter '******************************************************************* Clockout: Reset Portd.clk 'clock low Waitus 1 'wait 50 micro second Set Portd.clk 'clock high Waitus 1 'wait 50 micro second Return