问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求一个51单片机的简单数字钟。附上汇编程序或C也行2

发布网友 发布时间:2023-10-10 17:52

我来回答

4个回答

热心网友 时间:2024-11-13 21:14

学过几天,我自己编过,但是失败了。看看大牛的吧,没有按键功能,只能走动,我的单片机坏了,忘记怎么加*了:
---------------------------------------------------------------------------------------------------------------------
/*时钟程序,大家是否想到用定时器,对,也可用定时器的中断来处理,这样的程序我想不用我说了吧!
你们可自己发辉下,本程序采用外元件DS1302时钟IC,使用此IC不增加系统资源,要时钟时直接去读取就可以了
本IC跟ADC0831一样以串口方式传送数据,不同的是协议,只要你读懂它的串口协议,就可以用P口来模拟协议进行
,这样更能使你对传送数据协议的了解,在看本程序之前,先看看芯片的串口协议*/

#include <reg51.h>
#include <intrins.h>

sbit SCL2=P1^3;//SCL2定义为P1口的第3位脚,连接DS1302SCL和ADC0831SCL脚
sbit SDA2=P1^4;//SDA2定义为P1口的第4位脚,连接DS1302SCL和ADC0831SDA脚
//sbit CS2=P1^6;//CS2定义为P1口的第4位脚,连接ADC0831CS脚
sbit RST = P1^5; // DS1302片选脚

unsigned char l_tmpdate[8]={0x00,0x06,0x03,0x18,0x0c,0x07,0x06,0};
unsigned char l_tmpdisplay[8]={0x40,0x40,0x40,0x40,0x40,0x40,0x40,0};
code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //地址为:秒分小时月日年
code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};

code unsigned char table[]=
{0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x40,0x00};
//共阴数码管 0-9 '-' '熄灭‘表

void delay();//延时子函数,5个空指令
void display(unsigned char *lp,unsigned char lc);//数字的显示函数;lp为指向数组的地址,lc为显示的个数

void Write_Ds1302_byte(unsigned char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );

void Read_RTC(void);//read RTC
void Set_RTC(void);//set RTC

void main(void) //入口函数
{
Set_RTC();
while(1){
Read_RTC();
switch (l_tmpdate[0]/5) //设计每个5秒 交替显示 年月日 时分秒
{
case 0:
case 2:
case 4:
case 6:
case 8:
case 10:
l_tmpdisplay[0]=l_tmpdate[2]/16;//数据的转换,因我们采用数码管0~9的显示,将数据分开
l_tmpdisplay[1]=l_tmpdate[2]&0x0f;
l_tmpdisplay[2]=10;//加入"-"
l_tmpdisplay[3]=l_tmpdate[1]/16;
l_tmpdisplay[4]=l_tmpdate[1]&0x0f;
l_tmpdisplay[5]=10;
l_tmpdisplay[6]=l_tmpdate[0]/16;
l_tmpdisplay[7]=l_tmpdate[0]&0x0f;
break;
case 1:
case 3:
case 5:
case 7:
case 9:
case 11:
l_tmpdisplay[0]=l_tmpdate[6]/16;
l_tmpdisplay[1]=l_tmpdate[6]&0x0f;
l_tmpdisplay[2]=10;
l_tmpdisplay[3]=l_tmpdate[4]/16;
l_tmpdisplay[4]=l_tmpdate[4]&0x0f;
l_tmpdisplay[5]=10;
l_tmpdisplay[6]=l_tmpdate[3]/16;
l_tmpdisplay[7]=l_tmpdate[3]&0x0f;
break;
default:
break;
}
display(l_tmpdisplay,8);
}
}

void display(unsigned char *lp,unsigned char lc)//显示
{
unsigned char i;//定义变量
P2=0;//端口2为输出
P1=P1&0xF8;//将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管
for(i=0;i<lc;i++){//循环显示
P2=table[lp[i]];//查表法得到要显示数字的数码段
delay();//延时
P2=0;//清0端口,准备显示下位
if(i==7)//检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据
break;
P1++;//下一位数码管
}
}
void delay(void)//空5个指令
{
unsigned char i=10;
while(i)
i--;
}
void Write_Ds1302_Byte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++) //循环8次 写入数据
{
SCL2=0;
SDA2=temp&0x01; //每次传输低字节
temp>>=1; //右移一位
SCL2=1;
}
}

/****************************************************************************/
void Write_Ds1302( unsigned char address,unsigned char dat )
{
RST=0;
_nop_();
SCL2=0;
_nop_();
RST=1;
_nop_(); //启动
Write_Ds1302_Byte(address);//发送地址
Write_Ds1302_Byte(dat);//发送数据
RST=0; //恢复
}
/****************************************************************************/
unsigned char Read_Ds1302 ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0;
_nop_();
SCL2=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++) //循环8次 读取数据
{
if(SDA2)
temp|=0x80;//每次传输低字节
SCL2=0;
temp>>=1;//右移一位
SCL2=1;
}
RST=0;
_nop_();//以下为DS1302复位的稳定时间
RST=0;
SCL2=0;
_nop_();
SCL2=1;
_nop_();
SDA2=0;
_nop_();
SDA2=1;
_nop_();
return (temp);//返回
}
/****************************************************************************/
void Read_RTC(void)//读取 日历
{
unsigned char i,*p;
p=read_rtc_address; //地址传递
for(i=0;i<7;i++)//分7次读取 年月日时分秒星期
{
l_tmpdate[i]=Read_Ds1302(*p);
p++;
}
}
/***********************************************************************/
void Set_RTC(void)//设定 日历
{
unsigned char i,*p,tmp;
for(i=0;i<7;i++){
tmp=l_tmpdate[i]/10;
l_tmpdate[i]=l_tmpdate[i]%10;
l_tmpdate[i]=l_tmpdate[i]+tmp*16;
}
Write_Ds1302(0x8E,0X00);

p=write_rtc_address;//传地址
for(i=0;i<7;i++)//7次写入 年月日时分秒星期
{
Write_Ds1302(*p,l_tmpdate[i]);
p++;
}
Write_Ds1302(0x8E,0x80);
}

热心网友 时间:2024-11-13 21:14

当小姑娘们长大*
不该实现选择痛苦的美好目标,
如果你一心要爱我,那就别为了么,
它窥视充满空缺的巢穴
而亚历山大的人,像平常一样,
你是秋收金黄遍的哈哈

热心网友 时间:2024-11-13 21:15

是用简单的单片机定时器还是要加时钟芯片啊。追问就是用51单片机,用三极管驱动6个共阳数码管。用三个按钮可以调节时分秒的时间。12小时制或24的也行,想再用一个按键,加一个DS18B20温度传感器。按一下,测下室温。给个程序。加个简易示意图

追答这样的话二楼的就是1302的了啊,你再加个18b20就Ok啦。空间Q联系,具体聊

热心网友 时间:2024-11-13 21:15

给邮箱
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 女生多大后可以不在长身高? 如何不用软件把手机投屏到电脑上手机屏幕怎样投放到电脑上 战时拒绝、故意延误军事订货罪既遂的处罚? 战时故意延误军事订货罪处罚标准 小说名字忘了,但是里面主人公叫张狂,有半生万龙纹身,58 现代修真小说主角姓叶刚开始他是一个孤儿后来女朋友生日那天认祖... 找一部小说,主角姓叶,是个在孤儿院长大的孤儿。还被人贩子给拐...1 单片机的数字钟设计 利用51单片机设计一个数字钟,至少实现基...1 基于51单片机简易电子时钟设计3 有本讲黑道的小说主人公是孤儿有苗族纹身,龙眼是他的胎记,他的... 求高手帮忙用51单片机设计一个时钟程序 如何写出漂亮的连笔字姿势图片姿势图片32 求路线!从张家口南火车站到张北草原?2 张家口南火车站到张北草原怎么走3 怎样写出好看的连笔字9 . 设计要求 以AT89C51单片机为核心,制作一个LCD显...1 想知道:张家口市 从张家口市政府到张北草原天路怎么坐公交? 如何写出一手漂亮的字,连笔字也行37 求一份设计一个以51单片机为核心的数字钟,要求能够实时显示小...6 想知道:张家口市 从南站到张北坝上草原怎么坐公交?1 如何写出一手漂亮的字?连笔字怎么写?1 朴宝剑 连笔字1 剑字草书怎么写16 蓄电池是维护好,还是周转好? 求一本小说,主人公生长在一个大家族中,但是从小就是九阳之体,...3 阿克苏市创新型中小企业名单 550度,要配隐形眼镜应该多少度4 我想知道这度数配隐形眼镜应该配多少度的? 比亚迪s6办理全部要多少钱 阴历是十一月初九那阳历是多少? 海信电视可以怎么连接无线 上海浩渺金融有限公司不需要征信吗 海信47k600无线网络参数怎么设置 07款飞度车身尺寸 鹿心用烤箱怎么烘干? 暗黑里符文怎么用?只能放凹槽吗?听说可用来合装备,真的吗? 据说泰奇八宝粥里有蟑螂尸体,这是真的吗? 由于流水对土地的侵蚀作用,地表会形成许多——和——43 地表形成的沉积实验28 海信电话卡能用oppo,vivo 苹果手机 免死金牌有什么用,真的能免死吗 雨水对土地的侵蚀 教案怎么写 实验怎么设计15 海信电视用WiFi怎么收直播 谁能提供一写关于土地资源的资料,我们上课时要交流的6