跳转到主要内容

C语言

单片机C语言编程定时器的两种表达方式

demi 提交于

单片机C语言编程中,定时器的初值对于初学者真的是比较不好计算,因此我总结了以下几种方法。

<strong>第1种方法:</strong>

#define FOSC 11059200L //晶振的频率
#define TIMS (65536-FOSC/12/1000) //12T mode 对于8051系列单片机通用
//#define TIMS (65536-FOSC/1000) //1T mode STC单片机可以用这个
unsigned int timer0_tick;
int timer0_count;
void Timer0(void) interrupt 1 using 1 //定时器0中断外理
{
TL0=TIMS;
TH0=TIMS&gt;&gt;8;
if(timer0_tick--==0) //加到1000次即1秒
{
timer0_tick=1000;
LED_Timer=~LED_Timer;
}
}

单片机C语言优化技巧

judy /

对程序进行优化,通常是指优化程序代码或程序执行速度。优化代码和优化速度实际上是一个予盾的统一,一般是优化了代码的尺寸,就会带来执行时间的增加,如果优化了程序的执行速度,通常会带来代码增加的副作用,很难鱼与熊掌兼得,只能在设计时掌握一个平衡点。

一、程序结构的优化

1、程序的书写结构

虽然书写格式并不会影响生成的代码质量,但是在实际编写程序时还是应该尊循一定的书写规则,一个书写清晰、明了的程序,有利于以后的维护。在书写程序时,特别是对于While、for、do…while、if…elst、switch…case 等语句或这些语句嵌套组合时,应采用“缩格”的书写形式,

2、标识符

程序中使用的用户标识符除要遵循标识符的命名规则以外,一般不要用代数符号(如a、b、x1、y1)作为变量名,应选取具有相关含义的英文单词(或缩写)或汉语拼音作为标识符,以增加程序的可读性,如:

count、number1、red、work 等。

3、程序结构

C语言中的指针和内存泄漏

judy /

<strong>引言</strong>

对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏。这些的确是消耗了开发人员大多数调试时间的事项。指针和内存泄漏对某些开发人员来说似乎令人畏惧,但是一旦您了解了指针及其关联内存操作的基础,它们就是您在 C 语言中拥有的最强大工具。

本文将与您分享开发人员在开始使用指针来编程前应该知道的秘密。本文内容包括:

●导致内存破坏的指针操作类型
●在使用动态内存分配时必须考虑的检查点
●导致内存泄漏的场景

如果您预先知道什么地方可能出错,那么您就能够小心避免陷阱,并消除大多数与指针和内存相关的问题。

<strong>什么地方可能出错?</strong>

有几种问题场景可能会出现,从而可能在完成生成后导致问题。在处理指针时,您可以使用本文中的信息来避免许多问题。

<strong>未初始化的内存</strong>

在本例中,p已被分配了 10 个字节。这 10 个字节可能包含垃圾数据,如图 1所示。

char *p = malloc ( 10 );

单片机中C语言的程序与数据存储

judy /

<font size="3"><strong> 一、五大内存分区:</strong></font>

内存分成5个区,它们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

1、栈区(stack):FIFO就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。

2、堆区(heap):就是那些由new分配的内存块,它们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

3、自由存储区:就是那些由malloc等分配的内存块,它和堆是十分相似的,不过它是用free来结束自己的生命。

4、全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

5、常量存储区:这是一块比较特殊的存储区,它们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)

C51编程经验汇总分享

judy /

在单片机的开发应用中,已逐渐开始引入高级语言,C语言就是其中的一种。用惯了汇编的人,总觉得高级语言“可控性”不好,不如汇编那样随心所欲。以下是笔者在C51编程中的几点经验,希望对初学C51者有所帮助。

<font size="3"><strong>一、C51热启动代码的编制</strong></font>

工业控制计算机,往往设有看门狗电路,看门狗动作,计算机复位,这就是热启动。热启动时,一般不允许程序从头开始,因为这将使测量或计算值复位,导致系 统工作异常。故程序必须判断是热启动还是冷启动。常用的方法是:设定某内存单位为标志位(如0x7f位和0x7e位),启动时首先读该内存单元的内容,如 果它等于一个特定的值(例如两个内存单元的都是0xaa),就认为是热启动,否则就是冷启动,程序执行初始化部分,并将0xaa赋予这两个内存单元。

C语言访问MCU寄存器的三种方式

Lee_ /

MCU中的特殊功能寄存器SFR,实际上就是SRAM地址已经确定的SRAM单元,在C语言环境下对其访问归纳起来有3种方法。

1.对C编译器进行语法扩充

对C编译器进行语法扩充。例如MCS51系列单片机的C-51语法中扩充了sfr关键字,举例如下:
sfr P0 = 0x80;

这样操作0x80单元直接写P0即可。

又如Atmel的AVR系列单片机,其ICCAVR和GCCAVR编译器都没有定义新的数据类型,只能采用标准C的强制类型转换和指针来实现访问MCU的寄存器。而IAR和CodeVisionAVR编译器对ANSI C进行了扩充,定义了新的数据类型,使C语言可以直接访问MCU的有关寄存器,例如在IAR中可以使用:

SFR_B(DDRB, 0x28);

CodeVisionAVR中可以使用:

sfrb DDRB = 0x28;

2.使用标准C的强制类型转换和指针来实现

采用标准C的强制转换和指针的概念来实现访问MCU的寄存器,例如:

#define DDRB (*(volatile unsigned char *)0x25)

分析如下:

C语言访问MCU寄存器的两种方式

Lee_ /

单片机的特殊功能寄存器SFR,是SRAM地址已经确定的SRAM单元,在C语言环境下对其访问归纳起来有两种方法。

<strong>1、采用标准C的强制类型转换和指针来实现</strong>

采用标准C的强制转换和指针的概念来实现访问MCU的寄存器,例如:
#define DDRB (*(volatile unsigned char *)0x25)

分析如下:
A:(unsigned char *)0x25中的0x25只是个值,前面加(unsigned char *)表示0x25是个地址,而且这个地址所存储的数据的数据类型是unsigned char,意思就是说读/写这个地址时,要写进unsigned char的值,读出也是unsigned char的值。

单片机C语言static属性和数码管显示程序

Lee_ /

简介:static从英文上翻译是静态的意思,在C语言中static所起的作用也正是静态。对于局部变量而言,其作用域是局部的如某一子函数体,程序在每次执行时调用该子函数时,其声明的局部变量都会重新赋值。那如果我们想让程序在调用该子函数时,其声明的某个局部变量的......

static从英文上翻译是静态的意思,在C语言中static所起的作用也正是静态。对于局部变量而言,其作用域是局部的如某一子函数体,程序在每次执行时调用该子函数时,其声明的局部变量都会重新赋值。那如果我们想让程序在调用该子函数时,其声明的某个局部变量的值,保留上次该子函数被调用结束时的值,那么就需要在变量声明时前置static。可以这么理解,对于静态的局部变量,其占用的内存空间在程序执行时是一直都存在的(静态的本质)。当然即使是静态局部变量,其作用域仅限于该子函数。