基于单片机的电子时钟和显示屏的设计(编辑修改稿)内容摘要:
0x00,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0xC2,0x82,0x02,0x00,0x00, 0x00, 14 0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x30,0x20, 0x00, /*五 */ 0x10,0x10,0x10,0x10,0x10,0x91,0x12,0x1E,0x94,0x10,0x10,0x10,0x10,0x10,0x10,0x00, 0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x00,0x00,0x01,0x02,0x0C,0x78,0x30,0x00,0x00, /*六 */ }。 /*半角数字点阵 8 乘 16*/ uchar code DIGITS[]= { 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F, 0x00,/*0*/ 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00, 0x00,/*1*/ 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30, 0x00,/*2*/ 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E, 0x00,/*3*/ 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24, 0x00,/*4*/ 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E, 0x00,/*5*/ 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E, 15 0x00,/*6*/ 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00, 0x00,/*7*/ 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C, 0x00,/*8*/ 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F, 0x00,/*9*/ }。 /*生日快乐歌的音符频率表 ,不同的频率由不同的延时值来决定 */ uchar code SONG_TONE[]= { 212,212,190,212,159,169,212,212,190,212,142,159 , 212,212,106,126,159,169,190,119,119,126,159,142,159,0 }。 /*生日快乐歌节拍表 ,节拍表决定了每个音符的演奏长短 */ uchar code SONG_LONG[]= { 9,3,12,12,12,24,9,3,12,12,12,24, 9,3,12,12,12,12,12,9,3,12,12,12,24,0 }。 void DelayMS(uint x) /*调用延时子函数 */ { uchar i。 while(x) for(i=0。 i120。 i++)。 } void PlayMusic()/*音乐播放函数 */ { uint i=0,j,k。 16 while(SONG_LONG[i]!=0||SONG_TONE[i]!=0) { /*播放各个音符 ,SONG_LONG 为拍 */for(j=0。 jSONG_LONG[i]*20。 j++) { SPK=~SPK。 /*SONG_TONE 延时表决定了每个音符的频率 */ for(k=0。 kSONG_TONE[i]/3。 k++)。 } DelayMS(100)。 /*下一个音符的索引 */ i++。 } } void Alarm(uchar t) /*温度报警函数 */ { uchar i,j。 for(i=0。 i200。 i++) { SPK=~SPK。 /*由参数 t 形成不同的频率 */ for(j=0。 jt。 j++)。 } } /*向 DS1302 写入一字节 */ void Write_A_Byte_TO_DS1302(uchar x) { uchar i。 for(i=0。 i8。 i++) { SDA=xamp。 1。 CLK=1。 CLK=0。 x=1。 17 } } /*从 DS1302 读取一字节 */ uchar Get_A_Byte_FROM_DS1302() { uchar i,b,t。 for(i=0。 i8。 i++) { b=1。 t=SDA。 b|=t7。 CLK=1。 CLK=0。 } /*BCD 码转换 */ return(b/16*10+b%16)。 } /*从 DS1302 指定位置读数 据 */ uchar Read_Data(uchar addr) } uchar dat。 RST=0。 CLK=0。 RST=1。 Write_A_Byte_TO_DS1302(addr)。 dat=Get_A_Byte_FROM_DS1302()。 CLK=1。 RST=0。 return dat。 } /*向 DS1302 某地址写入数据 */ void Write_DS1302(uchar addr,uchar dat) { CLK=0。 RST=1。 Write_A_Byte_TO_DS1302(addr)。 Write_A_Byte_TO_DS1302(dat)。 CLK=1。 RST=0。 } 18 /*设置时间 */ void SET_DS1302() { uchar i。 Write_DS1302(0x8E,0x00)。 /*秒分时日月年依次写入 */ for(i=0。 i7。 i++) { /*秒 ,分 ,时 ,日 ,月 ,星期 ,年的起始地址分别为0x80,0x82,0x84,0x86,0x88,0x8A,0x8C*/ Write_DS1302(0x80+2*i,(DateTime[i]/104)|(DateTime[i]%10))。 } Write_DS1302(0x8E,0x80)。 }/*读取当前时间 */ void GetTime() { uchar i。 for(i=0。 i7。 i++) { DateTime[i]=Read_Data(0x81+2*i)。 } } uchar isLeapYear(uint y)/*判断是否为闰年 */ { return (y%4==0amp。 amp。 y%100!=0)||(y%400==0)。 } /*********刷新星期 ******/ void RefreshWeekDay() { uint i,d,w=5。 /*已知 是周五 */ for(i=2020。 i2020+DateTime[6]。 i++) { 19 d=isLeapYear(i)?366:365。 w=(w+d)%7。 } d=0。 for(i=1。 iDateTime[4]。 i++) d+=MonthsDays[i]。 d+=DateTime[3]。 /*保存星期 ,0~6 表示星期日 ,星期一 ,二 ,三 ,四 ,五 ,六 ,为了与 DS1302 的星期格式匹配 , 返回值需要 加 1*/ DateTime[5]=(w+d)%7+1。 }/*蜂鸣器函数 */ void Beep(uchar t) { uchar i。 for(i=0。 i100。 i++) { SPK=~SPK。 DelayMS(t)。 } SPK=0。 } void DateTime_Adjust(char x)/*年月日时分 ++或 */ { switch(Adjust_Index) { case 6: /*年 0099*/ if(x==1amp。 amp。 DateTime[6]99) DateTime[6]++。 if(x==1amp。 amp。 DateTime[6]0) DateTime[6]。 /*获取 2 月天数 */ MonthsDays[2]=isLeapYear(2020+DateTime[6])?29:28。 /*如果年份变化后当前月份的天数大于上限则设为上限 */ if(DateTime[3]MonthsDays[DateTime[4]]) DateTime[3]=MonthsDays[DateTime[4]]。 20 RefreshWeekDay()。 /*刷新星期 */ break。 case 4: /*月 01 至 12*/ if(x==1amp。 amp。 DateTime[4]12) DateTime[4]++。 if(x==1amp。 amp。 DateTime[4]1) DateTime[4]。 /*获取 2 月天数 */ MonthsDays[2]=isLeapYear(2020+DateTime[6])?29:28。 /*如果年份变化后当前月份的天数大于上限则设为上限 */ if(DateTime[3]MonthsDays[DateTime[4]]) DateTime[3]=MonthsDays[DateTime[4]]。 RefreshWeekDay()。 /*刷新星期 */ break。 case 3: /*日 00 至 28/29/30/31。 调节之前首先根据年份得出该年中 2 月的天数 */ MonthsDays[2]=isLeapYear(2020+DateTime[6])?29:28。 /*再根据当前月份决定调节日期的上限 */ if(x==1amp。 amp。 DateTime[3]MonthsDays[DateTime[4]])。基于单片机的电子时钟和显示屏的设计(编辑修改稿)
相关推荐
器。 导体的电阻随着机械变形而发生变化的现象叫做电阻应变效应。 电阻应变片把机械应变信号 转换为 △R/R 后,由于应变量及相应电阻变化一般都很微小,难以直接精确测量,且不便处理。 因此,要采用转换电路把应变片的 △R/R 变化转换成电压或电流变化。 其转换电路常用测量电桥。 直流电桥的特点是信号不会受各元件和导线的分布电感及电容的影响,抗干扰能力强,但因机械应变的输出信号小
数字信号 经过 控制器 完成 处理,驱动显示模块 实现 人 和 机 器之间 信息 的 交 换。 由于软件控制系统大部分功能,故本设计对软件部分要求相对较高。 在 其他 功能上,设为了 使 其 更人性化智能化 我 增加了一个过载报警提示功能 以及一个 电子日历功能。 第二章 系统硬件方案设计 系统设计方案 在设计系统时, 初步考虑具体以下三种基本方案: 方案 1 仅采用 数码管显示 方案 : 图
框图如图 所示。 单 片 机液 晶 显 示 模 块矩 阵 键 盘电 机 驱 动 模 块直 流 电 机霍 尔 测 速 模 块 图 系统总体设计框图 单片机最小系统 直流电机调速控制系统以 AT89C51 为控制主芯片, AT89C51 是一款低功耗、高 14 性能的 CMOS 8 位微控制器,具有 4K 可编程 Flash 存储器,使用 Atmel 公司高密度非易失性存储器技术制造。 在单芯片上
5 制管理系统。 (5) 设施水平低,抵御自然灾害的 能力差。 我国目前部分蔬菜的建筑材料主要是钢材和玻璃。 但没有形成国家统一的标准和工厂系列的产品,且应用率仅占设施栽培面积的 10%,而绝大部分由农民自行建造的塑料日光蔬菜也只能 起到一定的保温作用,根本不能实现对温度、湿度、光照等环境因子的调控。 (6)机械化水平低,调控能力差,作业主要依靠人力。 生产管理主要靠经验和单因子定性调控。
AL1 和 XTAL2:外部晶体引线端。 当使用芯片内部时钟时, XTAL1 和 XTAL2用于外接石英晶体谐振器和微调电容;当使用外部时钟时,用于接入外部时钟脉冲信号。 按键模块 图 5 按键模块 在该模块中,采用四个按键作为对电子时钟的控制输入,通过按键来实现时钟的时间设置、定时功能。 电路中将四个按键的一端接地,而单片机的 P2 口默认为高电平,一旦按键被按下,则该按键对应的管脚被拉低
始做这个设计。 我们小组先是进行了收集资料,选择方案,确定要用到的器件然后手工绘制简单的原理图以及编写程序。 之后我们分工合作,一人主攻对各个器件的原理、功能以及器件各引脚的分布、作用。 一人主攻熟悉仿真软件和程序编译、 10 下载。 一人主攻实物焊接。 虽然各有主攻方向但遇到问题时依然是相 互探讨商议。 在做课程设计的过程中原理图绘制颇费了点劲但最终还是做到了,理论上可以实现。