附录
附录的主要内容是温湿度监测仪表的具体程序的设计,包括温湿度监测的主程序,及相关系统的各个子程序。 #include
text_jishuan_temp11(); show_all(); xianshi(); sht_rest(void); baojing();
unsigned char temp_h ; unsigned char temp_LL ; unsigned char ack ; unsigned char error ; unsigned int xianzhi_t=0; unsigned int xianzhi_h=0; unsigned int td=0; unsigned int tg=0; unsigned int hd=0;
33
unsigned int hg=0; sbit DATA =P2^6; sbit SCK=P2^7; sbit up=P3^3; sbit res=P3^7; sbit down=P3^6; SYSTEMTIME changed; static char press_flag; bit key_flag=0;
static char sec_add,min_add,hou_add,day_add,mon_add,yea_add,td_add,tg_add,hd_add,hg_add; /*********主函数**********/ void main() {
SYSTEMTIME CurrentTime; uchar i; T2=0; EA=1; EX0=1; IT0=1; LCD_Initial(); Initial_DS1302(); sht_rest() ; GotoXY(9,1); Print(\GotoXY(9,0); Print(\while(1) { td=0; tg=99; hd=0; hg=99;
text_jishuan_temp11();
34
DS1302_GetTime(&CurrentTime); changed.Second=CurrentTime.Second; changed.Minute=CurrentTime.Minute; changed.Hour=CurrentTime.Hour; changed.Week=CurrentTime.Week; changed.Day=CurrentTime.Day; changed.Month=CurrentTime.Month; changed.Year=CurrentTime.Year; for(i=0;i<9;i++) {
changed.DateString[i]=CurrentTime.DateString[i]; changed.TimeString[i]=CurrentTime.TimeString[i]; } settime(); news(); reset(); baojing(); if(press_flag==0) {
show_all(); } else { xianshi(); }
delay1ms(100); } }
char read() //读一个字节 返回应答信号 {
unsigned char i,val=0; temp_LL=0; temp_h=0;
35
DATA=1; //释放数据总线 for (i=0x80;i>0;i/=2) //位移8位 { SCK=1; //上升沿读入 if (DATA) val=(val | i); //确定值 SCK=0; }
DATA=0; //读应答信号,有应答为1,为应答为0 通过CPU下拉为应答
SCK=1; //第9个脉冲 _nop_(); _nop_(); _nop_(); //pulswith approx. 5 us SCK=0;
DATA=1; //释放数据总线 temp_h=val; val=0;
DATA=1; //释放数据总线 for (i=0x80;i>0;i/=2) //位移8位 { SCK=1; //上升沿读入 if (DATA) val=(val | i); //确定值 SCK=0; }
DATA=1;//0; //不需要应答 通过CPU下拉为应答 SCK=1; //第9个脉冲 _nop_(); _nop_(); _nop_(); //pulswith approx. 5 us SCK=0;
DATA=1; //释放数据总线 temp_LL=val;
return((temp_h<<4)+temp_LL); }
char write(unsigned char value) //写一个字节 返回应答信号 {
unsigned char i ; ack=0;
for (i=0x80;i>0;i/=2) //释放数据总线
36
{ if (i & value) DATA=1; //写入值 else DATA=0;
SCK=1; //上升沿写入 _nop_(); _nop_(); _nop_(); //延时 SCK=0; }
DATA=1; //释放数据总线 SCK=1; if (DATA==1) ack=1; SCK=0;
return ack; }
void start_sht11(void) //启动 {
DATA=1; SCK=0; _nop_();
SCK=1; _nop_();
DATA=0; _nop_ ();
SCK=0; _nop_(); _nop_(); _nop_();
SCK=1; _nop_();
DATA=1; _nop_();
SCK=0; }
sht_rest(void) //复位 {
unsigned char i;
DATA=1; SCK=0; for(i=0;i<9;i++) //第9个脉冲 //读应答信号 //error=1 表示没有应答 //数据为1,SCK=0 //第一个脉冲 //数据跌落 //完成一个脉冲 //再一个脉冲 //数据变为1 //完成该脉冲
//数据为1 时钟为0 //9 个脉冲为 复位
37