#include <at89x51.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit DQ = P2 ^ 6; //定义端口DQ
sbit led1 =P2^0;
sbit led2 =P2^1;
sbit led3 =P2^2;
sbit led4 =P2^3;
sbit pwm = P2^4;
sbit IN3 =P1^0;
sbit IN4 =P1^1;
sbit beep =P1^5;
u8 r_buf; //蓝牙接收到的字符存储缓冲区
sbit RxD =P3^0;
sbit TxD =P3^1;
unsigned char r_buf ;
unsigned char tx[10]={0,0,0x2E,0,0,0,0,0xDF,0x43,0x0A};
unsigned char time=0 ;
//unsigned code table[]={0xc0,0xfa,0xa4,0xb0,0x9a,0x91,0x81,0xf8,0x80,0x90};
unsigned char gao_dianping =0;
unsigned code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90};
unsigned char a;
/********************************************************************
* 名称 : Delay()
* 功能 : 微秒级延时函数
***********************************************************************/
void Delay(int num)//延时函数
{
while(num--) ;
}
/********************************************************************
* 名称 : Delaynms()
* 功能 : 毫秒级延时函数
***********************************************************************/
void Delaynms(unsigned int di) //延时
{
unsigned int da,db;
for(da=0;da<di;da++)
for(db=0;db<100;db++);
}
void sound() //蜂鸣器
{
u8 i=100;
while(i--)
{
beep=~beep;
Delaynms(5);
}
}
void dianji80 ()
{
while(1)
{
IN3=1;
Delay(40);
IN4=0;
Delay(10);
if(tx[0]<3)
break;
}
}
void dianji50()
{
while(1)
{
IN3=1;
Delay(10);
IN4=0;
Delay(10);
if(tx[0]<3)
break;
}
}
void dianji30 ()
{
while(1)
{
IN3=1;
Delay(30);
IN4=0;
Delay(70);
if(tx[0]<3)
break;
}
}
/********************************************************************
* 名称 : Init_DS18B20()
* 功能 : 初始化ds1820
***********************************************************************/
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);
}
/********************************************************************
* 名称 : ReadOneChar()
* 功能 : 从DS18B20读取一节数据
***********************************************************************/
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);
}/********************************************************************
* 名称 : WriteOneChar()
* 功能 : 对DS18B20写一节数据
***********************************************************************/
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;
}
}
/********************************************************************
* 名称 : ReadTemperature()
* 功能 : 读取数据 转换温度
***********************************************************************/
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
}
}
/********************************************************************
* 名称 : Display_SMG()
* 功能 : 数码管显示函数
***********************************************************************/
void Display_SMG(void)
{
unsigned char a;
for(a=0;a<=50;a++)
{
P0=table[tx[0]];
P2_0 = 0;
Delaynms(5);
P2_0 = 1;
P0=(table[tx[1]])&0x7f;
P2_1 = 0;
Delaynms(5);
P2_1 = 1;
P0=table[tx[3]];
P2_2 = 0;
Delaynms(5);
P2_2 = 1;
P0=table[tx[4]];
P2_3 = 0;
Delaynms(5);
P2_3 = 1;
}
}
void InitUART() //串口初始化9600
{
//初始化串口定时器9600
TMOD = 0x20;
//PCON = 0x00;
SCON = 0x50;
ET1=0;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
ES = 1;
EA = 1;
}
/*********************************************************************
* 名称 : main()
* 功能 : 主函数
***********************************************************************/
void main(void)
{
InitUART();
// IN3=0;
// IN4=0;
// beep=1;
// Init_DS18B20();
IN3=1;
Delay(40);
IN4=0;
gao_dianping=0;
while(1)
{
//unsigned int a=10000;
ET0 = 1; //to中断允许位
TMOD &=0Xf1;
TH0 = 0xec; //定时器T0设置参数
TL0 = 0x78;
TR0 = 1;
//gao_dianping=100;
ReadTemperature(); //读取温度
Display_SMG(); //显示
}
}
void UARTInterrupt(void) interrupt 4 //串口接收字符
{
if(RI)
{
RI = 0;
r_buf=SBUF ;
if (r_buf=='1')
gao_dianping=3 ;
if (r_buf=='2')
gao_dianping =50;
if (r_buf=='3')
gao_dianping =80;
SBUF=r_buf;
while(!TI);
TI = 0;
//add your code here!
}
}
void time0_int(void) interrupt 1
{
time++; //time 为中断次数
TH0 = 0xec;
TL0 = 0x78;
if(time<gao_dianping ) //high次中断后电平由高电平变成高电平
pwm=1;
if(time >gao_dianping) //period 相当于周期,保持不变的
{ pwm = 0;
}
if (time>100)
{
time=0;
}
}
|