#include <AT89X52.h>
#include <Intrins.h>
#define DATA P0 //1602???????
//ROM????????
#define READ_ROM 0x33 //??ROM
#define SKIP_ROM 0xCC //????ROM
#define MATCH_ROM 0x55 //???ROM
#define SEARCH_ROM 0xF0 //????ROM
#define ALARM_SEARCH 0xEC //?澯????
//?洢??????????
#define ANEW_MOVE 0xB8 //???μ???E^2????
#define READ_POWER 0xB4 //?????
#define TEMP_SWITCH 0x44 //??????任
#define READ_MEMORY 0xBE //?????洢??
#define COPY_MEMORY 0x48 //???????洢??
#define WRITE_MEMORY 0x4E //д???洢??
//????洢??
typedef struct tagTempData
{
unsigned char btThird; //??λ????
unsigned char btSecond; //?λ????
unsigned char btFirst; //??λ????
unsigned char btDecimal; //С??????λ????
unsigned char btNegative; //????????
}TEMPDATA;
TEMPDATA m_TempData;
//???????
sbit DQ = P1^6; //????????
sbit RS= P2^0;
sbit RW= P2^1;
sbit E= P2^2;
sbit K1= P2^5;
sbit K2= P2^6;
sbit K3= P2^7;
sbit LED1= P3^2;
sbit LED2= P3^3;
sbit LED3= P3^4;
sbit LED4= P3^5;
sbit LED5= P3^6;
sbit LED6= P3^7;
sbit relay1= P1^0;
sbit relay2= P1^1;
static unsigned char ti = 0;
unsigned char BJ1=0,BJ2=0,BJ3=0,war1=30,war2=32,state=0;
//DS18B20???к?,???????GetROMSequence()??????P1?????(??8??)
//const unsigned char code ROMData1[8] = {0x28,0xFF,0x4A,0x7C,0x63,0x14,0x02,0x8C}; //U1
const unsigned char code ROMData1[8] = {0x28, 0x33, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xD7}; //U1
const unsigned char code ROMData2[8] = {0x28, 0x30, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x8E}; //U2
const unsigned char code ROMData3[8] = {0x28, 0x31, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xB9}; //U3
//?ж?????
void Busy()
{
DATA = 0xff;
RS = 0;
RW = 1;
while(DATA & 0x80)
{
E = 0;
E = 1;
}
E = 0;
}
//д??????
void WriteCommand(unsigned char btCommand)
{
Busy();
RS = 0;
RW = 0;
E = 1;
DATA = btCommand;
E = 0;
}
//д???????
void WriteData(unsigned char btData)
{
Busy();
RS = 1;
RW = 0;
E = 1;
DATA = btData;
E = 0;
}
//???????
void Clear()
{
WriteCommand(1);
}
//?????
void Init()
{
WriteCommand(0x0c); //?????,???????
WriteCommand(0x06); //???????????????????
WriteCommand(0x38); //?????????:8λ2??5x7????
}
//??????????
void DisplayOne(bit bRow, unsigned char btColumn, unsigned char btData, bit bIsNumber)
{
if (bRow) WriteCommand(0xc0 + btColumn);
else WriteCommand(0x80 + btColumn);
if (bIsNumber) WriteData(btData + 0x30);
else WriteData(btData);
}
//????????????
void DisplayString(bit bRow, unsigned char btColumn, unsigned char *pData)
{
while (*pData != '\0')
{
if (bRow) WriteCommand(0xc0 + btColumn); //??????1??
else WriteCommand(0x80 + btColumn); //??????0??
WriteData(*(pData++)); //??????????
btColumn++; //???????
}
}
//???16us?????
void Delay16us()
{
unsigned char a;
for (a = 0; a < 4; a++);
}
//???60us?????
void Delay60us()
{
unsigned char a;
for (a = 0; a < 18; a++);
}
//???480us?????
void Delay480us()
{
unsigned char a;
for (a = 0; a < 158; a++);
}
//???240us?????
void Delay240us()
{
unsigned char a;
for (a = 0; a < 78; a++);
}
//???500ms?????
void Delay500ms()
{
unsigned char a, b, c;
for (a = 0; a < 250; a++)
for (b = 0; b < 3; b++)
for (c = 0; c < 220; c++);
}
//о??????
void Initialization()
{
while(1)
{
DQ = 0;
Delay480us(); //???480us
Delay240us();
DQ = 1;
Delay60us(); //???60us
if(!DQ) //???ds18b20????????
{
DQ = 1;
Delay480us(); //???480us
break;
}
}
}
//д??????(???λ???д)
void WriteByte(unsigned char btData)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
DQ=0;
DQ = btData&0x01;
Delay240us();
DQ = 1;
btData>>=1;
}
}
//????????(???λ?????)
unsigned char ReadByte()
{
unsigned char i, btDest;
for (i = 0; i < 8; i++)
{
btDest >>= 1;
DQ = 0;
_nop_();
_nop_();
DQ = 1;
Delay16us();
if (DQ) btDest |= 0x80;
Delay60us();
}
return (btDest);
}
//???к????
void MatchROM(const unsigned char *pMatchData)
{
unsigned char i;
Initialization();
WriteByte(MATCH_ROM);
for (i = 0; i < 8; i++) WriteByte(*(pMatchData + i));
}
//???????
TEMPDATA ReadTemperature()
{
TEMPDATA TempData;
unsigned int iTempDataH;
unsigned char btDot, iTempDataL;
TempData.btNegative = 0; //?0??????
ti++;
if (ti == 4) ti = 1;
Initialization();
WriteByte(SKIP_ROM); //????ROM???
WriteByte(TEMP_SWITCH); //??????
Delay500ms(); //??????ξ???
Initialization();
//???о????????MatchROM(ROMData)????WriteByte(SKIP_ROM)
switch (ti)
{
case 1 : MatchROM(ROMData1); break; //???1
case 2 : MatchROM(ROMData2); break; //???2
case 3 : MatchROM(ROMData3); break; //???3
}
//WriteByte(SKIP_ROM); //????ROM???(????о??????任???????switch)
WriteByte(READ_MEMORY); //??????
iTempDataL = ReadByte();
iTempDataH = ReadByte();
iTempDataH <<= 8;
iTempDataH |= iTempDataL;
if (iTempDataH & 0x8000)
{
TempData.btNegative = 1;
iTempDataH = ~iTempDataH + 1; //??????
}
//???????????????????????????????????С????????????????(???????????)
btDot = (unsigned char)(iTempDataH & 0x000F); //???С??????
iTempDataH >>= 4; //???????????
btDot *= 5; //btDot*10/16?????????С??????
btDot >>= 3;
//???????
TempData.btThird = (unsigned char)iTempDataH / 100;
TempData.btSecond = (unsigned char)iTempDataH % 100 / 10;
TempData.btFirst = (unsigned char)iTempDataH % 10;
TempData.btDecimal = btDot;
return TempData;
}
//????????????
void DataProcess()
{
m_TempData = ReadTemperature();
if(ti==1)
{
if (m_TempData.btNegative) DisplayOne(0, 1, '-', 0);
else DisplayOne(0, 1, m_TempData.btThird, 1);
DisplayOne(0, 2, m_TempData.btSecond, 1);
DisplayOne(0, 3, m_TempData.btFirst, 1);
DisplayOne(0, 4, '.', 0);
DisplayOne(0, 5, m_TempData.btDecimal, 1);
if((m_TempData.btSecond*10+m_TempData.btFirst)>=war2)
{
BJ1=1;
LED1=0;LED2=1;
}
else if((m_TempData.btSecond*10+m_TempData.btFirst)<war1)
{
BJ1=0;
LED1=1;LED2=0;
}
else
{
BJ1=2;
LED1=1;LED2=1;
}
}
if(ti==2)
{
if (m_TempData.btNegative) DisplayOne(0, 10, '-', 0);
else DisplayOne(0, 10, m_TempData.btThird, 1);
DisplayOne(0, 11, m_TempData.btSecond, 1);
DisplayOne(0, 12, m_TempData.btFirst, 1);
DisplayOne(0, 13, '.', 0);
DisplayOne(0, 14, m_TempData.btDecimal, 1);
if((m_TempData.btSecond*10+m_TempData.btFirst)>=war2)
{
BJ2=1;
LED3=0;LED4=1;
}
else if((m_TempData.btSecond*10+m_TempData.btFirst)<war1)
{
BJ2=0;
LED3=1;LED4=0;
}
else
{
BJ2=2;
LED3=1;LED4=1;
}
}
if(ti==3)
{
if (m_TempData.btNegative) DisplayOne(1, 6, '-', 0);
else DisplayOne(1, 6, m_TempData.btThird, 1);
DisplayOne(1, 7, m_TempData.btSecond, 1);
DisplayOne(1, 8, m_TempData.btFirst, 1);
DisplayOne(1, 9, '.', 0);
DisplayOne(1, 10, m_TempData.btDecimal, 1);
if((m_TempData.btSecond*10+m_TempData.btFirst)>=war2)
{
BJ3=1;
LED5=0;LED6=1;
}
else if((m_TempData.btSecond*10+m_TempData.btFirst)<war1)
{
BJ3=0;
LED5=1;LED6=0;
}
else
{
BJ3=2;
LED5=1;LED6=1;
}
}
if((BJ1==1)&&(BJ2==1)&&(BJ3==1))
{
relay1=0;
relay2=1;
}
else if((BJ1==0)&&(BJ2==0)&&(BJ3==0))
{
relay1=1;
relay2=0;
}
else
{
relay1=1;
relay2=1;
}
}
void main()
{
//GetROMSequence();
Clear();
Init();
//DisplayString(0, 0, " Temperature");
//DisplayOne(1, 9, '.', 0);
while (1)
{
WriteCommand(0x01);
while(state==0)
{
DataProcess();
if(K1==0)
{
while(K1==0);
state++;
}
}
WriteCommand(0x01);
DisplayString(0, 0, "Set temp low:");
while(state==1)
{
WriteCommand(0xc0+5);
WriteData('0'+war1/10%10);
WriteData('0'+war1%10);
WriteData(0xdf);
WriteData('C');
if(K1==0)
{
while(K1==0);
state++;
}
if(K2==0)
{
while(K2==0);
war1++;
if(war1>war2)
war1=war2;
}
if(K3==0)
{
while(K3==0);
war1--;
if(war1<1)
war1=1;
}
}
WriteCommand(0x01);
DisplayString(0, 0, "Set temp high:");
while(state==2)
{
WriteCommand(0xc0+5);
WriteData('0'+war2/10%10);
WriteData('0'+war2%10);
WriteData(0xdf);
WriteData('C');
if(K1==0)
{
while(K1==0);
state=0;
}
if(K2==0)
{
while(K2==0);
war2++;
if(war2>99)
war1=99;
}
if(K3==0)
{
while(K3==0);
war2--;
if(war2<war1)
war2=war1;
}
}
}
}
uj5u.com熱心網友回復:
先確定程式有沒有跑起來,如果沒檢查供電和晶振再看下運行速度主要晶振是不是和仿真一樣
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/129175.html
標籤:單片機/工控
下一篇:ov7670
