最近做51小车,期间发现,sprintf在51单片机上发生了一点小意外。
出现意外的源程序如下:
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
uchar n;
uint dat;
char buf[128];
void delay_ms(unsigned int nCount)
{
unsigned int j = 0,i=0;
for (j = nCount; j != 0; j--)
for(i = 7960; i != 0; i--);
}
#define UART
#define SENDSTR
#ifdef UART
//串口初始化 晶振为 11.0592M 方式 1 波特率 300-57600
void InitCom(unsigned char BaudRate)
{
unsigned char THTL;
switch (BaudRate)
{
case 1: THTL = 64; break; //波特率 300
case 2: THTL = 160; break; //600
case 3: THTL = 208; break; //1200
case 4: THTL = 232; break; //2400
case 5: THTL = 244; break; //4800
case 6: THTL = 250; break; //9600
case 7: THTL = 253; break; //19200
case 8: THTL = 255; break; //57600
default: THTL = 208;
}
SCON = 0x50; //串口方式 1,允许接收
TMOD = 0x20; //定时器1定时方式2
TCON = 0x40; //设定时器 1 开始计数
TH1 = THTL;
TL1 = THTL;
PCON = 0x80; //波特率加倍控制,SMOD 位
RI = 0; //清收发标志
TI = 0; // 发送
TR1 = 1; //启动定时器
}
//向串口输出一个字符(非中断方式)
void ComOutChar(char OutData)
{
SBUF = OutData; //输出字符
while(!TI); //空语句判断字符是否发完
TI = 0; //清 TI
}
void send_str(char *str)
{
while(*str) ComOutChar(*str++);
}
#define UARTOUT(inum) ComOutChar((uchar)inum);
// ComOutChar((uchar)inum>>8);ComOutChar((uchar)inum&0xff);
#endif // UART
void main()
{
InitCom(6);
for (n=0; n<8; ++n) {
P0 ^= 0x0f;
dat = 4*n + 1;
sprintf(buf,"n:%u dat:%u \n", n, dat);
send_str(buf);
delay_ms(100);
}
}
串口接收到的数据却不是预料的:
这里的 n, dat, 冒号,空格,换行都没有出错,只是两个整数在sprintf中出现了一些异常。
大家都来看看为什么啊?
后记:后来发现,原来是Keil实现的sprintf的问题——要求"%d"对应的参数必须以int型(2B)传入,sprintf在转义时不论如何都读取两个字节;
而这里用char(1B)传入所以导致出现了这样的情况,解决方法也比较简单——只需在传入的参数前面各自加上(int)强制转换一下
关键字:51单片机 sprintf 数字格式
引用地址:
51 单片机 sprintf 数字格式问题
推荐阅读最新更新时间:2024-03-16 14:56
基于51单片机设计的空调主板显示数据实时监测电路
近年来,随着空调市场的不断扩大,竞争也日趋激烈;从而对空调生产成本控制提出了更高的要求,空调生产过程中测试成本占据了生产成本相当大的比重。同时,生产测试的方便性、准确性和有效性都影响着产品质量,从而最终影响空调品牌的信誉。 国内空调生产厂家对空调主板的测试大多数仍停留在手工检测阶段,为提高生产测试中的自动化程度,我们设计了空调主板自动测试系统;自行研制的主板测试数据的实时监测电路是该自动测试系统的一个重要组成部分。 该监测电路是以Philips增强型单片机P89C51RD2为核心,实时监视空调主板内的单片机与显示驱动芯片之间的同步串行数据,确保对空调主板检测的准确有效;同时根据工控机软件定义的检测流程,将计算机发出的控制信号传
[单片机]
51单片机常见的硬件电路
要想自己做板,没有硬件电路知识储备是非常困难的,下面我们来说下51单片机中常见的几种电路,大家也可以通过看电路然后来评估一下自己有没有做硬件工程师的潜质。在51单片机中我们常见的电路有晶振电路、复位电路、电源电路、存储电路等。 晶振电路:晶振常用到的有两种。一种是12Mhz的;另一种是11.0592Mhz的。两种晶振的用途是不一样的,12Mhz的比较适合计算延时时间,而另一个晶振比较适合串口通信。 复位电路:51单片机是高电平复位的,想复位是给对应的引脚一个高电平信号就可以实现。 电源电路:常用的5V稳压电路,使用的是LM7805芯片 3.3V稳压电路:我们通过输入5V电压到1117,通
[单片机]
51单片机(计时器+时钟应用)
Ps: 使用的是51单片机, 晶振为11.0592M的, 时间选择5ms。 这篇博客好像是第一篇单片机博客诶~。 算法: 简单的计时器应用, 最开始 根据 2^16 - (t - f)/12 计算得到值, 将其转换为16进制 (注意:单位的改变, 例如晶振要乘上 10e6 时间 要转换为秒s 乘上 10e-3) 由此可以得到 TH0/TL0的值。 例如: 设计的是5ms, 则 算式为 2^16 - (5 * 10^-3 - 11.0592 * 10^6) / 12; 转换为16进制 为DC00; 所以 TH0 = 0XDC __ TL0 = 0X00; 显示: 拆字什么的 就不说了~~, 反正就是 分和秒 对 10取余 和
[单片机]
51单片机串口的扩充方法
基本的 51 单片机有四个并行口,其中还包含了一个串行口。 当接口不够用的时候,大家就会想到,使用什么外接芯片来扩充。 但是,各种教材、参考书、网络文章,介绍扩充并行口的花样不少,扩充串行口的方法,几乎无人问津。 偶尔见到一个,也是使用 8250、8251 等“巨型”芯片来扩充的 使用这些芯片,就要占用单片机很多的更为紧缺的并行口,基本上就是得不偿失。更别说还要设置复杂的控制字了。 做而论道使用简单的三态门,即可为单片机扩充串行口,仅仅占用单片机的一、二个引脚作为控制引线而已。 这个方法,在以前的各种书籍、杂志、网文中,都没有见到过,可以说是做而论道的独创。 呵呵,小小的自豪一下,请不要拍砖。 实际
[单片机]
C51单片机LCD1602驱动程序
LCD1602简介 LCD1602字符型液晶(每行显示16个字符,一共可以显示两行)——一种专门用来显示字母、数字、符号的点阵型液晶模块。它由若干个5x7或者5x10的点阵字符组成,每个点阵字符位都可以用来显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片。 1602的引脚 我们只需要关注以下几个管脚: 3 脚:VL,液晶显示偏压信号,用于调整LCD1602 的显示对比度,一般会外接电位器用以调整偏压信号,注意此脚电压为0时可以得到最强的对比度。 4 脚:RS,数据/命令选择端,当此脚为高电平时,可以对1602 进行数据字节的传输操作,而为电平时,
[单片机]
51单片机定时器模式1使用
特殊功能寄存器如下 使用TCON和TMOD TF:溢出标志 为1时表示溢出 需要手工置0 TR:开始计时 为1开始 为0停止 M1,M0 :工作模式 01为模式1 //16位 65536 GATE门暂不使用 置0 C/T:定时/计数 TH0,TL0:定时器0初始值 方法: 1、设定TMOD 2、设定初始值TH TL 3、设定TCON 开始计时 实例:共阳七段数码管0-F循环显示延时1s 七段共阳数码管真值表 const uint8 ledcode ={ 0xC0, // 0 0xF9, // 1 0xA4, // 2 0xB0, // 3 0x99, // 4 0x92, // 5 0x
[单片机]
51单片机-各功能代码的运用
尽管部分初学者对液晶屏的全部代码的理解存在困难,不过没关系,只要我们懂得如何运用它们各个函数的功能即可,大家下载进开发板之后观察实验现象再结合代码与注释慢慢细读掌握吧。 1.测试代码 #include reg52.h #include function.h //详见第六章第8讲 #include lcd.h void main() { char x;//取值范围-128~127 u8 str1 = Good Good Study ; u8 str2 = Day Day Up! ; InitLcd1602();//初始化液晶屏 while (1) { LcdSetCursor(
[单片机]
基于51单片机的温控风扇
设计要求: 1.本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机 • 2.采用DS18B20温度传感器测温(0-99.9°C),三极管驱动数码管显示温度和风扇的档位。 • 3.共3个按键:设置、加、减。按一下设置可以设置上限,再按下设置下限,均可以按键加减调整。 • 4.利用PWM调速,当温度低于下限时,风扇不转动,当温度处于上、下限之间时1档转动(50%的转速),当温度超过上限时,全速转动。 使用说明: 一共3个按键:设置、加、减 按下设置键的时候才可以加减。 按一下设置键,是设置温度的上限,再按下设置键,是设置温度的下限,再按下设置键是退出并保存。 部分程序: #include
[单片机]