简单的avr c语言程序,avr单片机c语言编程风格介绍 - 全文
摘要:作为一个初学者如何具有良好的程序设计风格呢?下面小编将以avr单片机介绍它的c语言编程风格。
C语言编程风格介绍
1.变量定义
在定义变量时,前缀使用变量的类型,之后使用表现变量用途的英文单词或单词缩写,且每个单词或缩写的首字母大写,各种前缀缩写如下:
无符号变量使用 u8,u16,u32;例:unsigned char u8Temp;
有符号变量使用 s8,s16,s32;例:char s8Temp;
浮点数变量使用 f32,d64;例:float f32Temp;
结构体变量使用 st;例:struct Temp stTemp;
字符串变量使用 s;例:char sTemp;
数组变量使用 a;例:unsigned char aTemp[10];
指针变量使用 p;例:unsigned char *pTemp;
枚举变量使用 e;例:enum Temp eTemp;
2.宏定义
对于宏定义使用大写+下划线的方式。
3.程序排版
一行程序的开始使用tab键进行对齐,一行的中间使用空格键进行对齐。
这样防止不同的编辑工具打开时,造成代码混乱。
4.注释的书写
这里注释分为函数头注释,程序中代码注释,
函数头注释使用如下形式
/*
*Name:
*DescripTIon:
*Created:
*Author:
*/
这四项必选,其他的如函数的传入传出参数,视函数的需要适当增加。
5.测试代码
在编程的同时,需要注意添加适当的测试代码,这样可以减轻以后测试代码时的工作量。
AVR c语言优秀编程风格
文件结构
模块化的程序应该是有一个很好的程序结构的。AVR C语言程序有两种用户文件,.c程序文件,.h头文件,程序中编写过程中需要在.c文件中包含.h头文件。初学者往往出现重复包含或者头文件包含错误的问题,我当时也时常为这种错误而发愁。下面我以我写的电机驱动例程来给大家说明一下,优秀的编程文件结构。
这个工程中有8个文件,一个说明文件,如下图:下载程序例子 电机控制案例 。
我写的成型的程序的文件个数基本上都是偶数,因为每一个结构化的函数定义.c文件都会对应一个.h文件。main.c对应config.h。我们来看看各文件的包含关系。下面我们看看这些文件的包含关系与内容:[推荐的文件包含顺序与关系]
所有.c文件都包含了config.h文件。如: #include “config.h”
在config.h 中有如下代码:
#include “delay.h”
#include “device_init.h”
#include “motor.h”
这样做就不容易出现错误的包含关系,为了预防万一,我们还引入了宏定义与预编译。如下:
#ifndef _UNIT_H__
#define _UNIT_H__ 1
//100us
extern void Delay100us(uint8 n);
//1s
extern void Delay1s(uint16 n); // n 《= 6 ,when n==7, it is 1.
//1ms
extern void Delay1ms(uint16 n);
#endif
第一次包含本文件的时候正确编译,并且#define _UNIT_H__ 1,第二次包含本文件#ifndef _UNIT_H__就不再成立,跳过文件。
预编译还有更多的用途,比如可以根据不同的值编译不同的语句,如下:
//#pragma REGPARMS
#if CPU_TYPE == M128
#include 《iom128v.h》
#endif
#if CPU_TYPE == M64
#include 《iom64v.h》
#endif
#if CPU_TYPE == M32
#include 《iom32v.h》
#endif
#if CPU_TYPE == M16
#include 《iom16v.h》
#endif
#if CPU_TYPE == M8
#include 《iom8v.h》
#endif
#include《filename》 与 #include “filename” 的区别 :前者是包含系统目录include下 的文件,后者是包含程序目录下的文件。
变量名与函数名
变量以及函数命名应该按照尽量短,按需长,具有实际意义。可以通过下划线或者大小写结合的方法组合动词和名词组成变量函数名。下面对比好的命名方法与不好的命名方法:
1.好的: Delay100us();
不好的: Yanshi();
2.好的: init_devices();
不好的: Chengxuchushihua();
3.好的: int temp;
不好的: int dd;
外部调用
1.首先在模块化程序的.h文件中定义extern
//端口初始化
extern void port_init(void);
//T2初始化
void TImer2_init(void);
//各种参数初始化
extern void init_devices(void);
2.模块化程序的.c文件中定义函数,不要在模块化的程序中调用程序,及不要出现向TImer2_init();这样函数的使用,因为你以后不知道你到底什么地方调用了函数,导致程序调试难度增加。可以在定义函数的过程中调用其他函数作为函数体。
/**************************采用TImer2 产生波形***********************/
// PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值))
void timer2_init(void)
{
TCCR2 = 0x00; //stop
TCNT2= 0x01; //set count
OCR2 = 0x66; //set compare
TCCR2 = (1《《WGM20)|(1《《WGM21)|(1《《COM21)|0x06; // start timer 快速pwm模式,匹配清零,溢出置位 256分频
//占空比=高比低为:(OCR2-0X01)/(0XFF-OCR2) OX01++++++(OCR2)__________OXFF (+表示输出高,_表示输出低)
//即OCR2越大,输出越大
}
3.在少数几个文件中调用函数,在main.c中调用大部分函数,在interupts.c中根据不同的中断调用服务函数。
void main(void)
{
/******************************************************************************/
//初始工作
/******************************************************************************/
init_devices();
while(1)
{
for_ward(0); //默认速度运转 正
Delay1s(5); //延时5s
motor_stop(); //停止
Delay1s(5); //延时5s
back_ward(0); //默认速度运转 反
Delay1s(5); //延时5s
speed_add(20); //加速
Delay1s(5); //延时5s
speed_subtract(20); //减速
Delay1s(5); //延时5s
}
}
宏定义
宏定义主要用于两个地方:
1.一是用得非常多的命令或语句,利用宏将其简化。
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifndef NULL
#define NULL 0
#endif
#define MIN(a,b) ((a《b)?(a):(b))
#define MAX(a,b) ((a》b)?(a):(b))
#define ABS(x) ((x》)?(x):(-x))
typedef unsigned char uint8; /* 定义可移植的无符号8位整数关键字 */
typedef signed char int8; /* 定义可移植的有符号8位整数关键字 */
typedef unsigned int uint16; /* 定义可移植的无符号16位整数关键字 */
typedef signed int int16; /* 定义可移植的有符号16位整数关键字 */
typedef unsigned long uint32; /* 定义可移植的无符号32位整数关键字 */
typedef signed long int32; /* 定义可移植的有符号32位整数关键字 */
2.二是利用宏定义方便的进行硬件接口操作,再程序需要修改时,只需要修改宏定义即可,而不需要满篇去找命令行,进行修改。
//PD4,PD5 电机方向控制 如果更改管脚控制电机方向,更改PORTD |= 0x10即可。
#define moto_en1 PORTD |= 0x10
#define moto_en2 PORTD |= 0x20
#define moto_uen1 PORTD &=~ 0x10
#define moto_uen2 PORTD &=~ 0x20
//启动TC2定时比较和溢出
#define TC2_EN TIMSK |= (《《1OCIE2)|(1《《TOIE2)
//禁止TC2再定时比较和溢出
#define TC2_DIS TIMSK &=~ (1《《OCIE2)|(1《《TOIE2)
关于注释
为了增加程序的可读性,方便合作者读动程序,或者程序作者在一段时间之后还能看懂程序,我们需要在程序中写 注释。
在比较特殊的函数使用或者命令调用的地方加单行注释。使用方法为:
Tbuf_putchar(c,RTbuf); // 将数据加入到发送缓冲区并开中断
extern void Delay1s(uint16 n); // n 《= 6 ,when n==7, it is 1.
在模块化的函数中使用详细段落注释:
/***********************
** 函数名称: Com_putchar
** 功能描述: 从串行口输出一个字符c
** 输 入: c:输出字符
** 输出 : 0:失败 1:成功
** 全局变量: 无
** 调用模块:
** 说明:
** 注意:
********************/
在文件头上加文件名,文件用途,作者,日期等信息。
/*********************************************************************************************************
** serial driver
** (c) Copyright 2005-2006, limaokui
** All Rights Reserved
**
** V1.1.0
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名:sio.c
**创 建 人: 李茂奎
**最后修改日期: 2005年7月13日
**描 述: serial driver
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 李茂奎
** 版 本: V1.00
** 日 期: 2005年7月13日
** 描 述: 原始版本
**
*********************************************************************************************************/
要清楚,注释是为了方便阅读,增强程序的可度性,不要本末倒置,不要给很简单大家都能看明白的程序加注释,不要让注释淹没了你的程序结构。对于函数,变量等尽量使用文件名自注释的方法,及通过文件名就可以知道意思。
简单的avr c语言程序,avr单片机c语言编程风格介绍 - 全文相关推荐
- 单片机 中断秒表 c语言程序,51单片机c语言的秒表设计.doc
51单片机c语言的秒表设计.doc 课程设计报告 基于AT89C51单片机的秒表设计 院 系 电子信息工程学院 专 业 电子信息工程 1 姓 名 摘 要 本设计是设计一个单片机控制的多功能秒表系统. ...
- 51单片机蜂鸣器演奏《小苹果》C语言程序,51单片机C语言蜂鸣器发声生日快乐播放程序...
<51单片机C语言蜂鸣器发声生日快乐播放程序>由会员分享,可在线阅读,更多相关<51单片机C语言蜂鸣器发声生日快乐播放程序(4页珍藏版)>请在人人文库网上搜索. 1.按键发音/ ...
- 单片机汉字点阵c语言程序,51单片机C语言多种点阵屏驱动程序(开发软件为keil C...
51单片机C语言多种点阵屏驱动程序(开发软件为keil C 2016-08-23 1 0 0 暂无评分 其他 1 积分下载 如何获取积分? 51单片机C语言多种点阵屏驱动程序(开发软件为keil C ...
- 时钟加闹钟c语言程序,51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)...
<51单片机c语言电子钟(已加入调时.闹铃.整点报时功能)>由会员分享,可在线阅读,更多相关<51单片机c语言电子钟(已加入调时.闹铃.整点报时功能)(13页珍藏版)>请在技术 ...
- 74hc595点亮点阵式led交通灯灯 c语言程序,89C51单片机C语言用四个74hc595控制四个LED实现交通灯...
89C51单片机C语言用四个74hc595控制四个LED实现交通灯 (2009-05-16 18:52:38) 标签: 教育 #include #define uchar unsigned char ...
- 单片机交通灯数码管c语言程序,51单片机C语言实现交通灯(红绿灯)源程序.doc
51单片机用C语言实现交通灯(红绿灯)源程序 2009-10-29 23:00 交通灯,红黄绿灯交替亮,怎样实现呢?其实就是根据单片机定时器及倒计时的程序修改. 源程序如下: /*1.程序目的:使用定 ...
- 89c51c语言程序,89C51单片机计算器C语言程序.doc
89C51单片机计算器C语言程序 89C51单片机[计算器]C语言程序 89C51单片机[计算器]C语言程序2010-12-15 16:54/*89C51单片机[计算器]C语言程序*/ /*P2位选P ...
- 8255A红绿灯c语言程序,51单片机外接8255A做成的交通灯程序及PROTEUS仿真结果(附对应C语言程序).doc...
51单片机外接8255A做成的交通灯程序及PROTEUS仿真结果(附对应C语言程序) 51单片机外接8255A做成的交通灯程序及PROTEUS仿真结果(附对应C语言程序)2010-04-21 22:0 ...
- 8255a初始化c语言程序,8255A的c语言程序.doc
8255A的c语言程序 8255A的c语言程序 [实例24]用8243扩展I/O端口 #include sbit ContrBit0=P1^0; sbit ContrBit1=P1^1; sbit C ...
- 简单谱子C语言程序,c语言曲谱_单片机c语言音乐简谱代码
51单片机曲谱编写音乐程序,我看不懂曲谱,谁能教下我! //<世上只有妈妈好>51单片机C语言程序和音乐采灯程序 //此程序在硬件上调试通过 //本程序的单片机晶振采用11.0592MHZ ...
最新文章
- 使用Java企业级技术开发大型系统(3)
- 3.Spring Security 自定义用户认证
- python中文编辑器推荐-python文本编辑器是什么
- docker 主进程 日志_运维笔记--docker高效查看后台日志
- SenchaTouch2.3.1 中使用listpaging以及pullrefresh插件 做的分页示例
- EscapeDataString URI 字符串太长
- 计算机 线性代数答案,2013-2014-1《线性代数》计算机B答案
- Spring教程动画文字版
- 一文看懂推荐系统:排序11:Deep Cross Network(DCN)
- 取消管理员取得所有权_win7下取得管理员所有权的技巧
- 迷失lost结局什么意思_《lost》《迷失》大结局,没看懂的进,详细讲解
- Error:1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL
- 某站弹幕抓取,视频,评论......
- hdoj-2036题解-向量积法求任意多边形面积
- JavaSE学习笔记 详解Set集合中实现类:LinkedHashSet以及TreeSet
- nyoj_42 一笔画问题
- 计算机刻录机无法显示,电脑不识别刻录机是为什么
- Linux C popen函数返回Shell命令执行结果
- 【分享】光模块PPT
- python 类对象转换json的三种方式
热门文章
- 个人计算机显示器配置,怎么看电脑显示器配置
- 自学编程,上这8个免费网站,省去上万元学费
- Python程序设计基础(第九章 字典和集合 练习记录)
- 二叉树的中序遍历-python
- 天下网商属于阿里系吗_“阿里公子”商标申请被驳回,不属于马云父亲的阿里家族吗?...
- CDSP认证是什么?数据安全认证专家含金量大吗?
- Excel如何把同类数据合并到同一单元格
- vue+element:el-descriptions组件,自定义图片,适配移动端
- 边缘计算是什么?边缘计算系统的组成及概念
- Windows开启 CPU 虚拟化 + 关闭 Hyper-V