求高手帮我写个电子钟程序

我有做好的原理图和PCB板,需要高手帮我写个程序,要和我的P端口对应,还要带DS1302断电计时。谢谢!!... 我有做好的原理图和PCB板,需要高手帮我写个程序,要和我的P端口对应,还要带DS1302断电计时。谢谢!! 展开
 我来答
mage心寒
2012-05-17 · TA获得超过110个赞
知道答主
回答量:64
采纳率:100%
帮助的人:48.5万
展开全部
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar time_buf2[16];
uchar tempdata[8];
uchar num;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
sbit sck=P3^6;
sbit sda=P3^4;
sbit rst=P3^5;
#define ds1302_sec_add 0x80 //秒数据地址
#define ds1302_min_add 0x82 //分数据地址
#define ds1302_hr_add 0x84 //时数据地址
#define ds1302_date_add 0x86 //日数据地址
#define ds1302_month_add 0x88 //月数据地址
#define ds1302_day_add 0x8a //星期数据地址
#define ds1302_year_add 0x8c //年数据地址
#define ds1302_control_add 0x8e //控制数据地址
#define ds1302_charger_add 0x90
#define ds1302_clkburst_add 0xbe

unsigned char time_buf1[] = {20,10,07,27,17,16,00,00};//年月日时分秒周
unsigned char time_buf[16] ;//空年月日时分秒周
/*向DS1302写入一字节数据*/
void ds1302_write_byte(uchar add, uchar d) {

uchar i;
rst=1; /*启动DS1302总线*/

/*写入目标地址:addr*/
add= add & 0xfe;/*最低位置零*/
for (i = 0; i < 8; i ++) {

if (add & 0x01) {
sda=1;
}
else {
sda=0;
}
sck=1;
sck=0;
add = add >> 1;
}

/*写入数据:d*/
for (i = 0; i < 8; i ++) {

if (d & 0x01) {
sda=1;
}
else {
sda=0;
}
sck=1;
sck=0;
d = d >> 1;
}
rst=0; /*停止DS1302总线*/
}

/*从DS1302读出一字节数据*/
uchar ds1302_read_byte(uchar add)
{

uchar i;
uchar temp;
rst=1; /*启动DS1302总线*/

/*写入目标地址:addr*/
add = add | 0x01;/*最低位置高*/
for (i = 0; i < 8; i ++) {

if (add & 0x01) {
sda=1;;
}
else {
sda=0;
}
sck=1;
sck=0;
add = add >> 1;
}

/*输出数据:temp*/
for (i = 0; i < 8; i ++) {
temp = temp >> 1;
if (sda==1) {
temp |= 0x80;
}
else {
temp &= 0x7f;
}
sck=1;
sck=0;
}

rst=0; /*停止DS1302总线*/
return temp;
}

/*向DS302写入时钟数据*/
void ds1302_write_time()
{

unsigned char i,tmp;
for(i=4;i<7;i++){ //BCD处理
tmp=time_buf1[i]/10;
time_buf1[i]=time_buf1[i]%10;
time_buf1[i]=time_buf1[i]+tmp*16;
}
ds1302_write_byte(ds1302_control_add,0x80); //打开写保护
ds1302_write_byte(ds1302_sec_add,0x80); //暂停
ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充电
/* ds1302_write_byte(ds1302_year_add,time_buf[1]); //年
ds1302_write_byte(ds1302_month_add,time_buf[2]); //月
ds1302_write_byte(ds1302_date_add,time_buf[3]); //日 */
ds1302_write_byte(ds1302_hr_add,time_buf1[4]); //时
ds1302_write_byte(ds1302_min_add,time_buf1[5]); //分
ds1302_write_byte(ds1302_sec_add,time_buf1[6]); //秒
/* ds1302_write_byte(ds1302_day_add,time_buf[7]); //周 */
ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护

}

/*从DS302读出时钟数据*/
void ds1302_read_time() {
/* time_buf[1]=ds1302_read_byte(ds1302_year_add); //年
time_buf[2]=ds1302_read_byte(ds1302_month_add); //月
time_buf[3]=ds1302_read_byte(ds1302_date_add); //日 */
time_buf[4]=ds1302_read_byte(ds1302_hr_add); //时
time_buf[5]=ds1302_read_byte(ds1302_min_add); //分
time_buf[6]=ds1302_read_byte(ds1302_sec_add);//秒
}

/*DS302初始化函数*/
void ds1302_init(void) {

rst=0; /*RST脚置低*/
sck=0; /*SCK脚置低*/

}

void display()
{
P0=table[tempdata[6]%10];
P2=7;
delay(1);
P0=table[tempdata[6]/10];
P2=6;
delay(1);
P0=0x40;
P2=5;
delay(1);
P0=table[tempdata[5]%10];
P2=4;
delay(1);
P0=table[tempdata[5]/10];
P2=3;
delay(1);
P0=0x40;
P2=2;
delay(1);
P0=table[tempdata[4]%10];
P2=1;
delay(1);
P0=table[tempdata[4]/10];
P2=0;
delay(1);
}
main()
{
unsigned char i,tmp,j;
ds1302_init(); /*DS302初始化函数*/
delay(15); //延时用于稳定功能
ds1302_write_time();
while(1)
{
ds1302_read_time();
for(i=4;i<7;i++)
{ //BCD处理
tmp=time_buf[i]/16;
time_buf[i]=time_buf[i]%16;
time_buf[i]=time_buf[i]+tmp*10;
}
for(j=4;j<7;j++)
{
tempdata[j]=time_buf[j];
display();
}
}
}

断电计时程序要烧两次,第一次写把时间调整好了,第二次烧的时候讲写函数屏蔽了,断电计时是需要你买块小电池给1302供电的这个你应该知道吧,没电是没发工作的,上面程序我调试没问题,以前写的。。希望以后对你有帮助。。
陕西妙网网络科技有限责任公司_
2024-03-17 广告
无论你之前是否做过电子书、电子杂志,选择FLBOOK就对了,这里有功能强大、安全便捷的平台教你如何轻松简单制作电子杂志,能够给你提供最贴心得服务和帮助,三分钟轻松在线制作电子杂志,无需下载安装软件,无论您是免费版用户,还是VIP用户,都可以... 点击进入详情页
本回答由陕西妙网网络科技有限责任公司_提供
梦里听海ing
2012-05-15 · TA获得超过518个赞
知道小有建树答主
回答量:918
采纳率:0%
帮助的人:466万
展开全部
我不是高手,我也不会写。程序猿是个伤不起的职业
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式