版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、LED点阵数字钟与温度计一、系统设计方案本LED点阵数字钟基于STC89C52RC单片机设计,使用5片6*7的LED点阵作为显示屏。通过设计系统可以完成显示时间,日期,并增加了用DS18B20温度传感器显示温度的功能。同时,通过程序的改变可以为点阵数字钟扩充例如闹钟,字幕滚屏等功能。 LED点阵数字钟通过单片机来完成计时,设定,温度测量等功能。显示部分通过74HC595通用移位寄存器,完成点阵屏幕与单片机连接从而完成显示部分的功能。其系统组成框图如下:二、单元电路设计1.MCU控制部分单片机的时钟周期由外部12M晶振,时间信息则通过DS1302产生。DS1302通过串行方式与单片机进行数据传送
2、,能够向单片机提供包括秒、分、时、日、月、年等在内的实时时间信息,并可对月末日期、闰年天数自动进行调整;它还拥有用于主电源和备份电源的双电源引脚,在主电源关闭的情况下,也能保持时钟的连续运行。从而完成断电计时的功能。其中DS1302采用32.768KHz的晶振提供时钟周期(原理图见附录1)1 图12.LED点阵显示部分74HC595通用移位寄存器并行输出端具有输出锁存功能。与单片机连接简单方便,只须三个I/O口即可。而且通过芯片的Q7引脚和SER引脚,可以级联。点阵屏幕由5片6*7的LED点阵组成。采用74HC595来实现时钟的动态显示。点阵屏幕段选码由4片74HC595控制,段选数据由74H
3、C595的SER引脚串行输入,由于输出使能时钟RCLK并接在一起,因此,4片74HC595并行输出端同时输出。而5个点阵位选信号也并接在一起,因此,一次可以同时点亮4列此过程类似于静态显示。每片74HC595并行输出端并接到点阵的每一位的引脚,用于扫描输出,此过程类似于动态扫描过程。此方法运用4片74HC595,7条位选信号,从而实现LED点阵的显示.其中位选控制端为通过经三极管放大后的P2口输出信号控制。(原理图见附录2)3.电源部分采用普通电源接口和USB接口,可以使用5V,400mA电源供电,亦可使用电脑USB供电。预设备用电源纽扣电池接口,保证时钟断电后继续走时。三、程序设计1. 定义
4、字符#include "reg52.h"#define uchar unsigned char#define uint unsigned int/74HC595管脚定义sbit S_DIO = P30;sbit S_CLK = P31; sbit R_CLK = P32;/按键管脚定义sbit KEY_1 = P11;sbit KEY_2 = P12; sbit KEY_3 = P10;/蜂鸣器管脚定义sbit BEEP = P27;/DS18B20管脚定义sbit DQ = P34;uchar temp_value;unsigned char tempL=0; /设全局变
5、量unsigned char tempH=0;unsigned int sdata;/测量到的温度的整数部分unsigned char xiaoshu1;/小数第一位unsigned char xiaoshu2;/小数第二位unsigned char xiaoshu;/两位小数bit fg=1; /温度正负标志,等于0时为负数/DS1302管脚定义sbit T_CLK = P35;sbit T_IO = P36;sbit T_RST = P37;sbit ACC0 = ACC0;sbit ACC1 = ACC1;sbit ACC2 = ACC2;sbit ACC3 = ACC3;sbit AC
6、C4 = ACC4;sbit ACC5 = ACC5;sbit ACC6 = ACC6;sbit ACC7 = ACC7;bitdistime,disdate,disyear,distweek,diswendu,setyear,setdate,settime,setalarm,setweek;unsigned char code Bmp74=0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf
7、f,0xff,0xff,;unsigned char code font7=0x38,0x44,0x64,0x54,0x4C,0x44,0x38,/0xF8,0x88,0x88,0x88,0x88,0x88,0xF8, /-'0'0x10,0x18,0x10,0x10,0x10,0x10,0x38,/0x20,0x30,0x28,0x20,0x20,0x20,0xF8, /-'1'0x38,0x44,0x40,0x20,0x10,0x08,0x7C,/0xF8,0x80,0x80,0xF8,0x08,0x08,0xF8, /-'2'0x7C,0x
8、20,0x10,0x20,0x40,0x44,0x38,/0xF8,0x80,0x80,0xF8,0x80,0x80,0xF8, /-'3'0x20,0x30,0x28,0x24,0x7C,0x20,0x20,/0x48,0x48,0x48,0x48,0xF8,0x40,0x40, /-'4'0x7C,0x04,0x3C,0x40,0x40,0x44,0x38,/0xF8,0x08,0x08,0xF8,0x80,0x80,0xF8, /-'5'0x70,0x08,0x04,0x3C,0x44,0x44,0x38,/0xF8,0x08,0x08,0
9、xF8,0x88,0x88,0xF8, /-'6'0x7C,0x40,0x20,0x10,0x08,0x08,0x08,/0xF8,0x80,0x80,0x80,0x80,0x80,0x80, /-'7'0x38,0x44,0x44,0x38,0x44,0x44,0x38,/0xF8,0x88,0x88,0xF8,0x88,0x88,0xF8, /-'8'0x38,0x44,0x44,0x78,0x40,0x20,0x1C,/0xF8,0x88,0x88,0xF8,0x80,0x80,0x80, /-'9'0x00,0x30,0x
10、30,0x00,0x30,0x30,0x00, /-10-':'0x78,0x48,0x78,0x48,0x78,0x48,0x64, /-11-'月'0x78,0x48,0x48,0x78,0x48,0x48,0x78, /-12-'日'0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, /-13-''0x00,0x00,0x00,0x00,0x00,0x00,0x00, /-14-' '0x3C,0x44,0x44,0x44,0x44,0x44,0x3C, /-15-' D'
11、0x44,0x44,0x44,0x28,0x10,0x10,0x10, /-16-' Y'0x08,0xF8,0x24,0xF8,0x28,0xFC,0x20, /-17-'年'0x88,0xA8,0xA8,0xA8,0xA8,0xF8,0x70, /-18-' W'0x88,0x48,0x28,0x18,0x28,0x48,0x88, /-19-' K'0x00,0x00,0x00,0x38,0x00,0x00,0x00, /-20-'-'0x00,0x00,0x00,0x00,0x00,0x30,0x30, /
12、-21-'.'0xE8,0x10,0x10,0x10,0x10,0x10,0xE0, /-22-''unsigned char idata DisTemp57;unsigned char idata Dis5;/时钟数据(7字节BCD码)格式为: 秒 分 时 日 月星期 年 unsigned char idata Time7;/=0x30,0x42,0x23,0x18,0x06,0x04,0x09; unsigned char idata alarm2=0x30,0x06;uchar alarm_hh,alarm_ss,alarm_fg,alarm_off,fl
13、ag;/闹钟unsigned char idata CSRow7=0x01,0x02,0x04,0x08,0x10,0x20,0x40;unsigned char idata second,minute,hour,day,month,week,year,time_revise; unsigned char idata keyvalue;unsigned long int idata Disbuf5;unsigned long int idata Disbuftemp7;unsigned int ss,i,TimeT1;/* 函数名: Delay* 功能描述:延时(带参数)*/void Dela
14、y(unsigned int i)unsigned int j;for(j=0;j<i;j+);/* 函数名: KeyOff* 功能描述:*/void KeyOff()if(keyvalue=2|keyvalue=1|keyvalue=3)alarm_off=1;/* 函数名: OutData* 功能描述:*/void OutData(unsigned char Data)SBUF=Data;while(TI=0);TI=0;/* 函数名: BCD2HEX* 功能描述:*/unsigned char BCD2HEX(unsigned char BCDChar)unsigned char
15、temp;temp=(BCDChar/16*10+BCDChar%16);return temp;/* 函数名: HEX2BCD* 功能描述:*/unsigned char HEX2BCD(unsigned char HEXChar)unsigned char temp;temp=(HEXChar/10*16+HEXChar%10);return temp;/* 函数名: WriteByteDS1302* 功能描述:*/void WriteByteDS1302(unsigned char Data)unsigned char i;ACC = Data;for(i=8; i>0; i-)T
16、_IO = ACC0;T_CLK = 1;T_CLK = 0;ACC = ACC >> 1;/* 函数名: ReadByteDS1302* 功能描述:*/ unsigned char ReadByteDS1302(void)unsigned char i;for(i=8; i>0; i-)ACC = ACC >>1;ACC7 = T_IO;T_CLK = 1;T_CLK = 0;return(ACC);/* 函数名: WriteDS1302* 功能描述:*/void WriteDS1302(unsigned char Addr,unsigned char Data
17、)T_RST = 0;T_CLK = 0;T_RST = 1;WriteByteDS1302(Addr);WriteByteDS1302(Data);T_CLK = 1;T_RST = 0;/* 函数名: ReadDS1302* 功能描述:*/unsigned char ReadDS1302(unsigned char Addr)unsigned char Data;T_RST = 0;T_CLK = 0;T_RST = 1;WriteByteDS1302(Addr);Data = ReadByteDS1302();T_CLK = 1;T_RST = 0;return(Data);/* 函数名
18、: Set* 功能描述:设置*/void Set(unsigned char sel,unsigned char selby)unsigned char address,item;unsigned char max,min;if(sel=0) address=0x80; max=59;min=0; /秒if(sel=1) address=0x82; max=59;min=0; /分钟if(sel=2) address=0x84; max=23;min=0; /小时if(month=2)if(flag=1)if(sel=3) address=0x86; max=28;min=1;elseif(s
19、el=3) address=0x86; max=27;min=1;elseif(month=1|month=3|month=5|month=7|month=8|month=10|month=12) if(sel=3) address=0x86; max=31;min=1;if(month=4|month=6|month=9|month=11)if(sel=3) address=0x86; max=30;min=1;if(sel=4) address=0x88; max=12;min=1; /月if(sel=5) address=0x8a; max=7; min=1; /星期if(sel=6)
20、address=0x8c; max=99;min=0; /年if(sel=7) address=0xc0; max=59;min=0; /闹钟分钟if(sel=8) address=0xc2; max=23;min=0; /闹钟小时item=ReadDS1302(address+1)/16*10+ReadDS1302(address+1)%16;if (selby=0) item+; else item-;if(item>max) item=min;if(item<min) item=max;WriteDS1302(0x8e,0x00);WriteDS1302(address,it
21、em/10*16+item%10);WriteDS1302(0x90,0xa5);WriteDS1302(0x8e,0x80);/* 函数名: SetTime* 功能描述:*/void SetTime(unsigned char *pClock)unsigned char h;unsigned char Addr=0x80;WriteDS1302(0x8e,0x00);for(h=7; h>0; h-)WriteDS1302(Addr,*pClock);pClock+;Addr+=2;WriteDS1302(0x90,0xa5);WriteDS1302(0x8e,0x80);/* 函数名
22、: ReadTime* 功能描述:*/void ReadTime()Second = BCD2HEX(Time0=ReadDS1302(0x81);minute = BCD2HEX(Time1=ReadDS1302(0x83);hour = BCD2HEX(Time2=ReadDS1302(0x85);day = BCD2HEX(Time3=ReadDS1302(0x87);month = BCD2HEX(Time4=ReadDS1302(0x89);year = BCD2HEX(Time5=ReadDS1302(0x8d);week = BCD2HEX(Time6=ReadDS1302(0x
23、8b);alarm_ss = BCD2HEX(alarm0=ReadDS1302(0xc1);alarm_hh = BCD2HEX(alarm1=ReadDS1302(0xc3);/* 函数名: WriteTime* 功能描述:*/void WriteTime()WriteDS1302(0x8e,0x00);WriteDS1302(0x80,HEX2BCD(second);WriteDS1302(0x82,HEX2BCD(minute);WriteDS1302(0x84,HEX2BCD(hour);WriteDS1302(0x86,HEX2BCD(day);WriteDS1302(0x88,H
24、EX2BCD(month);WriteDS1302(0x8A,HEX2BCD(week);WriteDS1302(0x8C,HEX2BCD(year);WriteDS1302(0xc0,HEX2BCD(alarm_ss);WriteDS1302(0xc2,HEX2BCD(alarm_hh);WriteDS1302(0x90,0xa5);WriteDS1302(0x8e,0x80);/* 函数名: StopTime* 功能描述:*/void StopTime()second = BCD2HEX(Time0=ReadDS1302(0x81);WriteDS1302(0x8e,0x00);Write
25、DS1302(0x80,HEX2BCD(second)|0x80);WriteDS1302(0x90,0xa5);WriteDS1302(0x8e,0x80);/* 函数名: StartTime* 功能描述:*/void StartTime()WriteDS1302(0x8e,0x00);WriteDS1302(0x80,HEX2BCD(second)&0x7f);WriteDS1302(0x90,0xa5);WriteDS1302(0x8e,0x80);/温度处理程序/*ds18b20延迟子函数(晶振12MHz )*/void delay_18B20(unsigned int i)w
26、hile(i-);/*ds18b20初始化函数*/void Init_DS18B20(void)unsigned char x=0;DQ = 1; /DQ复位delay_18B20(16); /稍做延时DQ = 0; /单片机将DQ拉低delay_18B20(160); /精确延时 大于 480usDQ = 1; /拉高总线delay_18B20(28);x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(40);/*ds18b20读一个字节*/unsigned char ReadOneChar(void)uchar i=0;uchar dat = 0
27、;for (i=8;i>0;i-)DQ = 0; / 给脉冲信号dat>>=1;DQ = 1; / 给脉冲信号if(DQ)dat|=0x80;delay_18B20(8);return(dat);/*ds18b20写一个字节*/void WriteOneChar(uchar dat)unsigned char i=0;for (i=8; i>0; i-)DQ = 0;DQ = dat&0x01;delay_18B20(10);DQ = 1;dat>>=1;/*读取ds18b20当前温度*函数名:ReadTemperature(void)*功能描述:读
28、温度值(低位放tempL;高位放tempH;)*/void ReadTemp(void)Init_DS18B20(); /初始化WriteOneChar(0xcc); /跳过读序列号的操作WriteOneChar(0x44); /启动温度转换delay_18B20(200); /转换需要一点时间,延时Init_DS18B20(); /初始化WriteOneChar(0xcc); /跳过读序列号的操作WriteOneChar(0xbe); /读温度寄存器(头两个值分别为温度的低位和高位) tempL=ReadOneChar(); /读出温度的低位LSBtempH=ReadOneChar(); /
29、读出温度的高位MSBif(tempH>0x7f) /最高位为1时温度是负tempL=tempL+1; /补码转换,取反加一tempH=tempH;fg=0; /读取温度为负时fg=0else fg=1;sdata = tempL/16+tempH*16; /整数部分xiaoshu1 = (tempL&0x0f)*10/16; /小数第一位xiaoshu2 = (tempL&0x0f)*100/16;/小数第二位xiaoshu=xiaoshu1*10+xiaoshu2; /小数两位/温度处理程序结束/* 函数名: DisPlay* 功能描述:*/void DisPlay()
30、unsigned char i,j;for(i=0;i<7;i+)P2=0xFF;for(j=0;j<4;j+)OutData(unsigned char *)&Disbuftempi)3-j);R_CLK=1;R_CLK=0;P2=CSRowi;BEEP=1;Delay(250);P2=0xff;/* 函数名: SetDis* 功能描述:设置显示内容菜单*/void SetDis()if(distime=1)/时分显示,秒针闪动if(hour/10)=0)Dis0=14;elseDis0=hour/10;Dis1=hour%10;Dis3=minute/10;Dis4=m
31、inute%10;if(second%10)%2)Dis2=14;elseDis2=10;else if(disdate=1)/月、日显示Dis0=month/10;Dis1=month%10;Dis3=day/10;Dis4=day%10;Dis2=20;else if(disyear=1)/年显示Dis0=2;Dis1=0;Dis2=year/10;Dis3=year%10;Dis4=17;else if(distweek=1)/星期显示Dis0=18;Dis1=19;Dis2=14;Dis3=14;Dis4=week%10;else if(diswendu=1)/显示温度if(fg=0)
32、Dis0=20;elseDis0=sdata/10;Dis1=sdata%10;Dis2=21;Dis3=xiaoshu1;Dis4=22;else if(settime=1)/设定时间显示、秒不闪动 if(hour/10)=0)Dis0=14;elseDis0=hour/10;Dis1=hour%10;Dis3=minute/10;Dis4=minute%10;Dis2=10;else if(setalarm=1)/设定闹钟时分 if(alarm_hh/10)=0)Dis0=14;elseDis0=alarm_hh/10; Dis1=alarm_hh%10;Dis3=alarm_ss/10;
33、Dis4=alarm_ss%10;Dis2=10;else if(setdate=1)/月、日显示 Dis0=month/10;Dis1=month%10;Dis3=day/10;Dis4=day%10;Dis2=20;else if(setyear=1)/年显示 Dis0=2;Dis1=0;Dis2=year/10;Dis3=year%10;Dis4=17;else if(setweek=1)/星期显示 Dis0=18;Dis1=19;Dis2=14;Dis3=14;Dis4=week%10;/* 函数名: DisProcess* 功能描述:装载显示数据*/void DisProcess()
34、unsigned char i,j;for(i=0;i<5;i+)for(j=0;j<7;j+)DisTempij=fontDisij;for(i=0;i<7;i+)Disbuf0=DisTemp4i;Disbuf1=DisTemp3i;Disbuf2=DisTemp2i;Disbuf3=DisTemp1i;Disbuf4=DisTemp0i;Disbuftempi=Disbuf0<<24|Disbuf1<<18|Disbuf2<<12|Disbuf3<<6|Disbuf4;/* 函数名: KeyCheck* 功能描述:*/vo
35、id KeyCheck()if(KEY_1=0)DisPlay();if(KEY_1=0)keyvalue=1;for(i=0;i<1000;i+)BEEP = 0;while(KEY_1=0)DisPlay();if(KEY_2=0)DisPlay();if(KEY_2=0)keyvalue=2;for(i=0;i<1000;i+)BEEP = 0;while(KEY_2=0)DisPlay();if(KEY_3=0)DisPlay();if(KEY_3=0)keyvalue=3;for(i=0;i<1000;i+)BEEP = 0;while(KEY_3=0)DisPla
36、y();/* 函数名: KeyProcess* 功能描述:*/void KeyProcess()if(keyvalue=3)if(distime)/转换设置年distime=0;disdate=0;disyear=0;distweek=0;diswendu=0;setyear=1;setdate=0;setweek=0;settime=0;setalarm=0;TR0=0;StopTime();/停止时钟 else if(setyear)/转换设置月、日 distime=0;disdate=0;disyear=0;distweek=0;diswendu=0;setyear=0;setdate=
37、1;setweek=0;settime=0;setalarm=0;else if(setdate)/转换设置星期 distime=0;disdate=0;disyear=0;distweek=0;diswendu=0;setyear=0;setdate=0;setweek=1;settime=0;setalarm=0;else if(setweek)/转换设置时间 distime=0;disdate=0;disyear=0;distweek=0;diswendu=0;setyear=0;setdate=0;setweek=0;settime=1;setalarm=0;else if(setti
38、me)/转换设置闹钟 distime=0;disdate=0;disyear=0;distweek=0;diswendu=0;setyear=0;setdate=0;setweek=0;settime=0;setalarm=1;else if(setalarm)/转换显示时间 distime=1;disdate=0;disyear=0;distweek=0;diswendu=0;setyear=0;setdate=0;setweek=0;settime=0;setalarm=0;TR0=1;/ StartTime();/启动时钟 keyvalue=0;else if(keyvalue=1&am
39、p;&settime=1) Set(2,0);keyvalue=0;else if(keyvalue=2&&settime=1) Set(1,0);keyvalue=0;else if(keyvalue=1&&setdate=1) Set(4,0);keyvalue=0;else if(keyvalue=2&&setdate=1)Set(3,0);keyvalue=0;else if(keyvalue=1&&setyear=1)Set(6,0);keyvalue=0;else if(keyvalue=2&&setyear=1)Set(6,1);keyvalue=0;else if(keyvalue=1&&setweek=1)Set(5,0);keyvalue=0;else if(keyvalue=2&&setweek=1)Set(5,1);keyvalue=0;else if(keyvalue=1&&setalarm=1)Set(8,0);keyvalue=0;else if(keyvalue=2&&setalarm=1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 白酒制曲工安全培训效果水平考核试卷含答案
- 松焦油工岗位指挥能力考核试卷含答案
- 气体净化工岗位技能安全考核试卷含答案
- 戏服制作工岗位设备考核试卷含答案
- 糖汁过滤工个人技能评优考核试卷含答案
- 拖拉机涂装加工生产线操作调整工岗前深度考核试卷含答案
- 2026氢能源技术行业市场供需潜力挖掘及储能系统规划分析研究报告
- 2026中国光刻胶化学品行业安全生产标准与风险管理体系
- 2026金融科技行业市场深度研究及数字化转型趋势和金融服务创新分析报告
- 2026中国膜电容去离子技术产业化可行性论证报告
- 2026稀土储氢材料行业市场发展分析及前景趋势与投融资战略研究报告
- 《智能网联汽车规划与决策技术》课件 项目4 常见的行为决策方法
- 2026年智慧海洋产业园区规划:功能布局与产业协同设计
- 个人暗股合同协议书
- 2025-2026学年人美版(2024)小学美术三年级上册《果篮传情谊》教学设计
- 认知障碍患者护理课件
- 螺栓培训课件视频
- GB 30035-2021船员健康检查要求
评论
0/150
提交评论