⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2bcd.c

📁 实现多字节二进制转BCD码功能
💻 C
字号:
#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

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -