单片机
返回首页

51单片机-数据类型强制转换

2021-08-25 来源:eefocus

1.实用性改善


为了使上一讲的功能更加完善,我们编写新的实用型的代码,效果是让数码管显示的数就是输入引脚高电平持续的微秒数,最高能捕获到999999微秒。如果高电平持续的时间超出这个取值范围,那么数码管不够显示,所以超出范围的话我们就让6个数码管显示    FFFFFF。


因为计数器计时到65535之后就会产生溢出,也就是超过71ms就会溢出一次,我们知道计数器溢出也是会产生中断的,所以在中断函数里我们实现让变量x简单的自加1表明时间过去了71毫秒左右。


假设高电平持续的时间有75毫秒左右,那么得出最后的微秒数就是


x*71111+(TH0*256+TL0)*(12/11059200)*1000000;


现在我们首次使用float类型的变量,第一次使用带小数点的数据类型。


不同的数据类型之间运算要进行强制转换,请参考《手把手教你学51单片机》文档10.1.1节。


我们定义的float类型变量capture_val就是用来记录持续高电平的微秒数。请看以下三段代码


capture_val=(float)TH0*256.0+(float)TL0;

capture_val=(capture_val*12.0)/11.0592;

capture_val=x*71111.0+capture_val;

第一段是取出计数器的值。第二段就是把计数器的值乘以(12/11059200),意思是得到的秒数,但是我们需要的是微秒数,所以除以11.0592就是把秒数放大了10的6次方倍。第三段代码则是,溢出过好几次71.111ms,所以需要加上这些时间。


我们记住,浮点型的数据加减乘除其他数时我们要加小数点。


还有函数参数的传递也要强制转换,比如“ShowNumber((u32)capture_val);”


capture_val本身是float类型,想显示正整数就要强制转换为unsigned long类型。


2.代码


#include  

#include //详见第六章第8讲

  

float x=0;

  

//请用杜邦线把P1.6和P3.2连接起来

void main()

{   

    u8 i;

    float capture_val;

    LED_Init();    //初始化LED硬件模块

    TMOD=0x09;     //低四位 1001 

   

    EA=1;          //闭合总中断开关

    ET0=1;

    

    BEEP=0;        //先让P1.6输出低电平

    TR0=1;

    BEEP=1;        //开始计数  

    delay_ms(500); //软件仿真调试出此处的延时时间为698275.8微秒

    BEEP=0;        //停止计数  

   

    capture_val=(float)TH0*256.0+(float)TL0;

    capture_val=(capture_val*12.0)/11.0592;

    capture_val=x*71111.0+capture_val;

   

    if(capture_val>999999.0)

    {

        for(i=0;i<6;i++)LedBuff[i]=LedChar[15]; //超出数码管的显示范围就显示FFFFFF 

    }

    else  ShowNumber((u32)capture_val);         //显示没超过999999时的数

   

    while(1)

    {     

        SEG_Scan();         

    }   

}

  

void TIM0_IRQHandler() interrupt 1

{

    x=x+1.0;

}


我们把“delay_ms(500);”改为“delay_ms(100);”,然后先软件仿真调试看看“delay_ms(100);”花费了多少时间,接着再下载进开发板看看数码管显示的数值是多少,记住要保证P3.2和P1.6用杜邦线相连。

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 基于IC555的可变PWM振荡器电路

  • 优化电路板布局的简单方法

  • 如何使用LED驱动器LM3915制作振动计

  • 分享一个电网倾角计电路

  • 电谐波图形均衡器示意图

  • 一种构建12V和230V双直流电源的简单方法

    相关电子头条文章