第三章 软件设计
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
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)