资源描述:
《基于c51单片机的数字可调时钟》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、河南机电高等专科学校《C51程序设计》大作业设计题目:数字可调时钟班级:通技091学号:090413128姓名:成绩:2011年11月1设计任务制作数字可调时钟,要求可以分开调节分、时、年、月、日,能够显示温度。2电路原理图以下为protel99se画的的原理图3系统流程图数字可调时钟分以下四个部分构成:显示部分:此次显示采用了动态扫描显示,采用74ls573进行数据锁存。温度采集:温度采集采用了18b20采集的,18b20转化温度较快,精度高。时钟:采用普通的ds1302芯片。数据运算:单片机
2、用普通的8051单片机(12M晶振)。数码管显示模块单片机键盘温度采集模块时钟模块4源程序/*******************************数字可调时钟*********************************//*******************************by:lhc****************************************/#include#defineDataPortP0voiddelayms(unsigned
3、chari);sbitDQ=P1^3;sbitsclk=P1^4;sbitdate=P1^5;sbitrst=P1^6;sbitLATCH1=P2^2;//定义锁存使能端口段锁存sbitLATCH2=P2^3;//位锁存unsignedchartime[8]={20,11,11,27,11,30,00,7};//年月日时分秒周unsignedchartime1[8],readtemflag;unsignedcharcodeDuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,
4、0x6d,0x7d,0x07,0x7f,0x6f};//显示段码值0~9unsignedcharcodeWeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsignedcharcodepingnian[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年的月份天数unsignedcharcodeyunnian[13]={0,31,29,31,30,31,30,31,
5、31,30,31,30,31};//闰年的月份天数unsignedcharTempData[8];//存储显示值的全局变量voiddelay(unsignedchari){while(--i);//us延时函数}voiddelayms(unsignedchari)//ms延时函数{while(i--){delay(245);delay(245);}}bitrest(void)//18b20重启函数{bitk=0;DQ=1;delay(5);DQ=0;delay(150);delay(200);D
6、Q=1;delay(40);k=DQ;delay(25);return(k);}unsignedcharread()//18b20读数据函数{unsignedchari=0;unsignedchardat=0;for(i=0;i<8;i++){DQ=0;dat>>=1;DQ=1;if(DQ)dat
7、=0x80;delay(25);}return(dat);}voidwrite(unsignedchardat)//18b20写数据函数{unsignedchari=0;for(i=0;i<8;i++
8、){DQ=0;DQ=dat&0x01;delay(25);DQ=1;dat>>=1;}delay(25);}unsignedintReadTemperature(void)//读取温度函数{unsignedchara=0;unsignedintkk=0,b=0;LOOP:if(rest()==0){write(0xCC);//跳过ROMwrite(0x44);//初始化温度转换delayms(20);rest();TH1=0XFa;TL1=0Xff;write(0xCC);write(0xBE)
9、;//读取温度a=read();b=read();b<<=8;kk=a+b;return(kk);}elsegotoLOOP;}voidrestds1302(void){sclk=0;rst=0;//ds1302重启}voidwritebyte(unsignedcharaddr,unsignedcharbyte)//写入ds1302一个字节数据{unsignedchari;rst=1;addr=addr&0xfe;for(i=0;i<8;i++){date=addr&0x01;sclk=1;sc