单片机C语言模块化编程之数码管显示电子万年历篇.docx

上传人:苏美尔 文档编号:11687238 上传时间:2021-08-30 格式:DOCX 页数:10 大小:105.17KB
返回 下载 相关 举报
单片机C语言模块化编程之数码管显示电子万年历篇.docx_第1页
第1页 / 共10页
单片机C语言模块化编程之数码管显示电子万年历篇.docx_第2页
第2页 / 共10页
单片机C语言模块化编程之数码管显示电子万年历篇.docx_第3页
第3页 / 共10页
单片机C语言模块化编程之数码管显示电子万年历篇.docx_第4页
第4页 / 共10页
单片机C语言模块化编程之数码管显示电子万年历篇.docx_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《单片机C语言模块化编程之数码管显示电子万年历篇.docx》由会员分享,可在线阅读,更多相关《单片机C语言模块化编程之数码管显示电子万年历篇.docx(10页珍藏版)》请在三一文库上搜索。

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;i8;i+)CLK=O;addi=l;DIN=CY;CLK=1;CLK=O;for

3、(i=0;i8;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;i8;i+)CLK1=O; addi=l;DIN1=CY;CLK1=1;CLK1=O;for(i=0;i8;i+)(CLK1=O; dat=l;DIN1=CY;CLK1=1;CLK1=O;CSB1=1;)void init() (write(0x09,0xff): /编码模式地址0x09 , OxOO-Oxff,为1的则位选通 write(0x0a,0x07); 亮度地址 0x0a ,

4、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() _nop_(),_nop_0,_nop_0,_nop_OsbitDQ=Pl人

5、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/米米/#iiiclude温度字符uchai code Temperature_Char8 =

6、 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时表示当前读取温度正常,否则读取失败。uchai Display_Digit4= 0.0.0,0 ;读取的温度

7、值转换后存在这个数组中/初始化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 = 1; DQ = 1; _nop_();_nop_();if(DQ) dat |= 0x80;

8、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(Iiiit_DS18B20() = 1)DS18B20 IS OK = 0;elseWnteOneByte(OxCC);WnteOneByt

9、e(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)则为负数,为负数时取反加1,并设置负数标识if(Temp_Valuel & 0xF8) = 0xF8) (Temp_Valuel = Temp_V

10、aluel;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)4)(Temp-Value 1 & 0x07)4);将整数部分分解为3位待显示数字Display_Digit3 = CunentT / 100;Display_Digi

11、t2 = 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 显示缓存uchar disbuSl=0,0,10.0,0,10,0,0;/第二个 max7221 显示缓存void init_T()定时器初始化(TMOD=0X01;TH0=-5000/256;TL0

12、=-5000%256;TR0=l;ET0=l; EA=1;void main()主函数(uchar i; mitO; imtlO; 第一个max7221初始化第二个 max7221 初始化Read_TemperatuieQ;先读一遍当前温度delayms(50000);读取温度有一段时间,先让他等待一段时间否则下一刻显示的将会是错误的温度delayms(50000);delayms(50000); wliile(l) gettimeO; /读取当前时间值disbuff0=datetHne2/l 0;将获得的时间值分解出来disbuff 1 =datetime2% 10;disbuffl3=da

13、tetiinel/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;disbuffl 7=datetune3% 10;for(i=0;i8;i+) 第一个 max7221 显示 (write(i+1,disbuffl i);for(i=0;i8;i+)第二个

14、 max7221 显示(write 1 (i+ l,disbuffi);)Read_Temperatiue();/再次读取当前温度if(DS 18B20S_OK)如果读取成功( Piocess_Temperature(); 对温度进行处理,特别要考虑的是负数的情况 delayms(50000);延时等温度显示稳定了再次读取,这个值要取适当,否则数码管显示会出现闪烁情况 delayms(50000); delayms(50000); ) )void TimerO()mtenupt 1为了避免温度显示在数码管上出现闪屏的情况,这里使用定时器来显示当前温度。(static num=0:TH0=-30

15、00/256;这个数值要足够的小,这样扫描次数才会更多,显示才会更稳定TL0=-3000%256;P3=0x00;每次进来时候要让位码清空,也叫做消影switch(num)通过一个Switch语句来实现对数码管的扫描case 0:(PO=table Display_DigitO;P3=0x200;) break;case 1:(PO=tableDisplay_Digit 1 &0x7f;P3=0x20l;) break;case 2:在数码管上显示当前温度值小数后面的一位有小数点的位要&0x7f小数位,个为十位if(Display_Digit2=0)if(Display_Digit3=0) 都

16、显示十位为空PO=Oxff;PO=Oxff; ) elseP0=tableDisplay_Digit2; P3=0x202;) break;case 3: if(Display_Digit3=0) PO=Oxff: elsePO=table Display_Digit3; P3=0x203;) break;case 4: 显示口P0=、0x63; P3=Ox8O; ) break;case 5: 固定显示CP0=0x39; P3=0x40; ) break;case 6: /对负数的处理若十位为零且百位也为零,则否则,正常显示当前十位的值若百位为零,则不显示,否则正常显示if(ng=l)若ng=l,表示当前表示当前获得的温度值为负数,(if(Display_Digit3=0) 因为考虑到温度为负数的时候最小值为所 以,只可能在十位,和百位这两个位置可能出现负号(if(Display_Digit=0)/百位和十位都为零,则,在十位的位置添加一个负号,PO=Oxbf,) )break;num=(num+1)%7;PO=Oxbf;P3=OxO8;PO=Oxbf;P3=0x04;/否则直接在百位的位置添加一个负号、/num值不断在0-6直接循环

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1