AVR单片机位操作的C语言编程实现
第2页 共4页
} BYTE_BIT; //B 口宏定义,此值参见相应头文件。 #define_PINB ox23 #define_DDRB ox24 #define PORTB ox25 //定义 B 端口每个位,进行地址绑定。 #define PINB_BITO (*(volatileBYTE_BIT*)(_PINB)).BTTO PINB_BITl BITl…… #dcfinc PORTB_BIT0(*(volatilcBYTE_BIT*)(_PORTB))BIT0 PORTB_BIT1 BIT1…… #define DDRB BITO (*(volatilcBYTE_BIT*)(_DDRB)BITO DDRB_B1T1 Bitl…… 对各端口依同一规律均进行各位的定义即可。 结合头文件的相关定义,重新对其特定地址进行另外的绑定,结合位域的概念,进而一步步 将各寄存器由一个字节分成了可操控的 8 个位。在上述文件中,笔者仅表述了 B 端口。另外, Atmega48 的端口不完全,只有 B、C、D 口,没有 A 口,且 D 口为 8 位,C 口为 6 位,B 口为 7 位,若外接晶体,则 PB6 和 PB7 不能另作端口运用。所以,端口很不完整,但为了保持位域完 整性和一致性,便于理解,将 B、C、D 三口均作 8bit 对待。实际操作时,千万注意不要去操作 那些实际不存在的位。当然,若感兴趣,大家可改动头文件相关定义,来完善它。 为验证这个头文件,笔者很快编写了一个测试程序 Beep.c,具体如下: Beep.c 程序代码 #include<iom48r.h> #include"avr_bith”//包含自定义头文件 #define time 40000 Void beepcunsigned int); Void portint(); Void main(); { while(1) { portint(); beep(time); } } Void beep cunsigned intr)//蜂鸣器发声函数 { unsignedinti; PORTB_BIT0=0;//PB0 输出低电平 for{i=r,i>o,i..) PORTB_BIT0=1;//PB0 输出高电平 for(i=r;i>0;i..) } void portint()端口初始化函数
电子报/2011 年/1 月/16 日/第 015 版 智能电子
AVR 单片机位操作的 C 语言编程实现
湖北 曾安君
一、常规方法 AVR 单片机的各类教材或编程应用参考资料,对介绍的端口位操作方法不外乎宏定义及整体 和某个常量相或、相与来实现某一单个位状态的改变。如:PORT&=~(1<<1);等价于:PORTB& =oxfd;作用是 PB1 清零而其余位不变。与之类似的还有: PORTB1=(1<<4);PB4 置位,其余位不变。 PORTBA=(1<<4);PB4 翻转,其余位不变。 上述方法,无论是常量值参与还是移位操作,用起来总嫌麻烦,不够直观,且具体常量值还 需人工推算,易出错。移位操作生成的目标代码偏大,在大量运用时,占用系统内存或 flash 空 间,执行效率低。 以笔者实际运用效果来看,宏定义比较好。笔者也偏好运用宏定义。C 编译器在编译之前会 事先进行宏替换,所以,如果宏定义讲究一些技巧,则代码执行效率将得到较大提升,编程时, 操作也得心应手。 常规参考手册或资料,建议用以下宏定义: #define PAO 0 #define PAl 1 #define PA2 2 #define PA3 3 #define PA4 4 #deffine PA5 5 #define PA6 6 #define PA7 7 #define CPL_BIT(x、y)(x^=(1<y)) #define SET_BIT(x、y)(xl=(1<y)) #define CLR_BIT(x、y)(x&=~(1<y)) #define GET_BIT(x、y)(x&=(1<y)) 如此宏定义之后,可构成一个头文件,然后加入到新建工程文件中(编译器用 ICC 的 ICC6.31A),但之前需包含相应单片机的头文件,如:MCU 为 AT-MEGA48,则最先包含 iom48V.h 之后,再包含此自制头文件,即可在程序中运用: CPLBIT(PORTA,PA2);//PB2 取反 GET_BIT(PORTA,PA6);//读取 PA6 的状态 CLR_BIT(PORTA,PA5);//清零 PA5 SET BIT(PORTA,PAl);//PA1 置 1 此法在运用时,依旧用了移位操作,只是为了方便程序操作,笔者只在小规模程序中运用。 下面,笔者将充分利用 C 语言自身的强大位运算能力和指针相结合,构建一个 ICC6.31A 平 台下的位定义头文件,希望能给大家一些启示。 首先明确几个基本概念:位域、地址绑定,和 Volatile 限定关键字。 在 ICC6 31A 的安装目录中有个 in-elude 文件夹,里面有大量编译器开发人员已为我们开发好
第3页 共4页
{ DDRB_BITO=1://PB0 为输出状态 PORTB_BIT0=O://PB0 输出“0” } 在电路拓扑中,在 ATMEGA48 的 PB0 脚,即(14)脚外接一只三极管(接 b 极)由三极管去控制 只蜂鸣器。程序很简单。为了更直观,在 PORTB 口其他不用的引脚上均接了发光二极管,此时, 在测试程序中,将端口初始化函数语句改为:DDRB=oxff;PORTB=ox00;(或 PORTB=oxff;视二 极管接法而定),由二极管配合蜂鸣器来观察 PBO 位是否能单独动作。当然,运用此位定义头文 件,可实现单片机任一口的任一位的位操作。 二、扩展运用 基于上述原理,结合 C 语言取地址运算符&,不难实现一个通用位定义头文件,来适合所有 AVR 单片机,只是代码较为复杂。大家不妨自己试试。 注意一点:以上头文件,笔者是参考 ICC6.31A 编译器的 include 文件夹定义的,在使用前,请 首先包含系统提供的 MCU 头文件,并将自定义头文件复制到所建工程中,然后,就可运用自如 了。 就目前使用情况来看,使用 AT-MEGA48/16/128 的 MCU 较多,所以即便是定义 3 个对应的 位操作头文件,也是可以的。通用型文件往往体积较大,编制麻烦,可读性差,不适合普通爱好 者。 在本文中,笔者对于 AVR 单片机的位操作端口编程提出了自己的一些看法,也给出了自己 的具体做法。对于实际运用效果,笔者较为满意,也希望大家提出自己的看法。因为单片机的操 作,是运用单片机的一项基本技能,对于不支持位操作的 C 语言编译器,希望能有一套行之有效 的好方法来解决日常运用中的一些困惑。 最后,愿大家能写出更好的头文件,更好的源代码。此文写作时,笔者的项目尚未完工,所 以成稿时间紧迫,过程匆忙,如有疏漏之处,请文件,下面是 iom48v.h 头文件。 AVR 的 ATMEGA48MCU 头文件 iom48v.h 中关于其端口地址定义部分: /*PortB*/ #define PINB(*(volatile unsignedchar*)ox23) #define DDRB(*(volatile unsignedchar*)oxx24) #define PORTB(*(volatile unsignedchar*)ox25) /*PORT C*/ #define PINC (*(volatile unsignedchar*)ox26) #define DDRC(*(volatile unsignedchar*)ox27) #define PORTC(*(volatile unsignedchar*)ox28) /*Port D*/ #define PIND(*(volatile unsignedchar*)ox29) #define DDRD(* (volatile unsignedchar*)ox2A) #define PORTD(*(volatile unsignedchar*)ox2B) 注:每个端口均有 PIN、DDR、PORT 三个八位寄存器 简要概括如下: Volatile 一词用来规定 C 编译器不允许对其限定的变量进行优化处理。如: #define PORTB(*(volatile unSignedchar*)ox25) 这句宏定义要结合 iom48v.h 头文件来看,在前面有该头文件关于各端口寄存器的定义。上述
宏语句中,ox25 被强制转化为一个指针常量,实际上,上述宏定义的意义为:PORTB 被强制定义 在地址 ox25 上,即定义了一个无符号字符型变量 PORTB,且被强制绑定在 ox25 地址上。其他语 句依此类推。
有了这个概念之后,再来了解一下 C 语言中位域的定义。标准 C 语言中,可以定义一个特殊 的结构,位域,允许对定义的结构中的单个位进行操作。基本构成如下:
位域: struct 位域结构名 { 位域列表;
} 位域类型变量名; 下面是笔者给出的位域定义等的头文件,在自定义位操作头文件中定义了一个位域 BYTE_BIT。相关详细架构标准请参考 C 语言规范,在此不再多述,只是希望大家对此有大概了 解。 自定义 avr_bit.h 头文件(节选,以 ATMEGA48 为例,定义其 B 口) //定义位域 tyoedef struct ByteBit { unsigned Bit0:1; unsigned Bitl:l; unsigned Bit2:1: unsigned Bit3:1; unsigned Bit4:1; unsigned Bit5:1; unsigned Bit6:1; unsigned Bit7:1;
AVR单片机C语言项目开发实践教程项目一 AVR单片机系统开发与设计工具
图2-14 进入调试状态
二、程序编译及下载
1.工程文件的建立与编译
点击全速运行
图2-15 程序全速仿真
二、程序编译及下载
1.工程文件的建立与编译
单步运行查看 单口状态
程序指针
点击单步运行 执行每条语句
图2-16 单步执行后的IO状态
二、程序编译及下载
2.示例程序说明
程序使用芯片ATmega16,频率为8MHz。如使用其他 芯片,需修改模拟调试选项中的芯片型号,并修改程序中 的头文件包含。程序所完成的功能:PC0接一LED。以 2Hz的频率闪烁。
图2-20 程序下载界面
三、AVR单片机软件仿真
如果在没用硬件实训箱,也可以利用软件仿真的形式 进行学习。本书简单介绍Proteus软件。
在单片机学习过程中,同学们更应该实际动手设计、 制作、调试,才能从硬件上真正提高自己的水平。
Proteus软件使用方法参照课本演示步骤进行操作。
AVR单片机(C语 言)项目开发实践 教程项目一 AVR单 片机系统开发与设
计工具
目录
一、WinAVR+AVR Studio软件开发环境使用 二、程序编译及下载 三、AVR单片机软件仿真
一、WinAVR+AVR Studio软件开发环境使用
1.AVR单片机嵌入式系统的开发平台AVR Studio ATMEL公司为开发使用AVR单片机提供了一套免费的
1.工程文件的建立与单步执行语句 单步执行语句或函数 跳出当前函数 运行到光标处 自动单步运行 在当前位置添加断点 取消所有断点 快速查看变量
图2-13 运行工具栏
二、程序编译及下载
1.工程文件的建立与编译
3、MCU运行监视
avr单片机gcc程序设计
AVR单片机GCC程序设计1. 介绍AVR单片机是一种基于哈佛架构的8位微控制器,具有高性能、低功耗和广泛的应用领域。
GCC是一种开源的编译器套装,可用于编译C、C++和其他编程语言。
本文将介绍AVR单片机的GCC程序设计,包括开发环境的搭建、程序的编写和调试等内容。
2. 开发环境搭建为了进行AVR单片机的GCC程序设计,我们需要搭建相应的开发环境。
以下是搭建开发环境的步骤:2.1 安装AVR工具链AVR工具链是AVR单片机编程的基础,它包含了编译器、汇编器、链接器等工具。
可以从AVR官方网站上下载并安装AVR工具链。
2.2 安装开发环境在进行AVR单片机GCC程序设计之前,需要安装一个适合的开发环境。
常用的开发环境有AVR Studio和Atmel Studio等。
可以根据个人需求选择一个适合的开发环境进行安装。
2.3 配置编译器在开发环境中配置编译器是非常重要的步骤。
需要将AVR工具链的路径添加到系统环境变量中,以便编译器能够找到相应的工具。
3. GCC程序编写在搭建好开发环境后,就可以开始编写GCC程序了。
以下是GCC程序编写的基本步骤:3.1 编写主函数GCC程序的入口是一个名为”main”的函数。
可以在这个函数中进行初始化操作和主程序的编写。
#include <avr/io.h>int main() {// 初始化代码while (1) {// 主程序代码}}3.2 配置引脚AVR单片机的GPIO引脚可以作为输入或输出使用。
可以使用AVR提供的头文件来配置引脚。
#include <avr/io.h>int main() {DDRB = 0xFF; // 将PB引脚配置为输出while (1) {// 主程序代码}}3.3 读写引脚可以使用AVR提供的函数来读写引脚的电平。
#include <avr/io.h>int main() {DDRB = 0xFF; // 将PB引脚配置为输出while (1) {PORTB = 0xFF; // 将PB引脚输出高电平// 延时PORTB = 0x00; // 将PB引脚输出低电平// 延时}}3.4 中断处理AVR单片机支持外部中断,可以在需要的时候触发中断处理函数。
AVR_单片机与GCC_编程使用方法
WINA VR 是一个ATMEL A VR 系列单片机的开发工具集,它包含GNU C 和C++编译器GCC。
1.1 一个简单的例子为了先有一个感性的认识,我们首先看一下如下一段程序和它的编译、链接过程。
文件demo1.c :#includeint main( void ){ unsigned char i, j, k,led=0; DRB=0xff;while (1) { if(led) PORTB|=0X01; ese RTB&=0XFE; led=!led;for (i=0; i<255; i++) fr(j=0; j<255;j++)k++;}}//延时这是一个使接在PB0 口的LED 发光管闪烁的程序。
有了源程序文件demo1.c,我们就可以编译它了。
通过点击菜单开始->运行在弹出的对话框中输入― command ‖ ,来打开控制台窗口,并在命令行输入:avr-gcc –mmcu=at90s2313 –c demo1.c如图1-1 所示。
必需告诉编译器程序的mcu 类型,这是我们通过命令行选项-mmcu 来指定的,我们指定的器件为at90s2313。
-c 选项告诉编译器编译完成后不链接。
图1-1 控制台窗口编译完成后在工作目录新生成了一个文件:demo1.o ,它是我们的目标文件,我们再使用链接器将它链接成可在器件上执行的二进制代码。
在命令行输入:avr-gcc –mmcu=at90s2313 –O demo1.elf demo1.o之后我们会在工作目录看见链接器生成的demo1.elf。
gcc 的链接后生成的文件为ELF 格式,在命令行我们通常用.elf 指定其扩展名。
ELF 格式文件除了包含不同存储器的二进制格式内容外还包含一些调试信息,所以我们还要借助一个有用工具avr-objcopy 来提取单片机程序存储器内容。
命令行输入:avr-objcopy -j .text -j .data -O ihex demo1.elf demo1.hexgcc 把不同类型的数据分到不同的段落,相关程序存储器的段有.text 和.data ,我们用选项–j 指定了要提取的段。
AVR单片机C语言编程
高性能
AVR单片机的功耗较低,适用于电池供电的设备。
低功耗
AVR单片机可以通过C语言编程实现不同的功能。
可编程
AVR单片机的外设接口丰富,如ADC、DAC、UART、SPI等,便于实现各种通信和控制功能。
丰富的外设接口
AVR单片机的应用领域
AVR单片机可以通过外设接口实现与传感器的通信和控制,适用于智能仪表领域。
AVR Studio简介
AVR Studio可从Atmel官方网站下载安装,支持Windows、Linux和Mac等多种操作系统。
AVR Studio安装
AVR Studio简介及安装
AVR Studio的使用方法
使用AVR Studio进行单片机编程,需先创建一个工程,然后编写代码、编译、链接和下载程序到单片机中。
调试技巧
使用AVR Studio的调试功能,可以实时监控单片机内部寄存器和IO口状态,支持串口调试和JTAG调试等多种方式。
AVR Studio的使用方法及调试技巧
AVR单片机的开发流程
先确定单片机型号及所需外围器件,然后编写程序、编译、链接、下载并调试,最后进行系统测试。
注意事项
在进行AVR单片机开发时,要注意代码规范、注释明确、变量命名规则和模块化设计等基本问题,提高代码可读性和可维护性。同时,要避免使用未经Atmel认证的芯片和元器件,以确保系统稳定可靠。
01
02
03
01
总结词:熟练掌握
AVR单片机实现液晶显示控制
02
液晶显示控制程序:利用AVR单片机的串行通信接口,实现液晶显示的控制,同时采用C语言编写相应的程序。
03
程序逻辑:利用AVR单片机的USART串行通信接口,通过发送相应的指令控制液晶显示器的显示内容和显示位置,同时采用中断处理的方式对液晶显示器的状态进行实时监控,实现液晶显示的控制功能。
AVR单片机C语言编程
定时器与计数器的工作原理
定时器
定时器是单片机内部的一个硬件资源,可以通过编程控制其产生一定时间间隔的时序。定时器的工作原理是将 单片机内部的某个固定时间单位(通常为时钟周期)进行计数,当达到设定的计数值时,定时器就会产生一个 中断信号或者输出一个脉冲信号。
计数器
计数器是单片机内部另一个重要的硬件资源,用于对外部信号进行计数。计数器的工作原理是当外部信号输入 时,计数器的值就会自动加1或者减1。通过编程控制计数器的初始值和溢出值,可以实现不同的计数功能。
定时器与计数器的编程实例
要点一
定时器的编程实例
以AVR单片机的定时器0为例,通过编程控制定时器的 初始值和溢出值,实现一个1秒的定时器。首先需要设 置定时器的控制寄存器,包括选择定时器模式、设置定 时器初始值和启动定时器。然后通过读取定时器的当前 值,判断是否已经到达设定的溢出值,如果到达则产生 一个中断信号或者输出一个脉冲信号。
如用于设置中断的寄存器、设置时钟频率的寄 存器等
AVR单片机的内存管理
了解AVR的内存映射以及如何使用指针访问内存地址等
C语言编译器及开发环境
GCC for AVR
是AVR单片机常用的编译器,可以将C语言源代码编译成AVR能 理解的汇编代码
Atmel Studio
Atmel公司提供的集成开发环境,内含GCC for AVR,可用于编 写、编译和调试AVR的C语言代码
中断处理函数
编写中断处理函数,用于处理各个中断源 的中断事件。
中断使能
通过使能全局中断或特定中断源来启动中 断处理。
中断处理的扩展方法
中断嵌套
支持多层嵌套中断,确保关键任务得到优先处理。
可编程中断控制器
通过可编程中断控制器对中断进行更灵活的控制。
avr单片机gcc程序设计
avr单片机gcc程序设计一、前言AVR单片机是一种常见的嵌入式系统处理器,广泛应用于各种电子设备中。
GCC是一款常用的C语言编译器,也可以用于AVR单片机程序设计。
本文将介绍如何使用GCC进行AVR单片机程序设计。
二、准备工作1. 安装GCC编译器GCC编译器可以在Linux、Windows和Mac OS X等操作系统上安装。
安装方法请参考相关文档。
2. 安装AVR-GCC工具链AVR-GCC工具链包括编译器和调试器等工具,可以在Linux、Windows和Mac OS X等操作系统上安装。
安装方法请参考相关文档。
3. 准备开发板选择一款支持AVR单片机的开发板,并连接到计算机上。
4. 编写代码使用C语言编写程序,并保存为.c文件。
三、编译过程1. 编译源代码打开命令行终端,进入.c文件所在目录,执行以下命令:avr-gcc -mmcu=atmega328p -Wall -Os -o main.o main.c其中,-mmcu选项指定了目标单片机型号;-Wall选项启用所有警告信息;-Os选项启用优化;-o选项指定输出文件名。
2. 生成可执行文件执行以下命令:avr-gcc -mmcu=atmega328p -o main.elf main.o其中,-mmcu选项指定了目标单片机型号;-o选项指定输出文件名。
3. 生成HEX文件执行以下命令:avr-objcopy -j .text -j .data -O ihex main.elf main.hex其中,-j选项指定要复制的段;-O选项指定输出格式。
四、烧录过程使用AVR ISP编程器将HEX文件烧录到目标单片机中。
五、调试过程可以使用AVR-GDB进行调试。
首先需要在编译源代码时添加-g选项,生成带有调试信息的可执行文件。
然后执行以下命令:avr-gdb main.elf进入GDB调试界面后,可以使用各种GDB命令进行调试。
六、结语本文介绍了AVR单片机GCC程序设计的基本过程,包括准备工作、编译过程、烧录过程和调试过程。
AVR单片机C语言编程
步骤2
将时钟芯片的数据输入/输出引脚连接到AVR单片机的I/O口
步骤4
完善程序,实现时钟芯片的读写功能和数据显示
步骤3
通过编写C语言程序,读取时钟芯片的实时时间数据,并将数据存储到指定的变量中
AVR单片机C语言编程常见问题及解决方案
05
总结词:在烧录程序时,AVR单片机可能因为各种原因导致程序无法成功烧录到芯片中。
使用编译器调试功能:使用编译器的调试功能可以帮助定位错误所在位置,以便更准确地解决问题。
程序编译时出现错误或警告
AVR单片机C语言编程的进阶学习建议
06
阅读经典应用案例和项目经验
通过阅读成功的项目案例,了解AVR单片机在各个领域的应用情况及技术实现。
参考优秀的代码库和开源项目
学习并理解其他开发者分享的代码库和开源项目,掌握优秀的编程技巧和经验。
AVR单片机的开发环境和工具链
03
Atmel Studio
01
Atmel旗下的集成开发环境(IDE),支持AVR系列单片机的设计与开发。
AVR单片机的开发环境
WinAVR
02
在Windows平台上进行AVR单片机开发的开源集成开发环境(IDE)。
AVR-GCC
03
AVR单片机的C编译器,可将C语言源码编译成可在AVR单片机上运行的二进制代码。
参加线下技术研讨会和培训课程
参加相关的学习研讨会、技术分享会和培训课程,与行业专家面对面交流,深入了解AVR单片机领域的最新动态和发展趋势。
参加相关的技术论坛和社区交流活动
THANKS
感谢观看
程序无法烧录成功
程序运行时出现异常
总结词:在编译程序时,编译器可能会给出错误或警告信息,这些信息可能是由于代码语法错误、类型转换不正确等原因引起的。
基于AVR单片机I-O演示C语言程序
基于AVR单片机I/O演示C语言程序//程序流程:全亮->全灭->PD 隔一步进->全亮->全灭->PD 隔二步进->全亮->全灭->PB 全亮->pb0 置位->pb0 清零->PB0 反转->全灭->(循环)// Target :M8// Crystal: 11.059Mhz#include #include //起始全亮void port_init(void){PORTB= 0x00;DDRB = 0xFF;PORTC = 0x00;DDRC = 0x7F;PORTD = 0x00;DDRD =0xFF;}//延时函数,大约1ms;void delay(char tim){unsigned inti,j;for(i=0;i<tim;i++) for(j=0;j<10000;j++);}//led 全亮void led_on(void){PORTB =0x00;PORTC = 0x00;PORTD = 0x00;delay(5000);}//led 全灭void led_off(void) {PORTB = 0xFF;PORTC = 0xFF;PORTD = 0xFF;delay(5000);}//PB 隔1 步进void pd_1(void){char i;for (i = 0; i < 8; i++){ PORTB = ~(1 << (i));//位操作结合移位操作delay(5000);}}//PB 隔2 步进void pd_2(void){char i;for (i = 0; i < 8; i+=2){ PORTB = ~(1 << (i));//位操作结合移位操作delay(5000);}}//call this routine to initialise all peripheralsvoid init_devices(void){//stop errant interrupts until set upCLI(); //disable all interruptsport_init();MCUCR = 0x00;GICR = 0x00;TIMSK =0x00; //timer interrupt sourcesSEI(); //re-enable interrupts//all peripherals are now initialised}//void main(void){init_devices();while(1){ led_on(); led_off(); led_on();led_off(); pd_1(); led_on(); led_off(); pd_2(); led_on(); led_off(); //赋值(会给所有的位以特定值),使pb0 为0,led 亮;PORTB = 0xFE; delay(5000); //置位(不影响其他位),使pb0 为1,led 灭;PORTB |= 0x01; delay(5000); //清零(不影响其他位),使pb0 为0,led 亮;PORTB &= ~0x01; delay(5000); //反转(不影响其他位),使pb0 为1,led 灭;PORTB –0x01; delay(5000);}}tips:感谢大家的阅读,本文由我司收集整编。
AVR单片机C语言编程
}
2021/1/28
6
机电系统控制电路设计
1 C语言基础
关于编译预处理(宏定义)
❖ #define PI 3.14159 ---不带参数 #define S(a,b) a*b---带参数 ❖ #define — 宏定义命令 ❖ PI — 符号常量(宏名,最好用大写,以区别一般变量) ❖ 3.14159 —宏体(可以是一个表达式,如3+4) ❖ 作用:用简单符号代表宏体部份内容(编译时会先自动替换) ❖ 意义:直观/多次使用/便于修改 ❖ 注意: #define 可出现在程序的任一位置
#include <math.h>
/*编译预处理——文件包含*/
main( )
/*主函数*/
{
float r,s;
/*定义变量r、s类型为单精度实型*/
r =1.0;
/*变量r赋初值*/
s=PI * pow(r,2);
/*计算圆面积s*/
printf ("半径R=%f 时,面积S=%f \n",r,s); /*输出结果*/
执行部份:输入、赋值、计算、控制、输出等:
r=1.0;
/*变量r赋初值*/
s=PI*pow(r,2);
/*计算圆面积s*/
printf("半径R=%f 时,面积S=%f \n",r,s); /*输出结果*/
2021/1/28
11
机电系统控制电路设计
1 C语言基础
其他函数
❖ 标准库函数——只能调用 。使用方法: ⒈先“包含”,即将该函数所在头文件包含在程序中。 例: #include <stdio.h> ⒉后调#用in。clu调de用<方m式at:h.h函>数名(参数) main( ) { …… s=PI*pow(r,2); …… printf(“半径R=%f 时,面积S=%f\n”,r,s); } 说明:pow(x,y) 求xy (math.h中的标准数学函数) printf(……); (stdio.h中的标准输出函数)
AVR单片机位操作的C语言编程实现
} BYTE_BIT; //B 口宏定义,此值参见相应头文件。 #define_PINB ox23 #define_DDRB ox24 #define PORTB ox25 //定义 B 端口每个位,进行地址绑定。 #define PINB_BITO (*(volatileBYTE_BIT*)(_PINB)).BTTO PINB_BITl BITl…… #dcfinc PORTB_BIT0(*(volatilcBYTE_BIT*)(_PORTB))BIT0 PORTB_BIT1 BIT1…… #define DDRB BITO (*(volatilcBYTE_BIT*)(_DDRB)BITO DDRB_B1T1 Bitl…… 对各端口依同一规律均进行各位的定义即可。 结合头文件的相关定义,重新对其特定地址进行另外的绑定,结合位域的概念,进而一步步 将各寄存器由一个字节分成了可操控的 8 个位。在上述文件中,笔者仅表述了 B 端口。另外, Atmega48 的端口不完全,只有 B、C、D 口,没有 A 口,且 D 口为 8 位,C 口为 6 位,B 口为 7 位,若外接晶体,则 PB6 和 PB7 不能另作端口运用。所以,端口很不完整,但为了保持位域完 整性和一致性,便于理解,将 B、C、D 三口均作 8bit 对待。实际操作时,千万注意不要去操作 那些实际不存在的位。当然,若感兴趣,大家可改动头文件相关定义,来完善它。 为验证这个头文件,笔者很快编写了一个测试程序 Beep.c,具体如下: Beep.c 程序代码 #include<iom48r.h> #include"avr_bith”//包含自定义头文件 #define time 40000 Void beepcunsigned int); Void portint(); Void main(); { while(1) { portint(); beep(time); } } Void beep cunsigned intr)//蜂鸣器发声函数 { unsignedinti; PORTB_BIT0=0;//PB0 输出低电平 for{i=r,i>o,i..) PORTB_BIT0=1;//PB0 输出高电平 for(i=r;i>0;i..) } void portint()端口初始化函数
