当前位置:网站首页 > 编程语言 > 正文

51单片机电子时钟秒表(51单片机 时钟)

准确延时,数码管显

!用于

电子时钟

#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单片机 时钟)的文章就介绍到这了,更多相关内容请继续浏览下面的相关 推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 一级毕业论文一二三级标题_论文一二三级标题排版二级毕业论文一二三级标题_论文一二三级标题排版三级毕业论文一二三级标题_论文一二三级标题排版字体字号(一级毕业论文一二三级标题_论文一二三级标题排版二级毕业论文一二三级标题_论文一二三级标题排版三级毕业论文一二三级标题_论文一二三级标题排版字体字号论文)2025-01-07 22:54:07
  • 网页聊天源码是什么(网页在线聊天源码)2025-01-07 22:54:07
  • dos命令安装win98(dos命令安装xp)2025-01-07 22:54:07
  • linux 命令安装(linux 命令安装libva)2025-01-07 22:54:07
  • 断开连接是什么意思(红外设备已断开连接是什么意思)2025-01-07 22:54:07
  • win7虚拟机镜像文件下载(虚拟机windows7镜像文件下载)2025-01-07 22:54:07
  • 配置ssh免密登录(配置ssh免密登录,并进行验证,结果拍照上传)2025-01-07 22:54:07
  • ewm焊机参数设置(ewm500焊机)2025-01-07 22:54:07
  • vs什么意思啊(vs是什么意思呀)2025-01-07 22:54:07
  • 单片机程序的入口地址是(单片机程序的入口地址是0000H,外部中断1的入口地址是)2025-01-07 22:54:07
  • 全屏图片