- 博客(0)
- 资源 (3)
- 收藏
- 关注
51单片机温度传感器程序
#include
#define uchar unsigned char
#define uint unsigned int
sbit led=P2^5;
sbit wei=P2^7;
sbit duan=P2^6;
sbit DQ=P2^2;
uchar mazhi_duan[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
uchar mazhi_wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xff};
void delayl(uint n)
{
uint i,j;
for(i=n;i>0;i--)
for(j=114;j>0;j--);
}
void delays(uchar i)
{
while(i--);
}
bit init_DS18B20() //DS8B20初始化
{
bit x;
DQ=1; //DQ复位
delays(8);
DQ=0; //单片机将DQ拉低
delays(75);
DQ=1; //拉高总线
delays(15);
x=DQ; //延时过后 若x=0则初始化成功 若x=1则初始化失败
delays(5);
return x;
}
void write_data(uchar dat)
{
uchar i,temp;
temp=dat;
DQ=1;
for(i=0;i>=1;
}
}
uchar read_data()
{
uchar i,dat;
DQ=1;
for(i=0;i>=1;
DQ=1;//配置为输入
if(DQ)
dat|=0x80;
delays(4);
}
return dat;
}
uint readtemp()
{
uchar temph,templ;
uint temp;
float wendu;
init_DS18B20();
write_data(0xcc);//跳过ROM
write_data(0x44);//启动温度转换
//delayl(100);
init_DS18B20();
write_data(0xcc);//跳过ROM
write_data(0xBE);//读温度
//以下读温度,低八位在前
//高8位在后
templ=read_data();
temph=read_data();
temp = (temph<<8)|templ;
wendu = temp*0.625+0.5;//温度扩大10倍,四舍五入
temp = wendu;//10倍温度
return temp;
}
void STC_init()
{
P1=0x00;//关闭led
led=0; //锁存
wei=0;
duan=0;
}
void display(uchar weil,uchar duanl,bit dp)
{
wei=1;
P0=mazhi_wei[weil-1];
wei=0;
duan=1;
if(dp==1)
P0=(mazhi_duan[duanl]|0x80);
else
P0=mazhi_duan[duanl];
duan=0;
}
void main()
{
uchar i;
uint wendu;
STC_init();
wendu=readtemp();
delayl(500);
wendu=readtemp();
delayl(500);
while(1)
{
wendu=readtemp();
for(i=0;i<80;i++)
{
display(1,wendu/100,0);
delayl(3);
display(2,wendu0/10,1);
delayl(3);
display(3,wendu,0);
delayl(3);
}
}
}
2012-10-19
51单片机数模转换程序
单片机数模转换程序
将da#include //52系列单片机头文件
#include
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6; //申明U1锁存器的锁存端
sbit wela=P2^7; //申明U2锁存器的锁存端
sbit adwr=P3^6; //定义AD的WR端口
sbit adrd=P3^7; //定义AD的RD端口
sbit led=P2^5;
sbit DAC0832_CS = P3^2;
sbit DAC0832_WR = P3^6;
sbit AD_CS=P0^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar weima[] = {0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
void display(uchar bai,uchar shi,uchar ge) //显示子函数
{
dula=1;
P0=table[bai]|0x80; //送段选数据
dula=0;
P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时
wela=1; //原来段选数据通过位选锁存器造成混乱
P0=0x7e; //送位选数据
wela=0;
delayms(1); //延时
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0x7d;
wela=0;
delayms(1);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0x7b;
wela=0;
delayms(1);
}
/*void displays(uchar a ,uchar b,uchar c) //显示子函数
{
dula=1;
P0=table[a]; //送段选数据
dula=0;
P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时
wela=1; //原来段选数据通过位选锁存器造成混乱
P0=0x77; //送位选数据
wela=0;
delayms(1); //延时
dula=1;
P0=table[b];
dula=0;
P0=0xff;
wela=1;
P0=0x6f;
wela=0;
delayms(1);
dula=1;
P0=table[c];
dula=0;
P0=0xff;
wela=1;
P0=0x5f;
wela=0;
delayms(1);
}
*/
void displays(uchar shuzi,uchar weizhi,bit dp)
{
dula=1;
if(dp)
P0 = table[shuzi]|0x80;
else
P0 = table[shuzi];
dula=0;
wela=1;
P0 = weima[weizhi];
wela=0;
}
void main() // 主程序
{
uint ad;
uchar A1,A2,A3,adval;
AD_CS=1; //置CSAD为0,选通ADCS 以后不必再管ADCS
DAC0832_CS = 0;
DAC0832_WR = 0;
while(1)
{
wela=1;
P0=0x7f;
wela=0;
adwr=1;
_nop_();
adwr=0; //启动AD转换
_nop_();
adwr=1;
P1=0xff; //读取P1口之前先给其写全1
adrd=1; //选通ADCS
_nop_();
adrd=0; //AD读使能
_nop_();
adval=P1;
ad=adval*1.941; //AD数据读取赋给P1口
adrd=1;
A1=ad/100; //分出百,十,和个位
A2=ad0/10;
A3=ad;
P1=(~adval);
P0=adval;
displays(adval/100,4,0);
delayms(1);
displays(adval0/10,5,0);
delayms(1);
displays(adval,6,0);
delayms(1);
display(A1,A2,A3);
}
}
ad的数据相互转换
2012-10-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人