新手自学单片机,求6位数码管时钟电路+程序,我手上只有一块STC 89C516RD和几块数码管,求简单点的电路。

新手自学单片机,求6位数码管时钟电路+程序,我手上只有一块STC 89C516RD和几块数码管,求简单点的电路。,第1张

#include<reg51h>

#define uchar unsigned char

uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9

unsigned char sec=0,min=0,hour=12,scanled;

unsigned char key,flashbit,mode,time;

unsigned char disdat[6];

sbit led=P1^0;

void delay(unsigned int x)

{

unsigned int i,j;

for(i=0;i<x;i++)

for(j=0;j<120;j++);

}

void dischg()

{

disdat[0]=sec%10;

disdat[1]=sec/10;

disdat[2]=min%10;

disdat[3]=min/10;

disdat[4]=hour%10;

disdat[5]=hour/10;

}

void flash()

{

switch(flashbit)

{

case 0:break;

case 1:

disdat[4]=0x10;

disdat[5]=0x10;

delay(50);

dischg();

delay(80);

break;

case 2:

disdat[2]=0x10;

disdat[3]=0x10;

delay(50);

dischg();

delay(80);

break;

case 3:

disdat[0]=0x10;

disdat[1]=0x10;

delay(50);

dischg();

delay(80);

break;

default:break;

}

}

void t0isr() interrupt 1 //秒计时

{

TH0=0x3c;

TL0=0xb0;

time++;

switch(mode)

{

case 0:

if(time==20)

{

time=0;

sec++;

if(sec>59)

{

sec=0;

min++;

if(min>59)

{

hour++;

if(hour>23)hour=0;

}

}

}

break;

case 1:

if(time==20)

{

time=0;

if(sec>0)sec--;

else if(min>0){sec=59;min--;}

else if(hour>0){sec=59;min=59;hour--;}

else {hour=0;min=0;sec=0;}

}

break;

}

dischg();

}

void t1isr() interrupt 3 //显示

{

TH1=0xec;

TL1=0x78;

switch(scanled)

{

case 0:

P2=0x08;

P0=ledtab[disdat[5]];

break;

case 1:

P2=0x09;

P0=ledtab[disdat[4]];

break;

case 2:

P2=0;

P0=ledtab[disdat[3]];

break;

case 3:

P2=0x0b;

P0=ledtab[disdat[2]];

break;

case 4:

P2=0x0c;

P0=ledtab[disdat[1]];

break;

case 5:

P2=0x0d;

P0=ledtab[disdat[0]];

break;

default:break;

}

scanled++;

scanled%=6;

}

main()

{

TMOD=0x11;

TH0=0x3c;

TL0=0xb0;

TH1=0xec;

TL1=0x78;

EA=1;

TR1=1;

ET0=1;

ET1=1;

sec=0;

min=0;

hour=12;

flashbit=0;

scanled=0;

time=0;

mode=0;

dischg();

while(1)

{

flash();//闪烁

// led=1;

if((P3&0x0f)!=0x0f){

key=P3&0x0f;

while((P3&0x0f)!=0x0f);

led=0;

delay(10);

key|=0xf0;

switch(~key)

{

case 0x01: //p31选择调时、分、秒

TR0=0;

flashbit+=1;

if(flashbit>3){flashbit=0;TR0=1;}

break;

case 0x02: //p32调数

if(flashbit==0)break;

if(flashbit==1)

{

hour++;

if(hour>99)hour=0;

}

if(flashbit==2)

{

min++;

if(min>59)min=0;

}

if(flashbit==3)

{

sec++;

if(sec>59)sec=0;

}

break;

case 0x04: //选择正/倒

TR0=0;

mode++;

mode&=0x01;

if(mode==0){sec=0;min=0;hour=0;}

dischg();

break;

case 0x08: //启动/暂停

TR0=~TR0;

break;

default:break;

}

}

}

}

有些STC单片机如STC12C56系列16AD及以上的型号出厂标准配置是外部晶体或外部时钟,以下型号的出厂配置是内部时钟,且除30AD以外,其它型号都可以在编程时在页面选择内部还是外部时钟,30AD只能使用外部时钟。

首先配置它的时钟源

初始化比较器(可以设置成自动重载)

设置一个初始值

如果是向下计数的话就是从这个值开始一直减到0

开启中断

当减到0时条件满足产生比较中断

写程序的话按照这个步骤应该就可以调通了。

首先在主程序中注释掉SystemInit();

然后使用下面的函数做为系统时钟的初始化函数

void RCC_Configuration(void)

{

RCC_DeInit();//将外设 RCC寄存器重设为缺省值

RCC_HSICmd(ENABLE);//使能HSI

while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);//等待HSI使能成功

//FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

//FLASH_SetLatency(FLASH_Latency_2);

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div2);

RCC_PCLK2Config(RCC_HCLK_Div1);

//设置 PLL 时钟源及倍频系数

RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_2);//使能或者失能 PLL,这个参数可以取:ENABLE或者DISABLE

RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,那么它不能被失能

//等待指定的 RCC 标志位设置成功 等待PLL初始化成功

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

//设置系统时钟(SYSCLK) 设置PLL为系统时钟源

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择想要的系统时钟

//等待PLL成功用作于系统时钟的时钟源

// 0x00:HSI 作为系统时钟

// 0x04:HSE作为系统时钟

// 0x08:PLL作为系统时钟

while(RCC_GetSYSCLKSource() != 0x08);//需与被选择的系统时钟对应起来,RCC_SYSCLKSource_PLL

}

void RCC_Configuration(void)

{

RCC_DeInit();//将外设 RCC寄存器重设为缺省值

RCC_HSICmd(ENABLE);//使能HSI

while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);//等待HSI使能成功

//FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

//FLASH_SetLatency(FLASH_Latency_2);

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div2);

RCC_PCLK2Config(RCC_HCLK_Div1);

//设置 PLL 时钟源及倍频系数

RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_2);//使能或者失能 PLL,这个参数可以取:ENABLE或者DISABLE

RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,那么它不能被失能

//等待指定的 RCC 标志位设置成功 等待PLL初始化成功

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

//设置系统时钟(SYSCLK) 设置PLL为系统时钟源

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择想要的系统时钟

//等待PLL成功用作于系统时钟的时钟源

// 0x00:HSI 作为系统时钟

// 0x04:HSE作为系统时钟

// 0x08:PLL作为系统时钟

while(RCC_GetSYSCLKSource() != 0x08);//需与被选择的系统时钟对应起来,RCC_SYSCLKSource_PLL

}

补充一点:

由图可以看出系统时钟的供给可以有3种方式,HSI,HSE,PLL。如果选用内部时钟作为系统时钟,其倍频达不到72Mhz,最多也就8Mhz/216 = 64Mhz。

STC单片机PC端ISP下载控制软件Ver488

非安装版,解压后直接执行

>

以上就是关于新手自学单片机,求6位数码管时钟电路+程序,我手上只有一块STC 89C516RD和几块数码管,求简单点的电路。全部的内容,包括:新手自学单片机,求6位数码管时钟电路+程序,我手上只有一块STC 89C516RD和几块数码管,求简单点的电路。、STC单片机第一次烧写程序是否一定要用内部时钟、stc单片机内部比较器怎么使用求大神讲解,最好带一个例程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10116575.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存