标题:
51单片机温控风扇并显示时钟的源程序
[打印本页]
作者:
huangsongwqq
时间:
2017-10-7 10:48
标题:
51单片机温控风扇并显示时钟的源程序
单片机课大作业,温控风扇并能显示时间日期
0.png
(47.21 KB, 下载次数: 56)
下载附件
2017-10-7 23:01 上传
单片机源程序如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#include"lcd.h"
#include"temp.h"
#include"ds1302.h"
uchar ChCh[10] = "HUANG SONG";
uchar num=0;
uchar j;
uint tp;
uint temp;
uchar a,b;
uchar datas[] = {0, 0, 0, 0, 0}; //定义数组
void LcdDisplay(int);
#define LCD1602_DATAPINS P0
////////////////////
sbit beep=P2^4;
sbit dj=P2^1;//电机控制端接口
sbit DQ=P3^7;//温度传感器接口
//////////按键接口/////////////////////////////////
sbit key1=P3^0;//设置温度
sbit key2=P3^1;//温度加
sbit key3=P3^2;//温度减
//////////////////////////////////////////////////////
sbit w1=P3^3;
sbit w3=P2^2;
sbit w4=P2^3;
sbit LE=P2^0;
/////共阴数码管段选//////////////////////////////////////////////
uchar table[22]=
{0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F,
0x77,0x7C,0x39,0x5E,0x79,0x71,
0x00,0x38,0x76,0x00,0xff,0x37};//'-',L,H,灭,全亮,n 16-21
int wen_du=0;
uchar gao,di;//pwm
uint shang,xia; //对比温度暂存变量
uchar dang,dang1;//档位显示
uchar flag;
uchar d1,d2,d3;//显示数据暂存变量
void delay(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
/***********ds18b20延迟子函数(晶振12MHz )*******/
void display()//显示温度
{
w1=0;P1=table[d1];LE=1;LE=0;delay(1); w1=1;//第1位
P1=0x00;LE=1;LE=0;
w3=0;P1=table[d2]; LE=1;LE=0; delay(1);w3=1;//第3位
P1=0x00;LE=1;LE=0;
w4=0;P1=table[d3]; LE=1;LE=0; delay(1);w4=1;//第4位
P1=0x00;LE=1;LE=0;
}
void zi_keyscan()//自动模式按键扫描函数
{
if(key1==0)
{
delay(1);
if(key1==0)flag=1;
while(key1==0);//松手检测
}
while(flag==1)
{
d1=18;d2=shang/10;d3=shang%10;
display();
if(key1==0)
{
delay(0.1);
if(key1==0)flag=2;
while(key1==0);//松手检测
}
if(key2==0)
{
delay(0.1);
if(key2==0)
{
shang+=1;
if(shang>=100)shang=100;
}while(key2==0);//松手检测
}
if(key3==0)
{
delay(0.1);
if(key3==0)
{
shang-=1;
if(shang<=10)shang=10;
}while(key3==0);//松手检测
}
}
while(flag==2)
{
d1=17;d2=xia/10;d3=xia%10;
display();
if(key1==0)
{
delay(0.1);
if(key1==0)flag=0;
while(key1==0);//松手检测
}
if(key2==0)
{
delay(0.1);
if(key2==0)
{
xia+=1;
if(xia>=95)xia=95;
}while(key2==0);//松手检测
}
if(key3==0)
{
delay(0.1);
if(key3==0)
{
xia-=1;
if(xia<=0)xia=0;
}while(key3==0);//松手检测
}
}
}
void zi_dong()//自动温控模式
{
uchar i;
d1=dang;d2=16;d3=16;
zi_keyscan();//按键扫描函数
display();
if(wen_du<xia){dj=0;dang=0;}//低于下限 停止
if((wen_du>=xia)&&(wen_du<=shang))//1挡
{
dang=1;
for(i=0;i<10;i++){dj=0;display();}
for(i=0;i<10;i++){dj=1;display();}
zi_keyscan();
}
if(wen_du>shang){dj=1;dang=2;display();}//高温全速
}
unsigned int i=0;
void main()
{
TMOD= 0x01; //配置T0为模式1
TL0=0x00;
TH0=0xDC;
TF0 = 0;
EA=1;
ET0=1;
TR0=1;
beep=1;
dj=0;
shang=30;
xia=20; //初始化LCD1602
LcdInit();
Ds1302Init();
LcdWriteCom(0xc6); //写地址 80表示初始地址
LcdWriteData('C');
tp=Ds18b20ReadTemp();
Ds1302ReadTime();
display();
while(1)
{
temp=tp*0.0625*100+0.5;
a=temp % 10000 / 1000;
b=temp % 1000 / 100;
wen_du=a*10+b;
LcdDisplay(tp);
Delay1ms(100);//1s钟刷一次
}
}
void T0_time() interrupt 1
{
TL0=0x00;
TH0=0xDC;
TF0=0;
TR0=0;
tp=Ds18b20ReadTemp();
Ds1302ReadTime();
dang1=dang;
if(dang1==2)
{beep=~beep;
num=num++;
if(num==10)dang1=0;}
display();
zi_dong();
TR0=1;
}
void LcdDisplay(int temp) //lcd显示
{
unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组
float tp;
if(temp< 0) //当温度值为负数
{
LcdWriteCom(0xc0); //写地址 80表示初始地址
LcdWriteData('-'); //显示负
//因为读取的温度是实际温度的补码,所以减1,再取反求出原码
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
//算由?.5,还是在小数点后面。
}
else
{
LcdWriteCom(0xc0); //写地址 80表示初始地址
LcdWriteData('+'); //显示正
tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
//如果温度是正的那么,那么正数的原码就是补码它本身
temp=tp*0.0625*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
//算加上0.5,还是在小数点后面。
}
datas[0] = temp / 10000;
datas[1] = temp % 10000 / 1000;
datas[2] = temp % 1000 / 100;
datas[3] = temp % 100 / 10;
datas[4] = temp % 10;
LcdWriteCom(0xc1); //写地址 80表示初始地址
LcdWriteData('0'+datas[1]); //十位
LcdWriteCom(0xc2); //写地址 80表示初始地址
LcdWriteData('0'+datas[2]); //个位
LcdWriteCom(0xc3); //写地址 80表示初始地址
LcdWriteData('.'); //显示 ‘.’
LcdWriteCom(0xc4); //写地址 80表示初始地址
LcdWriteData('0'+datas[3]); //显示小数点
LcdWriteCom(0xc5); //写地址 80表示初始地址
LcdWriteData('0'+datas[4]); //显示小数点
LcdWriteCom(0x80);
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
51单片机温控风扇源程序.zip
(69.97 KB, 下载次数: 28)
2017-10-7 10:46 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1