这是师傅叫我们做的蓝桥杯的题,用的是Proteus8和keil5;
单片机进阶
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
#include "supend.h" #include "Nixie_tube.h" #include "pcf8591.h" #include "ds1320.h" #include "key_bord.h" #include "at24c02.h" void Time_out(); void Decide(); void LED_A_M() ; //------------------------------------------------------------------------------------------------------ u8 time[8]; //临时存储,时间,湿度值等 //手动/自动切换标志位 u8 V; //用于存储湿度值 bit K7,flag,K6,K4,K5,H,K; //标志位,H自动下蜂鸣器叫 bit set=0,Z; //set自动和手动切换,Z标志位 u8 X=50,Y; //X存储自动设定下的湿度值,Y蜂鸣器和继电器 //---------------------------------------定时器0中断服务函数--------------------------------------------- void Service1_function() interrupt 1 { TR0=0; TH0=(65536-500)/256; TL0=(65536-500)%256; //数码管显示函数 keyscan(); //按键扫描函数 switch(Trg) //选择第几页 { case 0x01: { K7=~K7; } ; break; //S7 case 0x02: { K6=~K6; } ; break; //S6 case 0x04: { K5=~K5; K=1; } ; break; //S5 case 0x08: { K4=~K4; K=0; } ; break; //S4 } V=Pcf8591ReadByte(); //湿度测量函数 V=(V*100)/254; //湿度处理函数 Time_out(); //时间/湿度处理 Decide(); // display(); LED_A_M() ; TR0=1; } //---------------------------------------时间/湿度处理--------------------------------------------------------- void Time_out() { if(flag==0) { WriteSet1302(0x82,0x30); //分 WriteSet1302(0x84,0x08); //时 X=EEP_ReadChar(0x01); flag=1; } if(set==0) { time[0]=ReadSet1302(0x85)>>4; time[1]=ReadSet1302(0x85)&0x0f; time[2]=10; time[3]=ReadSet1302(0x83)>>4; time[4]=ReadSet1302(0x83)&0x0f; time[5]=11; time[6]=V/10; time[7]=V%10; } if(set==1) { time[0]=10; time[1]=10; time[2]=11; time[3]=11; time[4]=11; time[5]=11; time[6]=X/10; time[7]=X%10; } } //----------------------------------------判断蜂鸣器开关/存储X到at24c02------------------------------------------------- void Decide() { if(K7==0) { if(K6==1) set=1; if(K5==1) { K5=0; X++; Z=1; } if(K4==1) { K4=0; X--; Z=1; } if(K6==0) set=0; if(Z==1) { Z=0; EEP_WriteChar(0x01,X); } } if(V>=X) { H=0; } if(V<X) { H=1; } } //--------------------------------------led闪亮/继电器------------------------------------------------------------------------- void LED_A_M() //手动/自动模式切换灯函数 { if(K7==0) //自动 { LED=0xfe; if(H==1) BUZZER=0x50; if(H==0) BUZZER=0x00; } if(K7==1) //手动 { LED=0xfd; if(K6==1)Y=Y|0x40; if(K6==0)Y=Y&0xbf; if(K==1) { Y=Y|0x10; } if(K==0) { Y=Y&0xef; } BUZZER=Y; } }
仿真好像有点问题,需要自己debug下
资源标识:220111单片机智能灌溉系统
暂无评论