4位数码管中间的时钟点应该接在52单片机的哪两个引脚上?
答案:2 悬赏:70 手机版
解决时间 2021-02-20 17:28
- 提问者网友:疯孩纸
- 2021-02-20 02:33
4位数码管中间的时钟点应该接在52单片机的哪两个引脚上?
最佳答案
- 五星知识达人网友:像个废品
- 2021-02-20 03:30
任意两个I/o口,关键是看程序怎样设定。
全部回答
- 1楼网友:时间的尘埃
- 2021-02-20 03:46
我也是新手但研究ds1302加ds18b20已经半年了,写了很多程序,大体上有两种方案,一种是io口直接驱动数码管,这种方式程序简单,但缺点很明显,占io口资源太多,而且最关键的一点就是必须采用单片机动态扫描数码管,在简单还行,复杂一点的如加按键闹钟温度什么的,在调时或有时数码管会出现不可避免的闪烁,自己玩玩还行,做成实用的产品就不行了。第二种是采用驱动芯片,如max7219,这样扫描电路由芯片完成,单片机只把数据送给芯片就行,完全不必担心闪烁的困扰。
你的电路是io口驱动,我先给你个io口的吧,我开发板上段选和位选分别接了两个d触发器,你根据你的电路在改一下就行,ds1302的三个口也得改一下,不过这个电路在扫描时温度会有抖动,是因为中断扫描打断了ds1302和ds18b20的时序,他们都是非常严格的时序器件,网上有人提出的解决办法是在进入时序函数之前关中断,但延时效果更差,如果去掉一个ds18b20就没问题了。程序给你自己研究吧,我还有一个用max7219驱动带按键的,比这个好的多,接近产品了,想要给你。
#include
#include
sbit sclk=p2^2; //ds1302时钟信号
sbit dio=p2^1; //ds1302数据信号
sbit ce=p2^0; //ds1302片选信号
sbit acc_7=acc^7;
sbit dq=p2^4; //ds18b20总线
sbit p0_0=p0^0;
sbit p0_1=p0^1;
unsigned char code a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
unsigned char shi,ge,i=0;
char hour,minute,second;
void startt0()
{
tmod=0x01;
th0=(65536-500)/256;
tl0=(65536-500)%256;
et0=1;
ea=1;
tr0=1;
}
//************ds1302操作子程序********************************************
void write(unsigned char addr,dat)//写一个字节子函数
{
unsigned char i,n;
ce=0;
sclk=0;
ce=1;
for(i=0;i<8;i++)//发送地址
{
sclk=0;
n=addr;
dio=n&0x01;
addr>>=1;
sclk=1;
}
for(i=0;i<8;i++)//发送数据
{
sclk=0;
n=dat;
dio=n&0x01;
dat>>=1;
sclk=1;
}
ce=0;
}
unsigned char read( unsigned char addr)//读一个字节
{
unsigned char i,m,dat1;
ce=0;
sclk=0;
ce=1;
for(i=0;i<8;i++)//发送地址
{
sclk=0;
m=addr;
dio=m&0x01;
addr>>=1;
sclk=1;
}
for(i=0;i<8;i++)
{
acc_7=dio;
sclk=1;
acc>>=1;
sclk=0;
}
ce=0;
dat1=acc;
return dat1;
}
//*****************ds18b20操作子程序***********************************
void delay1( unsigned int a)// 延时
{
while(--a);
}
void write18(unsigned char dat)//写数据
{
unsigned char i;
for(i=0;i<8;i++)
{
dq=0;
dq=dat&0x01;
delay1(5);
dq=1;
dat>>=1;
}
}
unsigned char read18()//读数据
{
unsigned char i,dat=0;
dq=1;
_nop_();
for(i=0;i<8;i++)
{
dq=0;
_nop_();
_nop_();
dat>>=1;
dq=1;
_nop_();
_nop_();
if(dq)
dat|=0x80;
delay1(30);
dq=1;
}
return dat;
}
void start18()//**********ds18b20初始化**************
{
dq=1;
delay1(8);
dq=0;
delay1(90);
dq=1;
_nop_();
_nop_();
delay1(100);
dq=1;
}
//*******************初始化************************************
void start()
{
write(0x8e,0x00); //去掉写保护
write(0x80,0x00); //秒初始化
write(0x82,0x00); //分初始化
write(0x84,0x00); //时初始化
write(0x8e,0x80); //写保护开启
}
void du()
{
unsigned char w,b,c;
unsigned int a,bb ;
ea=1;
w=read(0x81);
b=w&0x0f;
c=(w&0x70)>>4;
second=c*10+b;
w=read(0x83);
b=w&0x0f;
c=(w&0x70)>>4;
minute=c*10+b;
w=read(0x85);
b=w&0x0f;
c=(w&0x30)>>4;
hour=c*10+b;
start18();
write18(0xcc);
write18(0x44);
start18();
write18(0xcc);
write18(0xbe);
a=read18();
bb=read18();
ea=1;
bb=((bb&0x03)<<4)+((a&0xf0)>>4);
shi=bb/10;
ge=bb%10;
}
int main()
{
start();
startt0();
while(1){du();
}
return 0;
}
void t0() interrupt 1
{
th0=(65536-500)/256;
tl0=(65536-500)%256;
switch(i)
{case 0:{p1=a[hour/10];p0_0=1;p0_0=0;p1=~0x01;p0_1=1;p0_1=0;}break;
case 1:{p1=a[hour%10];p0_0=1;p0_0=0;p1=~0x02;p0_1=1;p0_1=0;}break;
case 2:{p1=a[minute/10];p0_0=1;p0_0=0;p1=~0x04;p0_1=1;p0_1=0;}break;
case 3:{p1=a[minute%10];p0_0=1;p0_0=0;p1=~0x08;p0_1=1;p0_1=0;}break;
case 4:{p1=a[second/10];p0_0=1;p0_0=0;p1=~0x10;p0_1=1;p0_1=0;}break;
case 5:{p1=a[second%10];p0_0=1;p0_0=0;p1=~0x20;p0_1=1;p0_1=0;}break;
case 6:{p1=a[shi];p0_0=1;p0_0=0;p1=~0x40;p0_1=1;p0_1=0;}break;
case 7:{p1=a[ge];p0_0=1;p0_0=0;p1=~0x80;p0_1=1;p0_1=0;}break;
}
i++;
if(i==8)i=0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯