"); //-->
这是我的程序,当时是为了做一个小冰箱的温控器做的,用的是51单片机,共阴数码管,P0口做段选,P1.4-1.7做位选。
#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
//相比以前的函数解决了显示不了百位,不能直接显示负号等
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
// 0 1 2 3
0x66,0x6d,0x7d,0x07,
// 4 5 6 7
0x7f,0x6f,0x40
//8 9 -
};
void display(uchar , uchar ,uchar ,uchar );
void delay_led(uint z);
void init_led();
uchar wei_3,v,wei_4,wei_5,wei_6,FWD,flag;
int shuju,a; //得到的温度值
uchar temp[2]={0,0}; //存放DS18B20的温度寄存器值
uint value = 0;
sbit DQ=P1^0; //数据线
sbit key=P1^1; //被控开关
sbit key1=P3^4; //温度加
sbit key2=P3^5; //温度减
sbit d1=P1^2; //设置指示灯
sbit we1=P1^4;
sbit we2=P1^5;
sbit we3=P1^6;
sbit we4=P1^7;
void ow_reset(void);
void tmstart (void);
void Read_Temperature(void);
void write_byte(char);
uint read_byte(void);
void delay_18B20(uint);
/*******主函数**********/
void main()
{
init_led();//初始化子程序
tmstart ();//18b20初始化
delay_18B20(50); /*等待转换结束*/
while(1)
{
Read_Temperature();
delay_18B20(50);
tmstart();
delay_18B20(50); /*等待转换结束*/
if(FWD==0) //当温度为正值时
{
if(shuju>a+5)//判断温度是否超过设定值若超过,则开始制冷,k=0时开始制冷
key=0;
if(shuju<a-5)
key=1; //shuju低于设定温度时,停止制冷,k=1停止制冷
}
if(FWD==1) //当温度为负值时
{
if(abs(a)>a)
{
if(shuju>abs(a)+5)//数据大于设定温度,说明当前温度低,停止制冷,k=1停止制冷
key=1;
if(shuju<abs(a)-5)//数据小于设定温度,说明当前温度高,开始制冷,k=0开始制冷
key=0;
}
else
key=1;
}
display(wei_3,wei_4,wei_5,wei_6);
}
}
void exter0() interrupt 2
{
flag=!flag;
// while(1);
}
/******延时函数*********/
void delay_led(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/******led初始化函数******/
void init_led()
{
key=1;
FWD=0;
a=40;
EA=1;//开总中断
EX1=1;//开中断1
IT1=1;//选择中断方式为下降沿触发
}
/********显示函数*********/
void display(uchar wei_3, uchar wei_4,uchar wei_5,uchar wei_6)
{
wei_3=shuju/1000%100%10;
wei_4=shuju/100%1000%100%10;
wei_5=shuju/10%10000%1000%100%10;
wei_6=shuju/1%100000%10000%1000%100%10;
if (FWD==1)//此处用双等号!
wei_3=10;
P0=table[wei_3];
we1=0;
delay_led(5);
we1=1;
P0=table[wei_4];
we2=0;
delay_led(5);
we2=1;
P0=table[wei_5]+0x80; //小数点显示+80H即可
we3=0;
delay_led(5);
we3=1;
P0=table[wei_6];
we4=0;
delay_led(5);
we4=1;
}
//========18b20程序=================*/
void delay_18B20(uint seconds) //延时
{
for(;seconds>0;seconds--);
}
/******************************************
18b20程序
******************************************/
//===============复位 ===========
void ow_reset(void)
{
uchar presence;
DQ = 0; //pull DQ line low
delay_18B20(44); //至少480微秒, leave it low for 501us
DQ = 1; // allow line to return high?
delay_18B20(3); // wait for presence18b20 36us
presence = DQ; // get presence signal // 0= DS18B20 ready, 1= busy
//if(!presence)P1_0=0;
delay_18B20(12); // wait for end of timeslot
}
//=========从总线上读取一个字节========
uint read_byte(void)
{
uchar i;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 0; // pull DQ low to start timeslot
_nop_();_nop_();_nop_();_nop_();
DQ = 1; // then return high
if(DQ)
{
value|=0x80;
}
delay_18B20(4); // wait for rest of timeslot
}
return(value);
}
//===========向18B20写一个字节=================
void write_byte(char val)
{
uchar i,j;
for (i=8; i>0; i--) // writes byte, one bit at a time
{
DQ = 0; // pull DQ low to start timeslot
j++; /*延时4us*/
DQ = val&0x01;
delay_18B20(8); // hold value for remainder of timeslot
DQ = 1;
j++;
val>>=1;
}
}
//============读取温度============
void Read_Temperature(void)
{
uint k,i;
int temple; /*存放读取的温度值 将其除以16即为得到的值*/
ow_reset();
k++; //延时4us
write_byte(0xCC); //Sk_nop_();ip ROM
k++; //延时4us
write_byte(0xBE); // read register
k++;k++; //延时8us
temp[0]=read_byte(); //读取低字节
temp[1]=read_byte(); //读取高字节
i=temp[1];
i<<=8; /*把b放到高八位上去*/
/*将a放到底八位上去*/
i=i|temp[0];
if(flag==1)//如果按下设置键
{
d1=0;
if(key1==0)//如果加温键被按下
{
delay_led(5);
if(key1==0)//消抖,再次判断
{
a=a+10;//步长为1度
while(!key1);//判断键盘松开
}
}
if(key2==0)//如果减温键被按下
{
delay_led(5);
if(key2==0)//再次判断,消抖
{
a=a-10;
while(!key2);
}
}
i=a*16/10;//显示当前设置的温度
}
else
d1=1;
if( i>6348)
{
temple=65536-i; //如果为负温则去除其补码
FWD=1; /*表示温度为负数*/
}
else
{
temple=i;
FWD=0;
/*表示温度为正数*/
}
shuju=temple*10/16;
}
//=======初始化============
void tmstart (void)
{
ow_reset(); //复位
delay_18B20(1); //延时
write_byte(0xCC); //跳过序列号命令,对所有器件有效
write_byte(0x44); //发转换命令 44H,
}
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
由声表面波谐振器(SAW)组成的基本无线电发射电路
遥控发射组件CS900
美国四家生产商的模拟芯片对华倾销幅度高达300%
时钟解决方案 CDCM6100x
韩国半导体技术将在2010被中国赶超
配备GPS的电动自行车
英特尔Xeon首席架构师即将离职
三星泰勒厂面临签证难题,恐影响2026年投产计划
芯原股份收购芯来科技,AI算力订单创新高
模拟器件 - 时 钟: EMI 降低
《Keil –C51 编译器用户手册 中文完整版》403页
新加坡延长电动车补贴政策,中国车企迎来新机遇
《DSP控制器及其应用》
英伟达违反反垄断法,市场监管总局决定对其收购案实施进一步调查
业界最高功率的 D 类放大器 - TAS5630/1
渐入佳境——新能源车市场进入市场驱动时代
【预测与分析亮点】8月份土耳其乘用车市场同比增长18.7%
由TX4915组成的遥控发射电路
《Keil Software –Cx51 编译器用户手册
《crc校验源码分析》
《MSP 430 单片机 在实际应用中的设计方案》
锂电池的充电特点和 TI 最新充电管理技术
SF04E与SF04B组成的发射电路
8月份中国乘用车零售销量同比增长4.6%,新能源汽车市场份额达到55%
AMD RDNA4 GPU架构,亮相
为中国市场度身定制的RF 收发器 – CC1100E
[推荐]新书-基于ARM微处理器与μC/OS-Ⅱ实时操作系统
[推荐]新书-嵌入式实时操作系统μC/OS-II(第2版)
谁为清华计算机系负责[转帖]
由SAW组成的超高频发射模块CS901