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

下载本文档

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

文档简介

1、百度文库10数码管显示模块化显示电子万年历数码管 共阳极7407驱动 共阴极max7221/7419驱动DS1302实时时间显示Dsl8b20温度显示芯片-E30/米米/#ifhdef_DELAY_H#define _DELAY_H_#define unit unsigned mt#define uchai unsigned charvoid delay(uint xnis); 0fCSB.CLK.sbitCSB=P2Al;sbit CLK=P2A2;sbit DIN1=P2A3;sbit CSB1=P2A4;sbit CLK1=P2A5;extern void write(unsigned

2、char addi, unsigned char dat); /niax7221 写数据,转换数据函 数,num的值为1,或者2,当num为1时,片选的是第一块Max7221,同理亦然。extern void write Huchar addiuchai dat);extern void/max7221 初始化extern void#endif#include#include ovoid write(uchar addi;uchar dat) / 写数据,写地址函数 (uchar i;CSB=0;for(i=0;i<8;i+)CLK=O;addi«=l;DIN=CY;CLK=1

3、;CLK=O;for(i=0;i<8;i+)CLK=O;dat«=l;DIN=CY;CLK=1;CLK=O;CSB=1;void write l(uchai add】.uchar dat)(uchar i;CSB1=O;for(i=0;i<8;i+)CLK1=O; addi«=l;DIN1=CY;CLK1=1;CLK1=O;for(i=0;i<8;i+)(CLK1=O; dat«=l;DIN1=CY;CLK1=1;CLK1=O;CSB1=1;)void init() (write(0x09,0xff): /编码模式地址0x09 , OxOO-Ox

4、ff,为1的则位选通 write(0x0a,0x07); 亮度地址 0x0a ,0x00-0x0f,0x0f 时最亮 wiite(0X0b,0x07); 扫描数码管个数地址0x0c,最多扫描8只数码管 write(0x0c,0x01); 工作模式地址 0x0c 0x00:关闭;0x01:正常 void(wiitel(0x09.0xff);wiitel(0x0a.0x07);wiitel(0x0b.0x07);wntel(OxOc.OxOl);)#ifhdef_DS18B20_H#define_DS18B20_H#iiiclude o#iiiclude#iiiclude odefine NOP(

5、) _nop_(),_nop_0,_nop_0,_nop_OsbitDQ=Pl人3J/DS18B20控制线,单线模式。extern bit ng;正负数标志位,ng=0,为正数,反之为负数,正数负数的处理方法不同,extern bit DS18B20_IS_OK; 为1时表示当前读取温度正常,否则读取失败。extern uchar Display_Digit4;读取的温度值转换后存在这个数组中extern void Read_TemperatuieQ; 读取当前温度值extern void Process_TemperatureQ;处理当前获得的温度值,正数,负数等。#endif/米米/#ii

6、iclude温度字符uchai code Temperature_Char8 = 0x0c.0xl2.0xl2.0x0c.0x00.0x00. 0x00,0x00;温度小数对照表uchai code df_Table = 0,1,1,2,3,3,4,4,5.6,6,7,8.8,9,9 ;uchar CunentT = 0 ;当前读取的温度整数部分uchai Temp_Value = 0x00,0x00; 从 DS18B20 读取的温度值bitng=0;正负数标志位,ng=0,为正数,反之为负数,正数负数的处理方法不同,bit DS18B20_IS_OK=1; 为1时表示当前读取温度正常,否则读

7、取失败。uchai Display_Digit4= 0.0.0,0 ;读取的温度值转换后存在这个数组中/初始化DS18B20/uchai Iiut.DS 18B20Q(uchai status;DQ = 1; delayms(8); DQ = 0 ; delaynis(90); DQ = 1; delaynis(8);status = DQ; delayms(lOO);DQ=1;return status;)读一字节/uchai ReadOneByteQ(uchai i, dat = 0;DQ=l;_nop_0;for (i = 0; i < 8; i+)(DQ = 0; dat 

8、87;= 1; DQ = 1; _nop_();_nop_();if(DQ) dat |= 0x80;delayms(30);DQ=1;return dat;)/ j./写一字节/ j.void WriteOneBytechar dat)(uchai i;for (i = 0; i < 8; i+)(DQ = 0 ; DQ = dat & 0x01 : delayms(5); DQ = 1; dat»=l;/读取温度值/void Read_Temperatuie()/DS18B20 故障跳过序列号/启动温度转换跳过序列号读取温度寄存器温度低8位温度高8位(if(Iiii

9、t_DS18B20() = 1)DS18B20 IS OK = 0;elseWnteOneByte(OxCC);WnteOneByte(Ox44);Imt_DS18B20();WnteOneByte(OxCC);WriteOneByte(OxBE);Temp_Value0 = ReadOneByteQ;Temp_Valuel = ReadOneByteQ;DS18B20 IS OK= 1;)H对读取的温度值进行判断,处理,负数的情况,整数情况/void Process_Temperature()(H uchar i;延时值与负数标识/ uchar ng = 0;高5位全为1(0)则为负数,为负

10、数时取反加1,并设置负数标识if(Temp_Valuel & 0xF8) = 0xF8) (Temp_Valuel = Temp_Valuel;Temp_Value0 = -Temp_Value0 + 1;if (Temp_Value0 = 0x00) Temp_Value 1 +;负数标识置1ng= 1;)elseng=0;查表得到温度小数部分Display_DigitO = dfTablef Temp_Value0 & OxOF ;获取温度整数部分(高字节中的第三位与低字节中的高四位,无符号)CurrentT = (Temp_Value0 & 0xF0)»

11、4)(Temp-Value 1 & 0x07)«4);将整数部分分解为3位待显示数字Display_Digit3 = CunentT / 100;Display_Digit2 = CunentT % 100 / 10;Display_Digitl = CunentT % 10;/米米/#include#include#includeuchar code table=0xc0,0xf9,0xa4,0xb0.0x99.0x92.0x82.0xf8,0x80,0x90;数码管段码共阳极uchardisbuff=0,0,10,0,0,10,0,0;第一个 max7221 显示缓存uc

12、har disbuSl=0,0,10.0,0,10,0,0;/第二个 max7221 显示缓存void init_T()定时器初始化(TMOD=0X01;TH0=-5000/256;TL0=-5000%256;TR0=l;ET0=l; EA=1;void main()主函数(uchar i; mitO; imtlO; 第一个max7221初始化第二个 max7221 初始化Read_TemperatuieQ;先读一遍当前温度delayms(50000);读取温度有一段时间,先让他等待一段时间否则下一刻显示的将会是错误的温度delayms(50000);delayms(50000); wliil

13、e(l) gettimeO; /读取当前时间值disbuff0=datetHne2/l 0;将获得的时间值分解出来disbuff 1 =datetime2% 10;disbuffl3=datetiinel/10;disbuff4=datetHiiel% 10;disbuff6=datetHiie0/10;disbuff7=datetHiie0% 10;disbuffl 0=datetime6/10;disbuffl l=datetime6% 10;disbuffl 3=datetime4/10;disbuffl 4=datetune4% 10;disbuffl 6=datetime3/10;d

14、isbuffl 7=datetune3% 10;for(i=0;i<8;i+) 第一个 max7221 显示 (write(i+1,disbuffl i);for(i=0;i<8;i+)第二个 max7221 显示(write 1 (i+ l,disbuffi);)Read_Temperatiue();/再次读取当前温度if(DS 18B20S_OK)如果读取成功( Piocess_Temperature(); 对温度进行处理,特别要考虑的是负数的情况 delayms(50000);延时等温度显示稳定了再次读取,这个值要取适当,否则数码管显示会出现闪烁情况 delayms(5000

15、0); delayms(50000); ) )void TimerO()mtenupt 1为了避免温度显示在数码管上出现闪屏的情况,这里使用定时器来显示当前温度。(static num=0:TH0=-3000/256;这个数值要足够的小,这样扫描次数才会更多,显示才会更稳定TL0=-3000%256;P3=0x00;每次进来时候要让位码清空,也叫做消影switch(num)通过一个Switch语句来实现对数码管的扫描case 0:(PO=table Display_DigitO;P3=0x20»0;) break;case 1:(PO=tableDisplay_Digit 1 &am

16、p;0x7f;P3=0x20»l;) break;case 2:在数码管上显示当前温度值小数后面的一位有小数点的位要&0x7f小数位,个为十位if(Display_Digit2=0)if(Display_Digit3=0) 都显示十位为空PO=Oxff;PO=Oxff; ) elseP0=tableDisplay_Digit2; P3=0x20»2;) break;case 3: if(Display_Digit3=0) PO=Oxff: elsePO=table Display_Digit3; P3=0x20»3;) break;case 4: 显示口P0=、0x63; P3=Ox8O; ) break;case 5: 固定显示CP0=0x39; P3=0x40; ) break;case 6: /对负数的处理若十位为零且百位也为零,则否则,正常显示当前

温馨提示

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

评论

0/150

提交评论