标题:
51单片机智能鱼缸源程序
[打印本页]
作者:
柴熊233
时间:
2022-2-5 19:35
标题:
51单片机智能鱼缸源程序
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LED_ON led=1
#define LED_OFF led=0
uchar dis_time_buf[16]={0};
char code str[] = "已加热\n";
char code str1[] = "已喂食\n";
char code str21[] = "已关灯\n";
char code str22[] = "已开灯\n";
char code str3[] = "已供氧\n";
unsigned char dat;
uint rrr;
//定义led灯
sbit led=P1^0; //照明引脚
sbit ledds1302 =P1^4; //加热棒工作
sbit dianji1=P1^6;
sbit dianji2=P1^5;
sbit ledduiguan=P1^7; //水泵工作 开始供氧气
//ds18b20引脚定义
sbit DQ = P2 ^ 6; //定义端口DQ
sbit led0 =P2^0;
sbit led1 =P2^1;
sbit led2 =P2^2;
sbit led3 =P2^3;
sbit k =P3^4;
sbit l =P3^5;
sbit led7 =P1^4;
unsigned char q=1;
unsigned char w=8;
//红外对管引脚定义
sbit OUT1=P2^5;//3
sbit OUT2=P2^4;
//ds18b20数组
unsigned char tx[10]={0,0,0x2E,0,0,0,0,0xDF,0x43,0x0A};
//ds18b20数组
//unsigned code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90};//gongyang
//unsigned code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
//0x07,0x7f,0x6f};//gongying
//功能:延时1毫秒
//入口参数:x
//出口参数:无
//说明:当晶振为12M时,j<112;当晶振为11.0592M时,j<122
void Delay_xms(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<112;j++);
}
/********************************************************************
* 名称 : Delay()
* 功能 : 微秒级延时函数
* 输入 : num
* 输出 : 无
***********************************************************************/
void Delay(int num)//延时函数
{
while(num--) ;
}
/********************************************************************
* 名称 : Delaynms()
* 功能 : 毫秒级延时函数
* 输入 : num
* 输出 : 无
***********************************************************************/
void Delaynms(unsigned int di) //延时
{
unsigned int da,db;
for(da=0;da<di;da++)
for(db=0;db<100;db++);
}
void Init_DS18B20(void)//初始化ds1820
{
unsigned char x=0;
DQ = 1; //DQ复位
Delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
Delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
Delay(20);
}
unsigned char ReadOneChar(void)//读一个字节
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
void WriteOneChar(unsigned char dat)//写一个字节
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay(2);
DQ = 1;
dat>>=1;
}
}
void ReadTemperature(void)//读取温度
{
unsigned char a=0;
unsigned char b=0;
unsigned char Data_L=0;
unsigned char num=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
a=ReadOneChar(); //读低8位
b=ReadOneChar(); //读高8位
tx[0] = (a/16+b*16)/10; //整数部分
tx[1] = (a/16+b*16)%10;
// Data_L=a&0X0F;
// for(num=3;num<7;num++) //小数部分
{
Data_L=Data_L*10; //10 //100 //40 //80
tx[num]=Data_L/16; //0 //6 //2 //5
Data_L=Data_L%16; //10 //4 //8
}
}
void anjian()
{
if(k==1)
{
Delay(5);
if(k==1)
{
w++;
if(w>=9)
{
w=9;
}
}
}
if(l==1)
{
Delay(5);
if(l==1)
{
w--;
if(w<=0)
{
w=0;
}
}
}
}
//定时器中断函数
void Timer2() interrupt 5 //定时器2是5号中断
{
static uchar t;
TF2=0;
t++;
if(t==100) //间隔200ms(50ms*4)读取一次时间
{
t=0;
rrr++;
if(rrr%2)
{
dianji2=1;
}
else
{
dianji2=0;
}
}}
//定时器2初始化
void Init_timer2(void)
{
RCAP2H=0x3c;//赋T2初始值0x3cb0,溢出20次为1秒,每次溢出时间为50ms
RCAP2L=0xb0;
TR2=1; //启动定时器2
ET2=1; //打开定时器2中断
EA=1; //打开总中断
}
//发送字符
//字符串发送函数
void sendwendu( )
// 传送字串
{
unsigned char i = 0;
while(str[i] != '\0')
{
SBUF = str[i];
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++; // 下一个字符
}
}
void sendweishi( )
// 传送字串
{
unsigned char i = 0;
while(str1[i] != '\0')
{
SBUF = str1[i];
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++; // 下一个字符
}
}
void senddengguang1( )
// 传送字串
{
unsigned char i = 0;
while(str21[i] != '\0')
{
SBUF = str21[i];
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++; // 下一个字符
}
}
void senddengguang2( )
// 传送字串
{
unsigned char i = 0;
while(str22[i] != '\0')
{
SBUF = str22[i];
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++; // 下一个字符
}
}
void sendgongyang( )
// 传送字串
{
unsigned char i = 0;
while(str3[i] != '\0')
{
SBUF = str3[i];
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++; // 下一个字符
}
}
//红外引脚 ********** P3^2 *********************
/*端口定义*/
unsigned char irtime;//红外用全局变量
bit irpro_ok,irok;
unsigned char IRcord[4];//用来存放用户码、用户反码、数据码、数据反码
unsigned char irdata[33];//用来存放32位码值
void clear_IR()
{
IRcord[0] = 0;
IRcord[1] = 0;
IRcord[2] = 0;
IRcord[3] = 0;
}
void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数
{
irtime++;
}
void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数
{
static unsigned char i;
static bit startflag;
if(startflag){
if(irtime<63&&irtime>=33)//引导码 TC9012的头码
i=0;
irdata[i]=irtime;
irtime=0;
i++;
if(i==33){
irok=1;
i=0;
}
}
else{
irtime=0;
startflag=1;
}
}
void TIM0init(void)//定时器0初始化
{
TMOD=0x22;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00;//reload value
TL0=0x00;//initial value
TL1=0xFD;
TH1=0xFD;
TR1=1;
SCON = 0x50;
ES=1;
ET0=1;//开中断
TR0=1;
}
void EX0init(void) //外部中断0子函数
{
IT0 = 1; // Configure interrupt 0 for falling edge on /INT0 (P3.2)
EX0 = 1; // Enable EX0 Interrupt
EA = 1;
}
void Ircordpro(void)//红外码值处理函数(关键函数)
{
unsigned char i, j, k=1;
unsigned char cord,value;
for(i=0;i<4;i++){//处理4个字节
for(j=1;j<=8;j++){ //处理1个字节8位
cord=irdata[k];
value=value>>1;
if(cord>7) value=value|0x80; //大于某值为1
k++;
}
IRcord[i]=value;
value=0;
}
irpro_ok=1;//处理完毕标志位置1
}
void none( void ) interrupt 4
{
if(RI) //是否接收中断
{
RI=0;
dat=SBUF;
}
}
//主函数
void main(void)
{
led=0;
Delay_xms(50);//等待系统稳定
Init_DS18B20();
Delay_xms(10);
Init_timer2(); //外部中断0
EX0init(); //外部中断0子函数
TIM0init(); // 定时器0初始化
SBUF = 1;
dianji1=1;
dianji2=1;
ledds1302=0;
ledduiguan=1;
while(1)
{
if(OUT1==1||OUT2==0)//红外对管+水泵
{
ledduiguan=0;
Delay_xms(900);
ledduiguan=1;
}
anjian(); ////////////////////////////////////////////////////////////////////////
ReadTemperature(); //读取温度
if(tx[1]==w)
{
led=0;
Delay(500);
led=1;
}
/////////////////////////////////////////////////////////////////////////////////HX1838b
if(irok)
{
Ircordpro();
irok=0;
}
if(irpro_ok)
{ /*遥控成功接收*/
irpro_ok=0;
}
//红外控制照明 照明
switch(IRcord[2])
{
case 0x45:LED_ON;senddengguang1();clear_IR(); break;//1 灯泡
case 0x44:LED_OFF;senddengguang2( );clear_IR(); break;//4
case 0x07:ledds1302=0;sendwendu( );clear_IR(); break;//2 加热棒
case 0x16:ledds1302=1;sendwendu( );clear_IR(); break;//5
case 0x47:dianji1=1;dianji2=0;sendweishi( );clear_IR(); break;//3 喂食电机
case 0x43:dianji1=1;dianji2=1;sendweishi( );clear_IR(); break;//6
case 0x15:ledduiguan=0;sendgongyang( );clear_IR(); break;//8 水泵供养
case 0x19:ledduiguan=1;clear_IR(); break;//0
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1