单片机C语言模块化编程之数码管显示电子万年历篇_第1页
单片机C语言模块化编程之数码管显示电子万年历篇_第2页
单片机C语言模块化编程之数码管显示电子万年历篇_第3页
单片机C语言模块化编程之数码管显示电子万年历篇_第4页
单片机C语言模块化编程之数码管显示电子万年历篇_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数码管显示模块化显示电子万年历数码管共阳极7407驱动共阴极max7221/7419驱动Ds1302实时时间显示Ds18b20温度显示芯片/*delay.h*/#ifndef_DELAY_H#define_DELAY_H_#defineuintunsignedint#defineucharunsignedcharvoiddelay(uintxms);//秒级延时voiddelayms(uintxms); //毫秒级延时,不可以更改,若更改,DS18B20将显示异常#endif/*delay.c*/#include"delay.h"voiddelay(uintxms){ uinti; ucharj; for(i=xms;i>0;i--) for(j=110;j>0;j--);}voiddelayms(uintxms) //毫秒级别延时{ while(xms--);}/*ds1302.h*/#ifndef_DS1302_H_#define_DS1302_H_#include<reg51.h>#defineuintunsignedint#defineucharunsignedcharsbitIO=P1^0;//ds1302跟单片机接口sbitSCLK=P1^1;sbitRST=P1^2;externunsignedchardatetime[7];//存储获得的时间值externvoidgettime(); //读取时间值函数#endif/*ds1302.c*/#include<intrins.h>#include"ds1302.h"uchardatetime[7]={0,0,0,0,0,0,0};//用来接收获得的时间值voidwrite_a_byte_to_ds1302(ucharX){uchari; CSB=0; for(i=0;i<8;i++) { CLK=0; addr<<=1; DIN=CY; CLK=1; _nop_(); _nop_(); CLK=0; } for(i=0;i<8;i++) { CLK=0; dat<<=1; DIN=CY; CLK=1; _nop_(); _nop_(); CLK=0; } CSB=1; }voidwrite1(ucharaddr,uchardat){ uchari; CSB1=0; for(i=0;i<8;i++) { CLK1=0; addr<<=1; DIN1=CY; CLK1=1; _nop_(); _nop_(); CLK1=0; } for(i=0;i<8;i++) { CLK1=0; dat<<=1; DIN1=CY; CLK1=1; _nop_(); _nop_(); CLK1=0; } CSB1=1; }voidinit() { write(0x09,0xff);//编码模式地址0x09,0x00-0xff,为1的则位选通 write(0x0a,0x07);//亮度地址0x0a,0x00-0x0f,0x0f时最亮 write(0x0b,0x07);//扫描数码管个数地址0x0c,最多扫描8只数码管 write(0x0c,0x01);//工作模式地址0x0c0x00:关闭;0x01:正常 }voidinit1(){ write1(0x09,0xff); write1(0x0a,0x07); write1(0x0b,0x07); write1(0x0c,0x01); }/*ds18b20.h*/#ifndef_DS18B20_H#define_DS18B20_H#include<reg51.h>#include"delay.h"#include<intrins.h>#defineNOP(){_nop_(),_nop_(),_nop_(),_nop_()}sbitDQ=P1^3;//DS18B20控制线,单线模式。externbitng;//正负数标志位,ng=0,为正数,反之为负数,正数负数的处理方法不同,externbitDS18B20_IS_OK; //为1时表示当前读取温度正常,否则读取失败。externucharDisplay_Digit[4]; //读取的温度值转换后存在这个数组中externvoidRead_Temperature();//读取当前温度值externvoidProcess_Temperature(); //处理当前获得的温度值,正数,负数等。#endif/*ds18b20.c*/#include"ds18b20.h"//温度字符ucharcodeTemperature_Char[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};//温度小数对照表ucharcodedf_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};ucharCurrentT=0;//当前读取的温度整数部分ucharTemp_Value[]={0x00,0x00};//从DS18B20读取的温度值bitng=0; //正负数标志位,ng=0,为正数,反之为负数,正数负数的处理方法不同,bitDS18B20_IS_OK=1; //为1时表示当前读取温度正常,否则读取失败。ucharDisplay_Digit[4]={0,0,0,0};//读取的温度值转换后存在这个数组中//-------------------------------------------------------//初始化DS18B20//-------------------------------------------------------ucharInit_DS18B20(){ucharstatus;DQ=1;delayms(8);DQ=0;delayms(90);DQ=1;delayms(8);status=DQ;delayms(100);DQ=1;returnstatus;}//-------------------------------------------------------//读一字节//-------------------------------------------------------ucharReadOneByte(){uchari,dat=0;DQ=1;_nop_();for(i=0;i<8;i++){DQ=0;dat>>=1;DQ=1;_nop_();_nop_();if(DQ)dat|=0x80;delayms(30);DQ=1;}returndat;}//-------------------------------------------------------//写一字节//-------------------------------------------------------voidWriteOneByte(uchardat){uchari;for(i=0;i<8;i++){DQ=0;DQ=dat&0x01;delayms(5);DQ=1;dat>>=1;}}//----------------------------------------------------------------//读取温度值//----------------------------------------------------------------voidRead_Temperature(){if(Init_DS18B20()==1 )//DS18B20故障 DS18B20_IS_OK=0; else { WriteOneByte(0xCC);//跳过序列号 WriteOneByte(0x44);//启动温度转换 Init_DS18B20(); WriteOneByte(0xCC);//跳过序列号 WriteOneByte(0xBE);//读取温度寄存器 Temp_Value[0]=ReadOneByte();//温度低8位 Temp_Value[1]=ReadOneByte();//温度高8位 DS18B20_IS_OK=1; }}//----------------------------------------------------------------//对读取的温度值进行判断,处理,负数的情况,整数情况//----------------------------------------------------------------voidProcess_Temperature(){//uchari;//延时值与负数标识//ucharng=0;//高5位全为1(0)则为负数,为负数时取反加1,并设置负数标识if((Temp_Value[1]&0xF8)==0xF8){Temp_Value[1]=~Temp_Value[1];Temp_Value[0]=~Temp_Value[0]+1;if(Temp_Value[0]==0x00)Temp_Value[1]++;//负数标识置1ng=1;}elseng=0;//查表得到温度小数部分Display_Digit[0]=df_Table[Temp_Value[0]&0x0F];//获取温度整数部分(高字节中的第三位与低字节中的高四位,无符号)CurrentT=((Temp_Value[0]&0xF0)>>4)|((Temp_Value[1]&0x07)<<4);//将整数部分分解为3位待显示数字Display_Digit[3]=CurrentT/100;Display_Digit[2]=CurrentT%100/10;Display_Digit[1]=CurrentT%10;}/*main.c*/#include"max7221.h"#include"ds1302.h"#include"ds18b20.h"ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管段码共阳极uchardisbuff[]={0,0,10,0,0,10,0,0};//第一个max7221显示缓存uchardisbuff1[]={0,0,10,0,0,10,0,0};//第二个max7221显示缓存voidinit_T() //定时器初始化{ TMOD=0X01; TH0=-5000/256; TL0=-5000%256; TR0=1; ET0=1; EA=1;}voidmain() //主函数{ uchari; init(); init1(); //第一个max7221初始化 init_T(); //第二个max7221初始化 Read_Temperature(); //先读一遍当前温度 delayms(50000); //读取温度有一段时间,先让他等待一段时间否则下一刻显示的将会是错误的温度 delayms(50000); delayms(50000); while(1) { gettime(); //读取当前时间值 disbuff[0]=datetime[2]/10; //将获得的时间值分解出来 disbuff[1]=datetime[2]%10; disbuff[3]=datetime[1]/10; disbuff[4]=datetime[1]%10; disbuff[6]=datetime[0]/10; disbuff[7]=datetime[0]%10; disbuff1[0]=datetime[6]/10; disbuff1[1]=datetime[6]%10; disbuff1[3]=datetime[4]/10; disbuff1[4]=datetime[4]%10; disbuff1[6]=datetime[3]/10; disbuff1[7]=datetime[3]%10; for(i=0;i<8;i++) //第一个max7221显示 { write(i+1,disbuff1[i]); } for(i=0;i<8;i++) //第二个max7221显示 { write1(i+1,disbuff[i]); } Read_Temperature(); //再次读取当前温度 if(DS18B20_IS_OK) //如果读取成功 { Process_Temperature(); //对温度进行处理,特别要考虑的是负数的情况 delayms(50000); //延时等温度显示稳定了再次读取,这个值要取适当,否则数码管显示会出现闪烁情况 delayms(50000); delayms(50000); } }}voidTimer0_1()interrupt1 //为了避免温度显示在数码管上出现闪屏的情况,这里使用定时器来显示当前温度。{ staticnum=0; TH0=-3000/256; //这个数值要足够的小,这样扫描次数才会更多,显示才会更稳定 TL0=-3000%256; P3=0x00;//每次进来时候要让位码清空,也叫做消影 switch(num) //通过一个Switch语句来实现对数码管的扫描 { case0: //在数码管上显示当前温度值 { P0=table[Display_Digit[0]]; //小数后面的一位 P3=0x20>>0; } break; case1: { P0=table[Display_Digit[1]]&0x7f; //有小数点的位要&0x7f P3=0x20>>1; //小数位,个为 } break; case2: //十位 { if(Display_Digit[2]==0) { if(Display_Digit[3]==0) //若十位为零且百位也为零,则都显示十位为空P0=0xff; P0=0xff; } else P0=table[Dis

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论