找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

用单片机制作一个数码管时钟—可中断调时间

[复制链接]
admin 发表于 2012-9-2 09:36:10 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
主函数
#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
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 13:51 , Processed in 0.050912 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表