【文件属性】:
文件名称:用51单片机制作电子时钟
文件大小:24KB
文件格式:RAR
更新时间:2013-11-29 04:43:26
7279显示数码管
准确延时,数码管显示!用于电子时钟
#include
//*** 函数定义 ***
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