基于单片机的电脑时钟设计完美实现版内容摘要:
设计 在 LCD 显示子程序中,初始化后,从 LCD 中读状态字,判断 LCD 是否忙状态,不是则可向 LCD 写控制命令,再写数据,即显示数据。 19 图 LCD显示流程图 八、 程 序清单 include include //include //include define uint unsigned int define uchar unsigned char sbit DS1302_CLK = P1^7。 //实时时钟时钟线引脚 sbit DS1302_IO = P1^6。 //实时时钟数据线引脚 sbit DS1302_RST = P1^5。 //实时时钟复位线引脚 sbit wireless_1 = P3^0。 sbit wireless_2 = P3^1。 sbit wireless_3 = P3^2。 20 sbit wireless_4 = P3^3。 sbit ACC0 = ACC^0。 sbit ACC7 = ACC^7。 char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year。 //秒 ,分 ,时到日 ,月 ,年位闪的计数 sbit Set = P2^0。 //模式切换键 sbit Up = P2^1。 //加法按钮 sbit Down = P2^2。 //减法按钮 sbit out = P2^3。 //立刻跳出调整模式按钮 sbit DQ = P1^0。 //温度传送数据 IO 口 char done,count,temp,flag,up_flag,down_flag。 uchar temp_value。 //温度值 uchar TempBuffer[5],week_value[2]。 void show_time()。 //液晶显示程序 /***********1602 液晶显示部分子程序 ****************/ sbit LcdRs = P2^5。 sbit LcdRw = P2^6。 sbit LcdEn = P2^7。 sfr DBPort = 0x80。 //P0=0x80,P1=0x90,P2=0xA0,P3= // 内 部 等 待 函 数******************************************************************* unsigned char LCD_Wait(void) { LcdRs=0。 LcdRw=1。 _nop_()。 LcdEn=1。 _nop_()。 LcdEn=0。 return DBPort。 21 } // 向 LCD 写 入 命 令 或 数 据************************************************************ define LCD_COMMAND 0 // Command define LCD_DATA 1 // Data define LCD_CLEAR_SCREEN 0x01 // 清屏 define LCD_HOMING 0x02 // 光标返回原点 void LCD_Write(bit style, unsigned char input) { LcdEn=0。 LcdRs=style。 LcdRw=0。 _nop_()。 DBPort=input。 _nop_()。 //注意 顺序 LcdEn=1。 _nop_()。 //注意顺序 LcdEn=0。 _nop_()。 LCD_Wait()。 } // 设 置 显 示 模 式************************************************************ define LCD_SHOW 0x04 //显示开 define LCD_HIDE 0x00 //显示关 define LCD_CURSOR 0x02 //显示光标 define LCD_NO_CURSOR 0x00 //无光标 define LCD_FLASH 0x01 //光标闪动 define LCD_NO_FLASH 0x00 //光标不闪动 void LCD_SetDisplay(unsigned char DisplayMode) { LCD_Write(LCD_COMMAND, 0x08|DisplayMode)。 } 22 // 设 置 输 入 模 式************************************************************ define LCD_AC_UP 0x02 define LCD_AC_DOWN 0x00 // default define LCD_MOVE 0x01 // 画面可平移 define LCD_NO_MOVE 0x00 //default void LCD_SetInput(unsigned char InputMode) { LCD_Write(LCD_COMMAND, 0x04|InputMode)。 } // 初始化LCD************************************************************ void LCD_Initial() { LcdEn=0。 LCD_Write(LCD_COMMAND,0x38)。 //8 位数据端口 ,2 行显示 ,5*7点阵 LCD_Write(LCD_COMMAND,0x38)。 LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR)。 //开启显示 , 无光标 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN)。 //清屏 LCD_SetInput(LCD_AC_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))。 23 } //将字符输出到液晶显示 void Print(unsigned char *str) { while(*str!=39。 \039。 ) { LCD_Write(LCD_DATA,*str)。 str++。 } } /////////////////////////////////////////////////////////////////// /***********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 24 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 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)。 } 25 void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302 地址 , ucData: 要写的数据 { DS1302_RST = 0。 // Write1302(0x8e,0x00)。 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。 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)。 26 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 = (。基于单片机的电脑时钟设计完美实现版
相关推荐
大 5nA 高共模抵制 CMR 最小 120dB 输入保护至 177。 40V 图 28 INA128 引脚图 宽电源电压范围 177。 至 177。 18V 低静态电流 700181。 A 8 引脚塑料 DIP 和 SO8 封装 放大器增益 G=1+50k/Rg,通过改变 Rg 的大小来改变放大器的增益。 因为放大的倍数是 1000,所以大致选用 50 欧姆的电阻就可以了。 基于以上分析
=3V~ 15V 逻辑 0(SPACE)=+3~+ 15V; 在 RTS、 CTS、 DSR、 DTR 和 DCD 等控制线上:信号有效(接通, ON 状态,正电压)= +3V~ +15V 信号无效(断开, OFF 状态,负电压 )=3V~15V TTL 输出 高电平 ,输出低电平。 在室温下,一般输出高电平是 ,项目 符号 测试条件 最小 典型 最大 单位 输入 正向压降 VF IF=10mA
相一致。 对于 74161 而言, 当 CLOCK 由低至高跳变或跳变前,如果计数控制端 ENP、 ENT 位高电平,则 LOAD 应避免由低电平至高电平的跳变,而74LS161 则无此限制。 161 的计数是同步的,靠 CLOCK 同时加在四个触 发器上而实现的。 当 ENP、 ENT 均为基于单片机的电源管理系统设计 10 高电平时,在 CLOCK 上升沿作用下 Q0— Q3同时变化
错后,就直接生产 hex 文件,然后进行( proteus)软件仿真。 我们用 proteus 绘制的仿真图如下: 图 、 软件仿真 在硬件设计完成后,利用软件对其进行仿真,这样,就会减少在做硬件时的错误,做到更准确。 本次我采用 Proteus 软件仿真。 第 16 页 如图 所示,电子万年历的时间仿真图。 图 经过此次的软件仿真,仿真结果正常,可以顺利的进行硬件制作。 、硬件调试
为前提的,蓄电池可接受的充电曲线,如图 1 所示。 实验表明,如果充电电流按 这条曲线变化,就可以大大缩短充电时间,并且对电池的容量和寿命也没有影响。 原则上把这条曲线称为最佳充电曲线,从而奠定了快速充电方法的研究方向。 图 最佳充电 曲线 由图 可以看出:初始充电电流很大,但是衰减很快。 主要原因是充电过程中产生了极化现象。 在密封式蓄电池充电过程中,内部产生氧气和氢气,当氧 7
P2 口输出其特殊功能寄存器的内容。 P2 口在 FLASH 编程和校验时接收高八位地址信号和控制信号。 P3 口: P3口管脚是 8个带内部上拉电阻的双向 I/O口,可接收输出 4个 TTL 门电流。 当 P3 口写入“ 1”后,它们被内部上拉为高电平,并用作输入。 作为输入时,由于 12 外部下拉为低电平, P3口将输出电流 (ILL),也是由于上拉的缘故。 P3 口也可作为AT89C51