完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
软件仿真没有问题,实物连接后,发现数码管显示时间是静止不动的,原来仿真中一切正常的功能都不可以用了,有高手来指点下吗? 附近保护源代码和仿真图 ![]() ![]() 18b20.c /*18B20温度传感器*/ #include"delay.h" #include"18b20.h" /*--18b20初始化--*/ bit Init_DS18B20(void) { bit dat=0; DQ = 1; //DQ复位 DelayUs2x(5); //稍做延时 DQ = 0; //单片机将DQ拉低 DelayUs2x(200); //200精确延时 大于 480us 小于960us DelayUs2x(200); //200 DQ = 1; //拉高总线 DelayUs2x(50); //50 15~60us 后 接收60-240us的存在脉冲 dat=DQ; //如果x=0则初始化成功, x=1则初始化失败 DelayUs2x(25); //稍作延时返回25 return dat; } /*--读取一个字节--*/ unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; DelayUs2x(25); } return(dat); } /*--写入一个字节--*/ void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; DelayUs2x(25); DQ = 1; dat>>=1; } DelayUs2x(25); } /*--读取温度--*/ unsigned int ReadTemperature(void) { unsigned char a=0; unsigned int b=0; unsigned int t=0; EA=0; //总中断关闭 Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 //EA=1; WriteOneChar(0x44); // 启动温度转换 DelayMs(20);//10 //EA=0; Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar(); //低位 b=ReadOneChar(); //高位 b<<=8; t=a+b; EA=1; //总中断打开 return(t); } 18b20.h #ifndef __DS18B20_H__ #define __DS18B20_H__ #include #include #define uchar unsigned char #define uint unsigned int; /*--端口定义--*/ ***it DQ=P1^7;//ds18b20 端口 /*--函数声明--*/ unsigned int ReadTemperature(void); bit Init_DS18B20(void); unsigned char ReadOneChar(void); void WriteOneChar(unsigned char dat); #endif ds1302.h // /************************************************************************** THE REAL tiMER DS1302 DRIVER LIB COPYRIGHT (c) 2005 BY JJJ. -- ALL RIGHTS RESERVED -- File Name: DS1302.h Author: Jiang Jian Jun Created: 2003/7/21 Modified: NO Revision: 1.0 ***************************************************************************/ #ifndef _DS1302_H_ #define _DS1302_H_ ***it DS1302_CLK = P1^3; //实时时钟时钟线引脚 ***it DS1302_RST = P1^5; //实时时钟数据线引脚 ***it DS1302_IO = P1^4; //实时时钟复位线引脚 ***it ACC7 = ACC^7 ; typedef struct __SYSTEMTIME__ { unsigned char Second; unsigned char Minute; unsigned char Hour; unsigned char Year; unsigned char Month; unsigned char Day; unsigned char Week; } SYSTEMTIME;//定义的时间类型 #define AM(X) X #define PM(X) (X+12) // 转成24小时制 #define DS1302_SECOND 0x80 #define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_WEEK 0x8A #define DS1302_DAY 0x86 #define DS1302_MONTH 0x88 #define DS1302_YEAR 0x8C #define DS1302_RAM(X) (0xC0+(X)*2) //用于计算 DS1302_RAM 地址的宏 void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数) { unsigned char i; for(i=0; i<8; i++) { DS1302_IO = (d&0x01); //相当于汇编中的 RRC DS1302_CLK = 1; d >>=1 ; DS1302_CLK = 0; } } unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数) { unsigned char i; for(i=8; i>0; i--) { ACC = ACC >>1; //相当于汇编中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; } return(ACC); } void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据 { DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); // 地址,命令 DS1302InputByte(ucDa); // 写1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; } unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据 { unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); // 地址,命令 ucData = DS1302OutputByte(); // 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData); } void DS1302_SetProtect(bit flag) //是否写保护 { if(flag) Write1302(0x8E,0x80); //是 else Write1302(0x8E,0x00); //否 } void DS1302_GetTime(SYSTEMTIME *Time) { unsigned char value; value = Read1302(DS1302_SECOND); Time->Second = ((value&0x70)>>4)*10 + (value&0x0F); //BCD码:十位+个位 value = Read1302(DS1302_MINUTE); Time->Minute = ((value&0x70)>>4)*10 + (value&0x0F); value = Read1302(DS1302_HOUR); Time->Hour = ((value&0x70)>>4)*10 + (value&0x0F); value = Read1302(DS1302_DAY); Time->Day = ((value&0x70)>>4)*10 + (value&0x0F); value = Read1302(DS1302_MONTH); Time->Month = ((value&0x70)>>4)*10 + (value&0x0F); value = Read1302(DS1302_YEAR); Time->Year = ((value&0x70)>>4)*10 + (value&0x0F); value = Read1302(DS1302_WEEK); Time->Week = ((value&0x70)>>4)*10 + (value&0x0F); } void Initial_DS1302(void) { unsigned char Second=Read1302(DS1302_SECOND); if(Second&0x80) //假如DS1302 还没有开始工作时 { DS1302_SetProtect(0); //禁止写保护 // Write1302(DS1302_MINUTE,0x59); //为BCD码 // Write1302(DS1302_HOUR,0x23); //最高位为低,表示24小时制 Write1302(DS1302_SECOND,((0/10)<<4)|0); //秒寄存器最高位写0//1,DS1302开始工作。 DS1302_SetProtect(1); //写保护 } } /* void Stop_DS1302(void) { DS1302_SetProtect(0); Write1302(DS1302_SECOND,0x80); DS1302_SetProtect(1); //写保护 } */ void modif_time(unsigned char second , unsigned char minute ,unsigned char hour) { DS1302_SetProtect(0); Write1302(DS1302_MINUTE,(((minute/10)<<4)|(minute%10))); Write1302(DS1302_HOUR,(((hour/10)<<4)|(hour%10))); Write1302(DS1302_SECOND,(((second/10)<<4)|(second%10))); DS1302_SetProtect(1); //写保护 } void modif_day(unsigned char day , unsigned char month ,unsigned char year) { DS1302_SetProtect(0); Write1302(DS1302_YEAR,(((year/10)<<4)|(year%10))); Write1302(DS1302_MONTH,(((month/10)<<4)|(month%10))); Write1302(DS1302_DAY,(((day/10)<<4)|(day%10))); DS1302_SetProtect(1); //写保护 } void modif_week(unsigned char week) { DS1302_SetProtect(0); Write1302(DS1302_WEEK,(((week/10)<<4)|(week%10))); DS1302_SetProtect(1); //写保护 } void Wirte_Alarmdata(SYSTEMTIME *Time,unsigned char num) { unsigned char RAM_ADDR=0xc0+num*4; DS1302_SetProtect(0); Write1302(RAM_ADDR,Time->Hour); Write1302(RAM_ADDR+2,Time->Minute); DS1302_SetProtect(1); //写保护 } void Read_Alarmdata(SYSTEMTIME *Time) { unsigned char i; unsigned char RAM_ADDR=0xc0; DS1302_SetProtect(0); for(i=0;i<5;i++) { (Time+i)->Hour = Read1302(RAM_ADDR); (Time+i)->Minute = Read1302(RAM_ADDR+2); RAM_ADDR +=4 ; } DS1302_SetProtect(1); } delay.c /********************************************************************************/ #endif #include "delay.h" /*------------------------------------------------ uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS ------------------------------------------------*/ void DelayUs2x(unsigned char t) { while(--t); } /*------------------------------------------------ mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编 ------------------------------------------------*/ void DelayMs(unsigned char t) { while(t--) { //大致延时1mS DelayUs2x(245); DelayUs2x(245); } } delay.h #ifndef __DELAY_H__ #define __DELAY_H__ /*------------------------------------------------ uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS ------------------------------------------------*/ void DelayUs2x(unsigned char t); /*------------------------------------------------ mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编 ------------------------------------------------*/ void DelayMs(unsigned char t); #endif 74hc595.c ***it LATCH = P1^0; //ST 锁存输出信号 ***it SRCLK= P1^1; //SCK 串行时钟信号 ***it SER = P1^2; //SER 串行数据 unsigned char code wing_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9 unsigned char code wing_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码 unsigned char TempData[8]; //存储显示值的全局变量 void TDisplay(unsigned char FirstBit,unsigned char Num);//数码管显示函数 /*74HC595串口数码管扫描*/ void SendByte(unsigned char dat) { unsigned char i; for(i=0;i<8;i++) { SRCLK=0; SER=dat&0x80; dat<<=1; SRCLK=1; } } void Send2Byte(unsigned char dat1,unsigned char dat2) { SendByte(dat1); SendByte(dat2); } void Out595(void) { LATCH=1; _nop_(); LATCH=0; } /*74HC595串口数码管扫描*/ void TDisplay(unsigned char FirstBit,unsigned char Num)//定时抽水数码管串口扫描 { static unsigned char i; Send2Byte(wing_WeiMa[FirstBit+i],TempData); Out595(); i++; if(i==Num) i=0; } 主程式 TIMER-02.c //完整程序源代码 #include #include #include "ds1302.h" #include "18b20.h" #include "74hc595.c" SYSTEMTIME CTime[6]; ***it beep=P1^6; ***it light=P3^7; ***it LED1=P0^0;//LED ***it LED2=P0^1; ***it LED3=P0^2; ***it LED4=P0^3; ***it RUNLED=P0^4; ***it LD1=P2^0;//按钮 ***it LD2=P2^1; ***it LD3=P2^2; ***it LD4=P2^3; ***it RUN=P2^4; ***it STOP=P2^5; ***it AT=P2^6; ***it TT=P2^7; ***it ADD=P3^0; ***it DEC=P3^1; ***it TT_SET=P3^2; ***it CC_ENT=P3^3; ***it MF_UP=P3^4; ***it CT_SET=P3^5; bit LD1_Flag;//标志位 bit LD2_Flag; bit LD3_Flag; bit LD4_Flag; bit RUN_Flag; bit AT_Flag; bit TT_Flag; bit ReadTempFlag;//定义读温度标志 bit KeyPressFlag;//定义按键标志位 bit UpdateTimeFlag;//定义读时间标志 //温度 uint TempH,TempL,Tempx,dba; //时间 bit key1,key2,key3,key4; uint state,gai,sett,bee,count,ring_flag,m,i,j; //uint state,gai,sett,key1,key2,key3,key4,temp,bee,count,ring_flag,m,i,j; uchar displaynum; uchar key_press_num,fen,miao; unsigned char KeyScan(void);//键盘扫描 void key_box(); void pump();//抽水 void time(); void beepscan(); void beepring(); void wendu();//温度 void shizhong();//时钟 void naozhong();//闹钟 void DelayUs2x(unsigned char t);//us级延时函数声明 void DelayMs(unsigned char t); //ms级延时 void Init_Timer0(void);//定时器0初始化 void main() { Init_Timer0(); //调用定时器0 Initial_DS1302(); Read_Alarmdata(CTime+1); while(1) { if((!LD1_Flag)&&(!LD2_Flag)&&(!LD3_Flag)&&(!LD4_Flag)) //初始化 { LED1=0; RUN_Flag=0; LD1_Flag=1; } DS1302_GetTime(&CTime); key_box(); if(RUN_Flag) { pump(); } else { time(); } beepscan(); beepring(); } } void shizhong()//时钟 { if(1==sett)//设置时间 { if((gai==0)||(gai==1)) { TempData[0]=wing_DuanMa[CTime[0].Hour/10];//时闪 TempData[1]=wing_DuanMa[CTime[0].Hour%10]; DelayMs(200); TempData[0]=wing_DuanMa[CTime[0].Hour/10]|0x80;//时 TempData[1]=wing_DuanMa[CTime[0].Hour%10]|0x80; DelayMs(200); TempData[2]=0x40; TempData[3]=wing_DuanMa[CTime[0].Minute/10];//分 TempData[4]=wing_DuanMa[CTime[0].Minute%10]; TempData[5]=0x40; TempData[6]=wing_DuanMa[CTime[0].Second/10];//秒 TempData[7]=wing_DuanMa[CTime[0].Second%10]; } if(gai==2) { TempData[0]=wing_DuanMa[CTime[0].Hour/10];//时 TempData[1]=wing_DuanMa[CTime[0].Hour%10]; TempData[2]=0x40; TempData[3]=wing_DuanMa[CTime[0].Minute/10];//分闪 TempData[4]=wing_DuanMa[CTime[0].Minute%10]; DelayMs(200); TempData[3]=wing_DuanMa[CTime[0].Minute/10]|0x80;//分 TempData[4]=wing_DuanMa[CTime[0].Minute%10]|0x80; DelayMs(200); TempData[5]=0x40; TempData[6]=wing_DuanMa[CTime[0].Second/10];//秒 TempData[7]=wing_DuanMa[CTime[0].Second%10]; } if(gai==3) { TempData[0]=wing_DuanMa[CTime[0].Hour/10];//时 TempData[1]=wing_DuanMa[CTime[0].Hour%10]; TempData[2]=0x40; TempData[3]=wing_DuanMa[CTime[0].Minute/10];//分 TempData[4]=wing_DuanMa[CTime[0].Minute%10]; TempData[5]=0x40; TempData[6]=wing_DuanMa[CTime[0].Second/10];//秒闪 TempData[7]=wing_DuanMa[CTime[0].Second%10]; DelayMs(200); TempData[6]=wing_DuanMa[CTime[0].Second/10]|0x80;//秒 TempData[7]=wing_DuanMa[CTime[0].Second%10]|0x80; DelayMs(200); } } else if(2==sett)//设置日期 { if((gai==0)||(gai==1)) { TempData[0]=wing_DuanMa[CTime[0].Year/10];//年闪 TempData[1]=wing_DuanMa[CTime[0].Year%10]; DelayMs(200); TempData[0]=wing_DuanMa[CTime[0].Year/10]|0x80;//年 TempData[1]=wing_DuanMa[CTime[0].Year%10]|0x80; DelayMs(200); TempData[2]=0x08; TempData[3]=wing_DuanMa[CTime[0].Month/10];//月 TempData[4]=wing_DuanMa[CTime[0].Month%10]; TempData[5]=0x08; TempData[6]=wing_DuanMa[CTime[0].Day/10];//日 TempData[7]=wing_DuanMa[CTime[0].Day%10]; } if(gai==2) { TempData[0]=wing_DuanMa[CTime[0].Year/10];//年 TempData[1]=wing_DuanMa[CTime[0].Year%10]; TempData[2]=0x08; TempData[3]=wing_DuanMa[CTime[0].Month/10];//月闪 TempData[4]=wing_DuanMa[CTime[0].Month%10]; DelayMs(200); TempData[3]=wing_DuanMa[CTime[0].Month/10]|0x80;//月 TempData[4]=wing_DuanMa[CTime[0].Month%10]|0x80; DelayMs(200); TempData[5]=0x08; TempData[6]=wing_DuanMa[CTime[0].Day/10];//日 TempData[7]=wing_DuanMa[CTime[0].Day%10]; } if(gai==3) { TempData[0]=wing_DuanMa[CTime[0].Year/10];//年 TempData[1]=wing_DuanMa[CTime[0].Year%10]; TempData[2]=0x08; TempData[3]=wing_DuanMa[CTime[0].Month/10];//月 TempData[4]=wing_DuanMa[CTime[0].Month%10]; TempData[5]=0x08; TempData[6]=wing_DuanMa[CTime[0].Day/10];//日闪 TempData[7]=wing_DuanMa[CTime[0].Day%10]; DelayMs(200); TempData[6]=wing_DuanMa[CTime[0].Day/10]|0x80;//日 TempData[7]=wing_DuanMa[CTime[0].Day%10]|0x80; DelayMs(200); } } else if(3==sett)//设置星期 { TempData[0]=0x40; TempData[1]=wing_DuanMa[CTime[0].Week%10];//周闪 DelayMs(200); TempData[1]=wing_DuanMa[CTime[0].Week%10]|0x80;//周 DelayMs(200); TempData[2]=0x40; wendu();//温度 } else if(0==sett) //正常显示时间 { DelayMs(20); dba++; if(dba>=0&&dba<=299) {displaynum=0;} if(dba>=300&&dba<=599) {displaynum=1;} if(dba>=600&&dba<=899) {displaynum=2;} if(dba==900) {dba=0;} if(00==displaynum) //显示时间 { TempData[0]=wing_DuanMa[CTime[0].Hour/10];//时 TempData[1]=wing_DuanMa[CTime[0].Hour%10]; TempData[2]=0x40; TempData[3]=wing_DuanMa[CTime[0].Minute/10];//分 TempData[4]=wing_DuanMa[CTime[0].Minute%10]; TempData[5]=0x40; TempData[6]=wing_DuanMa[CTime[0].Second/10];//秒 TempData[7]=wing_DuanMa[CTime[0].Second%10]; } if(1==displaynum) //显示日期 { TempData[0]=wing_DuanMa[CTime[0].Year/10];//年 TempData[1]=wing_DuanMa[CTime[0].Year%10]; TempData[2]=0x08; TempData[3]=wing_DuanMa[CTime[0].Month/10];//月 TempData[4]=wing_DuanMa[CTime[0].Month%10]; TempData[5]=0x08; TempData[6]=wing_DuanMa[CTime[0].Day/10];//日 TempData[7]=wing_DuanMa[CTime[0].Day%10]; } if(2==displaynum) //显示周 温度 { TempData[0]=0x40; TempData[1]=wing_DuanMa[CTime[0].Week%10];//周 TempData[2]=0x40; wendu();//温度 } } } void naozhong()//闹钟 { if(gai==1) { TempData[0]=wing_DuanMa[CTime[state].Hour/10];//时闪 TempData[1]=wing_DuanMa[CTime[state].Hour%10]; DelayMs(200); TempData[0]=wing_DuanMa[CTime[state].Hour/10]|0x80;//时 TempData[1]=wing_DuanMa[CTime[state].Hour%10]|0x80; DelayMs(200); TempData[2]=0x01; TempData[3]=wing_DuanMa[CTime[state].Minute/10];//分 TempData[4]=wing_DuanMa[CTime[state].Minute%10]; TempData[5]=0x01; TempData[6]=wing_DuanMa[CTime[state].Second];//1为开,0为关 TempData[7]=wing_DuanMa[state];//闹钟序号 } else if(gai==2) { TempData[0]=wing_DuanMa[CTime[state].Hour/10];//时 TempData[1]=wing_DuanMa[CTime[state].Hour%10]; TempData[2]=0x01; TempData[3]=wing_DuanMa[CTime[state].Minute/10];//分闪 TempData[4]=wing_DuanMa[CTime[state].Minute%10]; DelayMs(200); TempData[3]=wing_DuanMa[CTime[state].Minute/10]|0x80;//分 TempData[4]=wing_DuanMa[CTime[state].Minute%10]|0x80; DelayMs(200); TempData[5]=0x01; TempData[6]=wing_DuanMa[CTime[state].Second];//1为开,0为关 TempData[7]=wing_DuanMa[state];//闹钟序号 } else if(gai==3) { TempData[0]=wing_DuanMa[CTime[state].Hour/10];//时 TempData[1]=wing_DuanMa[CTime[state].Hour%10]; TempData[2]=0x01; TempData[3]=wing_DuanMa[CTime[state].Minute/10];//分 TempData[4]=wing_DuanMa[CTime[state].Minute%10]; TempData[5]=0x01; TempData[6]=wing_DuanMa[CTime[state].Second];//秒闪 DelayMs(200); TempData[6]=wing_DuanMa[CTime[state].Second]|0x80;//1为开,0为关 DelayMs(200); TempData[7]=wing_DuanMa[state];//闹钟序号 } else { TempData[0]=wing_DuanMa[CTime[state].Hour/10];//时 TempData[1]=wing_DuanMa[CTime[state].Hour%10]; TempData[2]=0x01; TempData[3]=wing_DuanMa[CTime[state].Minute/10];//分 TempData[4]=wing_DuanMa[CTime[state].Minute%10]; TempData[5]=0x01; TempData[6]=wing_DuanMa[CTime[state].Second];//1为开,0为关 TempData[7]=wing_DuanMa[state];//闹钟序号 } } void pump()//抽水 { static unsigned char i; if(AT_Flag) { TempData[0]=wing_DuanMa[CTime[0].Hour/10];//时 TempData[1]=wing_DuanMa[CTime[0].Hour%10]; if(CTime[0].Second%2==0) TempData[2]=0; else TempData[2]=0x40; TempData[3]=wing_DuanMa[CTime[0].Minute/10];//分 TempData[4]=wing_DuanMa[CTime[0].Minute%10]; TempData[5]=0; TempData[6]=0x73; i++; if(1==i) {TempData[7]=0x01;DelayMs(200);} else if(2==i) {TempData[7]=0x02; DelayMs(200);} else if(3==i) {TempData[7]=0x04; DelayMs(200);} else if(4==i) {TempData[7]=0x08; DelayMs(200);} else if(5==i) {TempData[7]=0x10; DelayMs(200);} else {i=0; TempData[7]=0x20; DelayMs(200);} } else if(TT_Flag) { if(UpdateTimeFlag==1)//更新数码管显示 { UpdateTimeFlag=0; TempData[0]=wing_DuanMa[fen/10]; TempData[1]=wing_DuanMa[fen%10]; TempData[2]=0x40; TempData[3]=wing_DuanMa[miao/10]; TempData[4]=wing_DuanMa[miao%10]; TempData[5]=0; TempData[6]=0x73; i++; if(1==i) {TempData[7]=0x01;DelayMs(200);} else if(2==i) {TempData[7]=0x02; DelayMs(200);} else if(3==i) {TempData[7]=0x04; DelayMs(200);} else if(4==i) {TempData[7]=0x08; DelayMs(200);} else if(5==i) {TempData[7]=0x10; DelayMs(200);} else {i=0; TempData[7]=0x20; DelayMs(200);} } } } void key_box() { if(!ADD) { DelayMs(10); if((!ADD)&&(!LD1_Flag)) { while(!ADD) { key_press_num++; DelayMs(10); if(key_press_num==200) { key_press_num=0; while(!ADD) { if(fen<99) fen++; pump(); DelayMs(50); } } } key_press_num=0; if(fen<99) fen++; } } if(!DEC) { DelayMs(10); if(!DEC) { while(!DEC) { key_press_num++; DelayMs(10); if(key_press_num==200) { key_press_num=0; while(!DEC) { if(fen>0) fen--; pump(); DelayMs(50); } } } key_press_num=0; if(fen>0) fen--; } } if(!LD1) //高水位 { DelayMs(10); //10-20ms if(!LD1) { LD1_Flag=1; LD2_Flag=0; LD3_Flag=0; LD4_Flag=0; RUN_Flag=0; fen=0; miao=0; state=0; sett=0; } } if(!LD2) //三份水位 { DelayMs(10); //10-20ms if(!LD2) { LD1_Flag=0; LD2_Flag=1; LD3_Flag=0; LD4_Flag=0; } } if(!LD3) //二份水位 { DelayMs(10); if(!LD3) { LD1_Flag=0; LD2_Flag=0; LD3_Flag=1; LD4_Flag=0; } } if(!LD4) //低水位 { DelayMs(10); if(!LD4) { if(AT_Flag) { LD1_Flag=0; LD2_Flag=0; LD3_Flag=0; LD4_Flag=1; RUN_Flag=1; } else LD1_Flag=0; LD2_Flag=0; LD3_Flag=0; LD4_Flag=1; } } if(!RUN) //手动开泵 { DelayMs(5); if((!RUN)&&(AT_Flag)&&(!LD1_Flag)) { RUN_Flag=1; } } if(!STOP) //手动关泵 { DelayMs(5); if(!STOP) { RUN_Flag=0; fen=0; miao=0; sett=0; state=0; } } if(!AT) //抽水模式 { DelayMs(10); if(!AT) { AT_Flag=1; TT_Flag=0; } } if(!TT) //抽水模式 { DelayMs(10); if(!TT) { AT_Flag=0; TT_Flag=1; } } if(!TT_SET) //设定时钟 { DelayMs(10); //10-20ms if(!TT_SET) { while(!TT_SET);//等待释放 { key1=1; } } } if(!CC_ENT) //选定 { DelayMs(10); //10-20ms if(!CC_ENT) { while(!CC_ENT);//等待释放 { key2=1; } } } if(!MF_UP) //更改 { DelayMs(10); //10-20ms if(!MF_UP) { while(!MF_UP);//等待释放 { key3=1; } } } if(!CT_SET) //闹钟设定 { DelayMs(10); //10-20ms if(!CT_SET) { while(!CT_SET);//等待释放 { key4=1; } } } } void time()//扫描键盘 { if(UpdateTimeFlag==1) { UpdateTimeFlag=0; if(state==0) shizhong(); else naozhong(); } if(sett) { state=0; if(sett==1) modif_time(CTime[state].Second,CTime[state].Minute,CTime[state].Hour); if(sett==2) modif_day(CTime[state].Day,CTime[state].Month,CTime[state].Year); if(sett==3) modif_week(CTime[state].Week); } else { Wirte_Alarmdata(CTime+state,state-1); } if(key1) { gai=0; if(5==state) {state=0;displaynum=0;dba=0;} else state++; key1=0; } if(key2) { if(gai==3) gai=1; else gai++; key2=0; } if(key3) { //if((state==0)&&(gai!=0)); Stop_DS1302(); if(gai==1) { if(sett==1) { if(CTime[state].Hour>=23) CTime[state].Hour=0; else CTime[state].Hour++; } else if(sett==2) { if(CTime[state].Year>=20) CTime[state].Year=0; else CTime[state].Year++; } else if(sett==3) { if(CTime[state].Week>=8) CTime[state].Week=1; else CTime[state].Week++; } else { if(CTime[state].Hour>=23) CTime[state].Hour=0; else CTime[state].Hour++; } } else if(gai==2) { if(sett==1) { if(CTime[state].Minute>=59) CTime[state].Minute=0; else CTime[state].Minute++; } else if(sett==2) { if(CTime[state].Month>=13) CTime[state].Month=1; else CTime[state].Month++; } else { if(CTime[state].Minute>=59) CTime[state].Minute=0; else CTime[state].Minute++; } } else { if(state==0) { if(sett==1) { if(CTime[state].Second>=59) CTime[state].Second=0; else CTime[state].Second++; } if(sett==2) { if(CTime[state].Day>=32) CTime[state].Day=1; else CTime[state].Day++; } } else { if(CTime[state].Second==0) CTime[state].Second=1; else CTime[state].Second=0; } } key3=0; } if(key4) { gai=1; if(4==sett) { sett=0; state=0; displaynum=0; dba=0; } else sett++; key4=0; } } void beepscan()//闹钟 { if(RUN_Flag) DS1302_GetTime(&CTime); ring_flag=0; if(i==5) i=1; else i++; if((CTime.Second==1)&&(CTime.Minute==CTime[0].Minute)&&(CTime.Hour==CTime[0].Hour)) ring_flag=1; else if((CTime.Second==1)&&(CTime.Minute+1==CTime[0].Minute)&&(CTime.Hour==CTime[0].Hour)) { ring_flag=0; beep=1; light=1; } else ring_flag=0; } void beepring()//闹钟响 { if(count>=2) { count=0; if(ring_flag) { beep=~beep; light=~light; } else ring_flag=0; } } void wendu()//温度 { if(ReadTempFlag==1) { ReadTempFlag=0; //Stop_DS1302(); Tempx=ReadTemperature(); if(Tempx&0x8000) { //TTime[2]=0x40;//负号标志 Tempx=~Tempx; // 取反加1 Tempx +=1; } else //TTime[2]=0; TempH=Tempx>>4; TempL=Tempx&0x0F; TempL=TempL*6/10;//小数近似处理 if(TempH/100==0) TempData[3]=0; else TempData[3]=wing_DuanMa[TempH/100]; //百位温度 if((TempH/100==0)&&((TempH%100)/10==0))//十位消隐 TempData[4]=0; else TempData[4]=wing_DuanMa[(TempH%100)/10]; //十位温度 TempData[5]=wing_DuanMa[(TempH%100)%10]|0x80; //个位温度,带小数点 TempData[6]=wing_DuanMa[TempL]; TempData[7]=0x39; //显示C符号 } } void Init_Timer0(void)//定时器0定义 { TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 //TH0=0x00; //给定初值 //TL0=0x00; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 } void Timer0_isr(void) interrupt 1 //定时器0中断 { static unsigned int i,lv,num; TH0=(65536-1000)/256;//1ms TL0=(65536-1000)%256; count++; TDisplay(0,8); i++; if(i==10) //20ms { i=0; UpdateTimeFlag=1; } num++; if(num==1000) // 倒计速度约1S { num=0; if(!RUN_Flag) { ReadTempFlag=1;} if((fen!=0)||miao)// 倒计时条件 miao--;// 秒-- if(miao==0xff)// 如果秒减到00时,重新赋值59 { miao=59; if(fen>0)// 如果分钟大于零减1 { fen--;} } } lv++; if(lv==500) //延时1s 扫描水位标志 { lv=0; if(LD1_Flag) //高水位 { LED1=0; RUN_Flag=0; } if(!LD1_Flag) { LED1=1; } if(LD2_Flag) //三份水位 { if(RUN_Flag) LED2=!LED2; else LED2=0; } if(!LD2_Flag) { LED2=1; } if(LD3_Flag) //二份水位 { if(RUN_Flag) LED3=!LED3; else LED3=0; } if(!LD3_Flag) { LED3=1; } if(LD4_Flag) //低水位 { if(RUN_Flag) LED4=!LED4; else LED4=0; } if(!LD4_Flag) { LED4=1; } if(((TT_Flag)&&((fen!=0)||(miao!=0)))||((AT_Flag)&&(LD4_Flag)))//开泵条件 { RUN_Flag=1;} if(((TT_Flag)&&(fen==0)&&(miao==0))||(LD1_Flag))//定时模式时,水满停泵 { RUN_Flag=0; } if(RUN_Flag) //开泵 { RUNLED=0; } if(!RUN_Flag) //关泵 { RUNLED=1; } } } |
|
相关推荐
6个回答
|
|
呵呵,你没发到问答类里面,所以昨天没看到。晚上有时间帮你试试!稍等啊!
|
|
|
|
|
|
|
|
我初步看了一眼寄存器,问题不大,我需远程看看。我的qq441747863。需要的话,加我。当然最好你自己处理,你就查是否开启了CH。
|
|
|
|
纳闷儿。会不会因为是实物焊接存在虚焊、短路等情况?
|
|
|
|
现在解决了没有呢
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
897 浏览 3 评论
2393 浏览 0 评论
2822 浏览 0 评论
Protues中自己封装的芯片元件无Program File、Clock Frequency选项怎么解决,求求大神了!
4614 浏览 1 评论
基于51单片机的车辆倒车雷达报警系统,HC-SR04超声波测距,全套资料
1040 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-8 20:32 , Processed in 0.769774 second(s), Total 85, Slave 66 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191