1. 使用printf打印小数
#include<stdio.h>
#include<reg51.h>
float idata t;
void Uart_Init()
{
}
void main()
{
t=1.234567;
SBUF=0; //这一步是必须的
Uart_Init(); //初始化串口,注意为加快速度非必须不要开串口中断
while(1)
{
printf("%f.2\n",t);
}
}
2.关于浮点数、大变量数组的声明
低128字节51MCU一般都会有,默认全局变量存于此(data),所以经常会出现溢出错误;高128字节用idata声明,一般float型(占4个字节)可声明于此,如float idata f;内部扩展RAM,用xdata声明,一般大变量数组声明于此,如unsigned char xdata s[256]; //注意查看MCU的SRAM大小不变的数组用code声明,放在flash里,如unsigned char code s[12]="Hello,World!";3.全局变量的声明
全局变量在.c中定义,在.h中用extern声明,如果在其他.c中使用,把.h包含进来就行了;如果全局变量仅在一个.c中使用,使用static;4.在矩阵键盘扫描时,单片机的输出1(P123内部上拉电阻接+5V)引脚和输出0(MOS管直接接地)引脚连在一起,会变成0
5.所用时间较少,如数码管等,在中断中刷新,也可以考虑按键的软件消抖也在中断里。。。
/* Timer0 interrupt routine */
void tm0_isr() interrupt 1
{
static unsigned char j=0;
TL0 = T1MS; //reload timer0 low byte
TH0 = T1MS >> 8; //reload timer0 high byte
if(j>8)
{
j=0;
}
else
{
j++;
switch(j)
{
case 1:{P2=DIS_BIT[0];P0=DIS_SEG[INT_Num/10];} break; //显示INT_Num的十位
case 2:{P2=DIS_BIT[1];P0=DIS_SEG[INT_Num%10];} break; //显示INT_Num的个位
case 3: break; //{P2=DIS_BIT[2];P0=DIS_SEG[];} break;
case 4:{P2=DIS_BIT[3];P0=DIS_SEG[Key_Num_last/10];} break; //显示Key_Num的十位
case 5:{P2=DIS_BIT[4];P0=DIS_SEG[Key_Num_last%10];} break; //显示Key_Num的个位
case 6: break; //{P2=DIS_BIT[4];P0=DIS_SEG[Key_Num%10];} break;
case 7:{P2=DIS_BIT[6];P0=DIS_SEG[Key_Num_before/10];} break; //显示Key_Num的个位
case 8:{P2=DIS_BIT[7];P0=DIS_SEG[Key_Num_before%10];} break; //显示Key_Num的个位
default: {;}
}
}
if(flag_Buzzer && ++count) //2ms中断一次,500Hz;有键按下时,flagBuzzer为真
{
Buzzer=!Buzzer; //!逻辑取反
if(count>50) //蜂鸣器响100ms
{
flag_Buzzer=0;
count=0;
Buzzer=1; //关闭蜂鸣器
}
}
}