avr 74hc595驱动数码管动态显示c语言例程,用C51编写的74HC595驱动数码管通用程序,可显示浮点数...

该博客详细介绍了如何使用C51语言编写程序,通过74HC595芯片驱动数码管显示浮点数。程序包括AD转换、数据处理和数码管驱动等部分,涉及到了浮点数到整数的转换、数码管段码表及74HC595的控制时序。同时,文章提供了中断服务子程序用于实时更新显示,并给出了完整的定时器和中断初始化设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原标题:用C51编写的74HC595驱动数码管通用程序,可显示浮点数

#

#include /*used for _nop_() function*/

sbit SDATA_=P1^3 ;/*串行数据输入*/

sbit SCLK_595 = P1^1;/*移位时钟脉冲*/

sbit RCK_595 =P1^2 ; /*输出锁存器控制脉冲*/

#AD_WR WR

#define AD_RD RD

#define AD_INTR INT0 /*51的相应连接ADC0804的三个控制端口*/

//#define Vin_Max 5

static unsigned char data num1=15; /*存放AD转换数据的*/

/****************************************************************/

unsigned char code Dig_Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,

0x88,0x82,0xc6,0xa1,0x84,0x8e};/*0到F的共阳段码表*/

//unsigned char data Dis_Tab[1]={0x00,0x01,0xff,0x02,0xff,0x04,0xff,0x08,0xff,0x10,0xff,0x20,0xff,0x40,0xbf,0x80,

// 0xbf};

unsigned char data Dis_Tab[17]={0x00,0x01,0xf7,0x02,0xf7,0x04,0xf7,0x08,0xff,0x10,0x7f,0x20,0xbf,0x40,0xbf,0x80,

0xbf};

/****************************************************************/

/* 更新显示数组Dis_Tab[]函数Dis_Updata()*/

Dis_Updata()

{

/*数据访问通过全局的num1*/

//unsigned char data temp1;

///

float data te; //定义存放计算得到的电压值

unsigned g data tem;

// {

// temp1=num1;

// num1&=0x0F;/*屏蔽高四位*/

// Dis_Tab[16]=Dig_Tab[num1]; /*A为代显示数据*/

/*Dig_Tab[]数组为段码表,序号A值用来检索对应段码,同时赋制值更新显示表*/

// num1=temp1;

// /*此语句编译时有问题,rires ANSI-style proto;mng function-proype*/

// /*asm ("SWAP num1;" );*/

// /*用C实现高低四位交换程序如下,一个问题ACC是否为带符号数*/

// num1>>=4;

// num1&=0x0F;

// Dis_Tab[14]=Dig_Tab[num1];

// }

//添加/

temp2=(num1*5)/255.0;

//temp2=(num1*5)/0xFF+((num1*5)%0xFF); 此除法运算有问题

if(temp2<0)

{

Dis_Tab[8]=0xbf; //若小于零,显示负号

//temp2=(-temp2); //若是负数,取正

}

temp2*=1000; //扩大1000倍,分别提取各个位的数值

temp3=temp2;

// temp3=( unsigned long)temp2; //强制转换为长整型

Dis_Tab[10]=Dig_Tab[temp3/1000]&0x7f; //数制转化,向高看齐,必须的用长整型,浮点数不可

Dis_Tab[12]=Dig_Tab[temp3/100%10];

Dis_Tab[14]=Dig_Tab[temp3%100/10];

Dis_Tab[16]=Dig_Tab[temp3%10];

}

/****************************************************************/

/*延时void Delay(unsinged char data i)*/

void Delay1(unsigned char i)

{

(--i);

}

/****************************************************************/

/* 精确延时e=2i+4,at 12MHZ AXIAL*/

void Delay2(unsigned char data j)

{

while(--j);

}

/****************************************************************/

/*InAD转换结束读取数据程序*/

void Int0_ISR(void) 0

{

AD_RD=0; /*开始读数据*/

num1=P0; /*读人数据*/

AD_RD=1;

Dis_Updata();

}

/****************************************************************/

/*A/D数据采集子程序ADC0804*/

void AD_start(void)

{

AD_WR=0;

_nop_();

_nop_();

AD_WR=1; /*写信号,启动AD转换*/

}

/****************************************************************/

/*T0中断程序,定时启动AD转换*/

void T0_ISR(void) interrupt 1

{

TL0=0x00;

TH0=0x00;

///

AD_start(); /* 每隔0.256ms启动一次AD*/

Dis_Updata();

}

/****************************************************************/

/*、、TNT0中断 初始化函数*/

void Init_Mcu51(void)

{

//TMOD|=0x22;/*T1波特率发生,MODE=2;T0为8位自动重装,*/

TMOD|=0x21;/*T1波特率发生,MODE=2;T0为16位,*/

TL1=0xF4;

TH1=0xF4; /*2400bps @AXIAL=11.0592MHZ*/

TL0=0x00;

TH0=0x00; /*定时时间为0.256ms*/

IT0=1; //下降沿触发

TR1=1; /*start T1*/

TR0=1;

SCON|=0x52;/*MODE=1,TI=1*/

IE=0x83; /*开INT0,开T0,总中断*/

}

/****************************************************************/

/*写数据到函数*/

void WR_595(unsigned char data num2 )

{

unsigned char data count1;

for(count1=0;count1<=7;count1++)

{

if((num2&0x80)==0x80) /*最高位为1,则向SDATA_595发送1*/

SDATA_595=1;/*发出数据的最高位*/

e

SDATA_595=0;

num2<<=1; /*右移位*/

SCLK_595=0;

_nop_();

_nop_();

SCLK_595=1; /*上生沿*/

}

}

/****************************************************************/

/*更新74HC595输出数据函数void Out_595(void)*/

void Out_595(void)

{

RCK_595=0;

_nop_();

_nop_();

RCK_595=1; /*上升沿锁存数据*/

}

/****************************************************************/

/*驱动程序void Led_Drive(void)*/

void Led_Drive(void)

{

unsigned char data Dis_Count;

while(1)

{ ++num1;

for(Dis_Count=1;Dis_Count<=16;Dis_Count++)

{

WR_595(Dis_Tab[Dis_Count]);

if(Dis_Count%2==0) /*判断若传完两个字节数据,则更新74HC595输出数据,并延时*/

{

Out_595();

//Delay1(1);

}

}

}

}

/****************************************************************/

main()

{

//P0=0xff;

//P1=0xff;

Init_Mcu51();

Led_Drive(); //自身是个无限循环显示的程序

}

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值