急求单片机时钟设计 要求 AT89C51芯片 DS1302计时单元 LCD显示 要求有流程图 代码 原理图 急急急急 10

 我来答
黄石佳诚家电维修
2012-12-16 · TA获得超过1427个赞
知道小有建树答主
回答量:1559
采纳率:93%
帮助的人:595万
展开全部

#include <reg52.h>

#include <intrins.h>

#include <string.h>

#define uint unsigned int

#define uchar unsigned char

sbit IO = P1^0;

sbit SCLK = P1^1;

sbit RST = P1^2;

sbit RS = P2^0;

sbit RW = P2^1;

sbit EN = P2^2;

uchar *WEEK[]=

{

 "SUN","***","MON","TUS","WEN","THU","FRI","SAT"

};

uchar LCD_DSY_BUFFER1[]={"DATE 00-00-00    "};

uchar LCD_DSY_BUFFER2[]={"TIME 00:00:00    "};

uchar DateTime[7];

void DelayMS(uint 耐庆槐ms)

{

 uchar i;

while(ms--)

{

for(i=0;i<120;i++);

}

}

void Write_A_Byte_TO_DS1302(uchar x)

{

 uchar i;

for(i=0;i<8;i++)

{

IO=x&0x01;SCLK=1;SCLK=0;x>>=1;

}

}

uchar Get_A_Byte_FROM_DS1302()

{

 uchar i,b=0x00;

for(i=0;i<8;i++)

{

b |= 差基_crol_((uchar)IO,i);

SCLK=1;SCLK=0;

}

return b/16*10+b%16;

}

uchar Read_Data(uchar addr)

{

 uchar dat;

RST = 0;SCLK=0;RST=1;

   Write_A_Byte_TO_DS1302(addr);

dat = Get_A_Byte_FROM_DS1302();

   SCLK=1;RST=0;

return dat;

}

void GetTime()

{

 uchar i,addr = 0x81;

for(i=0;i<7;i++)

{

DateTime[i]=Read_Data(addr);addr+=2;

}

}

uchar Read_LCD_State()

{

 uchar state;

RS=0;RW=1;EN=1;DelayMS(1);

state=P0;

EN = 0;DelayMS(1);

return state;

}

void LCD_Busy_Wait()

{

 昌友while((Read_LCD_State()&0x80)==0x80);

DelayMS(5);

}

void Write_LCD_Data(uchar dat)

{

 LCD_Busy_Wait();

RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0;

}

void Write_LCD_Command(uchar cmd)

{

 LCD_Busy_Wait();

RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS(1);EN=0;

}

void Init_LCD()

{

 Write_LCD_Command(0x38);

DelayMS(1);

Write_LCD_Command(0x01);

DelayMS(1);

Write_LCD_Command(0x06);

DelayMS(1);

Write_LCD_Command(0x0c);

DelayMS(1);

}

void Set_LCD_POS(uchar p)

{

 Write_LCD_Command(p|0x80);

}

void Display_LCD_String(uchar p,uchar *s)

{

 uchar i;

Set_LCD_POS(p);

for(i=0;i<16;i++)

{

Write_LCD_Data(s[i]);

DelayMS(1); 

}

}

void Format_DateTime(uchar d,uchar *a)

{

 a[0]=d/10+'0';

a[1]=d%10+'0';

}

void main()

{

 Init_LCD();

while(1)

{

GetTime();

Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+5);

Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+8);

Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+11);

strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTime[5]]);

Format_DateTime(DateTime[2],LCD_DSY_BUFFER1+5);

Format_DateTime(DateTime[1],LCD_DSY_BUFFER1+8);

Format_DateTime(DateTime[0],LCD_DSY_BUFFER1+11);

Display_LCD_String(0x00,LCD_DSY_BUFFER1);

Display_LCD_String(0x40,LCD_DSY_BUFFER2);

}

}

原理图:

你可以参考一下,不过没有流程图噢

意法半导体(中国)投资有限公司
2023-06-12 广告
单片机复位电路原理通常包括以下几个主要步骤:1. 电平检测:单片机复位电路需要检测一个关键参数,即控制器的复位引脚是否处于高电平(2V)。如果复位引脚没有高电平,复位电路就会启动一个复位过程来清除单片机内部的错误状态并将其恢复到正常状态。2... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
chenshichao54
2012-12-17 · 超过38用户采纳过TA的回答
知道小有建树答主
回答量:310
采纳率:0%
帮助的人:143万
展开全部
联系方式
追问
535833946@qq.com
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sdlylshl9
2012-12-17 · TA获得超过1814个赞
知道小有建树答主
回答量:779
采纳率:75%
帮助的人:252万
展开全部
673358729 可以帮你做
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
走在时间的前头
2012-12-25 · TA获得超过200个赞
知道小有建树答主
回答量:662
采纳率:0%
帮助的人:180万
展开全部
用1602显示吗?需要可以找我,我这里有一些资料,随时都在线,等待回复。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式