专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
用1.8寸数码管做万年历
2019-07-16 03:28
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
16118
17
1261
我是刚学
单片机
的,以前收到有好几个1.8寸数码管
有谁可以帮忙整理下ATC89S52,DS1302,DS12C887,DS18B20,MAX7219,等IC组合的显示年月时.分.秒.温度.的程序,是本
论坛
网友hukaipanwenjing 发上来的(如侵犯了权益请原谅),在此谢谢他,我只想做一个只显示时分秒温度的就可以了,
就是把程序整理出来就好了,
这是我的数码管
这是我下载再传上来的文件:
AT89S52MAX7219钟.zip
(401.05 KB, 下载次数: 191)
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
17条回答
丁一凡
2019-07-17 02:46
#include <AT89X52.H> //包含头文件
/*************************ds1302与at89s52引脚连接********************/
sbit T_RST=P1^4; //RST脚接P3^6
sbit T_CLK=P3^6; //CLK脚接P3^5
sbit T_IO=P3^7; //IO脚接P3^4
/*************************定义数码管显示引脚*************************/
sbit LED_0=P1^4; //数码管8个控制引脚定义
sbit LED_1=P1^5;
sbit LED_2=P1^0;
sbit LED_3=P1^1;
sbit LED_4=P1^2;
sbit LED_5=P1^3;
sbit LED_6=P1^6;
sbit LED_7=P1^7;
sbit ACC0=ACC^0; //定义标志位
sbit ACC7=ACC^7;
unsigned char seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//0~~9段码
void delay(unsigned char a); //延时函数声明
/******************DS1302:写入操作(上升沿)*********************/
void write_byte(unsigned char da)
{
unsigned char i;
ACC=da;
for(i=8;i>0;i--)
{
T_IO=ACC0;
T_CLK=0;
T_CLK=1;
ACC=ACC>>1;
}
}
/******************DS1302:读取操作(下降沿)*****************/
unsigned char read_byte(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
ACC=ACC>>1;
T_CLK = 1;
T_CLK = 0;
//delay(1);
ACC7 = T_IO;
}
return(ACC);
}
/******************DS1302:写入数据(先送地址,再写数据)***************************/
void write_1302(unsigned char addr,unsigned char da)
{
T_RST=0; //停止工作
T_CLK=0;
T_RST=1; //重新工作
write_byte(addr); //写入地址
write_byte(da);
T_RST=0;
T_CLK=1;
}
/******************DS1302:读取数据(先送地址,再读数据)**************************/
unsigned char read_1302(unsigned char addr)
{
unsigned char temp;
T_RST=0; //停止工作
T_CLK=0;
T_RST=1; //重新工作
write_byte(addr); //写入地址
temp=read_byte();
T_RST=0;
T_CLK=1; //停止工作
return(temp);
}
/***********************延时程序=a*1ms**************************************/
void delay(unsigned char a)
{
unsigned char i;
while(a-- !=0)
{
for(i=0;i<80;i++);
}
}
/***********************显示程序**********************************************/
/* 动态扫描条件(单个LED在1秒内): count >=50次 //点亮次数 */
/* time >=2ms //持续时间 */
/* DS1302秒,分,时寄存器是BCD码形式: 用16求商和余进行"高4位"和"低4位"分离 */
/* */
/****************************************************************************/
void led_disp(unsigned char *poi)
{
P0=seg[*poi % 16]; //第1个数码管:显示秒(个位);
LED_5=0;
delay(3);
LED_5=1;
P0=seg[*poi /16]; //第2个数码管:显示秒(十位);
LED_4=0;
delay(3);
LED_4=1;
P0=seg[*(poi+1) % 16]; //第4个数码管:显示分(个位)
LED_3=0;
delay(3);
LED_3=1;
P0=seg[*(poi+1) / 16]; //第5个数码管:显示分(十位)
LED_2=0;
delay(3);
LED_2=1;
P0=seg[*(poi+2) % 16]; //第7个数码管:显示时(个位)
LED_1=0;
delay(3);
LED_1=1;
P0=seg[*(poi+2) /16]; //第8个数码管:显示时(十位)
LED_0=0;
delay(3);
LED_0=1;/**/
}
/************************主程序**********************************************/
void main(void)
{
unsigned char clk_time[3]={0x00,0x00,0x12}; //秒,分,时寄存器初始值
unsigned char temp=0x80;
unsigned char i; //数组序号
delay(300);
write_1302(0x8e,0x00); //WP=0 写操作
for(i=0;i<3;i++)
{
write_1302(temp,clk_time
);
temp+=2;
//delay(300);
}
write_1302(0x8e,0x80); //WP=1 写保护
//delay(300);
while(1)
{
led_disp(clk_time); //发送时间到数码管显示
temp=0x81;
for(i=0;i<3;i++)
{
clk_time
=read_1302(temp); //实现每秒读时间
temp+=2;
}
}
}
d
s1302显示时间的程序
加载中...
查看其它17个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
/*************************ds1302与at89s52引脚连接********************/
sbit T_RST=P1^4; //RST脚接P3^6
sbit T_CLK=P3^6; //CLK脚接P3^5
sbit T_IO=P3^7; //IO脚接P3^4
/*************************定义数码管显示引脚*************************/
sbit LED_0=P1^4; //数码管8个控制引脚定义
sbit LED_1=P1^5;
sbit LED_2=P1^0;
sbit LED_3=P1^1;
sbit LED_4=P1^2;
sbit LED_5=P1^3;
sbit LED_6=P1^6;
sbit LED_7=P1^7;
sbit ACC0=ACC^0; //定义标志位
sbit ACC7=ACC^7;
unsigned char seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//0~~9段码
void delay(unsigned char a); //延时函数声明
/******************DS1302:写入操作(上升沿)*********************/
void write_byte(unsigned char da)
{
unsigned char i;
ACC=da;
for(i=8;i>0;i--)
{
T_IO=ACC0;
T_CLK=0;
T_CLK=1;
ACC=ACC>>1;
}
}
/******************DS1302:读取操作(下降沿)*****************/
unsigned char read_byte(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
ACC=ACC>>1;
T_CLK = 1;
T_CLK = 0;
//delay(1);
ACC7 = T_IO;
}
return(ACC);
}
/******************DS1302:写入数据(先送地址,再写数据)***************************/
void write_1302(unsigned char addr,unsigned char da)
{
T_RST=0; //停止工作
T_CLK=0;
T_RST=1; //重新工作
write_byte(addr); //写入地址
write_byte(da);
T_RST=0;
T_CLK=1;
}
/******************DS1302:读取数据(先送地址,再读数据)**************************/
unsigned char read_1302(unsigned char addr)
{
unsigned char temp;
T_RST=0; //停止工作
T_CLK=0;
T_RST=1; //重新工作
write_byte(addr); //写入地址
temp=read_byte();
T_RST=0;
T_CLK=1; //停止工作
return(temp);
}
/***********************延时程序=a*1ms**************************************/
void delay(unsigned char a)
{
unsigned char i;
while(a-- !=0)
{
for(i=0;i<80;i++);
}
}
/***********************显示程序**********************************************/
/* 动态扫描条件(单个LED在1秒内): count >=50次 //点亮次数 */
/* time >=2ms //持续时间 */
/* DS1302秒,分,时寄存器是BCD码形式: 用16求商和余进行"高4位"和"低4位"分离 */
/* */
/****************************************************************************/
void led_disp(unsigned char *poi)
{
P0=seg[*poi % 16]; //第1个数码管:显示秒(个位);
LED_5=0;
delay(3);
LED_5=1;
P0=seg[*poi /16]; //第2个数码管:显示秒(十位);
LED_4=0;
delay(3);
LED_4=1;
P0=seg[*(poi+1) % 16]; //第4个数码管:显示分(个位)
LED_3=0;
delay(3);
LED_3=1;
P0=seg[*(poi+1) / 16]; //第5个数码管:显示分(十位)
LED_2=0;
delay(3);
LED_2=1;
P0=seg[*(poi+2) % 16]; //第7个数码管:显示时(个位)
LED_1=0;
delay(3);
LED_1=1;
P0=seg[*(poi+2) /16]; //第8个数码管:显示时(十位)
LED_0=0;
delay(3);
LED_0=1;/**/
}
/************************主程序**********************************************/
void main(void)
{
unsigned char clk_time[3]={0x00,0x00,0x12}; //秒,分,时寄存器初始值
unsigned char temp=0x80;
unsigned char i; //数组序号
delay(300);
write_1302(0x8e,0x00); //WP=0 写操作
for(i=0;i<3;i++)
{
write_1302(temp,clk_time);
temp+=2;
//delay(300);
}
write_1302(0x8e,0x80); //WP=1 写保护
//delay(300);
while(1)
{
led_disp(clk_time); //发送时间到数码管显示
temp=0x81;
for(i=0;i<3;i++)
{
clk_time=read_1302(temp); //实现每秒读时间
temp+=2;
}
}
}
ds1302显示时间的程序
一周热门 更多>