蓝桥杯单片机学习过程记录(七)温度传感器
温度传感器
温度整数:
//温度传感器
#include<STC15F2K60S2.H>
#include<intrins.h>
sbit DS =P1^4;
#define uchar unsigned char ;
#define uint unsigned int ;
uchar wendu;
uchar seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x54,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf,0xff};
uint yi,er,san,si,wu,liu,qi,ba;
void Delay80us();
void Delay500us();
void delayms(int ms);
void display_12(yi,er);
void display_34(san,si);
void display_56(wu,liu);
void display_78(qi,ba);
void allinit(void);
void ds_init(void);
void ds_write(unsigned char dat);
uchar ds_read(void);
unsigned char temper_get(void);
void main(void){
allinit();
yi=21;er=21;san=21;si=21;wu=21;liu=21;qi=21;ba=21;
while(1){
wendu=temper_get();
yi=wendu/10;er=wendu%10;
display_12(yi,er);
display_34(san,si);
display_56(wu,liu);
display_78(qi,ba);
}
}
void ds_write(unsigned char dat){
unsigned char i;
for(i=0;i<8;i++){
DS=0;
DS=dat&0x01;
Delay80us();
DS=1;
dat>>=1;
}
}
uchar ds_read(void){
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++){
DS=0;
dat>>=1;
//Delay80us();
DS=1;
if(DS==1)
dat=dat|0x80;
Delay80us();
}
return dat;
}
unsigned char temper_get(void){
unsigned char low,high,temp;
//初始化ds18b20
ds_init();
ds_write(0XCC);
ds_write(0x44);
Delay500us();
ds_init();
ds_write(0xcc);
ds_write(0xbe);
low=ds_read();
high=ds_read();
//取中间八位
temp=high<<4;
temp=temp|(low>4);
return temp;
}
//数码管12
void display_12(yi,er){
P2=0XC0;P0=0X01;
P2=0XE0;P0=seg[yi];
delayms(1);
P2=0XC0;P0=0X02;
P2=0XE0;P0=seg[er];
delayms(1);
}
//数码管34
void display_34(san,si){
P2=0XC0;P0=0X04;
P2=0XE0;P0=seg[san];
delayms(1);
P2=0XC0;P0=0X08;
P2=0XE0;P0=seg[si];
delayms(1);
}
//数码管56
void display_56(wu,liu){
P2=0XC0;P0=0X10;
P2=0XE0;P0=seg[wu];
delayms(1);
P2=0XC0;P0=0X20;
P2=0XE0;P0=seg[liu];
delayms(1);
}
//数码管78
void display_78(qi,ba){
P2=0XC0;P0=0X40;
P2=0XE0;P0=seg[qi];
delayms(1);
P2=0XC0;P0=0X80;
P2=0XE0;P0=seg[ba];
delayms(1);
}
//温度初始化
void ds_init(void){
DS=0;
Delay500us();
DS=1;
Delay500us();
}
void allinit(void){
//初始蜂鸣器
P2=0XA0;P0=0X00;
//关闭数码管
P2=0XC0;P0=0XFF;
P2=0XE0;P0=0XFF;
//关闭LED
P2=0X80;P0=0XFF;
}
void delayms(int ms){
int q,w;
for(q=0;q<ms;q++)
for(w=0;w<845;w++);
}
void Delay500us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 6;
j = 93;
do
{
while (--j);
} while (--i);
}
void Delay80us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 1;
j = 217;
do
{
while (--j);
} while (--i);
}
温度小数:
//温度传感器小数
#include<STC15F2K60S2.H>
#include<intrins.h>
//定义
sbit DS =P1^4;
#define uchar unsigned char ;
#define uint unsigned int ;
//温度变量显示
long wendu;
uchar seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf,0xff};
uint yi,er,san,si,wu,liu,qi,ba;
void Delay80us();
void Delay500us();
void delayms(int ms);
void display_12(yi,er);
void display_34(san,si);
void display_56(wu,liu);
void display_78(qi,ba);
void allinit(void);
void ds_init(void);
void ds_write(unsigned char dat);
uchar ds_read(void);
long temper_get(void);
void main(void){
allinit();
yi=21;er=21;san=21;si=21;wu=21;liu=21;qi=21;ba=21;
while(1){
wendu=temper_get();
yi=wendu/100000;er=wendu%100000/10000+10;san=wendu%10000/1000;si=wendu%1000/100;
display_12(yi,er);
display_34(san,si);
display_56(wu,liu);
display_78(qi,ba);
}
}
//ds写入
void ds_write(unsigned char dat){
unsigned char i;
for(i=0;i<8;i++){
DS=0;
DS=dat&0x01;
Delay80us();
DS=1;
dat>>=1;
}
}
//ds读取
uchar ds_read(void){
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++){
DS=0;
dat>>=1;
DS=1;
if(DS==1)
dat=dat|0x80;
Delay80us();
}
return dat;
}
long temper_get(void){
unsigned char low,high;
long temp;
//初始化ds18b20
ds_init();
//温度转换
ds_write(0XCC);
ds_write(0x44);
Delay500us();
ds_init();
ds_write(0XCC);
ds_write(0XBE);
//读数
low=ds_read();
high=ds_read();
ds_init();
temp=high&0x0f;
temp<<=8;
temp|=low;
temp=temp*625;
return temp;
}
//数码管12
void display_12(yi,er){
P2=0XC0;P0=0X01;
P2=0XE0;P0=seg[yi];
delayms(1);
P2=0XC0;P0=0X02;
P2=0XE0;P0=seg[er];
delayms(1);
}
//数码管34
void display_34(san,si){
P2=0XC0;P0=0X04;
P2=0XE0;P0=seg[san];
delayms(1);
P2=0XC0;P0=0X08;
P2=0XE0;P0=seg[si];
delayms(1);
}
//数码管56
void display_56(wu,liu){
P2=0XC0;P0=0X10;
P2=0XE0;P0=seg[wu];
delayms(1);
P2=0XC0;P0=0X20;
P2=0XE0;P0=seg[liu];
delayms(1);
}
//数码管78
void display_78(qi,ba){
P2=0XC0;P0=0X40;
P2=0XE0;P0=seg[qi];
delayms(1);
P2=0XC0;P0=0X80;
P2=0XE0;P0=seg[ba];
delayms(1);
}
//温度初始化
void ds_init(void){
DS=0;
Delay500us();
DS=1;
Delay500us();
}
void allinit(void){
//初始蜂鸣器
P2=0XA0;P0=0X00;
//关闭数码管
P2=0XC0;P0=0XFF;
P2=0XE0;P0=0XFF;
//关闭LED
P2=0X80;P0=0XFF;
}
//延时
void delayms(int ms){
int q,w;
for(q=0;q<ms;q++)
for(w=0;w<845;w++);
}
//延时
void Delay500us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 6;
j = 93;
do
{
while (--j);
} while (--i);
}
//延时
void Delay80us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 1;
j = 217;
do
{
while (--j);
} while (--i);
}