- 1、本文档共26页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
学习笔记之 单片机编程之C语言
学习笔记之二:AVR单片机C语言编程
=====================================================
说明:
此为我的学习笔记,为AVR单片机C语言编程。
要了解AVR单片机的具体编程注意要点,请看《学习笔记之一:AVR单片机详解》。
By:郭梅芝2007.8初稿
一、AVR单片机与C语言
堆栈工作方式:
MCS-51的堆栈是一个由堆栈指针寄存器SP单字节控制的向上生长型堆栈,即将数据压入堆栈时SP增大。AVR系统单片机的堆栈同样受SP寄存器控制,而堆栈生长方向与MCS-51相反,为向下生长型,即数据压入堆栈时SP减小。另外要注意以下几点:
1.MCS-51的堆栈空间只能放置在片内的SRAM中,而AVR的堆栈空间既可放置在片内SRAM中,也可放置在片外SRAM中。
2.AVR单片机中,对不支持外部SRAM的单片机,SP寄存器为一个字节宽度,对支持外部SRAM的单片机为两个字节宽度(SPL、SPH)。
3.为了提高速度,一般在初始化SP时将其定位于内部SRAM的顶部.
4.在对AVR编程时一定要对SP时行初始化。
外部SRAM的配置:
在AVR中访问片内或片外SRAM无使用相同的指令,当访问数据空间的地址超过片内SRAM范围时会自动选择片外的SRAM空间。但为了正常工作还必须对寄存器MCUCR的SRE(D7)、SRW(D6)位进行设置。
MCUCR SRE SRW SE SM ISC11 ISC10 ISC01 ISC00 当SRE=1时,使能外部SRAM;SRE=0时,禁止外部SRAM。当SRW=1时在访问外部SRAM中插入一个等待周期,当SRW=0时在访问外部SRAM中不插入等待周期。在C语言中可直接用MCUCR|=0xC0或MCUCR=0x3F来配置外部SRAM。
程序空间的访问:
MCS-51的程序存储器是以字节为单位的,地址是按字节进行寻址的,使用MOVC指令访问程序存储器,这和指令寄存吕访问程序ROM没什么区别。在AVR中程序在座器的总线为16位,即指令寄存器访问程序ROM时是以字(双字节)为单位的,即一个程序地址对应两个字节,而AVR的数据存储器的总线为8位,当用户使用LPM指令访问程序ROM时是以字节为单位读取的,此时Z寄存器中的一个地址只对应一个字节,因此要注意这两个地址的换算,否则很容易产生错误,具体的换算是LPM指令使用的Z寄存器中地址应该是程序地址的两倍。如:
;初始化Z寄存器
ldi ZH,high(F_TABLE*2) ;Z寄存器高位存入程序存储器地址的高位
ldi ZL,low(F_TABLE*2 ) ;Z寄存器低位存入程序存储器地址的低位
;用户程序
lpm ;将Z寄存器的低位数送r0
st Y+,r0 ;Y变址,将r0数送SRAM后,Y=Y+1
;用户程序
FTABLE:
.db 0,1,2,3,4,5 ;数据表的起点
AVR输入/输出商品的使用:
MCS-51单片机的I/O端口大部分是准双向口,在复位时全部输出高电平,对端口的输入和输出操作也是直接通过I/O商品的地址进行的。而AVR的I/O端口为标准双向口,在复位时所有端口处于没有上拉电阻的输入状态(高阻态,管脚电平完全由外部电路决定),这在强调复位状态的场合是很有用的。
DDRXn PORTXn I/O 上拉 0 0 输入 关闭 三态(高阻) 0 1 输入 打开 提供弱上拉,低电平必须由外电路拉低,PXn脚输出电流。 1 0 输出 关闭 0输出 1 1 输出 关闭 1输出 DDRX为端口方向寄存器,当DDRX的某一位置1时,相应端口的引脚作为输出使用;当DDRX的某一位清0时,对应端口的引脚作为输入使用。PORTX为端口数据寄存器,当引脚作为输出使用时,PORTX的数据由相应引脚输出;当引脚作为输入使用时,PORTX的数据决定相应端口的引脚是否打开上拉功。,PINX为相应端口的输入引脚地址,如果希望读取相应引脚的逻辑电平值,一定要读取PINX而不能读取PORTX,PORTX为端口锁存器的值,这与MCS-51是有区别的。
注意:在使用AVR单片机之前,一定要根据引脚功能定义对相应的端口初始化,否则,端口很可能在用作输出时不能正常工作(复位后默认为输入状态)。如设置端口B的高四位输入,低四位输入,则有:
汇编语言:
ldi r16,$f0
out DDRB,r16
在C语言中:
DDRB=0xF0;
AVR定时器的使用:
具体详见《学习笔记之一:AVR单片机详解》。注意:1.由于T1的TCNT1、OCR1A、OCR1B和ICR1无为16位的定时器,为了正确地写入和读出,在写入数据时应先写入高位字节,后写入低位字节,在读取数据时应先读取低位节,后读取高位
文档评论(0)