当前位置:单片机教程网 >> 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两种的两种状态
如上图所示(有一个输出是为了理解而给出的,不存在于开关的实际电路中) 要么给个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);//第五位输出高电平