历史上的今天
今天是:2024年08月25日(星期日)
2021年08月25日 | 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 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用杜邦线相连。
上一篇:51单片机-输入捕获
史海拾趣
|
看到坛子里很多人拿到板子后不知道第一步该如何做, 在网上看到一个朋友的博客,感觉还不错,对于购买板子的朋友应该有所帮助,所以呈现出来: 来源:http://adreaman.com/0524arm-mini2440-led-key-non-os.html mini2440是当前最经济的arm9开 ...… 查看全部问答> |
|
本文为转帖,觉得对大家有用,就转到坛子了:)功率器件的牌子很多,以MOSFET为例,有飞兆,IR ,ST ,ON,英飞凌,TOSHIBA的世界各大牌子,如何花更少的钱买到最好的东西,是我们采购也好,工程师也罢是我们追求的目标,这样才会老板满意,客户满意 ...… 查看全部问答> |
|
目录: 第1章 EZ-USB简介 1.1 介绍 1.2 EZ-USB结构框图 1.3 USB规格说明 1.4 令牌和PID 1.5 主机是控制器 1.6 USB的传输方向 1.7 帧 1.8 EZ-USB的传输类型 1.9 枚举 l.10 USB内核 1.11 EZ-USB微处理器 l.12 重校举 ...… 查看全部问答> |
|
Keil uv3快速入门 demo https://bbs.eeworld.com.cn/thread-98020-1-1.html… 查看全部问答> |
|
(重分答谢)AT 命令 STATE: IP IND(连线失败,接受场景配置) 我再WinCE5.0上用GPRS上网发信息到服务器上: AT+CREG? // check if registration network in 2 seconds interval +CREG: 0,1 // module responses AT+CGATT? // check if attach PDU for 2 seconds interval +CGATT: 1 // module response ...… 查看全部问答> |
|
windows mobile上的数据拷贝(类似于PC的GHOST软件) 各位高手,最近小弟遇到一个问题,如何在windows mobile下实现类似于PC中GHOST软件,即读取ROM中的所有内容. 本人尝试过几种方法:(平台是VS2005 + Windows Mobile 5.0 Smartphone SDK) 1.在PC桌面端开发应用程序,用RAPI读取手机数据,其中用到了CeC ...… 查看全部问答> |
|
芯片是cc2430 运行环境是IAR 片外寄存器的0x0000-0xDF00是程序存储器, 在程序存储器的某个地址定义了一个字节的数据, #define DATA1 ((volatile xdata*)0x0010) = 0x0F 可是读这个地址的数据时,出现了问题 我读DATA1 的值为0x0F,但读地 ...… 查看全部问答> |
|
1.开启电压VT ·开启电压(又称阈值电压):使得源极S和漏极D之间开始形成导电沟道所需的栅极电压; ·标准的N沟道MOS管,VT约为3~6V; ·通过工艺上的改进,可以使MOS管的VT值降到2~3V。 2. 直流输入电阻RGS ·即 ...… 查看全部问答> |




