#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar bcdnumber[20];
uchar secondnumber[15]={255,255,255,255,255,255,0};
void init();
void second_to_bcd(uchar , uchar secondnumber[10],uchar bcdnumber[20]);
void send(uchar);
void delay_ms(unsigned int ms) //延时1MS,备用
{
unsigned int i,j;
for( i=0;i<ms;i++)
for(j=0;j<1000;j++);
}
void main()
{
uchar number;
init();
second_to_bcd(6,secondnumber,bcdnumber);
for(number=0;number<15;number++)
{
send(bcdnumber[number]);
// delay_ms(100);
}
while(1);
}
void second_to_bcd(uchar byte_number, uchar secondnumber[15], uchar bcdnumber[20])
{
uchar secondnumber_bit,i,j,k,high_bit;
uchar di_byte,gao_byte,ac=0,last_high_bit;
uchar control; //用于控制BCD码转换时循环次数
uint bcdjinwei; //BCD码*2加进位缓存
secondnumber_bit=8*byte_number; //二进制总位数
for(i=0;i<20;i++) //用于清bcdnumber[20]为0
{ bcdnumber[i]=0; }
for(i=0;i<secondnumber_bit;i++)
{
// 将整个二进制数移位
high_bit=0; //字节高位的标志,相当于汇编中的进位标志c
last_high_bit=0;
for(j=0;j<byte_number;j++)
{
high_bit=secondnumber[j]&0x80;
if(high_bit==0x80)high_bit=1;
else high_bit=0;
secondnumber[j]=secondnumber[j]<<1;
if(last_high_bit==1) //如果低位有进位标志
{secondnumber[j]=secondnumber[j]+1;}
last_high_bit=high_bit; //存本次最高位
}
//出口为多字节二进制的最高位high_bit
ac=0;
if(byte_number>4) control=byte_number+1; //原先算法中有bug,当超过4字节时会丢掉前面一些位,此句保证8字节不丢
else control=byte_number;
for(k=0;k<(control+1);k++)
{
if(high_bit==1) bcdjinwei=bcdnumber[k]*2+1;
else bcdjinwei=bcdnumber[k]*2;
di_byte=bcdnumber[k]&0x0f; //取BCD数组中该字节的低四位
if((di_byte*2+high_bit)>9) //进行DA调整,分高四位和第四位,先判断调整低四位
{
ac=1; //底4位的辅助进位标志
bcdjinwei=bcdjinwei+0x06;
}
else
{
ac=0;
}
gao_byte=bcdnumber[k]&0xf0; //取高四位
gao_byte=gao_byte>>4; //把所取的高四位移到低四位以便处理
if((gao_byte*2+ac)>9)
{
high_bit=1;
bcdjinwei=bcdjinwei+0x60;
}
else
{
high_bit=0;
}
bcdnumber[k]=bcdjinwei; //存本次单个字节转换结果
}
}
}
void send(uchar sendchar)
{
SBUF=sendchar;
while(TI==0);
TI=0;
}
void init()
{
TMOD=0x20; //定时器1,工作在模式1
TL1=0xfd;
TH1=0xfd; //22.1184MHZ,19200bit/s
SCON=0x50; //串口工作在模式1,REN=1
IT1=1; //外部中断1设置为下降沿触发
// IE=0x9C; //EA,ES,ET1,EX1,如果改成0x94不行
TR1=1; //启动定时器1
}