4487|2

4

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

用单片机制作一个数码管时钟—可中断调时间 [复制链接]

主函数

#include "main.h"
#include "time.h"
#include "seg7.h"
#include "extern_int.h"
unsigned char s=0,m=0,h=0;
sbit h_button=P3^3;
sbit m_button=P3^4;
void delay(unsigned long n)
{
  for(;n>0;n--);
}

void main(void)
 {
 
   EA=1;//中断器总开关
   init_timer0();//初始化定时器0
   extern_int0_init();//初始化外部中断0
     while(1)
    {
   disp_u8(h,m,s);
   if(h_button==0)
   {
  h++;
  while(!h_button);
   }
   if(m_button==0)
   {
  m++;
  while(!m_button);
   }
   if(timer_int_times==20)
   {
     s++;
  timer_int_times=0;
   }
  if(s==60)
 {
  s=0;
  m++;
 }
 if(m==60)
 {
   m=0;
   h++;
 }
 if(h==24)
 {
   h=0;
 }
  
      disp_fresh();
    }

 }

 

主函数头文件

#ifndef _MAIN_H_
#define _MAIN_H_
#include <reg52.h>
typedef unsigned char u8;
extern void delay(unsigned long n);
extern unsigned char int_flag;
#endif

定时器函数

#include "main.h"
#include "time.h"

unsigned int timer_int_times=0;//定时器中断次数

void timer0_int(void) interrupt 1 //50ms就会中断到这里
{
  TH0=0x3C; //高8位
  TL0=0xB0; //低8位
  timer_int_times++;
}

void init_timer0(void)
{
   TMOD=0x01;//定时器0工作方式0;
   TR0=1; //定时器0运行控制位:由软件决定开启关闭定时器;
   ET0=1;//定时器0 源允许开关 开启;
   /*定时器在方式1工作是16位计数器最大值65536-50ms也就是50000个机器周期=65536-50000=15536 也就是3CB0*/
   TH0=0x3C; //高8位
   TL0=0xB0; //低8位
  
}

定时器函数头文件

#ifndef _TIME_H_
#define _TIME_H_
extern void timer0_int(void);
extern void init_timer0(void);
extern unsigned int timer_int_times;
#endif

8段数码管函数

#include "main.h"
#include "sge7.h"
#define SEG7_0_ON P2=0
#define SEG7_1_ON P2=1
#define SEG7_2_ON P2=2
#define SEG7_3_ON P2=3
#define SEG7_4_ON P2=4
#define SEG7_5_ON P2=5
#define SEG7_6_ON P2=6
#define SEG7_7_ON P2=7
#define SYM_BLANK 10//空白段码
#define SYM_LIN 11//中横线
u8 disp_mem[9];
unsigned char code SEG_MASK[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0,0x40};

void disp_seg7(unsigned char digital)
{
    P0=SEG_MASK[digital];//输出断码
}


void disp_u8(u8 x,u8 y,u8 z)
{
 disp_mem[0]=x/10;
 disp_mem[1]=x%10;
 disp_mem[2]=SYM_LIN;
 disp_mem[3]=y/10;
 disp_mem[4]=y%10;
    disp_mem[5]=SYM_LIN;
 disp_mem[6]=z/10;
 disp_mem[7]=z%10;
}

void disp_fresh(void)
{
   SEG7_0_ON;
   disp_seg7(disp_mem[0]);
   delay(50);
   SEG7_1_ON;
   disp_seg7(disp_mem[1]);
   delay(50);
   SEG7_2_ON;
   disp_seg7(disp_mem[2]);
   delay(50);
   SEG7_3_ON;
   disp_seg7(disp_mem[3]);
   delay(50);
   SEG7_4_ON;
   disp_seg7(disp_mem[4]);
   delay(50);
   SEG7_5_ON;
   disp_seg7(disp_mem[5]);
   delay(50);
   SEG7_6_ON;
   disp_seg7(disp_mem[6]);
   delay(50);
   SEG7_7_ON;
   disp_seg7(disp_mem[7]);
   delay(50);

    
}

 

8段数码管头文件

#ifndef _SEG7_H_
#define _SEG7_H_
extern void disp_seg7(unsigned char digital);
extern void disp_u8(u8 x,u8 y,u8 z);
extern void disp_fresh(void);
#endif

外部中断0文件

#include "main.h"
#include "extern_int.h"
unsigned char int_flag=1;
void extern_int0_init(void)
{
  EX0=1;//打开外部中断0 中断源允许
  IT0=1;//中断方式为下降沿触发
  PX0=1;//设置高优先级
}

void extern_int0(void) interrupt 0 //外部中断0
{
   
 if(int_flag)
 {
  TR0=0;//停止外部定时器0
 }
 else
 {
  TR0=1;
 }
 int_flag=!int_flag;
}

 

外部中断头文件

#ifndef _EXTERN_INT_H_
#define _EXTERN_INT_H_
extern void extern_int0_init(void);
extern void extern_int0(void);
#endif


此帖出自51单片机论坛

最新回复

https://bbs.eeworld.com.cn/viewt ... =page%3D1&frombbs=1  详情 回复 发表于 2015-6-23 15:47
点赞 关注
 

回复
举报

3836

帖子

19

TA的资源

纯净的硅(中级)

沙发
 
谢谢分享
此帖出自51单片机论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表