资讯详情

AVR单片机学习(四)C语言的流水灯验证

当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

AVR单片机学习(4)C语言流水灯验证

作者:zww 1988来源:本站原创点击数:…更新时间:2014年4月18日 【字体:大 中 小】

AVR

的IO口简介和寄存器的概念

一、什么是寄存器?

寄存器就是RAM映射片上外设的一些特殊单元的特殊功能

二、何谓“IO口”

可以将"0"端口与1转换为电压信号

最常用的单片机TTL电平:0V代表“0”, 5V 代表“1”

Mega16有4个IO口,PA,PB,PC,PD

三、IO口的性能指标

灌电流能力:能流入IO口的最大电流

拉电流能力:能从IO最大电流从口流出

上拉电阻和下拉电阻

最大输入电压

IO两种的两种状态

f8517b195ef3fe3104532d04698e25a2.png

如上图所示(有一个输出是为了理解而给出的,不存在于开关的实际电路中) 要么给个5V 要么给个地 0V就是输出0和 1

输入模型模型理想的输入IO口相当于悬空导线,即输入此对VCC

对地的等效阻抗必须是无限的,实际的单片机现在通常是10M欧姆以上。

IO口腔输出性能指标

1/AVR 的IO口灌电流能力和拉电流能力均为30mA

2/51的拉电流能力<100uA,灌电流能力10mA

拉电流能力:

能够从IO最大电流从口流出

下图只是看电流时的电流IO口流相当于内部开关的实现VCC

电流随着外部电阻的变化而变化 最大电流30mA Imax

灌流能力:

能够流入IO口的最大电流

下图同理 IO口的输入

IO口腔输入性能指标

一、AVR的IO上拉电阻可配置在口输入状态下,值为100K 数量级

二、最大输入电压范围:-0.5V~VCC 0.5V

AVR 输入IO可配置上拉电阻,上拉电阻较弱 大概100K

-- 200K

、为什么要配置上拉电阻?对于输入口,因为当配置为输入时,它的等效是一个悬挂点。如果输入口上真的有悬挂点,悬挂线的电平会是多少?单片机将被视为输入0

或者1/答案是不确定的,可能会受到一些外部静电或者一些比较强的电磁场的影响,或者0或者1,但是如果我们配置上拉电阻,这个的时候IO当嘴悬挂时,电平不再不确定,被确定为上拉上拉。1.上拉电阻的具体功能将在下一论。在设计这个关键程序时,我们将有更深入的体验。最大输入电压见下图:输入小低压电压

-0.5最大0.2VCC输入高电压做小0.7VCC 最大VCC 0.5V就是说最小-0.5最大 5.5V

除了ATmega16之外其他的AVR芯片跟m16也差不多

一、IO口语IO寄存器映射(x代表A~D)\

方向寄存器:DDRx

数据寄存器:PORTx

输入寄存器:Pinx

二、C寄存器的语言变量和映射

io.h所有寄存器有寄存器映射为同名变量,读写相当于读写寄存器

三、输出状态IO寄存器设置

DDRx一个位置1,相应位置IO口设置为输出

PORTx对应某一位置1或0IO口相应位置的电平

以下是一些映射关系

第一个:C语言通过AVR Studio/WinAVR

编译成目标代码,然后下载线编程器(现在个人一般不需要),JATG口到硬件单片机

第二:寄存器到寄存器的映射 通过同名变量 、单片机通常是8位定时器,当然也有16位计数器,然后映射到寄存器中的数据0

1 虽然在RAM存的是0或1 以相当于内部高低电平的形式存储,最后通过IO口 UARTSPIIIC 转化为

5v0v 或LVTTL 3.3V 0V .

第三,其他变量 其实就是RAM数据也就是占用RAM当然,这个存储单元中的存储单元RAM不能直接与外界接触。

第四,函数表示每个函数之间的一些操作和交互关系,表示在单片机内部是每个寄存器和RAM最动关系最终转化为硬件模块之间的关系。

C语言流水灯验证

循环语句、

8位流水灯可用于指示8位二进制

对IO寄存器可以通过移位来实现流水灯的效果

循环语句

1、while语句

2、for 语句

验证各种操作符的流水灯

赋值=加 减-乘*除/ 括号()求余%

与& 或| 取反 ~异或^ 左移

<>

逻辑与 && 逻辑或||逻辑非!

while(表达式)//表达式不为0

即为真(1)死循环

{

}

如何设置断点

toggle breakpoint F9

断点是全速运行时,当运行到断点位置时,停止如下图所示

RunF5

去除断点,将光标定位到断点,再次点击小手或F9 去除断点。

再次按全速运行结果如下图灯全亮

原因是运行循环速度过快,应增加延迟AVR CPU 主频能跑到16MHZ

1到2微秒的时间。100万秒没有几十万次循环,但是人眼分辨加延迟。

for (赋值初始值只做一次;条件(真实内容);执行内容后执行此语句){};来回判断; 第二条和第三条语句

for 循环括号没有只执行 第二条和第三条 判断 加加动作。

位运算

将1个位置1、置0、取反

置1、

相应位与1

进行位或|运算

3.置0

对应的位置和0&运算

4.取反

根据相应的位置和1^

运算相同为0相异为1

5.移位运算符:左边是最高位,右边是最低位

左移<<:>

左移n位相当于乘2^n运算,左侧n丢弃,右侧n个0

6.右移

右移n位相当于乘2^n操作,右n位丢弃,左n位0

注:在32位操作系统中 是补符号位我试过嵌入式32位操作系统

假如自制仿真器的缺点,如果滤波不好,就会跑。

(引用百度说辞:程序跑飞

程序跑飞是指程序计数器PC值偏离给定的唯一变化过程,导致程序运行偏离正常运行路径.程序跑步的因素和后果往往是不可预测的.在许多情况下,程序运行后,系统会进入死循环,导致死亡

)

任何数与1 进行^ 异或取反。

PORTB = PORTB ^ 0b111111111

IO口设置为输出状态

蜂鸣器

一、有源蜂鸣器

加上电源电压,可以发出鸣叫声,消耗电流20mA左右

传统的蜂鸣器驱动电路

三极管驱动(如下图所示)

AVR蜂鸣器驱动电路

IO直接驱动口(如图所示)

编程验证(buzzer 蜂鸣器)

可看到PORTA 变化蜂鸣器叫了

好了总结下

第一步:IO设置为输出/p>

DDRB = 0XFF;

DDRB |= 0b00100000//第五位输出高电平

第二步:对应位输出数据

输出1:PORTB |= 0b00100000;//第五位输出高电平

输出0:PORTB &= ~0b00100000;//第五位输出低电平

输出1:PORTB |= (1<<5);//第五位输出高电平

输出0:PORTB &= ~(1<<5);//第五位输出低电平

对应位取反:PORTB^ = (1<<5);//第五位输出高电平

标签: c1008y三极管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台