问一段单片机的c语言程序。

问一段单片机的c语言程序。,第1张

我也接触到了这段代码。是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语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9869355.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存