课程设计论文-基于at89c52单片机的万年历设计内容摘要:
_UP|LCD_NO_MOVE)。 //AC 递增 , 画面不动 } //液晶字符输入的位置 ************************ void GotoXY(unsigned char x, unsigned char y) { if(y==0) LCD_Write(LCD_COMMAND,0x80|x)。 if(y==1) LCD_Write(LCD_COMMAND,0x80|(x0x40))。 } //将字符输出到液晶显示 void Print(unsigned char *str) { while(*str!=39。 \039。 ) { LCD_Write(LCD_DATA,*str)。 str++。 } } 19 /***********DS1302 时钟部分子程序 ******************/ typedef struct __SYSTEMTIME__ { unsigned char Second。 unsigned char Minute。 unsigned char Hour。 unsigned char Week。 unsigned char Day。 unsigned char Month。 unsigned char Year。 unsigned char DateString[11]。 unsigned char TimeString[9]。 }SYSTEMTIME。 //定义的时间类型 SYSTEMTIME CurrentTime。 define AM(X) X define PM(X) (X+12) // 转成 24小时制 define DS1302_SECOND 0x80 //时钟芯片的寄存器位置 ,存放时间 define DS1302_MINUTE 0x82 define DS1302_HOUR 0x84 define DS1302_WEEK 0x8A define DS1302_DAY 0x86 define DS1302_MONTH 0x88 define DS1302_YEAR 0x8C void DS1302InputByte(unsigned char d) //实时时钟写入一字节 (内部函数 ) { unsigned char i。 ACC = d。 for(i=8。 i0。 i) { DS1302_IO = ACC0。 //相当于汇编中的 RRC 20 DS1302_CLK = 1。 DS1302_CLK = 0。 ACC = ACC 1。 } } unsigned char DS1302OutputByte(void) //实时时钟读取一字节 (内部函数 ) { unsigned char i。 for(i=8。 i0。 i) { ACC = ACC 1。 //相当于汇编中的 RRC ACC7 = DS1302_IO。 DS1302_CLK = 1。 DS1302_CLK = 0。 } return(ACC)。 } void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302 地址 , ucData: 要写的数据 { DS1302_RST = 0。 DS1302_CLK = 0。 DS1302_RST = 1。 DS1302InputByte(ucAddr)。 // 地址,命令 DS1302InputByte(ucDa)。 // 写 1Byte 数据 DS1302_CLK = 1。 DS1302_RST = 0。 } unsigned char Read1302(unsigned char ucAddr) //读取 DS1302 某地址的数据 { unsigned char ucData。 DS1302_RST = 0。 DS1302_CLK = 0。 DS1302_RST = 1。 21 DS1302InputByte(ucAddr|0x01)。 // 地址,命令 ucData = DS1302OutputByte()。 // 读 1Byte 数据 DS1302_CLK = 1。 DS1302_RST = 0。 return(ucData)。 } void DS1302_GetTime(SYSTEMTIME *Time) //获取时钟芯片的时钟数据到自定义的结构型数组 { unsigned char ReadValue。 ReadValue = Read1302(DS1302_SECOND)。 TimeSecond = ((ReadValueamp。 0x70)4)*10 + (ReadValueamp。 0x0F)。 ReadValue = Read1302(DS1302_MINUTE)。 TimeMinute = ((ReadValueamp。 0x70)4)*10 + (ReadValueamp。 0x0F)。 ReadValue = Read1302(DS1302_HOUR)。 TimeHour = ((ReadValueamp。 0x70)4)*10 + (ReadValueamp。 0x0F)。 ReadValue = Read1302(DS1302_DAY)。 TimeDay = ((ReadValueamp。 0x70)4)*10 + (ReadValueamp。 0x0F)。 ReadValue = Read1302(DS1302_WEEK)。 TimeWeek = ((ReadValueamp。 0x70)4)*10 + (ReadValueamp。 0x0F)。 ReadValue = Read1302(DS1302_MONTH)。 TimeMonth = ((ReadValueamp。 0x70)4)*10 + (ReadValueamp。 0x0F)。 ReadValue = Read1302(DS1302_YEAR)。 TimeYear = ((ReadValueamp。 0x70)4)*10 + (ReadValueamp。 0x0F)。 } void DateToStr(SYSTEMTIME *Time) //将时间年 ,月 ,日 ,星期数据转换成液晶显示字符串 ,放到数组里 DateString[] { if(hide_year2) //这里的 if,else 语句都是判断位闪烁 ,2 显示数据 ,2 就不显示 ,输出字符串为 2020/07/22 { TimeDateString[0] = 39。 239。 TimeDateString[1] = 39。 039。 TimeDateString[2] = TimeYear/10 + 39。 039。 TimeDateString[3] = TimeYear%10 + 39。 039。 22 } else { TimeDateString[0] = 39。 39。 TimeDateString[1] = 39。 39。 TimeDateString[2] = 39。 39。 TimeDateString[3] = 39。 39。 } TimeDateString[4] = 39。 /39。 if(hide_month2) { TimeDateString[5] = TimeMonth/10 + 39。 039。 TimeDateString[6] = TimeMonth%10 + 39。 039。 } else { TimeDateString[5] = 39。 39。 TimeDateString[6] = 39。 39。 } TimeDateString[7] = 39。 /39。 if(hide_day2) { TimeDateString[8] = TimeDay/10 + 39。 039。 TimeDateString[9] = TimeDay%10 + 39。 039。 } else { TimeDateString[8] = 39。 39。 TimeDateString[9] = 39。 39。 } if(hide_week2) { week_value[0] = TimeWeek%10 + 39。 039。 //星期的数据另外放到 week_value[]数组里 ,跟年 ,月 ,日的分开存放 ,因为等一下要在最后显示 } else { week_value[0] = 39。 39。 23 } week_value[1] = 39。 \039。 TimeDateString[10] = 39。 \039。 //字符串末尾加 39。 \039。 ,判断结束字符 } void TimeToStr(SYSTEMTIME *Time) //将时 ,分 ,秒数据转换成液晶显示字符放到数组 TimeString[]。 { if(hide_hour2) { TimeTimeString[0] = TimeHour/10 + 39。 039。 TimeTimeString[1] = TimeHour%10 + 39。 039。 } else { TimeTimeString[0] = 39。 39。 TimeTimeString[1] = 39。 39。 } TimeTimeString[2] = 39。 :39。 if(hide_min2) { TimeTimeString[3] = TimeMinute/10 + 39。 039。 TimeTimeString[4] = TimeMinute%10 + 39。 039。 } else { TimeTimeString[3] = 39。 39。 TimeTimeString[4] = 39。 39。 } TimeTimeString[5] = 39。 :39。 if(hide_sec2) { TimeTimeString[6] = TimeSecond/10 + 39。 039。 TimeTimeString[7] = TimeSecond%10 + 39。 039。 } else { TimeTimeString[6] = 39。 39。 24 TimeTimeString[7] = 39。 39。 } TimeDateString[8] = 39。 \039。 } void Initial_DS1302(void) //时钟芯片初始化 { unsigned char Second=Read1302(DS1302_SECOND)。 if(Secondamp。 0x80) //判断时钟芯片是否关闭 { Write1302(0x8e,0x00)。 //写入允许 Write1302(0x8c,0x07)。 //以下写入初始化时间 日期 :07/07/ : 3. 时间 : 23:59:55 Write1302(0x88,0x07)。 Write1302(0x86,0x25)。 Write1302(0x8a,0x07)。 Write1302(0x84,0x23)。 Write1302(0x82,0x59)。 Write1302(0x80,0x55)。 Write1302(0x8e,0x80)。 //禁止写入 } } /***********ds18b20 子程序 *****************。课程设计论文-基于at89c52单片机的万年历设计
相关推荐
期工艺准备工作,无论是手工编程还是自动编程,在编程之前均需对所加工的轴类零件进行工艺分析。 如果工艺分析考虑不周,往往会造成工艺设计不合理 ,从而引起编程工作反复,工作量成倍增加,有时还会发 生推倒重来的现象 ,造成一些不必要的损失,严重者甚。 本文通过对典型的轴类零件数控加工工艺的分析,给出了对于一般零件数控加工工艺分析的方法,对于提高制造质量、实际生产具有一定的指导意义。
储,发出控制指令。 组态软件提供了丰富的用于工业自动化监控的功能,用户根据自 己工程的需要进行选择,配置等较为简单的工作来建立自己所需要的监控系统系统。 常用的组态软件有 iFLX、 InTouch、 Citech、 WinCC、 TraceMode、组态王、力控。 其中, 组态王软件是国内开发较早的软件,界面操作灵活方便,有较强的通信功能,对比使用便捷性和功能性,本设计采用组态王软件。 5
进入键盘 , 其变化的顺序为11101101101101111110 周而复始。 扫描信号 0111 代表扫描的为 *、 0、 这一排按键 ,当 *这个按键被按下时 , 由 kx2kx0 读出的值为 011, 按键位置的数码关 系如表 1 所列。 表 1 按键位置数码表 弹跳消除电路可避免误操作发生 , 由于设计中采用的矩阵式键盘是机械开关结构 , 因此在开关切换的瞬间 ,
以对游戏过程中的背景音乐和游戏中的声音进行开关,玩家用起来非常方便 关于菜单:该菜单包含两个模块,一个是游戏的操作的简介,方向键的左,下,右就是游戏中的操作方法,方向键上则是对图形的反转变化,空格键则是一键到底的快捷键。 第二个模块则是制作人,即是该游戏的制作人的说明。 游戏规则 游戏软件随即不断的下落其中方块中的一种,玩家在方块落到底部之前将方块尽量整齐的摆放好,以便能够对满一行进行消除
- / TS1平面S 平面j o o 图 21双线性变换的映射关系 为了将 S 平面的整个虚轴 jΩ 压缩到 S1 平面 jΩ1 轴上的 π/T 到 π/T 段上,可以通过以下的正切变换实现 ( 24) 式中 ,T 仍是采样间隔。 2tan2 1TT基于双线性变换法 的 IIR数字 低通滤波器设计 4 当 Ω1 由 π/T 经过 0 变化到 π/T 时, Ω 由