单片机C语言技巧

发布时间:2024-11-17

单片机C语言技巧

一、使用C51的技巧C51编译器能从C程序源代码中产生高度优化的 代码,而通过一些编程上的技巧又可以帮助编译器产 生更好的代码。一些使用技巧如下: 1.采用短型变量 如循环控制中常用unsigned char-8位代替int-16位 2.使用无符号类型 3. 尽量避免使用浮点指针。 因为在单片机这类8位机上使用32位浮点数会浪费大量 的时间。可以通过提高数值数量级和使用整型运算来 消除浮点指针。

单片机C语言技巧

4.使用位变量 对于某些标志位应使用位变量。 但应注意: (1)用#pragma disable说明和用“using”指定的函数, 不能返回bit值 (2)bit变量不能声明为指针,如bit *ptr是错误的。 (3)不能使用bit数组,如bit arr[5]. 5.用局部变量代替全局变量。 因为编译器在内部存储区中为局部变量分配存储空间, 而在外部存储区中为全局变量分配存储空间,从而降 低全局变量的速度。 6.为变量分配内部存储区 7.使用特定指针 8.使用宏代替函数 9.要时刻关注内部RAM的使用情况

单片机C语言技巧

二、C51使用规范为增强程序的可读性,便于源程序得交流,减 少合作开发中的障碍,应当在编写C51程序时遵 循一定的规范。 1. 注释 (1)采用中文 (2)开始的注释 文件(模块)注释内容:公司名称、版权、作者 名称、修改时间、模块功能、背景介绍等,复杂 的算法还要加上流程图说明

单片机C语言技巧

(3)函数开头的注释内容 函数名称、功能、说明、输入、返回、函数描述、流 程处理、全局变量、调用样例等,复杂的函数还要加上变量 用途说明。如 /*******************************************************/ *函 数 名:v_LcdInt *功能描述:LCD初始化 *函数说明:初始化命令:0x3c,0x08,0x01,0x06 *调用函数:v_Delaymsec(),v_LcdCmd() *全局变量: *输入:无 *返回:无 *设计者:zhao 日期:2007-04-01 *修改者:zhao 日期:2007-04-01 *版本: /********************************************************/

单片机C语言技巧

(4) 程序中的注释内容 修改时间和作者、方便理解的注释等。

2. 命名 命名必须有一定的实际意义。 (1) 常量的命名: 全部用大写 (2) 变量的命名: 变量名加前缀,前缀反 映变量的数据类型,用小写。反映变量意义的 第一个字母大写其他小写 (3) 函数的命名: 函数名首字母大写,函 数名若包含有两个单词,则每个单词首字母大 写。 函数原型说明包括:引用外来函数及内部函 数,外部引用必须在右侧注明函数来源(模块 名和文件名) ,内部函数只要注释其声明文 件名。

单片机C语言技巧

3. 编辑风格 (1) 缩进:缩进以Tab为单位,预处理语句、 全局数据、函数原型、标题、附加说明、函数说明、 标号等均顶格书写。语句块的“{”“}”配对对齐, 并与其前一行对齐。 (2)空

格: 数据和函数在其类型修饰名称之 间适当空格并据情况对齐 (3)对齐:原则上关系密切的行应对齐、对 齐包括类型、修饰、名称、参数等各部分对齐。 (4)空行: 程序文件结构各部分之间空两行, 若不必要也可空一行,各函数实现之间一般空两行。 (5)修改:对旧语句的删除修改要慎重 (6)形参:需要必要的说明

单片机C语言技巧

定时器/计数器综合应用1. 设单片机系统时钟频率为12MHz,编程使 P1.0和P1.1分别输出周期为1ms和500us的方波 分析:当系统时钟为12MHz、工作模式为2时, 最大的定时时间为256us,满足周期为500us的要求。 可以算出TH0=0x06H程序如下:

单片机C语言技巧

#include”reg51.h” sbit P1_0=P1^0; sbit P1_1=P1^1; void main() { char i; TMOD=0x02; //定时器T0,工作模式2 TH0=0x06;TL0=0x06; //装入初始值 TR0=1; while(1) { for(i=0;i<2;i++) { do{} while(!TF0); //等待定时中断 P1_1!=P1_1 ; } P1_0!=P1_0 ; }//end while }

单片机C语言技巧

2. 门控位的应用。GATE是是控制外部输入 脉冲对定时计数器的控制,当GATE=1时,只有 INTx=1且软件使TRx=1才能启动定时器。利用这个 特性可测输入脉冲的宽度。

利用定时器T0测量某正脉冲的宽度,脉冲从 P3.2输入。已知脉冲宽度小于10ms,系统时钟频率 为12MHz。测量测脉冲宽度,把结果放到片内40H 开始的数据存储单元,其中40H单元存个数。程序如下:

单片机C语言技巧

#include”reg51.c” sbit P3_2=P3^2; void main() { unsigned char *P,i; int a; P=0x40H; //指针指向片内40H单元 TMOD=0x09; //GATE=1;工作方式为计数器0 TL0=0x00H;TH0=0x00H; //装入初始值 do{} while(P3_2==1); //等待INT0变低 TR0=1; //启动计数器 while(P3_2==0); //等待INT0变高,即脉冲的上升沿 while(P3_2==1); //等待INT0变低,即脉冲的下降 TR=0; //停止计数

单片机C语言技巧

i=TH0; //读入TH0值 a=i*256+TL0; //计数结果转换为10进制数 for(a;a!=0;) //a不等于0时循环,转换为BCD码 { *P=a%10; //个位存放在40单元 a=a/10; P++; }//end for }

单片机C语言技巧

3、简单乐曲的播放 通过定时器的定时产生一定频率的波形信号, 经P1.0输出,驱动扬声器,发出音调。常见音调及其频率对应表 音符

频率Hz 音符 频率Hz

1 523 高音 1 1046

2 587

3 859

4 698

5 784

6 880

7 987

高音 高音 高音 高音 高音 高音 2 3 4 5 6 7

1174 1318 1396 1567 1760 1975

单片机C语言技巧

计数器初值对照表

音符

1

2

3

4

5FEC 1H 高音 5

6

7

计数器 FE22 FE56 H H 初值 音符 高音 高音 2 1 计数器 FF1 FF2B H 初值

FE85 FE9 H AH 高音 高音 3 4

FEE FF03 3H H 高音 高音 6 7

FF42 FF4 H CH

FF60 FF71 FF81 H H H

(1)将音符代码装入8位字节高4位,节拍代码装入低4位。将 整段乐曲转换成一定长度的代码数据表。 (2)在程序执行时,顺序查此表,取出音符,查频率值,置 入计数器0。取出节拍代码,供定时器1使用。 |1231|1231|345-|345-|565432|565432|15

1-|151-|

单片机C语言技巧

#include”reg51.h” #define uchar unsigned char #define uint unsigned int sbit P1_0=P1^0; uint m,I,rti,l; /***音频表:高位、低位*/ uchar code toneh[14]={0xfe,0xfe, 0xfe,0xfe, 0xfe,0xfe, 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff} uchar code tonel[14]={0x22,0x56,x85,0x9a,xc1,0xe3,0x03,0x10,x0x2b, 0x42,0x4c, 0x60,0x71,0x81}

/*乐符*/ uchar code song[]=“1231123134553455565432565432151115111”; uchar code length[]=“444444444444444422224422224444444444”;

单片机C语言技巧

/*定时器0中断服务器程序*/void timer0(void) interrupt 1 using 1

{ void timer1(void) interrupt 3 P1_0=!P1_0;//P1.0取反 using 3 TH0=toneh[rti];//装入音频初值 { TL0=tonel[rti]; TH1=0x0C;//重装定时初值 } TL1=0xDC; m++; }

/*定时器1中断服务器程序 */

单片机C语言技巧

/*音符到音频转换程序*/ playc{(char ch) { Int ti; Switch(ch) { case ’0’:ti=0;break; case ’1’:ti=1;break; case ’2’:ti=2;break; case ’3’:ti=3;break; case ’4’:ti=4;break; case ’5’:ti=5;break; case ’6’:ti=6;break;

case ’q’:ti=7;break; case ’w’:ti=8;break; case ’e’:ti=9;break; case ’r’:ti=10;break; case ’t’:ti=11;break; case ’y’:ti=12;break; case ’u’:ti=13;break; case ’ ’:ti=50;break; default:ti=50;break; } if(ti==50) return(100); return(ti)}

单片机C语言技巧.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219