可以使用sscanf,就像sprintf将整型数转换成字符串输出一样,逆运算(KEILC 中scanf和printf确定了通过单片机串行口完成输入输出模式,除非做了修改,一般实际中不用)。
给你个例子:
unsigned char string[5]={"1234"};
unsigned int n;
sscanf(string,"%u",n); //string是字符串,%u是格式控制串,u是无符号十进制数,n是变量n的地址。
printf ("%d\n",n); //可在KEIL C 开发环境中输出观察
你可以把上面这部分代码放到KEIL C中的HELLO.C程序中观察验证一下。
#includereg52.h
sbit key = P1^0;//按键
void delay(unsigned int time)
{
unsigned int i,j;
for(i=0; itime; i++)
for(j=0; j1000; j++)
{;}
}
void mian()
{
unsigned int temp =0x00;
while(1)
{
if(key == 0)
{
delay(20);//适当延时,消除按键抖动,自己看实际情况修改时间
if(key == 0)
temp = ~temp;
}
P2 = temp;
}
}
temp_h、temp_l是char型的数据,占用一个字节,仅有8bit
要把它们拼接在一起至少需要两个字节,而int在51单片机里面就占用两个字节,对应16bit
再说一下十六进制和二进制表示
0x3a 或 3aH 是十六进制表示,前者是C语言环境表示方法,后者是汇编语言环境
0x3a 等效于二进制的 0011 1010,二进制每一位数据十分清楚,可是对于16bit以上的数据看起来就不太方便了,所以下面只用十六进制表示
对于“高8位temp_h=0x02,即00000010,低8位,即00110100”
那么完整的数据 或者 拼接后的数据 即为 0000 0010 0011 0100 (即为十六进制的 0x0234)
从char型的0x02,0x34到0x0234确实可以用
ff=temp_h*256+temp_l;
但是单片机做乘法效率太低,移位运算只需要一条指令即可
所以也可以用
num=temp_h; //先把高位数据temp_h(8bit)写入
num=8; //然后把temp_h左移8位,即把temp_h放到了num的第16-9bit
num+=temp_l; //最后再把temp_l的8bit补到num的第8-1bit
于是num便从 0x0000 - 0x0002 - 0x0200 - 0x0234
注:左移时默认右侧补零(与之相对的是循环左移,是把的左侧移出的放到末尾)
正如,知道一个2位数字的十位和个位(如56),自然可以用5*10+6 表示,也可以
先用num=5;
然后左移1位,num=50;
最后再加上低位 num=50+6.
温度的14位和湿度的12位是传感器及其AD的精度决定的,但是51的整形数据格式要么是8位的无符号char形,要么16位的int形,或者32位的long形
显然8位不够,32位太多,16位是最佳的...
用16bit的int形数据来表示14位的温度数据,其高两位必然是0;用来表示12位的湿度数据的话高4位也必然是0,但不能说是多余的
说个可能不太恰当的例子,用8位数字表示你的工资,可能你的工资只有5位数有效数字,那么在电脑存储的时候最高3位必然是000,只是我们更习惯从首位不为零的数字开始读而已...
你可以把
void Delay(unsigned int t) { while(--t); } 代替函数原型放入头文件。不写在led.c 里。
led.h:
#ifndef __led_h__
#define __led_h__
#includereg52.h
#includeintrins.h
void Delay(unsigned int t) { while(--t); }
#endif
led.c: ( 把你上面的照抄,直到主程序结束处)
#include "led.h"
sbit LED0=P1^0;
...
void main (void)
{
。。。。
Delay(10000);
//主循环中添加其他需要一直工作的程序
。。。。。
}
编译链接 led.c
单片机拼接的介绍就聊到这里吧,感谢您花时间阅读,谢谢。
本文标签:单片机拼接