数字温湿度计设计(12864) 下载本文

第三章 软件设计

3.1程序流程图

开始通讯复位启动传输定时器初始化写温度指令成功error=0失败error=1读温度值成功error=0失败error=1写湿度指令成功error=0失败error=1读湿度值成功error=0失败error=1启动传输通讯复位显示处理Error=1?数据处理

图3.1程序流程图

3.2 源程序

#include #include #include

unsigned char code dispcode[]={0x14,0xd7,0x4c,0x45, 0x87,0x25,0x24,0x57,0x04,0x05,0xef,0xff}; unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f}; unsigned char dispbuf[8]={0,0,0,0,0,0,0,0}; typedef union {

unsigned int i; float f; }value;

enum {TEMP,HUMI};

sbit DATA=P0^5; //数据端口 sbit SCK=P0^6;//时钟端口

sbit P0_0=P0^0;//key1用来切换显示

sbit P0_1=P0^1;//key2用来调温湿度的十位 sbit P0_2=P0^2;//kye3用来调温湿度的个位 sbit P0_4=P0^4;//kye4用来复位 #define noACK 0 #define ACK 1

#define MEASURE_TEMP 0X03//读温度指令 #define MEASURE_HUMI 0X05//读湿度指令 unsigned char mstcnt; unsigned char dispbitcnt;

unsigned char humih,humil,temph,templ; unsigned char i,j,cnt; char tempset,humiset;

void display(float humi,float temp)//显示函数 {

int humi1,temp1; humi1=(humi*10); temp1=(temp*10);

if(temp1<0)//当温度为零下时 {

dispbuf[0]=10;//显示“-”号 temp1=abs(temp1); //取绝对值 } else {

dispbuf[0]=11;//什么也不显示

}

if(cnt==0)//显示实际测量的温湿度值 {

dispbuf[1]=temp1/100;//温度的十位 dispbuf[2]=temp1/10; //温度的个位 dispbuf[3]=temp1; //温度的小数位 dispbuf[4]=11; //什么也不显示

dispbuf[5]=humi1/100; //湿度的十位 dispbuf[6]=humi1/10;//湿度的个位 dispbuf[7]=humi1;//湿度的小数位

if((humi>humiset)||(temp>tempset))//比较报警 {

P0_4=0;//二极管亮 } else {

P0_4='Z';//二极管不亮 } } else {

if(cnt==1)//显示设置的温度 {

if(temph>9) {

dispbuf[0]=10;//显示“-” } else {

dispbuf[0]=11;//什么也不显示 }

dispbuf[1]=temph;//设置温度的十位 dispbuf[2]=templ;//设置温度的个位 dispbuf[3]=11; dispbuf[4]=11; dispbuf[5]=11; dispbuf[6]=11; dispbuf[7]=11; }

else //显示湿度 {

dispbuf[0]=11; dispbuf[1]=11; dispbuf[2]=11;

dispbuf[3]=11; dispbuf[4]=11;

dispbuf[5]=humih;//设置湿度十位 dispbuf[6]=humil;//设置湿度的个位 dispbuf[7]=11; } } }

void t0(void) interrupt 1 //中断函数 {

if(P0_0==0)//切换显示键 {

for(i=5;i>0;i--) for(j=248;j>0;j--); if(P0_0==0) {

cnt++; if(cnt>2) {

cnt=0; }

while(P0_0==0); } }

if(cnt==1)//显示设置的温度值,这时可以设置温度值 {

if(P0_1==0) {

for(i=5;i>0;i--) for(j=248;j>0;j--);

if(P0_1==0)//调温度的十位 {

temph++;

if(temph==15)//10-14分别表示-0——-4 {

temph=0; } }

while(P0_1==0); }

if(P0_2==0)//调温度的个位 {

for(i=5;i>0;i--) for(j=248;j>0;j--);

if(P0_2==0) {

templ++;

if(templ==10) {

templ=0; } }

while(P0_2==0); } } else

if(cnt==2)//显示设置的湿度值,这时可以设置湿度值 {

if(P0_1==0) {

for(i=5;i>0;i--) for(j=248;j>0;j--);

if(P0_1==0)//调节湿度的十位 {

humih++;

if(humih==10) {

humih=0; } }

while(P0_1==0); }

if(P0_2==0)//调节湿度个位 {

for(i=5;i>0;i--) for(j=248;j>0;j--); if(P0_2==0) {

humil++;

if(humil==10) {

humil=0; } }

while(P0_2==0); } }

if(temph<10)