标题:
温度单片机P0口用74HC373或74HC573锁存
[打印本页]
作者:
bibi
时间:
2015-4-19 03:29
标题:
温度单片机P0口用74HC373或74HC573锁存
#include <AT89X52.h> //调用51单片机的头文件
#include <Intrins.h>
sbit ds18b20=P3^7;
sbit OK=P3^6;
unsigned char TT,temp1,num,TL=20,TH=27,w,s,m,n;
unsigned char temp,temp2,key,dat;
unsigned char code tabcc[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};//共阴极
unsigned char code tabca[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF};//共阳极
//---------------------------------------
//名称:复位DS18B20函数
//---------------------
void delay(int ms)
{
int i;
while(ms--)
for(i=0;i<120;i++);
}
void disp(w,s)
{
unsigned char temp=0x01;
///////////////////
P0=tabca[s]; //显示一位数据
P2 &=0xFC;
_nop_();
P2 |=0x03;
_nop_();
P0=1<<w-1; //一位位选
P2 =0x01;
_nop_();
P2 |=0x03;
_nop_();
delay(6);
/////////////////////////
P0=0xff; //一位显示完后清屏
P2 &=0xFC;
_nop_();
P2 |=0x03;
_nop_();
///////////////////
}
void main()
{
char i;
while(1)
{
TT++;
if(TT==100)
TT=0;
n=TT/10;
m=TT%10;
for(i=0;i<20;i++)
{
disp(1,m); //个位
disp(2,n); //十位
disp(6,10);//右杠
disp(7,2);//区间
disp(8,10);//左杠
}
}
}
复制代码
#include <AT89X52.h> //调用51单片机的头文件
#include <Intrins.h>
sbit ds18b20=P3^7;
sbit OK=P3^6;
unsigned char TT,temp1,num,TL=20,TH=27,y;
unsigned char temp,temp2,key,dat;
unsigned char code tabcc[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};//共阴极
unsigned char code tabca[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x00};//共阳极
//---------------------------------------
//名称:复位DS18B20函数
//---------------------
void delay(int ms)
{
int i;
while(ms--)
for(i=0;i<120;i++);
}
void disp(void)
{
unsigned char temp=0x01;
///////////////////
P0=tabca[TT%10]; //第一位显示数据
P2 &=0xFC;
_nop_();
P2 |=0x03;
_nop_();
P0=0x01; //第一位位选
P2 =0x01;
_nop_();
P2 |=0x03;
_nop_();
delay(6);
/////////////////////////
P0=0xff; //第一位显示数据
P2 &=0xFC;
_nop_();
P2 |=0x03;
_nop_();
///////////////////
P0=tabca[TT/10]; //第二位显示数据
P2 &=0xFC;
_nop_();
P2 |=0x03;
_nop_();
P0=0x02; //第二位位选
P2 =0x01;
_nop_();
P2 |=0x03;
_nop_();
delay(6);
//////////////////////
P0=0xff; //第一位显示数据
P2 &=0xFC;
_nop_();
P2 |=0x03;
_nop_();
/////////////////////
}
void main()
{
char i;
while(1)
{
TT++;
if(TT==100)
TT=0;
for(i=0;i<20;i++)
{
disp();
}
}
}
复制代码
#include <AT89X52.h> //调用51单片机的头文件
#include <Intrins.h>
sbit ds18b20=P3^7;
sbit OK=P3^6;
unsigned char TT,temp1,num,TL=20,TH=27,w,s,m,n;
unsigned char temp,temp2,key,dat;
unsigned char code tabcc[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};//共阴极
unsigned char code tabca[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF,0xFF};//共阳极
//---------------------------------------
//名称:ms延迟
//---------------------
void delay(int ms)
{
int i;
while(ms--)
for(i=0;i<120;i++);
}
//---------------------------------------
//名称:复位DS18B20函数
//---------------------
bit Reset(void)
{
unsigned int i;
bit k;
ds18b20=0;
i=95;
while(i--);
ds18b20=1;
i=9;
while(i--);
k=ds18b20;
i=55;
while(i--);
return k;
}
//---------------------------------------
//名称:读一字节函数
//---------------------------------------
unsigned char ReadByte(void)
{
unsigned int i;
unsigned char j,buf=0;
for(j=0;j<8;j++)
{
buf=buf>>1;
ds18b20=0;
_nop_();
_nop_();
ds18b20=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
if(ds18b20==1)
buf|=0x80;
i=7;
while(i--);
}
return buf;
}
//---------------------------------------
//名称:写一字节函数
//---------------------------------------
void WriteByte(unsigned char dat)
{
unsigned int i;
unsigned char j;
for(j=0;j<8;j++)
{
if(dat&0x01) //如果写1
{
ds18b20=0; //拉低
_nop_(); //维持2US,符合大于1US小于15US的规范
_nop_(); //维持2US,符合大于1US小于15US的规范
ds18b20=1; //拉高
i=7; //维持约63US,符合不低于60US的要求
while(i--); //维持约63US,符合不低于60US的要求
}
else //如果写0
{
ds18b20=0; //拉低
i=7; //维持约63US,符合不低于60US的要求
while(i--); //维持约63US,符合不低于60US的要求
ds18b20=1; //拉高
_nop_(); //维持2US,符合大于1US的规范
_nop_(); //维持2US,符合大于1US的规范
}
dat=dat>>1; //写入字节右移1位
}
}
//---------------------------------------
//名称:DS18B20温度转换函数
//---------------------------------------
bit Convert(void)
{
if(Reset()==0) //复位DS18B20成功
{
WriteByte(0xcc); //写入跳过序列号命令字 Skip Rom
WriteByte(0x44); //写入温度转换命令字 Convert T
return 1; //启动温度转换成功
}
else //失败
{
return 0; //启动温度转换失败
}
}
//---------------------------------------
//名称:转换结束处理函数
//---------------------------------------
void ReadFlash(void)
{
unsigned char Lsb,Msb;
if(Reset()==0) //复位DS18B20成功
{
WriteByte(0xcc); //写入跳过序列号命令字 Skip Rom
WriteByte(0xbe); //写入读取数据令字 Read Scratchpad
Lsb=ReadByte(); //读出第一个字节暂存于LSB
Msb=ReadByte(); //读出第二个字节暂存于MSB
temp1=Lsb; //temp1内装温度参数的小数部分
temp2=Msb; //(Msb>>4)|(Lsb<<4);//temp2内装温度参数的整数部分
}
else
{
temp1=0; //如果复位失败,温度参数清零
temp2=0; //如果复位失败,温度参数清零
}
}
void disp(w,s)
{
unsigned char temp=0x01;
///////////////////
P0=tabca[s]; //显示一位数据
P2 &=0xFC;
_nop_();
P2 |=0x03;
_nop_();
P0=1<<w-1; //一位位选
P2 =0x01;
_nop_();
P2 |=0x03;
_nop_();
delay(4);
/////////////////////////
P0=0xff; //一位显示完后清屏
P2 &=0xFC;
_nop_();
P2 |=0x03;
_nop_();
///////////////////
}
void main()
{
while(1)
{
{
if(Convert()==1);
{
ReadFlash();
TT=(temp2<<4)|(temp1>>4);
}
if(TT<TL)
num=0;
else if(TT>TH)
num=2;
else //((TT>=TL)&(TT<=TH))
num=1;
disp(1,TT%10); //个位
disp(2,TT/10); //十位
disp(6,10);//右杠
disp(7,num);//区间
disp(8,10);//左杠
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1