您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页温度显示数码管C程序

温度显示数码管C程序

来源:华佗小知识


数码管温度显示:

程序:

#include //包括一个52标准内核的头文件

#include //_nop_();sbit DQ=P3^3; //sbit P07=P0^7; //LED// sbit P20=P2^0;

sbit SPEA=P3^7;

sbit P17=P1^7;

unsigned int h,n=0;

unsigned int temp;

void delay(unsigned int t);

void delay882us(void);

延时函数用温度输入口

小数点控制

ow_reset(void);

void write_byte(unsigned char val);

unsigned char read_byte(void);

unsigned int read_temp();

void delayms(unsigned int ms);

void runled(void); void light(void);

void x8led(unsigned long ddd);

/**********************温度小数部分用查表法************************/

unsigned char data temp_data[2]={0x00,0x00}; //读出温度暂放

unsigned char data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用

/*************************11us延时函数*****************************/ //

void delay(unsigned int t) {

for (;t>0;t--); } //

/*****************************延时882us****************************/

void delay882us(void) { unsigned char i;

for(i=0;i<255;i++);

{

_nop_();

}

} //

/***************************DS18B20************************/ ow_reset(void) {

char presence=1; while(presence) {

while(presence) {

DQ=1;_nop_();_nop_();//从高拉倒低

DQ=0; delay(50); //550 us

DQ=1; delay(6); //66 us

复位函数

presence=DQ; //presence=0 复位成功,继续下一步 }

delay(45); //延时500 us presence=~DQ; }

DQ=1; //拉高电平 } // //

/**************************DS18B20写命令函数************************/ //向1-WIRE 总线上写1个字节

void write_byte(unsigned char val) {

unsigned char i; for(i=8;i>0;i--) {

DQ=1;_nop_();_nop_(); //从高拉倒

低 DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 us

DQ=val&0x01; //出 delay(6); //66 us

最低位移

val=val/2; //右移1位 }

DQ=1;

delay(1); }

/************************DS18B20读1字节函数*************************/ //从总

线上取1个字节

unsigned char read_byte(void) {

unsigned char i;

unsigned char value=0; for(i=8;i>0;i--) {

DQ=1;_nop_();_nop_(); value>>=1;

DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 us DQ=1;_nop_();_nop_();_nop_();_nop_(); //4 us if(DQ)value|=0x80;

delay(6); //66 us }

DQ=1;

return(value); }

/*****************************读出温度函数**************************/

unsigned int read_temp() {

ow_reset(); //总线复位 delay(200);

write_byte(0xcc); //发命令

write_byte(0x44); //发转换命令 ow_reset(); delay(1);

write_byte(0xcc); //发命令 write_byte(0xbe);

temp_data[0]=read_byte(); //读温度值的第字

节 temp_data[1]=read_byte(); //读温度值的高字节 temp=temp_data[1];

temp<<=8; temp=temp|temp_data[0]; // 两字节合成一个整型变量。 if(temp>6348) {

temp=65536-temp; n=1; }

display[4]=temp&0x0f; // 取小数部分的值 temp=temp>>4; // 取中间八位,即整数部分的值 temp=temp*10+display[4];

return temp; //返回温度值 }

void delayms(unsigned int ms)

{ unsigned int i,j; for(i=20;i>0;i--) { x8led(temp); for(j=ms;j>0;j--) { _nop_(); }; } }

void runled(void) { unsigned int i,a=0x01; for(i=0;i<8;i++) { P1=~a; a<<=1; delayms(50); } }

void light(void) { P1=0; delayms(10); P1=0XFF; delayms(10); }

/*****************************数码管扫描****************************/

void x8led(unsigned long ddd) {

unsigned char q,r=0; unsigned char

l[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f,0xbf,0xff};

//0-9的字段码

unsigned char xx[4]={0,0,0,0};

unsigned char y[4]={0x8,0x4,0x2,0x1}; xx[3]=ddd%10; xx[2]=ddd/10%10; xx[1]=ddd/100%10; if(n==1) {

// n=0; xx[0]=11; //显示“-”号 }

else xx[0]=12; //无任何显示

for(q=0;q<4;) //循环扫描 {

q++; r++; if(r==4)r=0; P2=y[r];

P0=l[xx[r]]; if(r==2)P07=0; delay(100); P0=0xff;

} }

/*************************************************************/ void main() {

主函数

P0=0xff; //初始化端口 P2=0xff;

for(h=0;h<4;h++) //开机显示\"000\" {display[h]=0;}

ow_reset(); //开机先转换一

次 write_byte(0xcc); //Skip ROM write_byte(0x44); //发转换命令 for(h=0;h<200;h++) //开机显示\"000\" {x8led(0);} while(1) {

temp=read_temp(); //处理温度数据 x8led(temp); //显示温度值

if(temp>400) { light(); SPEA=0; } else {runled();SPEA=1; } n=0; } }

/*******************************************************************/

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务