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

下载本文档

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

文档简介

1、单片机C语言模块化编程之数码管显示电子万年历篇数码管显示模块化显示电子万年历数码管 共阳极7407驱动 共阴极max7221/7419 驱动Ds1302实时时间显示Ds18b20温度显示芯片O -H-rl1:VWVWWF,_ P 1-|P 3 ,戸7 尸叱II ViD900M1?30C:/*delay h*/#ifndef _DELAY_H #define _DELAY_H_ #define uint unsigned int#define uchar unsigned charvoid delay(uint xms);II 秒级延时void delayms(uint xms);II毫秒级延时

2、,不可以更改,若更改,DS18B20将显示异常#endifI*delay .c*/#include delay .hvoid delay(uint xms)uint i;uchar j;for(i=xms;i0;i-) for(j=110;j0;j-);void delayms(uint xms) II毫秒级别延时 while(xms-);/*ds1302.h*/#ifndef _DS1302_H_#define _DS1302_H_#include vreg51 h#define uint unsigned int#define uchar unsigned charsbit IO=P1A0

3、;/ds1302跟单片机接口sbit SCLK=P1A1;sbit RST=P1A2;extern unsigned char datetime7; / 存储获得的时间值extern void gettime(); /读取时间值函数 #endif/*ds1302.c*/#include vintrins h#include ds1302.huchar datetime7=0,0,0,0,0,0,0; /用来接收获得的时间值void write_a_byte_to_ds1302(uchar X)uchar i;for(i=0;i=1;uchar get_a_byte_from_ds1302()

4、uchar i,b=0x00;for(i=0;i8;i+)b|=_crol_(uchar )IO,i);SCLK=1;SCLK=0;/return b/16*10+b%16;返回的 BCD 码转换为十进制return (b4)*10+(b&0x0f);/ 注意运算的优先级uchar read_data(uchar add)uchar dat;RST=0;SCLK=0;RST=1;write_a_byte_to_ds1302(add); dat=get_a_byte_from_ds1302();SCLK=1;RST=0;return dat;void gettime() ds1302读取当前时间

5、存储 在 datetime 中uchar i,add=0x81; for(i=0;i#define uint unsigned int#define uchar unsigned charsbit DIN=P2A0;/max7221 与单片机接口DIN.CSB.CLK.sbit CSB=P2A1; sbit CLK=P2A2; sbit DIN1=P2A3;sbit CSB1=P2A4;sbit CLK1=P2A5;extern void write(unsigned char addr , unsigned char dat); max7221写数据,转换数据函 数,num的值为1,或者2,

6、当num为1时,片 选的是第一块Max7221,同理亦然。extern void write1(uchar addr,uchar dat); extern void init(); max7221 初始化 extern void init1();#endif/*max7221 .c*/#include max7221 .h#include void write(uchar addr,uchar dat) /写数据, 写地址函数uchar i;CSB=0;for(i=0;i8;i+)CLK=0; addr=1; DIN=CY;CLK=1;_nop_(); _nop_(); CLK=0;for(i

7、=0;i8;i+) CLK=0; datvv=1; DIN=CY;CLK=1;_nop_(); _nop_();CLK=0;CSB=1; void write1(uchar addr,uchar dat) uchar i; CSB1=0; for(i=0;i8;i+) CLK1=0; addr=1; DIN1=CY;CLK1=1;_nop_(); _nop_(); CLK1=0;for(i=0;i#include delay .h#include vintrins h#defineNOP()_nop_(),_nop_(),_nop_(),_nop_()sbit DQ=P1A3; /DS18B2

8、0 控制线,单线模式。 extern bit ng;/正负数标志位,ng=0,为正数,反之为负数,正数负数的处理方法不同, extern bit DS18B20_IS_OK; / 为 1 时表示当 前读取温度正常,否则读取失败。extern uchar Display_Digit4; 读取的温度值 转换后存在这个数组中extern void Read_Temperature(); II 读取当前温度值extern void Process_Temperature(); II处理当 前获得的温度值,正数,负数等。#endif/*ds18b2 0. c*I#include ds18b20.h温度字

9、符uchar code Temperature_Char8 = 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 ;uchar CurrentT = 0 ;/ 当前读取的温度整数部分uchar Temp_Value = 0x00,0x00;/ 从DS18B20读取的温度值bit ng=0;/正负数标志位,ng=0,为正数,反之为负数,正数负数的处理方法不同,bit DS18B20_IS_OK=1;/ 为 1 时表示当前读取温度正常,否则读取失败。uc

10、har Display_Digit4=0,0,0,0;II读取的温度值转换后存在这个数组中IIII初始化DS18B20IIuchar Init_DS18B20()uchar status;DQ = 1; delayms(8); DQ = 0 ; delayms(90);DQ = 1; delayms(8);status = DQ; delayms(100);DQ = 1;return status;II读一字节/uchar ReadOneByte()uchar i, dat = 0;DQ = 1; _nop_();for (i = 0; i = 1; DQ = 1; _nop_();_nop_

11、(); if(DQ) dat |= 0x80;delayms(30);DQ = 1;return dat;/写一字节/void WriteOneByte(uchar dat)uchar i;for (i = 0; i =1;/delayms(5);/读取温度值/void Read_Temperature()if( lnit_DS18B20() = 1 ) /DS18B20 故障DS18B20_IS_OK = 0; elseWriteOneByte(OxCC);跳过序列号WriteOneByte(0x44);/启动温度转换Init_DS18B20();WriteOneByte(OxCC);/跳过

12、序列号WriteOneByte(OxBE);读取温度寄存器Temp_Value0 = ReadOneByte();温度低8位Temp_Value1 = ReadOneByte();温度高8位DS18B20_IS_OK = 1;/对读取的温度值进行判断,处理,负数的情况, 整数情况/void Process_Temperature()/ uchar i;延时值与负数标识II uchar ng = 0;高5位全为1(0)则为负数,为负数时取反加 1,并设置负数标识if ( (T emp_Value1 & 0xF8) = 0xF8)Temp_Value1 = Temp_Value1; Temp_Va

13、lue0 = Temp_Value0 + 1; if 仃 emp_Value0 =0x00)Temp_Value1+;负数标识置1ng = 1;elseng=0;查表得到温度小数部分Display_Digit0 = df_Table Temp_Value0 & 0x0F ;/获取温度整数部分(高字节中的第三位与低 字节中的高四位,无符号)CurrentT =(Temp_Value0 &0xF0)4)|( (T emp_Value1 & 0x07)v4);将整数部分分解为3位待显示数字Display_Digit3 = CurrentT / 100;Display_Digit2 = Current

14、T % 100 / 10;Display_Digit1 = CurrentT % 10;/*main .c*/#include max7221 .h#include ds1302.hcode#include ds18b20 .h uchar table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/数码管段码共阳极uchar disbuff=0,0,10,0,0,10,0,0;/第一个max7221显示缓存uchar disbuff1=0,0,10,0,0,10,0,0; / 第二个 max7221显示缓存TMOD=0X01;TH0=-5

15、000/256;TL0=-5000%256;TR0=1;ET0=1;EA=1;void main()主函数uchar i;init();init1(); 第一个 max7221 初始化init_T();/第二个 max7221 初始化Read_Temperature();/ 先读一遍当前温度delayms(50000);/读取温度有一段时间,先让他等待一段时间否则下一刻显示的将会 是错误的温度delayms(50000);delayms(50000);whilegettime(); /读取当前时间值 disbuff0=datetime2/10; 将获得的时 间值分解出来disbuff1=dat

16、etime2%10; disbuff3=datetime1/10; disbuff4=datetime1%10; disbuff6=datetime0/10; disbuff7=datetime0%10; disbuff10=datetime6/10; disbuff11=datetime6%10; disbuff13=datetime4/10; disbuff14=datetime4%10; disbuff16=datetime3/10; disbuff17=datetime3%10;for(i=0;i8;i+)第一个 max7221 显示write(i+1,disbuff1i);for(i

17、=0;i0;break;case 1:/小/若P0=tableDisplay_Digit1&0 x7f;有小数点的位要&0x7fP3=0x201;数位,个为break;case 2:/ 十位if(Display_Digit2=0)if(Display_Digit3=0)十位为零且百位也为零,则都显示十位为空P0=0xff;P0=0xff; elseP0=tableDisplay_Digit2;否则,正常显示当前十位的值P3=0x202;break;case 3:if(Display_Digit3=0)II 若百位为零,则不显示,P0=0xff;elseII否则正常显示P0=tableDisplay_Digit3;P3=0x203;break;case 4:显示口P0=0x63;P3=0x80;break;case 5:II固定显示CP0=0x39;P3=0x40; br

温馨提示

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

评论

0/150

提交评论