我也接触到了这段代码。是HX711ad转换读数函数用到的
我来解释两点:
1、Count=Count^0x800000,最高位取反。把正负方向的电压转换ad全部变成正的数值。例如24位2进制可以表示的数值为-8388608~8388607,没有负载时为0;
最高位取反后表示数值为0~16777215,没有负载时候显示为8388608,这样做的目的是避免出现负数,方便计算。如果你做电子秤的话,我建议就不要这句了。一般不会有负数的。
2、有的代码后面还跟了一段
/ if((Count & 0x800000) == 0x800000)
{
Count = ~(Count - 1);
} /
表示负数补码还原成正值
#include<reg51h>
unsigned char t=0;
void main()
{
TMOD=0x02;//定时器0,初值自动重新装入的8位工作方式
TH0=6;
TL0=6;//写入定时器初值,每250us中断
TR0=1;//启动定时器0
ET0=1;//打开定时器中断
EA=1;//开总中断
while(1)//程序循环
{if(t==20) //当t=20,即20x250us=0005s时执行 *** 作,同时置零t
{
t=0;
/////////////////////////////////// *** 作
///////////////////////////////////
}
}
}
void timer0() interrupt 1//中断函数,每250us中断,t的值加1
{
t++;
}
请你参考:
参照上图,代码如下:
#include<reg51h>unsigned char i;
void Delayms(unsigned int x)
{
unsigned char t;
while(x--)
for(t=0;t<120;t++);
}
void main()
{
IT1=1;
IE|=0x84;
P2=0xFE;
i=1;
while(1);
}
void EX1_INT() interrupt 2
{
ET0=0;
Delayms(10);
P2=~(1<<i);
i=++i%8;
ET0=1;
}
随着单片机硬件性能的提高,编写应用程序更着重于程序本身的效率。
Franklin或KEIIC51交叉编译器是专为51系列单片机设计的一种高效的C语言编译器,用其开发的应用程序易于维护,可移植性好,是目前较流行的51系列单片机的开发工具。
一、C51语言程序设计的基本技巧
首先,C51语言程序设计要尽可能采用结构化的设计方法。可将整个程序按功能分成若干个模块,不同的模块完成不同的功能。对于不同的功能模块,分别指定相应的入口参数和出口参数,而经常使用的一些程序最好编成函数,这样既不会引起整个程序管理的混乱,还可使程序的可读性、移植性增强。
C51语言的主程序结构:
#include
main0{while(1);}
这是最小的C程序,包括头部文件和程序主体。头部文件为引用的外部资源文件,包括硬件信息和外部模块提供的可使用的函数和变量的说明。
语句定义后,就可以在C语言程序中像汇编一样使用这些硬件设备。
在C5l中常用项目来管理,项目一般分为C文件块和头部文件块,常把不同的功能写在不同的C文件中,依靠项目的管理,最后把所有文件连接起来,这样就可以得到烧录的HEX文件或BIN文件。没有在头部文件中列出的文件,可以算是该C文件的内部函数和变量,外部C不能使用。另外,在程序设计过程中要充分利用C51语言的预处理命令。
对于一些常用的常数,如TRUE、FAlSE、PI,以及各种特殊功能寄存器,或程序中一些重要的依据外界条件可变的常量,可采用宏定义(#de-fine)或集中起来放在一个头文件中进行定义,再采用文件包含命令(#in-elude)将其加入到程序中,这样当需要修改某个参量时,只需修改相应的包含文件或宏定义,而不必对使用它们的每个程序文件都进行修改,有利于文件的维护和更新。
举例:利用宏定义和条件编译,源程序不作任何修改就可适用于不同时钟频率的单片机系统,并可根据情况的不同取不同的delay值,完成不同的目的。程序如下:
#define flag 1#ifdef flag==l#define fose 6Mdelay=10;#elif flag==0#define fose 8Mdelay=12;#else#define fosc 12Mdelay=20;#endiFMain0{ for(I=O;l
/
//p10波形为:
//1、10ms为周期的方波或持续的高、低电平(与flag、p10初始值有关),持续2秒。
//2、持续的高、低电平或10ms为周期的方波(与flag、p10初始值有关),持续2秒。
//3、重复1、2步骤。
/
#include
unsigned
int
t02s;
unsigned
char
t05ms;
bit
flag;
void
main(void)
{
tmod=0x01;
//初始化定时器。
//可以对照单片机pdf相应章节,按位对比。
//此处设置定时器0工作于“16
位定时器/
计数器,tl0、th0
全用”模式。
th0=(65536-500)/256;
//初始化定时/计数器高字节。
tl0=(65536-500)%256;
//初始化。。。。。。低字节。
tr0=1;
//启动定时器0。
//以下两句开启定时器中断,缺一不可。
et0=1;
//允许定时器0中断。
ea=1;
//开启全局中断。
while(1);
//循环,整个程序交由定时中断控制。
}
//此处为定时器中断子程序,每次定时器溢出,进入此段程序。
//根据参数定义,每5ms中断一次。
//定时器中断后,计数不停止,但是需要重新初始化定时/计数器。
void
t0(void)
interrupt
1
using
0
{
//重新“初始化定时/计数器”高、低字节。
th0=(65536-500)/256;
tl0=(65536-500)%256;
//每次中断,t02s
加
1。
t02s++;
//增加400次后(5ms
×
400
=
2s),flag标志取反。
if(t02s==400)
{
t02s=0;
flag=~flag;
}
//若中断时flag标志为0,p10口取反。
if(flag==0)
{
p1_0=~p1_0;
}
}
1、把C语言编译为编程器支持的语言格式,比如常用的bin,或hex等格式。\x0d\2、如果是可在线编程的,可以用ISP直接进行烧录。\x0d\3、如果不是可在线编程的,将单片机芯片,放入编程器,然后烧录。\x0d\注意:编译和烧录时,都要选择和单片机芯片一致的型号,否则会出错。\x0d\如果找不到对应的型号,说明不支持该型号的单片机。
以上就是关于问一段单片机的c语言程序。全部的内容,包括:问一段单片机的c语言程序。、单片机C语言程序、51单片机的c语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)