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

发布者:huanhui最新更新时间:2020-02-09 来源: eefocus关键字:AVR单片机  C语言  流水灯验证 手机看文章 扫描二维码
随时随地手机看文章

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或0,对应IO口相应位的电平高低

下面是一些映射关系

第一个:C语言通过AVR Studio/WinAVR 等编译成目标代码,然后通过下载线编程器(现在个人一般不用了)、JATG口到硬件单片机


第二个:说的是寄存器到寄存器的映射 通过同名变量 、单片机一般多数为8位定时器当然也有16位计数器、然后映射到寄存器内的数据0 1 虽然在RAM存的是0或1 相当于内部高低电平的一种形式进行存储最后通过IO口 UART SPI IIC 转化为 +5v 0v 或LVTTL +3.3V 0V .


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


第四个、函数表示的就是各个函数之间的一些运算还有就是互动的关系,表现到单片机内部就是各个寄存器还有RAM的互动关系,最后转化为硬件模块之间的关系。

C语言的流水灯验证

循环语句、


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


对IO寄存器进行移位运算,即可实现流水灯效果


循环语句


1、while语句


2、for 语句


各种运算符的流水灯验证


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


与& 或| 取反 ~ 异或^ 左移 << 右移>>


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


while(表达式)//表达式不为0 即为真 (1)死循环


{


}

如何设置断点

toggle breakpoint F9


断点就是全速运行时候当运行到断点位置就停下来如下图



Run F5

去除断点就是把光标定位到断点处再次点击小手或F9 断点就去除了。


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

原因是因为运行循环速度太快应该加个延时AVR CPU 主频能跑到16MHZ 一个1到2微秒的时间。1百万没秒循环几十万次,然人眼分辨加延时。


for (赋值初始值只做一次;条件(真进入内容);执行完内容后执行此条语句){};来回判断 第2条与第3条语句


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

位运算

将某一位置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 ^ 0b11111111;//利用异或可以实现闪烁灯


IO口设置为输出状态

蜂鸣器

一、有源蜂鸣器


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


传统的蜂鸣器驱动电路


三极管驱动(如下图)

AVR的蜂鸣器驱动电路


IO口直接驱动(如图)

编一段程序进行验证(buzzer 蜂鸣器)

可看到PORTA 变化 蜂鸣器叫了


好了总结下


第一步:IO设置为输出


DDRB = 0XFF;


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


第二步:对应位输出数据


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


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


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


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


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


关键字:AVR单片机  C语言  流水灯验证 引用地址:AVR单片机学习C语言的流水灯验证

上一篇:AVR单片机学习异步串行口UART
下一篇:AVR的I/O存储器操作

推荐阅读最新更新时间:2024-11-17 09:18

AVR单片机的TWI总线的原理及应用
  AVR系列的单片机内部集成了TWI(Two-wire SerialInterface)总线。该总线具有I2C总线的特点,即接线简单,外部硬件只需两个上拉电阻,使用时钟线SCL和数据线SDA就可以将128个不同的设备互连到一起;而且支持主机和从机操作,器件可以工作于发送器模式或接收器模式,数据传输率高达400 kHz。正因为TWI总线具有这么多的优点,因此受到了使用者的青睐。   由于该总线与传统的I2C总线极其相似。因此不少人误以为TWI总线就是I2C总线,其实这只是一种简单化的理解。TWI总线是对I2C总线的继承和发展。它定义了自已的功能模块和寄存器,寄存器各位功能的定义与I2C总线并不相同;而且TWI总线引入了状奁寄
[单片机]
<font color='red'>AVR单片机</font>的TWI总线的原理及应用
C语言根据日期判断星期几(使用基姆拉尔森计算公式)
算法如下: 基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日数,m表示月份数,y表示年数。 注意:在公式中有个与其他公式不同的地方: 把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。 以公元元年为参考,公元元年1月1日为星期一 /PRE PRE 程序如下: #include "stdio.h" void CaculateWeekDay(int y,int m, int d) { if(m==1||m==2) { m+=12; y--; } i
[单片机]
PIC单片机CCS之C语言(#TYPE的用法)
#TYPE 语法: #type standard-type=size #type default=area standard-type是short,int,long或用户定义尺寸中的之一; size是1,8,16或32; area是#TYPE使用typemod命令定义的存储区. 目的:编译器默认将short看作1位, 将int看作8位, 将long看作16位.传统的C习惯为目标处理器而将INT定义成更高效率的尺寸.在PIC中,INT是8位.为了有助于代码兼容,#type命令允许改变这些关键字. #TYPE能重新定义这些关键字. 注意:逗号是可选项.当然#TYPE可能使一些尺寸得不到4种关键字的描绘(如上面的1位整型),下
[单片机]
STM32操作系统系列使用C语言的教程
C语言,相对于汇编有更好的可读性,便于维护等优点。下面实验将使用C语言实现点亮LED灯。C语言与硬件是紧密连在一起的,结合芯片中的flash和sram,简单了解C语言。 步骤: FLASH,就是存放.bin文件的地方。SRAM,用于存放程序的堆栈,全局变量。 MEMORY,用于定义存储器范围。 AT rom,表示将对应的SECTION放置到rom中,即Flash中。 _data_start / _data_end,用于说明data段在flash中的位置,方便程序将data段从flash中复制到sram中。 _ram_data_start,表示data段将复制到sram中的什么位置。 ADDR(),表示获得SECTION
[单片机]
AVR单片机定时/计数器学习笔记(二)
定时/计数器1(16位)有普通模式、CTC模式、快速PWM模式、相位修正PWM模式等工作模式。 2.CTC模式(需要用到OC1A、OC1B两个引脚) 应用:用于产生占空比为50%的方波信号 ( N为分频系数 ) 需要配置的寄存器:T/C1控制寄存器A(TCCR1A)、T/C1控制寄存器B(TCCR1B)、输出比较寄存器1A(OCR1A)。 (1)TCCR1A的bit7、bit6用于设置OC1A脚的比较输出模式,bit5、bit4用于设置OC1B脚的比较输出模式。(此处我们都设为,比较匹配时OC1A、OC1B电平取反) (2)TCCR1B的bit4、
[单片机]
<font color='red'>AVR单片机</font>定时/计数器学习笔记(二)
I2C总线驱动的C语言源程序详细说明
i2c 总线上单片机系统中常用到的总线技术这里给大家介绍一个I2C总线驱动的C51语言源程序。 //#pragma ot(6,SIZE) #i nclude 《AT89X52.H》 #i nclude 《intrins.h》 #define ERRORCOUNT 10 #define readI2C 0xa1 #define writeI2C 0xa0 sbit SDA=P1^6; sbit SCL=P1^5; enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256}; enum eepromtype EepromType; //Data
[单片机]
缺少仿真器时AVR单片机的开发方法
对FLASH存贮器单片机,不要仿真机也能方便快速地开发程序。具体可以从以下几方面入手: 一、尽量使用高级语言开发系统程序 您有没有在写汇编程序时,标错一个标号而浪费您大把时间找错或跳转偏移量过大而不得不改动程序结构的经历。其实您如果使用高级语言开发程序,就不会有这样的痛苦。 在开发程序时,除了建立一个良好的开发文档外,使用语言的选择也很重要。有许多人认为使用汇编写程序比较精简,而用高级语言开发会浪费很多程序空间,其实这是一种误解。对一个有经验的,而且非常熟悉某种单片机的汇编高手而言,他是能写出比高级语言更精简的代码。而对汇编不是很熟的开发者、或突然更换了一种新的单片机,您能保证一定可以写出比高级语言更简练的代码吗? 高级语言的优越
[单片机]
AVR单片机生成负压的原理解析
红外测温传感器的输出是一个mV级的电压信号,大约在室温下(26℃左右)输出0电压,温度再低就是负电压了。要用单片机检测这样一个小信号,必须进行放大,可一般的单电压运放都不能放大小信号(我曾经折腾过LM324的单电压小信号放大,发现大约在100mV以下,LM324就没有反应了),最常规的解决方案就是使用双电压供电。 双电压是个头疼的事情,弄两路电压一般来说要使用变压器,还得是双绕组的,全桥整流,78 79系列IC伺候着。。。看着就不爽! 如果要改用电池供电。。。麻烦啊! 于是打算用负压生成电路。 负压生成都是一个套路,用振荡器产生交流电,然后用电感产生感应电动势,或者用二极管和电容组成的倍压电路。。。既然用了单片机,那么产生
[单片机]
<font color='red'>AVR单片机</font>生成负压的原理解析
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved