atmega128单片机系列例程
第2章_ATmega128硬件结构
广州大学 机电学院 庞志
$100CA
$1006:LDI R1,$0A $1008:LDS R2,$FF00 $100A:ADD R2,R1 $100C:STS $$FFFF0000(($$110A)) $FF00,R2
R1=$0A R2=$$11AA0
2020年5月19日星期二
广州大学 机电学院 庞志
广州大学 机电学院 庞志
ATmega128
单 片 机 方 框 图
2020年5月19日星期二
广州大学 机电学院 庞志
ATmega128
单 片 机 指 令 执 行 过 程
2020年5月19日星期二
广州大学 机电学院 庞志
$1006
10+(0xFF00$)1=0>0(60:xLFDFI 0R0)1,$0A
当RAMPZ0=1: ELPM/SPM可以访问程序存储器地址 $8000——$FFFF(高64K字节)
2020年5月19日星期二
广州大学 机电学院 庞志
2.2.3 指令执行时序
AVR CPU由系统时钟clkCPU驱动。
并行取指和执行时序
2020年5月19日星期二
广州大学 机电学院 庞志
单时钟周期ALU 操作
模拟比较器
2020年5月19日星期二
广州大学 机电学院 庞志
2.1.2 主要性能 (续)
特殊的处理器特点
上电复位 可编程的掉电检测 片内RC振荡器 片内/片外中断源 6种睡眠模式: 空闲模式、ADC噪声抑制模式、省电模
式、掉电模式、Standby模式以及扩展的Standby模式 可选的时钟频率 可选ATmega103兼容模式 全局上拉禁止功能
Bit 6 – T: 位拷贝存储 Bit 4 – S: 符号位,S=N⊕V Bit 2 – N: 负数标志 Bit 0 – C: 进位标志
ATmega128的外部并行接口器件扩展应用
ATmega128的外部并行接口器件扩展应用ATmega128片内的RAM有4K字节,这在8位单片机中算佼佼者。
因此,设计一般的应用系统,应尽量不采用外部扩展并行器件的设计。
这样不仅方便PCB板的设计,减少PCB板的面积,同时也提高了系统的抗干扰性。
对于必须采用外部并行器件扩展的设计,ATmega128的PORTA(低8位地址线和8位数据线复用)、PORAC(高8位地址线)口提供了并行扩展接口。
尽管并行接口的基本使用原理同一般的单片机相同,但由于ATmega128的结构上的特点,以及其使用了增强型的并行接口,因此在使用并行扩展接口时还需要仔细的设计。
其主要特性有:*外部并行扩展的地址从0x1100开始;*使用外部并行扩展时,应将MCUCR寄存器中的SRE位置“1”,允许外部并行扩展;*可将PORTC口高位不用的地址线释放,作为普通的I/O口使用;*可设置对不同区域采用不同的读写操作时序(加等待),用于配合扩展使用不同时序操作的外部并行器件。
5.5.1 外部扩展RAM存储器的设计下图给出一个外部扩展32K的RAM(6264)的译码参考电路。
图中使用了一片74HC138和与门,与门的输出作为6264的片选信号,其地址空间为0x0000 –0x8FFF。
74HC138其它7个引脚输出用于在地址大于0x9000以上空间扩展其它更多的并行接口器件,每根线选通的地址空间为4K。
由于ATmega128的RAM空间前4352个字节分配给芯片内部的通用寄存器、I/O寄存器和4K 字节的内部SRAM,所以外部并行扩展器件的起始地址是从0x1100开始的(见第二章内容)。
当MCU在对0X0000-0X10FF范围的SRAM地址空间操作时,实际是对芯片内部的SRAM或寄存器操作,尽管会影响地址总线、数据总线和ALE,但此时和不受影响,因此对相应的处在这段地址范围的外部扩展的存储器没有影响。
在图5.6的设计中,实际上已经把6264中地址范围在0x0000-0x0FFF的一段存储单元“移”到ATmega128的RAM地址空间高端0x8000-0x8FFF处。
基于Atmega128单片机设计的嵌入式控制器
基于Atmega128单片机设计的嵌入式控制器
采用Atmega128单片机设计的嵌入式控制器,模拟量输入通道用
Atmega128片内A/D转换器,输出用AD421D/A转换器,数字量I/O通道配
置高速先耦器件.用LCCavr编译器修改OSTaskStklnit()函数及其相关文件,
定义数据类型等以实现MICroC/OS-Ⅱ的移植.
1 引言
嵌入式控制器是机电设备实现自动化的核心部件。
故以大型机电设备为控制对象,利用高性能Atmega 128微处理器,设计了具有现场总线(CANBUS)网络通信和一定通用性的多功能嵌入式智能控制器。
2 硬件设计
系统的硬件结构如图1。
本控制器的核心采用64管脚TQFP封装的Atmega128芯片,具有53个
可编程的I/O引脚,片内集成有128KB闪存、4KB EEPROM 和
4KBSRAM,适合I/O通道和存储空间的需求。
ATmega128 单片机硬件电路设计
ATmega128 单片机硬件电路设计在本系统中,本小节主要讲ATmega128 单片机的内部资源、工作原理和硬件电路设计等。
2.5.1 ATmega128 芯片介绍ATmega128 为基于AVR RISC 结构的8 位低功耗CMOS 微处理器。
片内ISP Flash 可以通过SPI 接口、通用编程器,或引导程序多次编程。
引导程序可以使用任何接口来下载应用程序到应用Flash 存储器。
通过将8 位RISC CPU 与系统内可编程的Flash 集成在一个芯片内,ATmega128 为许多嵌入式控制应用提供了灵活而低成本的方案。
ATmega128 单片机的功能特点如下:(1)高性能、低功耗的AVR 8 位微处理器(2)先进的RISC 结构①133 条指令大多数可以在一个时钟周期内完成② 32x8 个通用工作寄存器+外设控制寄存器③全静态工作④工作于16 MHz 时性能高达16 MIPS ⑤只需两个时钟周期的硬件乘法器(3)非易失性的程序和数据存储器① 128K 字节的系统内可编程Flash ②寿命: 10,000 次写/ 擦除周期③具有独立锁定位、可选择的启动代码区(4)通过片内的启动程序实现系统内编程① 4K 字节的EEPROM ② 4K 字节的内部SRAM ③多达64K 字节的优化的外部存储器空间④可以对锁定位进行编程以实现软件加密⑤可以通过SPI 实现系统内编程(5)JTAG 接口(与IEEE 1149.1 标准兼容)①遵循JTAG 标准的边界扫描功能②支持扩展的片内调试③通过JTAG 接口实现对Flash,EEPROM,熔丝位和锁定位的编程(6)外设特点①两个具有独立的预分频器和比较器功能的8 位定时器/ 计数器②两个具有预分频器、比较功能和捕捉功能的16 位定时器/ 计数器③具有独立预分频器的实时时钟计数器④两路8 位PWM ⑤ 6 路分辨率可编程(2 到16 位)的PWM ⑥输出比较调制器⑦ 8 路10 位ADC ⑧面向字节的两线接口⑨两个可编程的串行USART ⑩可工作于主机/ 从机模式的SPI 串行接口(7)特殊的处理器特点①上电复位以及可编程的掉电检测②片内经过标定的RC 振荡器③片内/ 片外中断源④ 6 种睡眠模式: 空闲模式、ADC 噪声抑制模式、省电模式、掉电模式、Standby 模式以及扩展的Standby 模式⑤可以通过软件进行选择的时钟频率⑥通过熔丝位可以选择ATmega103 兼容模式⑦全局上拉禁止功能ATmega128 芯片有64 个引脚,其中60 个引脚具有I/O 口功能,资源比较丰富,下面对ATmega128 的各个引脚做简单介绍:VCC:数字电路的电源。
Atmega128PWM程序
key_yanshi();
break;
//按键 5:PWM1B 正脉宽减小
case 6:
OCR0-=8;
key_yanshi();
break; //按键 6:PWM2 正脉宽减小
case 7:break;
//按键 7
case 8:break;
//按键 8
case 9:break;
//按键 9
case 10:break;
TCNT3=0x0000;
//清零计数器
}
/*******************************************************/
/****** 函数名称: Pwm2_Init()
******/
/****** 功 能: Pwm2 初始化函数
******/
/****** 参 数: 无
//按键 A
case 11:break;
//按键 B
case 12:break;
//按键 C
case 13:break;
//按键 D
case 14:break;
//按键 E
case 15:break;
//按键 F
default:break;
}
}
}
}
//快速 PWM,时钟 1024 分频
OCR0=0x20;
//正脉宽
TCNT0=0x00;
//清零计数器
}
/*******************************************************/
/****** 函数名称: main()
******/
/****** 功 能: 三路 PWM 同时输出
ATmega128串口通信程序(中断方式)
ATmega128串口通信程序(中断方式)2011-06-05 20:08:10| 分类:单片机程序编写| 标签:|字号大中小订阅程序采用IAR系统编译,实现使用串口调试助手收发数据的功能#include<iom128.h>#include<inavr.h>#include<string.h>#define INT8U unsigned char#define INT16U unsigned int#define UDRIE0 5/* UART Buffer Defines */#define UART0_RX_BUFFER_SIZE 128#define UART0_TX_BUFFER_SIZE 128/* Static Variables */static unsigned char UART0_RxBuf[UART0_RX_BUFFER_SIZE];static volatile unsigned char UART0_RxHead;static volatile unsigned char UART0_RxTail;static unsigned char UART0_TxBuf[UART0_TX_BUFFER_SIZE];static volatile unsigned char UART0_TxHead;static volatile unsigned char UART0_TxTail;static unsigned char UART0_Flag=1;void USART_INIT( void ){UBRR0H = 0x00;UBRR0L = 0x0B;//9600 at 1.8432MUCSR0A = 0x20;UCSR0B = 0xD8;//开接收结束中断,发送结束中断接收使能,发送使能UCSR0C = 0x06;//异步模式,1位停止位,8位数据位UDR0 = 0x00;//清空数据寄存器UART0_RxTail = 0;UART0_RxHead = 0;UART0_TxTail = 0;UART0_TxHead = 0;__disable_interrupt();//关全局中断}void Tran_Byte( INT8U sdata ){if(UART0_Flag == 0){UDR0 = sdata;UART0_Flag = 1;}else{UART0_TxBuf[UART0_TxHead] = sdata;UART0_TxHead++;if(UART0_TxHead >= UART0_TX_BUFFER_SIZE) UART0_TxHead = 0; }__enable_interrupt();}void Send_String( INT8U *string ){INT8U temp;while(1){temp = *string;Tran_Byte(temp);string++;if(*string == 0x00)break;}}INT8U HaveDataRxd( void ){if(UART0_RxHead != UART0_RxTail) return 1;elsereturn 0;}INT8U GetDataFromRxdBuf( void ){INT8U temp;temp = UART0_RxBuf[UART0_RxTail];UART0_RxTail ++ ;if( UART0_RxTail >= UART0_RX_BUFFER_SIZE ) { UART0_RxTail = 0 ;}return temp;}//清空接收缓冲区。
广大ATmega128单片机实验报告实验一 系统认识实验
广州大学学生实验报告开课学院及实验室:计机楼503 2014年 05月 08日学院机械与电气工程学院年级、专业、班电信122 姓名王健学号1207400051实验课程名称信号与系统成绩实验项目名称实验一系统认识实验指导老师庞志一、实验项目1、熟悉AVR Mega128学习板开发环境。
2、掌握C语言程序设计的编程及调试方法。
3、运行流水灯显示程序。
二、实验类型验证性。
三、计划学时2学时。
四、实验目的了解AVR Mega128学习板开发环境:1、硬件平台:AVR Mega128学习板,AVR下载/仿真器。
2、软件开发工具:ICCA VR C语言程序开发软件、AVR STUDIO软件调试平台、C语言。
五、实验设备与平台1、实验设备:计算机(PC),AVR Mega128学习板,AVR下载/仿真器。
2、平台:ICCA VR C语言程序开发软件、AVR STUDIO软件调试平台。
六、涉及的知识点AVR Mega128单片机、C语言程序设计。
七、实验内容与步骤1、AVR Mega128学习板,见下图:图 1.1 AVR Mega128学习板图1.2 AVR Mega128学习板电路结构图1.3 AVR Mega128学习板硬件系统组成连接系统步骤:1)连接AVR下载/仿真器:将AVR下载/仿真器的排线接到AVR Mega128学习板的CH2 JTAG 插座;使用USB连线将AVR下载/仿真器和PC 连接起来。
2)连接AVR Mega128学习板电源:将电源线的圆插头插入到AVR Mega128学习板的J1插座,另一端扁形插头插入PC的USB口,系统运行内置的程序。
2、修改、编译程序1)打开ICCA VR软件,选择Project下拉菜单的Open…打开工程。
图1.4 打开工程示意图2)打开例子程序里面的工程文件01LED.prj:图1.5 打开工程文件示意图3)打开工程后,工程栏里面显示工程包含文件信息,双击右边工程栏中的main.c文件,程序显示在编辑区,可以修改程序。
Almel ATmega128 ATmega128L 可编程 Flash 说明书
产品特点•高性能、低功耗的 AVR® 8位微处理器•先进的 RISC 结构–133条指令 – 大多数可以在一个时钟周期内完成–32 x 8 通用工作寄存器 + 外设控制寄存器–全静态工作–工作于16 MHz时性能高达16 MIPS–只需两个时钟周期的硬件乘法器•非易失性的程序和数据存储器–128K 字节的系统内可编程Flash寿命: 10,000次写/擦除周期–具有独立锁定位、可选择的启动代码区通过片内的启动程序实现系统内编程真正的读-修改-写操作–4K字节的EEPROM寿命: 100,000次写/擦除周期–4K 字节的内部SRAM–多达64K字节的优化的外部存储器空间–可以对锁定位进行编程以实现软件加密–可以通过SPI实现系统内编程•JTAG接口(与IEEE 1149.1标准兼容)–遵循JTAG标准的边界扫描功能–支持扩展的片内调试–通过JTAG接口实现对Flash, EEPROM, 熔丝位和锁定位的编程•外设特点–两个具有独立的预分频器和比较器功能的8位定时器/计数器–两个具有预分频器、比较功能和捕捉功能的16位定时器/计数器–具有独立预分频器的实时时钟计数器–两路8位PWM–6路分辨率可编程(2到16位)的PWM–输出比较调制器–8路10位ADC8个单端通道7个差分通道2个具有可编程增益(1x, 10x, 或200x)的差分通道–面向字节的两线接口–两个可编程的串行USART–可工作于主机/从机模式的SPI串行接口–具有独立片内振荡器的可编程看门狗定时器–片内模拟比较器•特殊的处理器特点–上电复位以及可编程的掉电检测–片内经过标定的RC振荡器–片内/片外中断源–6种睡眠模式: 空闲模式、ADC噪声抑制模式、省电模式、掉电模式、Standby模式以及扩展的Standby模式–可以通过软件进行选择的时钟频率–通过熔丝位可以选择ATmega103兼容模式–全局上拉禁止功能•I/O和封装–53个可编程I/O口线–64引脚TQFP与 64引脚 MLF封装•工作电压–2.7 - 5.5V ATmega128L–4.5 - 5.5V ATmega128•速度等级–0 - 8 MHz ATmega128L–0 - 16 MHz ATmega128微处理器,具有128K字节的系统BDTIC /ATMEL2ATmega1282467L–AVR–05/04引脚配置Figure 1. ATmega128的引脚综述ATmega128为基于AVR RISC 结构的8位低功耗CMOS 微处理器。
atmega128单片机pwm学习总结
ATMEGA128 PWM输出系列例程1、定时器0,快速PWM模式快速PWM可以的到比较高频率的PWM输出,但占空比的调节精度稍微差一些。
此时计数器仅工作在单程正向计数方式,计数器的上限值决定PWM的频率,而比较匹配寄存器的值决定了占空比的大小。
PWM 频率的计算公式为:))PWM频率= 系统时钟频率/(分频系数*(1+计数器上限值计数器上限值))快速PWM模式适合要求输出PWM频率较高,但频率固定,占空比调节精度要求不高的应用。
/*定时器0,快速PWM模式,由OC0输出PWM波 *//*PWM频率= 系统时钟频率/(分频系数*(1+计数器上限值))*//*本程序中:频率=8000000/(8*(1+255))=3.91KHZ,频率固定 *//*占空比为:OCR0/0XFF=OCR0/256,占空比可调 *//*TCNT0从BOTTOM计数到MAX,然后回到BOTTOM重新开始;TCNT0计数到与OCR0相等时,OC0清零,在BOTTOM时置位1 */#include <iom128v.h>#include<macros.h>#define uint unsigned int#define uchar unsigned charvolatile uchar num;void pwm0_init(void){DDRB=0X10; //将PB4设置为输出TCCR0=0X00; //关闭num=64; //设置输出比较寄存器的初值TCNT0=0; //计数器初值为0TCCR0=0X6A; //设置为快速pwm模式,采取8分频}/*键盘初始化*/void init_key(){DDRD=0X00;PORTD=0XFF;}/*延时函数 */void delay_ms(uint z){uint x,y;for(x=z;x>0;x--)for(y=1140;y>0;y--);}/*键盘扫描 */void keyscan(void ){if((PIND&0x01)==0){while(!(PIND&0x01)); //松手检测delay_ms(50);num+=5;if(num==255)num=0;}if((PIND&0x02)==0){while(!(PIND&0x02));delay_ms(50);num-=5;if(num==0)num=255;}if((PIND&0x08)==0){while(!(PIND&0x01));delay_ms(50);num=128;}}void main(void){uchar wide;pwm0_init();init_key();while(1){OCR0=num;keyscan();}}相位修正((调整调整))模式2、定时器0,相位修正频率(相位)调整PWM模式的占空比调节精度高,但输出频率比较低,因为此时计数器仅工作在双向计数方式。
ATmega128单片机仿真系统设计及实现_汤剑锋
第24卷第7期V o l .24N o .7荆楚理工学院学报J o u r n a l o f J i n g c h u U n i v e r s i t y o f T e c h n o l o g y 2009年7月J u l .2009[收稿日期]2009-06-17[作者简介]汤剑锋(1964-),男,福建华安人,漳州职业技术学院讲师。
研究方向:电子技术应用。
A T m e g a 128单片机仿真系统设计及实现汤剑锋(漳州职业技术学院电子工程系,福建漳州 363000)[摘 要] 本仿真系统采用A T m e g a 128单片机作为控制核心,利用其强大的兼容性和处理能力,以及丰富的接口等特点使整个系统的电路结构简单、可靠性高。
A T m e g a 128单片机仿真系统的硬件部分由电源电路、复位电路、晶振电路、模/数转换滤波电路、I S P 下载接口电路、J T A G 仿真接口电路、蜂鸣器驱动电路、M A X 232串口模块、按键模块以及各种显示模块组成。
[关键词] A T m e g a 128;单片机;仿真系统[中图分类号] T N 702 [文献标识码] A [文章编号] 1008-4657(2009)07-0025-070 引言A T m e g a 128为基于A V RR I S C 结构的8位低功耗C M O S 微处理器。
由于其先进的指令集以及单周期指令执行时间,A T m e g a 128的数据吞吐率高达1M I P S /M H z ,从而可以缓减系统在功耗和处理速度之间的矛盾。
A T m e g a 128具有如下特点:128K 字节的系统内可编程F l a s h (具有在写的过程中还可以读的能力,即R W W)、4K 字节的E E P R O M 、4K 字节的S R A M 、53个通用I /O 口线、32个通用工作寄存器、实时时钟R T C 、4个灵活的具有比较模式和P W M 功能的定时器/计数器(T /C )、两个U S A R T 、面向字节的两线接口T W I 、8通道10位A D C (具有可选的可编程增益)、具有片内振荡器的可编程看门狗定时器、S P I 串行端口、与I E E E 1149.1规范兼容的J T A G 测试接口(此接口同时还可以用于片上调试),以及六种可以通过软件选择的省电模式。
AVR 单片机 串口通信 串行通讯 详细例程介绍
Atmega128 有两个串口:USART0 与 USART1 以 USART0 为例
串口的初始化包括:
传输模式的选择:同步还是异步,默认为异步模式,可通过选择 USART 控制和状态 寄存器 UCSR0C 中的 UMSEL 位来选择,UMSEL 为 0,是异步模式. 波特率的设置:通信的双方都必须有相同的波特率,波特率可以通过设置波特率 发生寄存器 UBRR0 来确定,UBRR0 为两字节 16 位的寄存器,可分为 UBRR0H 和 UBRR0L.同时起作用的还有 UCSR0A 中的波特率加倍位 UX2,当 UX2 为 1 时设置的 波特率加倍.
3、设置 UCSR0C:
Bit6-UMSEL0:USART0 的模式选择,0 为异步模式,1 为同步模式 Bit5:4-UPM01:0:奇偶校验模式,00 禁止,01,保留,10 偶校验,11,奇校验 Bit3-USBS0:停止位的选择,0 停止位为 1bit,1 停止位为 2-bits Bit2:1-UCSZ01:0:字符长度,当 UCSZ02 为 0 时,00 表示 5 位,01 表示 6 位,10 表示 7 位,11 表示 8 位.当 UCSZ02 为 1 时,11 表示 9 位.(UCSZ02 为 UCSR0B 里的一位寄存器)
{ putchar0(*s); s++; }
putchar0(0x0a);//回车换行 putchar0(0x0d); }
/******************************************************************* ********* 函数功能:主程序 入口参数: 出口参数: ******************************************************************** ********/ void main(void) { unsigned char i;
atMega128的bootloader例程
char CheckFlash(void)
{
unsigned int i;
unsigned int TempInt;
unsigned int TempInt2;
for (i=0;i<ageByte;i+=2)
{
TempInt = read_program_memory(PageAddress + i,0x00);
//大于64K控制
if (PageAddressHigh) RAMPZ = 1;
else RAMPZ = 0;
}
/*****************************************************************************/
char GetPage(void)
TxChar(BootSize);
TxChar(BootVer);
break;
case 'L': //写配置信息
break;
case 'R': //读配置信息
break;
case 'I': //读信息
break;
default :
break;
}
//
void FlashLoad(void)
{
TxChar('O')
TxChar('K'); //发送OK
while (1)
{
GetPageNumber();
if (RealPageAddress == 0xffff) return;
ATMEGA128单片机读写倾角传感器ADXL345及所有I2C器件读写通用程序程序
}
uchar shin() {
uchar i,read_data; DDRD&=0XFD;//输入 for(i=0;i<8;i++)
{ PORTD|=0X01;//SCL=1 read_data<<=1; read_data|=(uchar)((PIND&0X02)>>1);//SDA PORTD&=0XFE; Delayuslcd(5);
temp1=((float)y_data*3.9); display(0,1,temp1);//显示 Y 方向加速度值 temp2=((float)z_data*3.9); display(0,9, temp2);//显示 Z 方向加速度值 delaylcd(1000); angle=(((atan2f(temp,temp1)*180)/3.14159265)+180);//算出倾角值 writeonechar(12,angle);//显示角度 }
void AX353_INIT()//倾角传感器初始化 {
write_byte(0x31,0x0B); //测量范围,正负 16g,13 位模式 write_byte(0x2C,0x08); //速率设定为 12.5 参考 pdf13 页 write_byte(0x2D,0x08); //选择电源模式 参考 pdf24 页 write_byte(0x2E,0x80); //使能 DATA_READY 中断 write_byte(0x1E,0x00); //X 偏移量 根据测试传感器的状态写入 pdf29 页 write_byte(0x1F,0x00); //Y 偏移量 根据测试传感器的状态写入 pdf29 页 write_byte(0x20,0x05); //Z 偏移量 根据测试传感器的状态写入 pdf29 页 }
ATmega128单片机的系统结构
这个时钟也可以作为系统时钟,只要对熔 丝位CKSEL进行编程即可。选择这个时钟 之后就无需外部器件了。
3、系统时钟及其选项
外部时钟
为了从外部时钟源驱动芯 片, XTAL1 必须如图所示 的进行连接。同时,熔丝 位CKSEL必须编程为 “0000”。
1.1 AVR CPU内核的结构 1.2 状态寄存器 1.3 通用寄存器结构 1.4 X、Y、Z寄存器 1.5 堆栈指针 1.6 复位和中断处理
1.1 AVR CPU内核的结构图
AVR 采用了Harvard 结构, 具有独立的数据和程序总线。 程序存储器的指令通过一级流 水线运行。
1.2 状态寄存器
ADC 时钟 clkADC ADC具有专门的时钟。这样可 以在ADC工作的时候停止CPU和I/O时钟以降低 数字电路产生的噪声,从而提高ADC 转换精度。
3、系统时钟及其选项
时钟源 ATmega128有如下几种通过熔丝位选择的
时钟源。时钟输入到AVR 时钟发生器,并 通往其他合适模块。
3、系统时钟及其选项
电路无论何时,只要Vcc低于检测电平Vpot时,器 件进入复位状态。
4、系统控制和复位
2.外部复位 外部复位是由外加在RESET引脚上的低电平将产生 的。当RESET引脚被拉低于Vrst的时间大于1.5µs时 既触发复位过程
4、系统控制和复位
3.掉电检测(BOD)复位 ATmega128片内的BOD( Brown-out Detection)电源检测电路,用于在 系统运行时对系统电压VCC的检测,并同一个固定的阈值电压相比较。 BOD检测阈值电压可以通过BODLEVEL熔丝位设定为2.7V或4.0V。 BOD检测阈值电压有迟滞效应,以避免系统电源的尖峰毛刺误触发BOD 检测器。阈值电平的迟滞效应可以理解为:上阈值电压VBOT+ = VBOT + VHYST/2,下阈值电压VBOT- = VBOT - VHYST/2。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ADCSRA=0x00; // ADC
ADMUX = 0X00;
// Aref
ADC0
ACSR=(1<<ACD);
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
//ADEN
ADC;ADSC,ADC
ADIE,ADC
: :k : ************************************************************************ ****/ void display(unsigned int k)// { DDRE|=1<<2; PORTE|=1<<2; DDRA=0XFF; PORTA=k; } #define SS 0 #define SCK 1 #define MOSI 2 #define MISO 3 #define SS_H() PORTB|=(1<<SS) #define SS_L() PORTB&=~(1<<SS)
#define led0_en() {DDRB|=1<<4;PORTB|=(1<<4);} // #define led0_dis() {DDRB|=1<<4;PORTB&=~(1<<4);} // #define led1_en() {DDRB|=1<<5;PORTB|=(1<<5);} #define led1_dis() {DDRB|=1<<5;PORTB&=~(1<<5);} #define led2_en() {DDRB|=1<<6;PORTB|=(1<<6);} #define led2_dis() {DDRB|=1<<6;PORTB&=~(1<<6);} #define led3_en() {DDRB|=1<<7;PORTB|=(1<<7);} #define led3_dis() {DDRB|=1<<7;PORTB&=~(1<<7);} #define OE 7 #define point 3 #define dp 7 #include <iom128v.h>
if(point==1) HC_595_OUT(table[led_buffer[2]]|(1<<dp)); else HC_595_OUT(table[led_buffer[2]]); led1_en(); delay_nus(60); led1_dis();
if(point==2) HC_595_OUT(table[led_buffer[1]]|(1<<dp)); else HC_595_OUT(table[led_buffer[1]]);
}
void leddis_update(void)
{
/*
*/
if(point==0)
HC_595_OUT(table[led_buffer[3]]|(1<<dp));
else
HC_595_OUT(table[led_buffer[3]]);
led0_en();
delay_nus(60);
led0_dis();
1
TCNT1H=0XF0; //
TCNT1L=0XBE;
TCCR1A=0X00; //
1
TCCR1B=0X05; // 1024
}
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1H=0XF0; //
TCNT1L=0XBE;
DDRE|=1<<2;
************************************************************************ ****/ void delay(void) {
int i; for(i=0;i<1800;i++); } /*********************************************************************** *****
#include <macros.h>
const unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F,
0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};
volatile unsigned char led_buffer[4];
*/
/*
2010 11 13
*/
//Aref AVCC(+5V), Aref
/*
AD
*/
/***********************************************************************
****/
/*********************************
********************************/
#include <iom128v.h>
#include <macros.h>
/********************************
*******************************/
extern const unsigned char tab[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
*****
:ADC
:
:
************************************************************************
****/
void adc_init(void)
{
DDRF&=0XFE; //PORTF0
ADC0
PORTF&=0XFE; //PORTF0
/***********************************************************************
****/
/*ADC
*/
/*
ATmega128
*/
/* :RC 8MHZ
*/
/*
ICCAVR 7.13A
*/
/*E-Mail:number007cool@
{
/*
*/
SPDR = Data;
/*
*/
while(!(SPSR & (1<<SPIF)))
;
}
/*
HC595
*/
void HC_595_init(void)
{
DDRC |= (1<<OE); // PORTC7
PORTC &= (1<<OE); //
595
PORTB = 0x0F; //
spi_init();
//N ms
/* spi
*/
void spi_init(void)
{
DDRB |= (1<<MOSI)|(1<<SCK)|(1<<SS);// MOSI SCK
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);// SPI
}
/*spi
*/
void SPI_MasterTransmit(char Data)
led2_en(); delay_nus(60); led2_dis();
/*
*/
if(point=3)
HC_595_OUT(table[led_buffer[0]]|(1<<dp));
else
HC_595_OUT(table[led_buffer[0]]);
led3_en();
delay_nus(60);
ATMEGA128
沧
minios@沧
avr 16L Makefie
icc avr winavr
.
avr/io.h
makefile
atmega128 ICC AVR
winavr
makefile
makefile
code vision avr
icc avr iom128v.h
128
atmega128. cvavr mega128.h
void delay_1us(void)
//1us
{
asm("nop");
}
void delay_nus(unsigned int n)
//N us
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1us();
}
//0,1,2,3,4 //5,6,7,8,9 //a,b,c,d,e,f
PORTE|=1<<2;
DDRA=0xff;
PORTA=cnt;
// led
B
cnt++;
if(cnt==255)
cnt=0;
}
void main() {
//DDRB=0XFF; SREG|=0X80; TIMSK=0X04; timer1_init(); while(1) {; } }