51单片机+DS1302+数码管制作时钟
实验目的:
用51单片机+时钟芯片DS1302+7段数码管制作时钟。
6个7段数码管,单片机IO口不够用,增加移位74HC164,串口驱动。
这个带来了个问题,串口速度太慢,6个数码管,移位的时间已经长到肉眼可见,所以显示效果是一闪一闪的。
准备换液晶屏重新做一个,这个算是初稿,仅当记录一下吧。
proteus原理图:
代码:
#include <reg51.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit DAT=P3^0;
sbit CLK=P3^1;
sbit CLR=P3^2;
sbit LED_ON=P3^3;
sbit RTC_DAT=P1^0;
sbit RTC_CLK=P1^1;
sbit RTC_RST=P1^2;
uchar code num[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar yy,mm,dd,hh,mm,ss;
//延时10ms
void delay10ms(uint n)
{
uchar i,j;
for(;n>0;n--)
{
for(i=0;i<18;i++)
{
for(j=0;j<184;j++){;}
}
}
}
//DS1302写8位地址和数据
void RTC_wcom(uchar addr,uchar wdata)
{
uchar i,j;
RTC_RST=0;
RTC_CLK=1;
RTC_RST=1;
for(i=0;i<8;i++)
{
RTC_DAT=addr >> i & 0x01;
RTC_CLK=0;
RTC_CLK=1;
}
for(j=0;j<8;j++)
{
RTC_DAT=wdata >> j & 0x01;
RTC_CLK=0;
RTC_CLK=1;
}
RTC_CLK=1;
RTC_RST=0;
}
//DS1302读数据
int RTC_rcom(uchar addr)
{
uchar i,rdata=0;
RTC_RST=1;
for(i=0;i<8;i++)
{
RTC_CLK=0;
RTC_DAT=addr>>i & 0x01;
RTC_CLK=1;
}
for(i=0;i<8;i++)
{
RTC_CLK=1;
RTC_CLK=0;
if(RTC_DAT)
rdata |= (0x01<<i);
}
RTC_DAT=0;
RTC_CLK=1;
RTC_RST=0;
return rdata;
}
//DS1302初始化
void RTC_init(void)
{
RTC_wcom(0x8e,0x00); //00允许写,80写保护
RTC_wcom(0x8c,0x00); //年,00~99,初始00
RTC_wcom(0x88,0x01); //月,01~12,初始01
RTC_wcom(0x86,0x01); //日,01~31,初始01
RTC_wcom(0x84,0x12); //时,00~23,初始12
RTC_wcom(0x82,0x00); //分,00~59,初始00
RTC_wcom(0x80,0x00); //秒,00~59,初始00
}
//装载数据
void num_wr(uchar n)
{
uchar i;
for(i=0;i<8;i++)
{
CLK=0;
DAT=(num[n]>>(7-i)) & 0x01;
CLK=1;
}
}
void display(void)
{
CLR=1;
LED_ON=1;
num_wr(ss%16); //寄存器的数据都是0~9的,16进制与10进制相同
num_wr(ss/16); //所以可以不转化为10进制,直接取高位低位
num_wr(mm%16);
num_wr(mm/16);
num_wr(hh%16);
num_wr(hh/16);
LED_ON=0;
delay10ms(100);
}
void main(void)
{
RTC_init();
while (1)
{
yy=RTC_rcom(0x8d);
mm=RTC_rcom(0x89);
dd=RTC_rcom(0x87);
hh=RTC_rcom(0x85);
mm=RTC_rcom(0x83);
ss=RTC_rcom(0x81);
display();
}
}
CuPhoenix: Bypass指的是旁路时钟源(BYPASS Clock Source),直接从SOC_IN导入外部时钟信号
zzh113: 这代码没出现amp呀,不应该啊,你能把报错原文贴一下吗?
m0_68319085: 报错,显示未定义amp
zzh113: num[] 这个数组就是显示数字的,只要在这个地方更改或增加,然后在对应的调用这个数组的代码中修改一下就可以了
零星的雨384: 再加数字的话要怎么显示,求