准确延时,数码管显
示!用于
电子时钟#include <reg51.h>
//* 函数定义 *
void long_delay(void); // 长延时
void short_delay(void); // 短延时
void delay10ms(unsigned char); // 延时10MS
void write7279(unsigned char, unsigned char);// 写入到HD7279
unsigned char read7279(unsigned char);//从HD7279读入
void send_byte(unsigned char); // 发送一个字节
unsigned char receive_byte(void); //接收一个字节
void init_timer(); /*定时器T0初始化*/
void conv(); /*时、分、秒单元及走时单元转换*/
void dirve(); /*时间显
示程序*/
void time_adj(); /*时间调整设置*/
unsigned char digit[6];
unsigned char j;
unsigned int tmr;
unsigned long wait_cnter;
unsigned char hour=0,min=0,sec=0; /*时、分、秒单元清零*/
unsigned char deda=0; /*5mS计数单元清零*/
bit sign; //设置标志位
sbit cs=P1^5; // cs at P1.5
sbit clk=P1^4; // clk 连接于 P1.4
sbit dat=P1^3; // dat 连接于 P1.3
sbit set=P3^7; // key 连接于 P3.7
// HD7279A 指令
#define CMD_RESET 0xa4
#define CMD_TEST 0xbf
#define DECODE0 0x80
#define DECODE1 0xc8
#define CMD_READ 0x15
#define UNDECODE 0x90
#define RTL_CYCLE 0xa3
#define RTR_CYCLE 0xa2
#define RTL_UNCYL 0xa1
#define RTR_UNCYL 0xa0
#define ACTCTL 0x98
#define SEGON 0xe0
#define SEGOFF 0xc0
#define BLINKCTL 0x88
//* 主函数 *
main()
{
for (tmr=0;tmr<0x2000;tmr++); // 上电延时
send_byte(CMD_RESET); // 复位HD7279A
//
// 测试指令演
示//
send_byte(CMD_TEST); // 指令测试
for (j=0;j<3;j++) // 延时哟3秒?
{
delay10ms(100);
}
send_byte(CMD_RESET); // 清除显
示//
//时间显
示//
init_timer();/*定时器T0初始化*/
while(1)
{
if(set==0) time_adj();
conv(); /*时、分、秒单元及走时单元转换*/
dirve(); /*时、分、秒单元显
示*/
}
}
/*定时器T0 5mS初始化*/
void init_timer()
{
TMOD=0x01;
TH0=-(4800/256);
TL0=-(4800%256);
IE=0x82;
TR0=1;
}
/*5mS定时中断服务子函数*/
void zd(void) interrupt 1
{
TH0=-(4800/256);
TL0=-(4800%256);
deda++;
}
/*时、分、秒单元及走时单元转换*/
void conv()
{
if(deda>=200){sec++;deda=0;}
if(sec==60){min++;sec=0;}
if(min==60){hour++;min=0;}
if(hour==24){hour=0;}
}
void dirve()
{
digit[0]=sec%10; //计数个位
write7279(DECODE0,digit[0]); //显
示个位
digit[1]=0x80|(sec/10); //计数十位
write7279(DECODE0+1,digit[1]); //显
示十位
digit[2]=0x80|(min%10); //计数百位
write7279(DECODE0+2,digit[2]); //显
示百位
digit[3]=0x80|(min/10); //计数千位
write7279(DECODE0+3,digit[3]); //显
示千位
digit[4]=0x80|(hour%10); //计数万位
write7279(DECODE0+4,digit[4]); //显
示万位
digit[5]=hour/10; //计数十万位
write7279(DECODE0+5,digit[5]);
}
void write7279(unsigned char cmd, unsigned char dta)
{
send_byte (cmd);
send_byte (dta);
}
unsigned char read7279(unsigned char command)
{
send_byte(command);
return(receive_byte());
}
void send_byte( unsigned char out_byte)
{
unsigned char i;
cs=0;
long_delay();
for (i=0;i<8;i++)
{
if (out_byte&0x80)
{
dat=1;
}
else
{
dat=0;
}
clk=1;
short_delay();
clk=0;
short_delay();
out_byte=out_byte*2;
}
dat=0;
}
unsigned char receive_byte(void)
{
unsigned char i, in_byte;
dat=1; // 设置为输入状态
long_delay();
for (i=0;i<8;i++)
{
clk=1;
short_delay();
in_byte=in_byte*2;
if (dat)
{
in_byte=in_byte|0x01;
}
clk=0;
short_delay();
}
dat=0;
return (in_byte);
}
void long_delay(void)
{
unsigned char i;
for (i=0;i<0x30;i++);
}
void short_delay(void)
{
unsigned char i;
for (i=0;i<8;i++);
}
// * 延时 n*10ms
void delay10ms(unsigned char time)
{
unsigned char i;
unsigned int j;
for (i=0;i<time;i++)
{
for(j=0;j<0x390;j++)
{
}
}
}
/*时间调整程序*/
void time_adj()
{
if(set==0) //有键按下,判断按键时间
{
delay10ms(200); //1s延时程序
if(set==0) //大于1s,进入时间设置
{
ET0=0; TR0=0; //关定时器0
while(set==0) dirve(); //等键释放
// ET1=1;TR1=1; con=0xF3; //开定时器1,让调整位闪烁
write7279(BLINKCTL,0xF3);
do
{
while(set!=0) dirve(); //等待按键
delay10ms(100);
if(set!=0) //小于0.5s,进入分钟设置
{
while(set==0) dirve(); //等待按键释放
sign=1;
min++;
if(min==60)min=0; //分钟加1
dirve();
}
else sign=0; //大于0.5s,进入小时设置
}while(sign);
while(set==0)dirve(); //等待按键释放
// con=0xCF;
write7279(BLINKCTL,0xCF);
do
{
while(set!=0) dirve(); //等待按键
delay10ms(100);
if(set!=0) //小于0.5s,进入小时设置
{
while(set==0) dirve(); //等待按键释放
sign=1;
hour++; //小时加1
if(hour==24)hour=0;
dirve();
}
else sign=0; //大于0.5s,结束时间设置
}while(sign);
// ET1=0;TR1=0; //关定时器1
ET0=1;TR0=1; //开定时器0
write7279(BLINKCTL,0xFF);
}
else //小于1s,进入省电模式
{
ET0=1; TR0=1; //开定时器0
while(set!=0); //等待按键
do
{
dirve(); //有键按下,调显
示程序消抖
}while(set!=0); //是干扰则继续循环
}
while(set==0) dirve(); //等待按键释放
}
else ; //无键按下,跳出按键扫描程序
到此这篇51单片机电子时钟秒表(51单片机 时钟)的文章就介绍到这了,更多相关内容请继续浏览下面的相关 推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/80756.html