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

51单片机电子时钟秒表(51单片机 时钟)准确延时 数码管显示 用于电子时钟 include lt reg51 h gt 函数定义 void long delay void 长延时 void short delay void 短延时 void delay10ms unsigned char 延时 10MS void write7279 unsigned char

大家好,我是讯享网,很高兴认识大家。

准确延时,数码管显!用于电子时钟 #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&lt;3;j++) // 延时哟3秒? { delay10ms(100); } send_byte(CMD_RESET); // 清除显<em>示</em> 

// //时间显 //

 init_timer();/*定时器T0初始化*/ while(1) { if(set==0) time_adj(); conv(); /*时、分、秒单元及走时单元转换*/ dirve(); /*时、分、秒单元显<em>示</em>*/ } 

} /定时器T0 5mS初始化/ void init_timer() { TMOD=0x01; TH0=-(4800256); TL0=-(4800%256); IE=0x82; TR0=1; } /5mS定时中断服务子函数/ void zd(void) interrupt 1 { TH0=-(4800256); TL0=-(4800%256); deda++; } /时、分、秒单元及走时单元转换/ void conv() {

讯享网 if(deda&gt;=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]); //显<em>示</em>个位 digit[1]=0x80|(sec/10); //计数十位 write7279(DECODE0+1,digit[1]); //显<em>示</em>十位 digit[2]=0x80|(min%10); //计数百位 write7279(DECODE0+2,digit[2]); //显<em>示</em>百位 digit[3]=0x80|(min/10); //计数千位 write7279(DECODE0+3,digit[3]); //显<em>示</em>千位 digit[4]=0x80|(hour%10); //计数万位 write7279(DECODE0+4,digit[4]); //显<em>示</em>万位 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&lt;8;i++) { if (out_byte&amp;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&lt;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&lt;0x30;i++); 

} void short_delay(void) {


讯享网

 unsigned char i; for (i=0;i&lt;8;i++); 

} // * 延时 n*10ms void delay10ms(unsigned char time) {

讯享网 unsigned char i; unsigned int j; for (i=0;i&lt;time;i++) { for(j=0;j&lt;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(); //有键按下,调显<em>示</em>程序消抖 }while(set!=0); //是干扰则继续循环 

}

 while(set==0) dirve(); //等待按键释放 

} else ; //无键按下,跳出按键扫描程序 }

小讯
上一篇 2025-05-11 23:37
下一篇 2025-04-16 12:54

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/168347.html