avr128硬件调试
ATmega128在开发应用中应注意的问题
ATmega128在开发应用中应注意的问题摘要: ATmega128是一种与51系列不同的单片机,本文应用ICCAVR和pony prog2000作为主要开发工具,通过分析其在开发过程中特殊的开发方法,从而达到更好地掌握和使用ATmega128的目的。
关键词: ATmega128 单片机ATmega128是AVR系列中功能最强的单片机,具有如下主要特点:(1)先进的RISC精简指令集结构:ATmega128具有133条功能强大的指令,大部分指令在单时钟周期内执行;有32b×8个通用工作寄存器;片内带有执行时间为2个时钟周期的硬件乘法器。
(2)非易失性程序和数据存储器:ATmega128具有128KB在线可重复编程Flash、4KB的E2PROM以及4KB内部SRAM。
在其BOOT区具有独立的加密位,可通过片内的引导程序实现在系统编程,写操作时真正可读。
(3)具有JTAG接口:通过JTAG接口对Flash、E2PROM熔丝位和加密位编程。
(4)增强的硬件功能:ATmega128具有2个带预分频器和一种比较模式的8位定时/计数器;2个扩充的带预分频器和比较模式、捕获模式的16位定时/计数器;独立振荡器的实时计数器;2通道8位PWM;6通道2~16位精度PWM;8通道10位A/D转换;输出比较调节器;8个单端通道;7个微分通道;2个增益为1x、10x或200x的微分通道;二线(I2C)串行接口;2路可编程串行UART接口;主/从SPI串行接口;带内部振荡器的可编程看门狗定时器等。
(5)独有的特点:上电复位和可编程的低电压检测;内部可校准的RC振荡器;5种睡眠模式,即空闲模式、ADC噪声抑制模式、省电模式、掉电模式、待命模式和扩展待命模式;可通过软件选择时钟频率;通过1个熔丝选定ATmega103兼容模式;全局上拉禁止。
笔者通过使用ATmega128单片机,总结出在使用ATmega128过程中应注意的问题,希望能给即将使用该单片机的读者提供有用的信息。
BK-AVR128说明书
图标,按提示直至安装完成.若提
第三章 快速入门
3.1 第一个 ICC AVR 程序 本章假设用户已经安装好所有必需的软件,如 ICCAVR AVRstudio,我们将以一 个 LED 闪 烁 程 序 讲 述 用 ICCAVR 开 发 软 件 编 写 一 个 简 单 的 程 序 , 并 在 BK-AVR128 开发反上进行实验及仿真.
8
点击 change 可改变软件的安装路径,一般按默认即可不用修改。
点击“Next”
9
点击 “Install”然后等待软件安装完成。
点击 “Finish” 软件安装完成。 2.3 ISP 下载器驱动安装
10
将我们提供的 USB 下载器软件及驱动文件解压到你的硬盘上,并将 ISP 下载器 插到计算机的 USB 接口。 如果之前还没安装过 USBASP 下载器驱动,插入 USB 后您的计算机将自动弹出下列提示框, 引导您安装 USB 驱动软件
2) 软件设置及使用 打开 AVRstudio 软件
19
执行菜单栏的”File|Open File”
20
选择.cof 后缀的文件,点击”打开”. 点击”保存”
21
选择芯片型号为 Atmega128,仿真器型号为 JTAG ICE,Port 端口号根据实际情 况设置(最大不能超过 com4),以上都设置好后点击 Finish 进入仿真操作. 端口号的查询方法:在桌面上”我的电脑图标”右击,选择“管理”-----设备管理 器------端口(COM 和 LPT)如下图
数码管(段 E)
数码管(段 F)
数码管(段 G)
数码管(段 dp)
矩阵键盘(行 1) 按键 K17
AT24C02(SCL)
矩阵键盘(行 2) 按键 K18
#2机ABBAVR试验报告
UNITROL® F三机励磁系统调试报告姓名日期姓名日期编制工厂试验审核工厂验收批准现场试验现场验收注:1、本调试报告前两部分(硬件设置、工厂试验)=出厂试验报告。
2、完成本调试报告的相关试验项目,表示已完成交接试验,设备可投入正常运行。
一、硬件设置1.1主控板 CON-2出厂编号:CH1:CH2:1.2 电源板 POW-1出厂编号:CH1:CH2:1.3 电力系统稳定器(PSS) UNS0869 出厂编号:CH1:CH2:1.4 功率接口板 UNS2861C出厂编号:CH1:CH2:*) HW-Code parameter must be setted manuallyFrequency SettingCurrent LimiterProportional gain K LIM with HEX switch S200Gain of Current IDCIe-max. Setpoint V LI with HEX switch S201Current RegulatorProportional gain K CR with HEX -Switch S202Inverter LimitEk1.5 信号处理板 UNS1860b,V1/V2,Modified 出厂编号:CH1:CH2:1.6 电源模块 UNS0868出厂编号:CH1:CH2:1.7 PT/CT接口板 UNS0862出厂编号:CH1:I1N p.u.Rated machine current divided by C.T. nominal current. Adjustment only required, if ratio <0.8.1.8 基本I/O接口板 UNS0863/C7出厂编号:1.10 跨接器 UNS0016b-E出厂编号:1.11 通道铭牌1.12 附加的硬件修改二、工厂试验2.1 外观检查〃设备及元件接地,接线排□〃元件布置□〃油漆□〃门把手功能□〃铭牌□2.2 MCB设置2.3 介电强度试验〃功率回路 2000V;50Hz;1Min □〃辅助交流和直流电源回路 1500V;50Hz;1Min □〃 PT和CT 回路 1500V;50Hz;1Min □2.4 供电电源检查〃辅助交流电源(照明、加热器) VAC □〃交流电源供电(可控硅桥输入) VAC □〃辅助直流电源 VDC □〃控制电压24V直流 VDC □2.5 变送器型号2.6 程序下载2.7 操作控制回路动作试验〃灭磁开关动作□〃照明电路动作□〃风扇电路动作□〃就地/远方动作□2.8 各附加单元整定与动作正确性试验〃数字量输入□〃模拟量输出□2.9 保护及报警监视试验〃小型断路器报警□〃灭磁开关跳闸报警□〃PT 断线报警□2.10 总体静态特性试验〃基准负载测试□2.11 测量值校验三、现场试验3.1 试验准备(发电机静止时)实际参数设置参照参数表详细信息参阅“调试指导”3.1.1 外观检查〃机壳安装妥善无可见损坏□〃外部连线,总线连接,外部接地□〃直流,灭磁开关,启励及灭磁回路□〃20℃时磁场电阻(含引线电缆电阻)3.1.2 绝缘试验〃主回路绝缘试验□3.1.3 供电电源〃交流电源(用于照明及加热器) V 〃直流电源 V 〃第二直流电源(可选) V 〃电子设备功能正常/内部电源电压正常 V3.1.4 软件〃软件下载(在AFT系统的两个通道中)□〃软件版本〃基本参数设定□3.1.5变送器检查□3.1.6 控制回路〃检查所有命令输入□〃检查所有信号输出□〃检查报警和跳闸回路□〃灭磁开关控制回路□〃启励电路灭磁开关控制回路□〃检查风扇控制回路灭磁开关控制回路□〃检查电压互感器(PT)和电流互感器(CT)□〃灭磁开关控制回路□〃检查模拟量输入和输出□3.1.7 保护装置〃跨接器的外观检查(校准BOD单元)□发电机接地检测检查□励磁机接地检测检查□3.2空载试验(发电机在额定转速下)3.2.1 手动通道〃将可控硅桥封脉冲,测量起励时的发电机电压U G%〃调整测量实际值(U G,U SYN,I F,U F)□〃设定参考值和预设值的限制值□〃在手动通道中调整PI参数□〃检查整流器电源电压和相位 V 〃检查分灭磁开关灭磁(灭磁电阻灭磁)□〃检查不分灭磁开关灭磁(逆变灭磁)□3.2.2 自动通道〃启励和软启励□〃调整测量实际值(U G,U SYN,I F,U F)□〃设定参考值和预设值的限制值□〃在自动通道中调整PID参数□〃设定及检查V/HZ限制器□〃检查灭磁回路(正常灭励和跳灭磁开关)□〃定义P/Q补偿□3.2.3 通道切换〃检查自动手动通道的切换,是否平滑无冲击□3.2.4 监视和保护〃检查PT 故障时自动到手动通道的切换动作定义□〃检查PT故障时通道1到通道2的切换动作定义□3.3并网功能试验(发电机在额定转速下)3.3.1并网后一般性试验〃校准发电机电流测量值/检查P和Q测量值□〃P≈0;Q滞相甩负荷试验□〃P≈0;Q进相甩负荷试验□〃自动通道作阶跃响应,优化动态性能□〃手动通道作阶跃响应,优化动态性能□〃检查叠加控制的影响□〃手动限制调整□3.3.2 IE限制器〃励磁电流IE过励限制器的定义和校核□〃用阶跃响应使限制器动作时优化动态响应过程□3.3.3 IG限制器〃定义电流IG过电流限制器 (过励和欠励时) □〃用阶跃响应使限制器动作时,优化动态响应过程□3.3.4 P/Q限制器〃定义P/Q特性曲线□〃P/Q限制器欠励检查□〃用阶跃响应使限制器动作时,优化动态过程□3.3.5恒功率因数控制器〃检查恒功率因数控制器的稳态和动态性能□〃检查功率因数的限制值□〃用增减按钮检查功率因数的参考值设定□3.3.6恒无功控制器〃检查恒无功控制器的稳态和动态性能□〃检查恒无功控制器的限制值□〃用增减按钮检查无功的参考值设定□3.3.7电力系统稳定器〃PSS参数计算□〃PSS作用检查□注:该试验由相关单位组织,设备供应单位参加。
TS8900-128开发板说明书
TS8900-M128开发板说明书AVR mega128学习板专为AVR单片机初学者设计,简单实用、价格合理是AVR 学习板的最大特点。
电路板精心布局,模块划分清晰位置放置合理,符合正常使用习惯。
电路简单,学习板上安排了最常用最实用的功能电路,电路接口设计上合理配置尽量不复用,降低学习难度,把方便留给大家硬件资源介绍(如下图):1.CPU核心板mega128,AVR单片机主芯片,内包含有:128K Flash、4K SRAM、4KByte EEPROM,芯片可与AT mega64互换。
2.AT24C02,I2C总线器件,EEPROM数据存储器,256Byte EEPROM。
3.74HC595,SPI总线器件,SPI总线并口扩展器件,8位移位寄存器(串行输入,3S并行锁存输出)。
4.PCF8563T,时钟芯片。
5.RS232,RS232接口芯片,两组接口(和下面485接口共用CPU两组UART接口)。
6.MAX487,485网络驱动芯片,产品组网中最常用最方便的一种方式,大部分室外控制网络采用485通信。
7.8个输入按键、1个复位按键。
8.4位动态扫描LED数码管、8位LED发光二极管。
9.1个无源蜂鸣器。
10.2路A/D输入可调电位器。
11.1个三线扩展接口,可用来扩展热敏电阻、DS18B20数字温度计等实验。
12.LCD接口,液晶显示屏接口,可接LCD1602和LCD12864两种液晶屏.13.AVR JTAG仿真接口,AVR ISP下载接口。
14.所有IO口全部引出,方便扩展实验及测试。
15.CPU采用独立mega128核心板,方便升级及更换芯片。
16.在1路RS232外提供了1路RS485网络驱动芯片,实用的多点远程通信网络。
实验项目1.AVRISP程编下载——AVRISP下载线程序下载是AVR单片机程序固化的最基本方法,学习AVR单片机首先应该掌握的。
2.流水灯显示——流水灯显示为最基本的IO口输出实验。
ATMEGA128--AVR教程
AVR教程(1):AVR单片机介绍作者:微雪电子文章来源: 点击数: 478 更新时间:2008-4-1 23:58:21 AVR,它来源于:1997年,由ATMEL公司挪威设计中心的A先生与V先生利用ATMEL公司的Flash新技术,共同研发出RISC精简指令集的高速8位单片机,简称AVR。
AVR单片机特点每种MCU都有自身的优点与缺点,与其它8-bit MCU相比,AVR 8-bit MCU最大的特点是:●哈佛结构,具备1MIPS / MHz的高速运行处理能力;●超功能精简指令集(RISC),具有32个通用工作寄存器,克服了如8051 MCU采用单一ACC 进行处理造成的瓶颈现象;●快速的存取寄存器组、单周期指令系统,大大优化了目标代码的大小、执行效率,部分型号FLASH非常大,特别适用于使用高级语言进行开发;●作输出时与PIC的HI/LOW相同,可输出40mA(单一输出),作输入时可设置为三态高阻抗输入或带上拉电阻输入,具备10mA-20mA灌电流的能力;●片内集成多种频率的RC振荡器、上电自动复位、看门狗、启动延时等功能,外围电路更加简单,系统更加稳定可靠;●大部分AVR片上资源丰富:带E2PROM,PWM,RTC,SPI,UART,TWI,ISP,AD,Analog Comp arator,WDT等;●大部分AVR除了有ISP功能外,还有IAP功能,方便升级或销毁应用程序。
●性价比高。
开发AVR单片机,需要哪些编译器、调试器?软件名称类型简介官方网址AVR Studio IDE、汇编编译器ATMEL AVR Studio集成开发环境(IDE),可使用汇编语言进行开发(使用其它语言需第三方软件协助),集软硬件仿真、调试、下载编程于一体。
ATMEL官方及市面上通用的AVR开发工具都支持AVRStudio。
GCCAVR (WinAVR) C编译器GCC是Linux的唯一开发语言。
GCC的编译器优化程度可以说是目前世界上民用软件中做的最好的,另外,它有一个非常大优点是,免费!在国外,使用它的人几乎是最多的。
AVR单片机 mega128 例程大全
//16超声波LED显示#include <iom16v.h>//PA0接控制引脚PA7接接收引脚#include <macros.h>#define chao 100longint time=0;void delay(long int z){inti,j;for(i=0;i<z;i++)for(j=0;j<100;j++);}void main(){int o=0;DDRD=0xff;DDRA=0x0f;TCNT1H=0x00;TCNT1L=0x00;while(1){PORTA=0x0f;delay(1);PORTA=0x00;while((PINA&0x80)==0x00); TCCR1B=0x03;while((PINA&0x80)==0x80); TCCR1B=0x00;time=TCNT1H*256+TCNT1L; TCNT1H=0x00;TCNT1L=0x00;if(time<chao){if(time<chao){o=500;while(o--)PORTD=0x04;}}if(time>chao){if(time>chao){o=500;while(o--)PORTD=0x08;}}}}//AD#include<iom128v.h>#include<macros.h>#define unint unsigned int#define unchar unsigned char#pragma data:codeconst table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unint mega128_ad(){unintaddata;DDRF&=~BIT(0);PORTF&=~BIT(0);ADMUX=0;ADCSRA=0X80;ADCSRA|=BIT(ADSC);while(!(ADCSRA&(BIT(ADIF))));addata=ADCL;addata=addata+ADCH*256;returnaddata;}void show(count){unchar temp1,temp2,temp3,temp4;temp1=count/1000;temp2=(count%1000)/100;temp3=(count%100)/10;temp4=count%10;HC_595_OUT(table[temp4]);DDRB|=(1<<4);PORTB|=(1<<4);delay(10);DDRB|=(1<<4);PORTB&=~(1<<4);HC_595_OUT(table[temp3]);DDRB|=(1<<5);PORTB|=(1<<5);delay(10);DDRB|=(1<<5);PORTB&=~(1<<5);HC_595_OUT(table[temp2]);DDRB|=(1<<6);PORTB|=(1<<6);delay(10);DDRB|=(1<<6);PORTB&=~(1<<6);HC_595_OUT(table[temp1]);DDRB|=(1<<7);PORTB|=(1<<7);delay(10);DDRB|=(1<<7);PORTB&=~(1<<7);}void HC_595_OUT(count){PORTB&=~(1<<0);SPDR =count ;while(!(SPSR & (1<<SPIF)));delay(10);PORTB|=(1<<0);}void delay(z){unintx,y;for(x=0;x<z;x++)for(y=0;y<200;y++);}void main(){unintcount,chl;DDRC |= (1<<7);PORTC &= (1<<7);PORTB = 0x0F;DDRB |= (1<<2)|(1<<1)|(1<<0);SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);while(1){count=mega128_ad();//用参数代替老是出问题,这一点需要再次认知考虑/*for(i=0;i<4;i++){ad[3-i]=shuzhi%10;shuzhi=shuzhi/10;}*/show(count);}}//ADC#include<iom128v.h>#include<macros.h>#define unint unsigned int#define unchar unsigned char#pragma data:codeconst table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unint mega128_ad(){unintaddata;DDRF&=~BIT(0);PORTF&=~BIT(0);ADMUX=0;ADCSRA=0X80;ADCSRA|=BIT(ADSC);while(!(ADCSRA&(BIT(ADIF)))); addata=ADCL;addata=addata+ADCH*256; returnaddata;}void show(count){unchar temp1,temp2,temp3,temp4;temp1=count/1000;temp2=(count%1000)/100;temp3=(count%100)/10;temp4=count%10;HC_595_OUT(table[temp4]);DDRB|=(1<<4);PORTB|=(1<<4);delay(10);DDRB|=(1<<4);PORTB&=~(1<<4);HC_595_OUT(table[temp3]);DDRB|=(1<<5);PORTB|=(1<<5);delay(10);DDRB|=(1<<5);PORTB&=~(1<<5);HC_595_OUT(table[temp2]);DDRB|=(1<<6);PORTB|=(1<<6);delay(10);DDRB|=(1<<6);PORTB&=~(1<<6);HC_595_OUT(table[temp1]);DDRB|=(1<<7);PORTB|=(1<<7); delay(10);DDRB|=(1<<7);PORTB&=~(1<<7);}void HC_595_OUT(count) {PORTB&=~(1<<0);SPDR =count ;while(!(SPSR & (1<<SPIF)));delay(10);PORTB|=(1<<0);}void delay(z){unintx,y;for(x=0;x<z;x++)for(y=0;y<200;y++);}void main()unintcount,chl;DDRC |= (1<<7);PORTC &= (1<<7);PORTB = 0x0F;DDRB |= (1<<2)|(1<<1)|(1<<0);SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);while(1){count=mega128_ad();//用参数代替老是出问题,这一点需要再次认知考虑/*for(i=0;i<4;i++){ad[3-i]=shuzhi%10;shuzhi=shuzhi/10;}*/show(count);}}//CTC//该程序并未在示波器上测试,在仿真软件上仿真时只有PB5上有方波信号出现#include <iom128v.h>#include <macros.h>#define uchar unsigned char#define uint unsigned intvoid main(){DDRB|=0X60;TCCR1A=0X50;TCCR1B=0X09;OCR1A=0X7CF;}//D口矩阵键盘检测#include "config.h"#include <iom128v.h>#include <macros.h>#define unint unsigned int#define unchar unsigned charconst unsigned char Seg7_Data[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};unchar temp1,temp2,temp3,temp4;unintdata,z;void HC_595_init(){DDRC=0x80;PORTC=0x00;PORTB=0x0F;DDRB=0x07;SPCR =0x53;}void Seg7_Led_display(unint data) {unchar temp1,temp2,temp3,temp4;temp1=data/1000;temp2=(data%1000)/100;temp3=(data%100)/10;temp4=data%10;HC_595_OUT(Seg7_Data[temp4]);PORTB|=(1<<4);delay(20);PORTB&=~(1<<4);HC_595_OUT(Seg7_Data[temp3]);PORTB|=(1<<5);delay(20);PORTB&=~(1<<5);HC_595_OUT(Seg7_Data[temp2]); PORTB|=(1<<6);delay(20);PORTB&=~(1<<6);HC_595_OUT(Seg7_Data[temp1]);PORTB|=(1<<7);delay(20);PORTB&=~(1<<7);}void HC_595_OUT(unchar data){PORTB=0x06;SPDR =data ;while(SPSR==0);delay(10);PORTB=0x01;}void delay(unint z){uninti,j;for(i=0;i<z;i++)for(j=0;j<100;j++);}void delay_1us(void) //1us延时函{asm("nop");}void delay_nus(unsigned int n) //N us延时函数{unsignedint i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void) //1ms延时函数{unsignedint i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n) //N ms延时函数{unsignedint i=0;for (i=0;i<n;i++)delay_1ms();voidBuzz_init(void){DDRG |= (1<<4);PORTG &=~ (1<<4);}void Beep(unsigned intH_time,unsignedintL_time) {PORTG |= (1<<4);delay_nms(H_time);PORTG &=~ (1<<4);delay_nms(L_time);}intkey_press(void){int k;delay_nms(5);PORTD=0x01;delay_nms(5);if((PIND&0xF0)!=0x00){delay_nms(10);if((PIND&0xF0)!=0x00){if(PIND==0x11) {Beep(100,50); PORTA=0x1F;k=1;}else if(PIND==0x21) {Beep(100,50); PORTA=0xFD;k=2;}else if(PIND==0x41) {Beep(100,50); PORTA=0xFB;k=3;}else if(PIND==0x81) {Beep(100,50);PORTA=0xF7;k=4;}else {;}} else {;}} else {;}//第二行delay_nms(5);PORTD=0x02;delay_nms(5);if((PIND&0xF0)!=0x00){delay_nms(10);if((PIND&0xF0)!=0x00){if(PIND==0x12){Beep(100,50);PORTA=0x1F;k=5;}else if(PIND==0x22) {Beep(100,50); PORTA=0xFD;k=6;}else if(PIND==0x42) {Beep(100,50); PORTA=0xFB;k=7;}else if(PIND==0x82) {Beep(100,50); PORTA=0xF7;k=8;}else {;}} else {;}} else {;}//第三行delay_nms(5);PORTD=0x04;delay_nms(5);if((PIND&0xF0)!=0x00){delay_nms(10);if((PIND&0xF0)!=0x00){if(PIND==0x14){Beep(100,50);PORTA=0x1F;k=9;}else if(PIND==0x24){Beep(100,50);PORTA=0xFD;k=10;}else if(PIND==0x44){Beep(100,50);PORTA=0xFB;k=11;}else if(PIND==0x84){Beep(100,50);PORTA=0xF7;k=12;}else {;}} else {;}} else {;}//第四行delay_nms(5);PORTD=0x08;delay_nms(5);if((PIND&0xF0)!=0x00) {delay_nms(10);if((PIND&0xF0)!=0x00) {if(PIND==0x18){}else if(PIND==0x28) {Beep(100,50); PORTA=0xFD;k=14;}else if(PIND==0x48) {Beep(100,50); PORTA=0xFB;k=15;}else if(PIND==0x88) {Beep(100,50); PORTA=0xF7;k=16;}else{;}} else {;}} else {;}return k;}void main(void){inti,j,x;DDRA=0xFF;PORTA=0xFF;DDRD=0x0F;DDRE=0xFF;PORTE=0xFF;Buzz_init();while(1){x=key_press();HC_595_init();Seg7_Led_display(x);}}//1602液晶#include<iom128v.h>#define uchar unsigned char#define uint unsigned int#define uchar unsigned char#define uint unsigned int#define RS 0#define RW 1#define EN 2ucharwz[]={"*WEN.JIU.LONG*"}; uchargd[]={"Good Luck!"}; voids_ms(uintms){for(;ms>1;ms--);}//写指令voidwritecom(uchar com){PORTC&=~(1<<RS); //RS=0 命令选择PORTC&=~(1<<RW); //RW=0 写选择PORTC|=(1<<EN); //EN=1 使能信号s_ms(500);PORTA = com; //输出指令s_ms(500);PORTC&=~(1<<EN); //EN=0}//1602初始化void LcdInit(void){writecom(0x01);writecom(0x02);writecom(0x06);writecom(0x0c);writecom(0x38); //没理解好这里设置的是四位总线,而且设不成5X10的点阵}//============================================ ====================// 描述:在任意位置写任意多个字符// 入口:’row‘要写的字符所在的行,只能为1或2;// ‘col’要写的字符所在的列,只能为0---15 // ‘num’要写字符的个数// ‘pbuffer’要写字符的首地址//============================================ ======================void WriteChar(ucharrow,ucharcol,uintnum,uchar*pBuffer){uchari,t,add;if (row == 1) add = 0x80 + col+0x10;else add = 0x80+0x40 + col+0x10;writecom(add);PORTC&=~(1<<RW);s_ms(500);PORTC|=(1<<RS);for(i=num;i!=0;i--){t = *pBuffer;PORTA = t;PORTC|=(1<<EN);s_ms(500);//必须有个延时PORTC&=~(1<<EN);pBuffer++;}}void main(){int i;DDRA=0xff;PORTA=0xff;DDRC=0xff;PORTC=0xff;LcdInit();WriteChar(1,1,14,wz); WriteChar(2,3,10,gd);for(i=0;i<16;i++){writecom(0X18);s_ms(50000);s_ms(50000);s_ms(50000);s_ms(50000);s_ms(50000);s_ms(50000);s_ms(50000);s_ms(50000);}}//按键加显示的最简写法.txt#include "config.h"#include <iom128v.h>#include <macros.h>#define unint unsigned int#define unchar unsigned charconst unsigned char Seg7_Data[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};unchar Seg7_Led_Buf[4],temp1,temp2,temp3,temp4; unintdata,z;void HC_595_init(){DDRC=0x80;PORTC=0x00;PORTB=0x0F;DDRB=0x07;SPCR =0x53;}void Seg7_Led_display(unint data) {unchar temp1,temp2,temp3,temp4;temp1=data/1000;temp2=(data%1000)/100;temp3=(data%100)/10;temp4=data%10;HC_595_OUT(Seg7_Data[temp4]);PORTB|=(1<<4);delay(20);PORTB&=~(1<<4);HC_595_OUT(Seg7_Data[temp3]);PORTB|=(1<<5);delay(20);PORTB&=~(1<<5);HC_595_OUT(Seg7_Data[temp2]); PORTB|=(1<<6);delay(20);PORTB&=~(1<<6);HC_595_OUT(Seg7_Data[temp1]); PORTB|=(1<<7);delay(20);PORTB&=~(1<<7);}void HC_595_OUT(unchar data) {PORTB=0x06;SPDR =data ;while(SPSR==0);delay(10);PORTB=0x01;}void delay(unint z){uninti,j;for(i=0;i<z;i++)for(j=0;j<100;j++);}voidKey_init(void){KEY_DDR &=~ 0xFF;KEY_PORT |= 0xFF;}unsigned char get_key(void){unsigned char Key_Value,tmp;Key_Value=KEY_PIN & 0xFF;if(Key_Value != 0xFF){delay_nms(2);if(Key_Value != 0xFF){Key_Value=PIND;}}returnKey_Value;}void delay_1us(void) //1us延时函数{asm("nop");}void delay_nus(unsigned int n) //N us延时函数{unsignedint i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void) //1ms延时函数{unsignedint i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n) //N ms延时函数{unsignedint i=0;for (i=0;i<n;i++)delay_1ms();}voidBuzz_init(void){BUZZ_DDR |= (1<<SPK);BUZZ_PORT &=~ (1<<SPK);}void Beep(unsigned intH_time,unsignedintL_time){BUZZ_PORT |= (1<<SPK); delay_nms(H_time); BUZZ_PORT &=~ (1<<SPK); delay_nms(L_time);}void main(void){unsigned char Key;DDRA=0xFF;PORTA=0x00;DDRE = 0xFF;PORTE = 0xFF;Key_init();Buzz_init();while(1){int w=10;Key=get_key();switch(Key){case (0xFE):{Beep(100,50);PORTA=0xFE;break;}case (0xFD):{Beep(100,50);PORTA=0xFD;HC_595_init();Seg7_Led_display( 617);break;}case (0xFB):{Beep(100,50);PORTA=0xFB;HC_595_init();while(w--){Seg7_Led_display( 327);}break;}case (0xF7):{PORTA=0xF7;Beep(100,50);HC_595_init();while(w--){Seg7_Led_display( 307);}break;}case (0xEF):{PORTA=0xEF;Beep(100,50);HC_595_init();while(w--){Seg7_Led_display( 617);}break;}case (0xDF):{PORTA=0xDF;Beep(100,50);HC_595_init();while(w--){Seg7_Led_display( 327);}break;}case (0xBF):{PORTA=0xBF;Beep(100,50);HC_595_init();while(w--){Seg7_Led_display( 307);}break;}case (0x7F):{PORTA=0x7F;Beep(100,50);HC_595_init();while(w--){Seg7_Led_display( 307);}break;}default:{break;}}}}//18B20#include "config.h" #include <iom128v.h> #include <macros.h> #include "hc595.h" #include "spi.h"#include "18b20.h" voidspi_init(void){DDRB |= (1<<MOSI)|(1<<SCK)|(1<<SS);//设置MOSI,SCK输出SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);//使能SPI,主机模式}voidSPI_MasterTransmit(char Data){/* 启动数据传输*/SPDR = Data;/* 等待传输结束*/while(!(SPSR & (1<<SPIF)));}const unsigned char Seg7_Data[]={0x3F,0x06,0x5B,0x4F,0x66,//0,1,2,3,40x6D,0x7D,0x07,0x7F,0x6F, //5,6,7,8,90x77,0x7C,0x39,0x5E,0x79,0x71,0x00};//a,b,c,d,e,fvolatile unsigned char Seg7_Led_Buf[4],point=0,point_pos=0;//point是小数点标志1代表有小数点point_pos表示小数点位置void HC_595_init(void){OE_DDR |= (1<<OE);OE_PORT &= (1<<OE);PORTB = 0x0F;spi_init();Seg7_Led_Buf[0]=16;Seg7_Led_Buf[1]=16;Seg7_Led_Buf[2]=16;Seg7_Led_Buf[3]=16;}void HC_595_OUT(unsigned char data){SS_L();SPI_MasterTransmit(data);SS_H();void Seg7_Led_Update(void){HC_595_OUT(Seg7_Data[Seg7_Led_Buf[0]]);Seg7_Bit0_En();delay_nus(60);Seg7_Bit0_Dis();HC_595_OUT(Seg7_Data[Seg7_Led_Buf[1]]);if((point==1)&&(point_pos==1))HC_595_OUT((Seg7_Data[Seg7_Led_Buf[1]])|(1<<dp)); Seg7_Bit1_En();delay_nus(60);Seg7_Bit1_Dis();HC_595_OUT(Seg7_Data[Seg7_Led_Buf[2]]);if((point==1)&&(point_pos==2))HC_595_OUT((Seg7_Data[Seg7_Led_Buf[2]])|(1<<dp)); Seg7_Bit2_En();delay_nus(60);Seg7_Bit2_Dis();HC_595_OUT(Seg7_Data[Seg7_Led_Buf[3]]);if((point==1)&&(point_pos==3))HC_595_OUT((Seg7_Data[Seg7_Led_Buf[3]])|(1<<dp)); Seg7_Bit3_En();delay_nus(60);Seg7_Bit3_Dis();}void Seg7_Led_display(unsigned int data){if(data>9999) //错误处理,超出显示范围则全亮{HC_595_OUT(0xFF);Seg7_Bitselect_PORT|=((1<<Seg7_Bit0)|(1<<Seg7_Bit1) |(1<<Seg7_Bit2)|(1<<Seg7_Bit3));}else if(data>999){Seg7_Led_Buf[3]=data/1000;Seg7_Led_Buf[2]=(data%1000)/100;Seg7_Led_Buf[1]=(data%100)/10;Seg7_Led_Buf[0]=data%10;Seg7_Led_Update();}else if(data>99){Seg7_Led_Buf[3]=16;Seg7_Led_Buf[2]=(data%1000)/100;Seg7_Led_Buf[1]=(data%100)/10;Seg7_Led_Buf[0]=data%10;Seg7_Led_Update();}else if(data>9){Seg7_Led_Buf[3]=16;Seg7_Led_Buf[2]=16;Seg7_Led_Buf[1]=(data%100)/10;Seg7_Led_Buf[0]=data%10;Seg7_Led_Update();}else{Seg7_Led_Buf[3]=16;Seg7_Led_Buf[2]=16;Seg7_Led_Buf[1]=16;Seg7_Led_Buf[0]=data%10;Seg7_Led_Update();}}/********************************************* ****************************** 函数名称:HC595显示浮点数据** 功能描述:** 输入:** 输出:** 全局变量:** 调用模块:** 说明:** 注意:********************************************** ****************************/void Seg7_Led_float(float data){unsignedint temp;/*重要说明:data+=0.00001;其中0.00001为容错值解决float数据类型在计算机内部存储的误差问题,可以解决显示问题但是会引入新的计算误差,如果精度要求大于0.00001建议更改容错值或者将此处注释掉*/data+=0.00001;point=1;if(data>999) //错误处理,超出显示范围则全亮{HC_595_OUT(0xFF);Seg7_Bitselect_PORT|=((1<<Seg7_Bit0)|(1<<Seg7_Bit1) |(1<<Seg7_Bit2)|(1<<Seg7_Bit3));}else if(data>99){temp=data*10;point_pos=1;Seg7_Led_Buf[3]=temp/1000;Seg7_Led_Buf[2]=(temp%1000)/100;Seg7_Led_Buf[1]=(temp%100)/10;Seg7_Led_Buf[0]=temp%10;Seg7_Led_Update();}else if(data>9){temp=data*100;point_pos=2;Seg7_Led_Buf[3]=temp/1000;Seg7_Led_Buf[2]=(temp%1000)/100;Seg7_Led_Buf[1]=(temp%100)/10;Seg7_Led_Buf[0]=temp%10;Seg7_Led_Update();}else{temp=data*1000;point_pos=3;Seg7_Led_Buf[3]=temp/1000;Seg7_Led_Buf[2]=(temp%1000)/100;Seg7_Led_Buf[1]=(temp%100)/10;Seg7_Led_Buf[0]=temp%10;Seg7_Led_Update();}point=0;}void delay_1us(void) //1us延时函数{asm("nop");}void delay_nus(unsigned int n) //N us延时函数{unsignedint i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void) //1ms延时函数{。
Mega128单片机调试与设置
Mega128单片机调试与设置一、单片机型号为ATmega128A二、调试软件为iccavr7.22和AVRstudio4.0连调三、流程:1.在iccavr中建立工程文件。
2.在iccavr中新建一个项目,并保存。
注意保存文件名必须为.c才可以。
如下图。
3.在右上方file里面右键添加.c 文件。
4.然后编写程序。
注意一般程序包括如下库文件:#include <iom128v.h>#include <macros.h>#include <stdio.h>#include <string.h>5.在利用系统生成(build)钱,一定要进行系统相关的设置,此项非常重要,否则会出现各种问题。
特别是单片机的选取,一定要按照下图选取,选择ATmega1280是不对的。
具体设置在project -> options6.设置完毕后,建立工程。
7.无错误应该为下图8.然后打开AVRstudio,打开projectwizard -> open,然后打开后缀名为.cof 的文件,如下图所示:然后会自动生成后缀名为.aps的工程文件9.然后选择10.连接成功后直接进入到如下界面11.点击黑色的AVR进行基本的设置单片机为ATmega128,JTAG mode ,然后添加 .hex 文件。
熔丝位的设置如下,只有这几个有“√”,特别要注意将M103C 的“√”去掉。
内部1M 晶振用外部8M 晶振用注意此处要修改烧入单片机的程序名称,后缀名为 .hex ,在iccavr 建立的工程文件里添加点击program 即将程序烧写进入单片机中其他一般不要设置。
12.都设置完毕后就可以进行debug或者是烧写程序了。
Debug点击绿色按钮或者在debug里选择。
AVR_128_spi串口通信程序
UCSR1B=(1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1);//发送接收使能,接收中断使能
UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);//8位数据,UCSZ12,11,10共同确定
DDRD|=BIT(3); //设置发送口为输出
}
/*串口0单字符发送,查询方式*/
{
UCSR1B = 0x00; //禁止发送和接收
UCSR1A = 0x02; //倍速异步模式 USX0=1
UBRR1L=(Crystal/8/Baud1-1)%256; //根据数据手册的计算法
UBRR1H=(Crystal/8/Baud1-1)/256; //如果不是倍速则(Crystal/16/Baud1-1)
Flag1=1;
UCSR1B|=BIT(RXCIE1);//重开接收中断
}
以下是主机部份 #include <iom128v.h> #include <macros.h> #define uchar unsigned char #define uint unsigned int #include "delay.h" #include "lcd.h" void port_init(void); //SPI initialize // clock rate: 1843199hz void spi_init(void) { SPCR = 0x74; //setup SPI
init_devices(); LCD1602_initial(); LCD1602_sendbyte(iDat,1+0x30 ); // while(1) //{ for(i=0;i<2;i++) {
mega128技术文档
雪松电子开发:/AVR mega128 技术文档1、电路分析图(1)mega128 核心板原理图 一,硬件电路说明 1,电源:1)通过 ISP 连接 USB 进行供电。
2)通过 JTAG 连接 USB 供电。
3)通过 P5 外接 5V 电源供电。
2,外围接口:P1,P2,P3,P4 共 64 位将 mega128 所有的接口全部引出,方便工程设 计和外围扩展。
3,发光二极管 D0 的作用是指示电源是否连接成功,如果外部电源成功的连接上,则发 光二极管发光指示电源连接成功;电阻 R0 的作用是对发光二极管进行限流,一般发光二极 管只能通过 5mA—15mA 左右的电流,且发光二极管上面的压降只需要 1.5V 左右,加到发 光二极管上面的电流如果超出额定值,则会烧毁。
而系统工作的电压是 5V,如果全部加在 发光二极管上, 则发光二极管很容易就会被烧毁。
所以要在电源和发光二极管之间串接一个 限流电阻。
该限流电阻阻值的计算: (VCC-发光二极管上的电压)/流过发光二极管的电流。
一般发光二极管的压降是 1.5V 左右,电流为 10mA 左右,为降低功耗我们在此取 680R 发光二极管 D1 和 R1 的作用是作为程序运行指示,在程序运行的过程中通过跳冒 P0 选 通 4,复位电路:单片机的第 20 脚(RESET,复位管脚)经过按钮 S0 连接到地。
分析:a)AVR 单片机是低电平复位(51 单片机是高电平复位,刚好相反) 。
需要 单片机复位时,最少要在复位管脚加上 1.5 微秒的低电平,才能确保单片机正确复位。
b)按下按钮 S0,复位管脚被直接拉到电源地,这样复位管脚的电平就被 拉低,从而使单片机复位;一般情况下按钮按下的时间超过毫秒级别,这样就能确保单片机“雪松电子开发”你身边的嵌入式开发专家雪松电子开发:/正确复位。
5, ISP 电路(程序下载电路) :ISP 下载接口不需要任何的外围零件。
AVR128定时器计数器1详细解读,附详细程序注释,初学者一看就懂的程序哦
1:如何设置A VR单片机的时钟?答:可以通过设置熔丝位来确定A VR单片机工作时的时钟是来自外部晶振还是来自内部的振荡器。
熔丝位设置:芯片有如下几种通过熔丝位选择的时钟源。
时钟输入到AVR 时钟发生器,并通往其他合适的模块。
Table 6.时钟源选择芯片时钟选项CKSEL3..0(1)外部晶体/ 陶瓷振荡器1111 - 1010外部低频晶体1001外部RC 振荡器1000 - 0101标定的内部RC 振荡器0100 - 0001外部时钟0000 2.如何操作定时器计数器1,让其工作在定时状态?答:(1)通过设置寄存器TCCR1A,和寄存器TCCR1B中的相应位来给定时器选择分频系数。
(2)向数据寄存器TCNT1H,TCNT1L装初值。
(3)设置定时器/ 计数器中断屏蔽寄存器TIMSK中的第二位TOIE1=1;(4)打开总中断,置SREG中的第4位为‘1’,打开总中断,这里只需使SREG|=0X80即可;(5)在中断函数中重装初值。
3.中断函数格式:#pragma interrupt_handler函数名():中断向量序号void 函数名(){重装初值;其它程序代码.}4.如何计算计数初始值?答:举例说明:若我们设置定时器工作的分频为M分频,时钟频率为fclk,则单片机产生一次中断的时间为t=fclk/m.则若设置定时T则要记的数N为:N=T/t;定时器1 (16位定时器)寄存器TCCR1B = 0x04 设定256预分频要利用定时器定时1秒1,4000000 / 256 = 15625 说明定时器每当1/15625 秒就会触发一次中断2,65535 - 15625 = 49910 //1s/(产生一次中断的时间)计算出要累加多少次才能在1秒后出发定时器1的溢出中断3,49910 <==> C2 F6 将计算后的值换算成16进制4,TCNT1H = 0xC2 ; 对寄存器赋初值TCNT1L = 0xF6 ;。
AVR-H128-CAN开发板用户手册说明书
AVR-H128-CANAVR- H128-CAN development boardUsers ManualAll boards produced by Olimex are ROHS compliantRev.A, January 2005Copyright(c) 2009, OLIMEX Ltd, All rights reservedINTRODUCTIONAVR-H128-CAN is inexpensive way to develop and prototype circuits withAT90CAN128 without need to deal with SMD soldering. All microcontroller pinsare available on extension header with 0.1" and power supply, oscillators, ICSP,JTAG are wired, so all you need to do is to connect your additional components tothe AVR ports, as the step is 0.1" these headers perfectly fit the prototype sea of padboards with 0.1" step.BOARD FEATURES–AT90CAN128-16AU microcontroller with 128KB Flash, 4KB RAM, 4KBEEPROM, CAN controller–ICSP 5x2 pin connector for in-circuit programming with AVR-PG1 or AVR-PG2 or STK500 compatible programmer–JTAG 5x2 pin connector for in-circuit debugging with AVR-JTAG-L or AVR-JTAG-USB–16MHz scillator circuit–32768 Hz oscillator circuit–Reset IC ZM33064–+5V voltage regulator LM78L05–power supply filtering capacitors–extension pin headers for each uC pin–FR-4, 1.5 mm (0,062"), green soldermask, white silkscreen component print–dimensions 47x47 mm (1.85x1.85")ELECTROSTATIC WARNINGThe AVR-H128-CAN board is shipped in protective anti-static packaging.Theboard must not be subject to high electrostatic potentials.General practice forworking with static sensitive devices should be applied when working with thisboard.BOARD USE REQUIREMENTSCables: The cable you will need depends on the programmer/debugger you use. Ifyou use AVR-JTAG or AVR-PG1 you will need RS232, if you use AVR-USB-JTAGor AVR-ISP500/TINY/ISO you will need 1.8 m A-B USB cable, if you use AVR-PG2, you will need LPT cable.Hardware:One of OLIMEX Programmers/Debuggers–AVR-JTAG,AVR-USB-JTAG, AVR-ISP500, AVR-ISP500-TINY, AVR-ISP500-ISO, AVR-PG1, AVR-PG2.Software: AVR C compiler.PROCESSOR FEATURESAVR-H128-CAN board use High-performance, Low-power AVR® 8-bitMicrocontroller – AT90CAN128 from Atmel Corporation with these features:–Advanced RISC Architecture–133 Powerful Instructions – Most Single Clock Cycle Execution–32 x 8 General Purpose Working Registers + Peripheral ControlRegisters–Fully Static Operation–Up to 16 MIPS Throughput at 16 MHz–On-chip 2-cycle Multiplier–Non volatile Program and Data Memories–128K Bytes of In-System Reprogrammable Flash–Endurance: 10,000 Write/Erase Cycles–Optional Boot Code Section with Independent Lock Bits–Selectable Boot Size: 1K Bytes, 2K Bytes, 4K Bytes or 8K Bytes–In-System Programming by On-Chip Boot Program (CAN,UART, ...)–True Read-While-Write Operation–4K Bytes EEPROM (Endurance: 100,000 Write/Erase Cycles)–4K Bytes Internal SRAM–Up to 64K Bytes Optional External Memory Space–Programming Lock for Software Security–JTAG (IEEE std. 1149.1 Compliant) Interface–Boundary-scan Capabilities According to the JTAG Standard–Programming Flash (Hardware ISP), EEPROM, Lock & Fuse Bits–Extensive On-chip Debug Support–CAN Controller 2.0A & 2.0B - ISO 16845 Certified–15 Full Message Objects with Separate Identifier Tags and Masks–Transmit, Receive, Automatic Reply and Frame Buffer Receive Modes–1Mbits/s Maximum Transfer Rate at 8 MHz–Time stamping, TTC & Listening Mode (Spying or Autobaud)–Peripheral Features–Programmable Watchdog Timer with On-chip Oscillator–8-bit Synchronous Timer/Counter-0–10-bit Prescaler–External Event Counter–Output Compare or 8-bit PWM Output–8-bit Asynchronous Timer/Counter-2–10-bit Prescaler–External Event Counter–Output Compare or 8-Bit PWM Output–32Khz Oscillator for RTC Operation–Dual 16-bit Synchronous Timer/Counters-1 & 3–10-bit Prescaler–Input Capture with Noise Canceler–External Event Counter–3-Output Compare or 16-Bit PWM Output–Output Compare Modulation–8-channel, 10-bit SAR ADC–8 Single-ended Channels–7 Differential Channels– 2 Differential Channels With Programmable Gain at 1x, 10x, or 200x –On-chip Analog Comparator–Byte-oriented Two-wire Serial Interface–Dual Programmable Serial USART–Master/Slave SPI Serial Interface–Programming Flash (Hardware ISP)–Special Microcontroller Features–Power-on Reset and Programmable Brown-out Detection–Internal Calibrated RC Oscillator–8 External Interrupt Sources– 5 Sleep Modes: Idle, ADC Noise Reduction, Power-save, Power-down & Standby–Software Selectable Clock Frequency–Global Pull-up Disable–Operating Voltages: 2.7 – 5.5V–Operating temperature: Industrial (-40°C to +85°C)–Maximum Frequency: 8 MHz at 2.7V, 16 MHz at 4.5V–53 Programmable I/O LinesBLOCK DIAGRAMMEMORY MAP:SCHEMATICRev. ACOPYRIGHT(C), 2005/devBOARD LAYOUTPOWER SUPPLY CIRCUITThe board is power supplied from POWER connector pin 1 and pin 2 with 9-12 VDC.RESET CIRCUITAVR-H128-CAN reset circuit includes pin 6 of JTAG connector, pin 5 of ICSPconnector, Extension connector CON2 – pin 4 and AT90CAN128 pin 20. CLOCK CIRCUITQuartz crystal 16MHz is connected to AT90CAN128 pin 23 (XTAL2) and pin 24(XTAL1).Quartz crystal 32kHz is connected to AT90CAN128 pin 18 (TOSC2) and pin 19(TOSC1).JUMPER DESCRIPTIONEPWREnable target power supply.CONNECTOR DESCRIPTIONS JTAGICSPPin #Signal Name Pin #Signal Name1PEN2PE03PE14PE25PE36PE47PE58PE69PE710PB011PB112PB213PB314PB415PB516PB6 CON2Pin #Signal Name Pin #Signal Name17PB718TOSC219TOSC120RESET21+5V22GND23XTAL224XTAL125PD026PD127PD228PD329PD430PD531PD632PD7Pin #Signal Name Pin #Signal Name33WR34RD35PC036PC137PC238PC339PC440PC541PC642PC743ALE44PA745PA646PA547PA448PA3 CON4Pin #Signal Name Pin #Signal Name49PA250PA151PA052+5V53GND54TDI55TDO56TMS57TCK58PF359PF260PF161PF062AREF63GND64+5V POWER CONNECTORPin #Signal Name1 (+)VCC2 (-)GNDMECHANICAL DIMENSIONSAVAILABLE DEMO SOFTWARE–Blinking LED C source for WinAVR–UART initialization C source for WinAVRORDER CODEAVR-H128-CAN – assembled and tested board, includes AT90CAN128-16microcontroller.How to order?You can order to us directly or by any of our distributors.Check our web /dev for more info.Revision history:REV.A- create January 2005Disclaimer:© 2009 Olimex Ltd. All rights reserved. Olimex®, logo and combinations thereof, are registered trademarks of Olimex Ltd. Other terms and product names may be trademarks of others.The information in this document is provided in connection with Olimex products. No license, express or implied or otherwise, to any intellectual property right is granted by this document or in connection with the sale of Olimex products.Neither the whole nor any part of the information contained in or the product described in this document may be adapted or reproduced in any material from except with the prior written permission of the copyright holder. The product described in this document is subject to continuous development and improvements. All particulars of the product and its use contained in this document are given by OLIMEX in good faith. However all warranties implied or expressed including but not limited to implied warranties of merchantability or fitness for purpose are excluded.This document is intended only to assist the reader in the use of the product. OLIMEX Ltd. shall not be liable for any loss or damage arising from the use of any information in this document or any error or omission in such information or any incorrect use of the product.AVR-H128-CAN。
AVR单片机ATmega128芯片BootLoader详细介绍
TIFR = TIFR|0x02;
}
}
//每秒向 PC 机发送一个控制字符"C",等待控制字〈soh〉
while(uart_getchar()!=XMODEM_SOH) //receive the start of Xmodem
{
if(TIFR & 0x02)
//timer0 over flow
{
Target: Mega128
Crystal: 16Mhz
Used: T/C0,USART0
*****************************************************/
#include #define SPM_PAGESIZE 256
//M128的一个 Flash 页为256字节(128字)
void quit(void)
{
uart_putchar('O');uart_putchar('K');
uart_putchar(0x0d);uart_putchar(0x0a);
while(!(UCSR0A & 0x20));
//等待结束提示信息回送完成
MCUCR = 0x01;
MCUCR = 0x00;
区本身。引导加载程序还可以对自身进行更新修改,甚至可以将自身删除,使系统的自编程能力消失。引导加载程序区的大小
可以由芯片的熔丝位设置,该段程序区还提供两组锁定位,以便用户选择对该段程序区的不同级别的保护。本节将给出一个实
际的的 Boot Loader 程序,它可以配合 Windows 中的超级终端程序,采用 Xmodem 传输协议,通过 RS232接口下载更新
AVR Studio调试软件的使用快速入门
AVR Studio调试软件的使用快速入门首先将JTAG下载仿真头连接好。
1、打开A VR Studio 软件,在弹出的界面中按下Cancel键,如图1-22所示。
图1-22 A VR Studio初始弹出界面2、单击Tile菜单的Program选项,如图1-23所示。
图1-23 A VR Studio Tools菜单此时点击Connect选项,会出现如图1-24的Programmer选项。
图1-24 Programmer选项此时在左侧如图26选择JTAG ICE后点击Connect选项,就会进入熔丝位设置选项。
注意:Connect与Auto Connect的区别是:Connect每次都会提示选择的设备名称与连接端口。
Auto Conect 会自动使用上一次的设置,提高操作效率。
3、熔丝位设置,如图1-25所示。
图1-25 熔丝位设置按需要进行相关设置,完成设置后点击Program进行编程然后关掉该界面即可。
4、单击File菜单的Open File选项,如图1-26所示图1-26 Open File选项5、找到用ICC A VR编译生成的.cof文件,按照提示进行操作,如图1-27所示。
图1-27 打开.cof文件6、选择调试接口(JTAG ICE)和器件(ATmega16)按下Finish图1-28 选择调试接口与器件Port端口我们选择Auto 即可。
如果没有连接JTAG设备,可以使用Disconnected Mode (脱机模式)进入查看操作界面。
如图2-17所示。
重要说明:根据接口选择Platform,A VR Studio本身不支持并口,同时,并不是所有的A VR单片机都支持JTAG协议。
7、调试界面,如图1-29所示。
图1-29 调试界面。
CAN128试验说明书
AT90CAN128处理器主控单元说明书一、前言AT90CAN128是一款低功率CMOS 8位的微处理器,它是基于A VR增强型RISC结构的。
在一个时钟周期里执行强大功效的指令,AT90CAN128可完成1 MIP 每MHz的吞吐量,从而让系统设计者可对进程速度进行优化功率消耗。
A VR内核结合了一个丰富的指令设置,有32个通用目标工作寄存器。
所有32个寄存器都直接和运算器连接,两个独立的寄存器允许被在一个时钟周期里执行的一条单个指令访问。
这种结构比常规的微处理器更具有效率。
AT90CAN128有以下特点:128K的内部可编程FLASH,具有可读写能力,4K 的EEPROM,4K的SRAM,53个通用目标I/O接口,32个通用目标工作寄存器,一个CAN控制器,实时时钟(RTC),四个灵活的定时/计数器,具有比较输出模式和PWM,两个USART,一位定向两线串行接口,一个8通道10位的ADC,一个可编程的带有内部震荡器的看门狗计时器,一个SPI串口,JTAG测试接口,也可用于访问片上调试系统和五个软件选择的省电模式。
空闲模式会关闭CPU,但允许SRAM,定时/计数器,SPI/CAN口和中断系统继续工作。
掉电模式保存寄存器内容,但停止震荡器,禁止所有其他片上功能直到下一个中断或者硬件复位。
省电模式中,异步计时器继续运行,当其他的器件处于休眠时允许用户保留一个计时器。
ADC噪声消除模式关闭CPU和所有的I/O接口模块(但除了异步计时器和ADC),以此在ADC转换期间使噪声最小化。
在备用模式中,晶体振荡器运行当其他器件都休眠。
器件运用Atmel公司的高密度非易失的存储技术制造。
片上ISP FLASH允许程序存储器被一个常规的非易失的储存编程器或者一个在A VR内核上运行的片上启动程序,通过一个内部SPI串行接口来重新编程。
启动程序能用于任何接口在应用FLASH储存器里来下载应用程序。
当应用FLASH部分被更新时,在启动FLASH 部分内的软件将继续运行,提供真正的读写操作。
史上最全的AVR128例程
自己学avr单片机已经有相当一段时间了,一开始用的是atmega128,觉得不是很好用。
于是自己去买了一块16L的芯片,觉得还行。
一开始用的是ICC A VR,应为它用起来比较简单,不像winavr那样,要写个Makefie,比较的麻烦,但icc avr的缺点是太过于简陋,调试程序时,感觉不是很好。
后来经同学介绍,用起了winavr,其实也是比较的简单,只不过要加一个makefile而已,其实makefile 可以用软件自带的组建自动生成,只需修改几个参数就可以用。
后来又用起了code vision avr,虽然不太习惯,也谈不上不好用.需要注意的是,三个不同的软件所带的同文件不一样。
icc avr 是iom128v.h(姑且以128为例),winavr是avr/io.h,不过makefile中要设置芯片为atmega128.而cvavr则是mega128.h。
记得一开始的时候,我对这些不同的同文件不是很理解,是从一个学长那里了解到,才弄明白的。
其实前两个软件只需把头文件稍微改一下基本上可以通用。
而最后一个软件的中断的写法似乎不太一样,因而和钱两个软件的兼容性是最差的。
总体说winavr给人的感觉是比较专业1、流水灯/*硬件环境:atmega128开发板软件环境:CodeVisionA VR-C*/#include <mega128.h>#define uchar unsigned char#define uint unsigned intuchar cnt;void timer1_init(){TCCR1B=0X00; //先停止定时器1TCNT1H=0XF0; //设定定时器初值TCNT1L=0XBE;TCCR1A=0X00; //启动定时器1TCCR1B=0X05; //使用1024分频}interrupt [TIM1_OVF] void timer1_ovf_isr(void){TCNT1H=0XF0; //重载定时器初值TCNT1L=0XBE;DDRE|=1<<2;PORTE|=1<<2;DDRA=0xff;PORTA=cnt; //输出led的值到端口Bcnt++;if(cnt==255)cnt=0;}void main(){//DDRB=0XFF;SREG|=0X80;TIMSK=0X04;timer1_init();while(1){;}}2、AD转换+数码管显示/***************************************************************************//*ADC测试程序*//*目标器件:ATmega128 *//*晶振:RC 8MHZ *//*编译环境:ICCA VR 7.13A *//*E-Mail:**********************//*时间:2010年11月13日*///Aref接A VCC(+5V),采用Aref作参考电压/*用数码管显示AD转换的结果*//***************************************************************************//*********************************包含头文件********************************/#include <iom128v.h>#include <macros.h>/********************************数码管段码表*******************************/ extern const unsigned char tab[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};/*********************************全局变量**********************************/ unsigned int adc_rel=0;/****************************************************************************函数功能:ADC初始化函数入口参数:出口参数:****************************************************************************/ void adc_init(void){DDRF&=0XFE; //PORTF0设置为输入,即作为ADC0口输入模拟电压PORTF&=0XFE; //PORTF0设置为输入低电平ADCSRA=0x00; //关ADCADMUX = 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中断使能;ADPSx,设置分频因子64}/**************************************************************************** 函数功能:ADC中断函数入口参数:出口参数:****************************************************************************/ #pragma interrupt_handler adc_isr:iv_ADCvoid adc_isr(void){//int data_h,data_l;//data_l=ADCL;//data_h=ADCH;ADCSRA = 0x00;ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE);adc_rel=ADC;/*if(adc_rel>0x1ff){PORTA|=1<<2;}elsePORTA&=~(1<<2);*/}/**************************************************************************** 函数功能:延时子程序入口参数:出口参数:****************************************************************************/ void delay(void){int i;for(i=0;i<1800;i++);}/**************************************************************************** 函数功能:显示子程序入口参数: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>#include <macros.h>const unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66, //0,1,2,3,40x6D,0x7D,0x07,0x7F,0x6F, //5,6,7,8,90x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; //a,b,c,d,e,fvolatile unsigned char led_buffer[4];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();}void delay_1ms(void) //1ms延时函数{unsigned int i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n) //N ms延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1ms();}/*完成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){/* 启动数据传输*/SPDR = Data;/* 等待传输结束*/while(!(SPSR & (1<<SPIF)));}/*完成对HC595的初始化*/void HC_595_init(void){DDRC |= (1<<OE); //设置PORTC7为输出PORTC &= (1<<OE); //输出高电平,使能595PORTB = 0x0F; //同时打开四个数码管的位选spi_init();led_buffer[0]=16; //初始化数码管段码led_buffer[1]=16;led_buffer[2]=16;led_buffer[3]=16;}/*HC595完成传送数据*/void HC_595_OUT(unsigned char data){SS_L();SPI_MasterTransmit(data);SS_H();}void leddis_update(void){/*最低位数码管,第四个数码管*/if(point==0)HC_595_OUT(table[led_buffer[3]]|(1<<dp));elseHC_595_OUT(table[led_buffer[3]]);led0_en();delay_nus(60);led0_dis();if(point==1)HC_595_OUT(table[led_buffer[2]]|(1<<dp));elseHC_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));elseHC_595_OUT(table[led_buffer[1]]);led2_en();delay_nus(60);led2_dis();/*最高位数码管,第一个数码管*/if(point==3)HC_595_OUT(table[led_buffer[0]]|(1<<dp));elseHC_595_OUT(table[led_buffer[0]]);led3_en();delay_nus(60);led3_dis();}void display_led(unsigned int data){if(data>9999){HC_595_OUT(0xFF);//当计数大于9999时,四个数码管同时输出8 PORTB|=((1<<4)|(1<<5)|(1<<6)|(1<<7));}else if(data>999){led_buffer[0]=data/1000;led_buffer[1]=(data%1000)/100;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else if(data>99){led_buffer[0]=data/1000; //关闭最高位的那个数码管led_buffer[1]=(data%1000)/100;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else if(data>9){led_buffer[0]=data/1000;led_buffer[1]=16;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else{led_buffer[0]=data/1000;led_buffer[1]=16;led_buffer[2]=16;led_buffer[3]=data%10;leddis_update();}}volatile unsigned int countnum=0;void timer1_init(void){TCCR1B = 0x00; //stopTCNT1H = 0x8F; //setupTCNT1L = 0x81;OCR1AH = 0x70;OCR1AL = 0x7F;OCR1BH = 0x70;OCR1BL = 0x7F;OCR1CH = 0x70;OCR1CL = 0x7F;ICR1H = 0x70;ICR1L = 0x7F;TCCR1A = 0x00;TCCR1B = 0x04; //start Timer}#pragma interrupt_handler timer1_ovf_isr:15void timer1_ovf_isr(void){TCNT1H = 0x8F; //reload counter high valueTCNT1L = 0x81; //reload counter low valuecountnum++;if(countnum>9999) countnum=0;}void init_devices(void){CLI(); //disable all interruptstimer1_init();TIMSK = 0x04; //timer interrupt sourcesSEI(); //re-enable interrupts}/**************************************************************************** 函数功能:主程序入口参数:出口参数:****************************************************************************/ void main(void){init_devices();HC_595_init();adc_init();SEI();//开全局中断变量display(0);while(1){delay();display_led(adc_rel/1024.0*5*1000);}}3、对EEPROM进行读写操作/************************************************文件:main.c用途:注意:内部8M晶振************************************************/#include "config.h"/*向EEPROM里面写入数据输入量:地址,数据*/void EEPROM_write(unsigned int uiAddress,unsigned char ucData) {while(EECR&(1<<EEWE)); //等待上一次写操作结束EEAR = uiAddress; //地址EEDR = ucData; //数据EECR |=(1<<EEMWE); //置位EEMWE,主机写使能EECR |=(1<<EEWE); //置位EEWE,写使能,启动写操作}/*从EEPROM指定的地址里面读出相应的数据*/unsigned char EEPROM_read(unsigned int uiAddress){while(EECR&(1<<EEWE)); //等待上一次写操作结束EEAR = uiAddress; //设置地址寄存器EECR |=(1<<EERE); //读使能return EEDR; //返回读入EEDR里面的数据}void main(void){unsigned char temp=123;unsigned char data;HC_595_init();EEPROM_write(0x01,temp);data=EEPROM_read(0x01);while(1){Seg7_Led_display(data); //调用显示函数将写入的数据又读出来 }}文件:eeprom12.rar大小:40KB下载:下载4、定时器0(轮循方式)/*定时器0和2(均为八位的定时计数器)有四种工作模式,此例是工作在普通模式。
AVR studio 4 mega128熔丝位设置详细说明-自学笔记个人总结
首先我们来讲讲设置熔丝位的目的:最基本的就是avr单片机可以使用外部晶振和内部晶振,设置熔丝位就是为了选择内部晶振或者外部晶振,很重要,如果设置不正确会导致程序无法运行1.连接仿真器和控制板,记得给控制板上电,不然找不到串口号,首次连接需要下载串口驱动程序,用下载好的驱动程序或者驱动精灵更新就行2.在avr studio中选中端口号,两种方式方式一:直接点击con按钮方式二:菜单栏Tool->proram AVR->connect在选择相应端口号,如:JTAG ICE(仿真器硬件仿真) ,COM23.进入JTAG ICE设置中的fuses(熔丝位)界面设置端口后自动跳入JTAG ICE设置界面,或者设置完端口以后其他两种方式进入方式一:点击按钮AVR方式二:tools->program avr->auto connect接着进入JTAG ICE设置界面,选择单片机型号megal128,选择型号以后才能进行设置熔丝位下面就可以选择进入fuses界面设置熔丝位设置前说明:下面对AVR STUDIO具体配置信息进行简单说明:英文中文不选中此模式,M103模式取消,使用M128模式,使用外部7.3728M晶振。
选中此项开门狗常开On-Chip Debug Enabled 片内调试使能JTAG Interface Enabled JTAG 接口使能允许JTAG接口期间,JTAG所对应的接口不能作为I/O口使用Serial program downloading (SPI)enabled串行编程下载(SPI) 使能(ISP下载时该位不能修改) Preserve EEPROM memory throughthe Chip Erase cycle;芯片擦除时EEPROM的内容保留Boot Flash section size=xxxx words Boot start address=$yyyy; 设置引导(Boot)区的大小xxxx个字(两个字节),后面是对应的引导区启始地址。
BK-AVR128原理图
2
1
2
1
2
1
2
1
B
U7 主 主电电 MEGA128
2
1
2
1
2
1
2
1
A
16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Title Size B Date: File:
BK-AVR128
Number 12-Jul-2013 F:\BK-AVR128.ddb Sheet of Drawn By: 6 Revision
ISP VCC GND GND GND GND 2 VCC 4 6 8 10
PB4
D9 LED
SEG_A SEG_B SEG_C SEG_D SEG_E SEG_F SEG_G SEG_DP
VCC
VCC 20 10
DIG1 DIG2 DIG3 DIG4 DIG5 DIG6 DIG7 DIG8
LED1 LED2 LED3 LED4 LED5 LED6 LED7 LED8
5V直 直电 电供 供
2 3 4 5
Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8
电锋电 电复电
RS232串串串串
VCC 16 C12 0.1uF 2 6 14 7 13 8 1 6 2 7 3 8 4 9 5 DB9 C13 0.1uF J13
U6 74HC573 D1 D2 D3 D4 D5 D6 D7 D8 PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 2 3 4 5 6 7 8 9
K16 KEY 3 PD3
电 电电 电电 电
KEY 4 3
J7 CON16
USB供 电供 供
J3 0 0 A USB-B J4 3 2 1 CON3 1 2 1 VDD DD+ GND 1 2 3 4 P_VCC 6 4 VCC 2
avr128熔丝位设置
(8)当你的系统中,不使用JTAG接口下载编程或实时在线仿真调试,且JTAG接口的引脚需要作为I/O口使用时,必须设置熔丝位JTAGEN的状态为“1”。芯片出厂时JTAGEN的状态默认为“0”,表示允许JTAG接口,JTAG的外部引脚不能作为I/O口使用。当JTAGEN的状态设置为“1”后,JTAG接口立即被禁止,此时只能通过并行方式或ISP编程方式才能将JTAG重新设置为“0”,开放JTAG。
CKSEL3/0: 时钟源选择 0001
CKOPT: 晶振选择 1
SUT1பைடு நூலகம்0: 复位启动时间选择 10
********************************
CKSEL3/0=0000:外部时钟,CKOPT=0:允许芯片内部XTAL1管脚对GND接一个36PF电容;CKOPT=1:禁止该电容
********************************
BOOTSZ1/0: 引导区程序大小及入口 00
00:1024Word/0xc00;
01:512Word/0xe00;
10:256Word/0xf00;
11:128Word/0xf80
********************************
(3)JTAGEN。如果不使用JTAG接口,应将JTAGEN的状态设置为“1”,即禁止JTAG,JTAG引脚用于I/O口。
(4)SPIEN。SPI方式下载数据和程序允许,默认状态为允许“0”。一般保留其状态。
(5)WDTON。看门狗的定时器始终开启。WDTON默认为“1”,即禁止看门狗的定时器始终开启。如果该位设置为“0”后,看门狗的定时器就会始终打开,不能被内部程序控制了,这是为了防止当程序跑飞时,未知代码通过写寄存器将看门狗定时器关断而设计的(尽管关断看门狗定时器需要特殊的方式,但它保证了更高的可靠行)。
AVR mega128 mega16驱动温湿度传感器DHT11调试说明
DHT11调试说明器件:DHT11模块,mega128核心板,USB转串口线,max232电平装换模块1,电路图注意:DHT11带标签的向下,从左边引脚分别是1,2,3,4;千万不可接错否则容易烧坏器件,即便不烧坏也使传感器精度大大降低。
2,mega128 用PD.0采集传感器数值用串口0发送数据3,测试程序如下开发环境:AVR Studio V4.17 +WinAVR晶振:外部16M#include <avr/io.h>#include <util/delay.h>#define uchar unsigned char#define uint unsigned int#define sint signed int#define Crystal 16000000/***************************USAR0初始化函数*******************************/void USART0_Init(uint baud){uint temp;temp=Crystal/16/baud-1;/DDRE = 0XFF; //E.0,E.1为RXD,TXD// PORTE = 0X00; //E口不上拉UCSR0B=0x00; //清零UCSR0A=0X00;UCSR0C=0x06; //8个数据位,1个停止位UBRR0H = 0; // 设置波特率UBRR0L = 0X67;UCSR0B = (1<<RXEN0)|(1<<TXEN0); // 接收器与发送器使能}/*******************************发送一个字符函数**************************/void USART0_Transmit( uchar data ){while ( !( UCSR0A & (1<<UDRE0)) ); /* 等待发送缓冲器为空*/UDR0 = data; /* 将数据放入缓冲器,发送数据*/}/************************调试函数******************************************/void debug(uchar temp){USART0_Transmit(temp);//_delay_ms(200);}/***************************发送一个字符串********************************/void USART0_str_send(char *s){while(*s) //字符串是以'\0'结束;{USART0_Transmit( *s);s++;//s的地址加1个单元;}}/***************************USART接收数据函数******************************/unsigned char USART0_Receive( void ){while ( !(UCSR0A & (1<<RXC0)) ); /* 等待接收数据*/return UDR0; /* 从缓冲器中获取并返回数据*//}/***************************DHT11采集数据函数*****************************/uchar DHTReadByte()//从DHT11中读一个字节{uchar i,Data=0 ;DDRD=0X00; //设置PD7为输rufor(i=0;i<8;i++){while(!(PIND&0X80)); //等待50us低电平数据位间隙过去,等高电平到来_delay_us(15); //延时40us ,延时必须(26-28us)_delay_us(15);_delay_us(10);Data<<=1;if((PIND&0X80)) //如果40us以后采集到数据还是高电平,则输出为高电平{Data|=0X01;}else{Data|=0X00;}while((PIND&0X80)); //等50us低电平到来,然后去读下一位数据}return(Data);}/void DHTReadData()//读DHT11中的数据{uchar i,Data[5]={};DDRD=0XFF;PORTD=0XFF;_delay_ms(5);PORTD=0X00; //发送启动信号_delay_ms(10); //拉低至少18ms_delay_ms(8);PORTD=0XFF;_delay_us(15);//主机拉高20-40?s_delay_us(15);DDRD=0X00; //配置为输入模式PORTD=0X00; //内部不上拉_delay_us(15);_delay_us(15);if(!(PIND&0X80))while(!(PIND&0X80)); // 等待响应信号结束while((PIND&0X80)); //等待高电平结束for(i=0;i<5;i++) //读取五个字节数据{Data[i]=DHTReadByte();}if(Data[0]+Data[2]==Data[4]){debug(Data[0]); //湿度/debug(Data[2]); //温度}}int main(){USART0_Init( 9600);//USAR0初始化函数初始化;while(1){DHTReadData();uint k=0;for(k=0;k<200;k++)_delay_ms(10);}}总结:DHT11作为One wire 型相对廉价的温湿度数字检测器件,对时序有严格要求,其中很重要的是>18mS的启动信号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ATMEGA128相关例程自己学avr单片机已经有相当一段时间了,一开始用的是atmega128,觉得不是很好用。
于是自己去买了一块16L的芯片,觉得还行。
一开始用的是ICC AVR,应为它用起来比较简单,不像winavr那样,要写个Makefie ,比较的麻烦,但icc avr的缺点是太过于简陋,调试程序时,感觉不是很好。
后来经同学介绍,用起了winavr,其实也是比较的简单,只不过要加一个makefile而已,其实makefile可以用软件自带的组建自动生成,只需修改几个参数就可以用。
后来又用起了code vision avr,虽然不太习惯,也谈不上不好用.需要注意的是,三个不同的软件所带的同文件不一样。
icc avr 是iom128v.h(姑且以128为例),winavr是avr/io.h,不过makefile中要设置芯片为atmega128.而cvavr则是mega128.h。
记得一开始的时候,我对这些不同的同文件不是很理解,是从一个学长那里了解到,才弄明白的。
其实前两个软件只需把头文件稍微改一下基本上可以通用。
而最后一个软件的中断的写法似乎不太一样,因而和钱两个软件的兼容性是最差的。
总体说winavr给人的感觉是比较专业/*硬件环境:atmega128开发板软件环境:CodeVisionAVR-C*/#include <mega128.h>#define uchar unsigned char#define uint unsigned intuchar cnt;void timer1_init(){TCCR1B=0X00; //先停止定时器1TCNT1H=0XF0; //设定定时器初值TCNT1L=0XBE;TCCR1A=0X00; //启动定时器1TCCR1B=0X05; //使用1024分频}interrupt [TIM1_OVF] void timer1_ovf_isr(void){TCNT1H=0XF0; //重载定时器初值TCNT1L=0XBE;DDRE|=1<<2;PORTE|=1<<2;DDRA=0xff;PORTA=cnt; //输出led的值到端口Bcnt++;if(cnt==255)cnt=0;}void main(){//DDRB=0XFF;SREG|=0X80;TIMSK=0X04;timer1_init();while(1){;}}/***************************************************************************/ /*ADC测试程序 *//*目标器件:ATmega128 *//*晶振:RC 8MHZ *//*编译环境:ICCAVR 7.13A *//*E-Mail:number007cool@ *//*时间: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,0x7F,0x6F};/*********************************全局变量**********************************/ unsigned int adc_rel=0;/**************************************************************************** 函数功能:ADC初始化函数入口参数:出口参数:****************************************************************************/ void adc_init(void){DDRF&=0XFE; //PORTF0设置为输入,即作为ADC0口输入模拟电压PORTF&=0XFE; //PORTF0设置为输入低电平ADCSRA=0x00; //关ADCADMUX = 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中断使能;ADPSx,设置分频因子64}/**************************************************************************** 函数功能:ADC中断函数入口参数:出口参数:****************************************************************************/ #pragma interrupt_handler adc_isr:iv_ADCvoid adc_isr(void){//int data_h,data_l;//data_l=ADCL;//data_h=ADCH;ADCSRA = 0x00;ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE);adc_rel=ADC;/*if(adc_rel>0x1ff){PORTA|=1<<2;}elsePORTA&=~(1<<2);*/}/**************************************************************************** 函数功能:延时子程序入口参数:出口参数:****************************************************************************/ void delay(void){int i;for(i=0;i<1800;i++);}/**************************************************************************** 函数功能:显示子程序入口参数: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>#include <macros.h>const unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66, //0,1,2,3,40x6D,0x7D,0x07,0x7F,0x6F, //5,6,7,8,90x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; //a,b,c,d,e,fvolatile unsigned char led_buffer[4];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();}void delay_1ms(void) //1ms延时函数{unsigned int i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n) //N ms延时函数{for (i=0;i<n;i++)delay_1ms();}/*完成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){/* 启动数据传输 */SPDR = Data;/* 等待传输结束 */while(!(SPSR & (1<<SPIF)));}/*完成对HC595的初始化*/void HC_595_init(void){DDRC |= (1<<OE); //设置PORTC7为输出PORTC &= (1<<OE); //输出高电平,使能595PORTB = 0x0F; //同时打开四个数码管的位选spi_init();led_buffer[0]=16; //初始化数码管段码led_buffer[1]=16;led_buffer[2]=16;led_buffer[3]=16;}/*HC595完成传送数据*/void HC_595_OUT(unsigned char data){SS_L();SPI_MasterTransmit(data);SS_H();}void leddis_update(void){/*最低位数码管,第四个数码管*/if(point==0)HC_595_OUT(table[led_buffer[3]]|(1<<dp));elseHC_595_OUT(table[led_buffer[3]]);led0_en();delay_nus(60);led0_dis();if(point==1)HC_595_OUT(table[led_buffer[2]]|(1<<dp));elseHC_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));elseHC_595_OUT(table[led_buffer[1]]);led2_en();delay_nus(60);led2_dis();/*最高位数码管,第一个数码管*/if(point==3)HC_595_OUT(table[led_buffer[0]]|(1<<dp));elseHC_595_OUT(table[led_buffer[0]]);led3_en();delay_nus(60);led3_dis();}void display_led(unsigned int data){if(data>9999){HC_595_OUT(0xFF);//当计数大于9999时,四个数码管同时输出8 PORTB|=((1<<4)|(1<<5)|(1<<6)|(1<<7));}else if(data>999){led_buffer[0]=data/1000;led_buffer[1]=(data%1000)/100;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else if(data>99){led_buffer[0]=data/1000; //关闭最高位的那个数码管led_buffer[1]=(data%1000)/100;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else if(data>9){led_buffer[0]=data/1000;led_buffer[1]=16;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else{led_buffer[0]=data/1000;led_buffer[1]=16;led_buffer[2]=16;led_buffer[3]=data%10;leddis_update();}}volatile unsigned int countnum=0;void timer1_init(void){TCCR1B = 0x00; //stopTCNT1H = 0x8F; //setupTCNT1L = 0x81;OCR1AH = 0x70;OCR1AL = 0x7F;OCR1BH = 0x70;OCR1BL = 0x7F;OCR1CH = 0x70;OCR1CL = 0x7F;ICR1H = 0x70;ICR1L = 0x7F;TCCR1A = 0x00;TCCR1B = 0x04; //start Timer}#pragma interrupt_handler timer1_ovf_isr:15void timer1_ovf_isr(void){TCNT1H = 0x8F; //reload counter high valueTCNT1L = 0x81; //reload counter low valuecountnum++;if(countnum>9999) countnum=0;}void init_devices(void){CLI(); //disable all interruptstimer1_init();TIMSK = 0x04; //timer interrupt sourcesSEI(); //re-enable interrupts}/**************************************************************************** 函数功能:主程序入口参数:出口参数:****************************************************************************/ void main(void){init_devices();HC_595_init();adc_init();SEI();//开全局中断变量display(0);while(1){delay();display_led(adc_rel/1024.0*5*1000);}}/************************************************文件:main.c用途:注意:内部8M晶振************************************************/#include "config.h"/*向EEPROM里面写入数据输入量:地址,数据*/void EEPROM_write(unsigned int uiAddress,unsigned char ucData) {while(EECR&(1<<EEWE)); //等待上一次写操作结束EEAR = uiAddress; //地址EEDR = ucData; //数据EECR |=(1<<EEMWE); //置位EEMWE,主机写使能EECR |=(1<<EEWE); //置位EEWE,写使能,启动写操作}/*从EEPROM指定的地址里面读出相应的数据*/unsigned char EEPROM_read(unsigned int uiAddress){while(EECR&(1<<EEWE)); //等待上一次写操作结束EEAR = uiAddress; //设置地址寄存器EECR |=(1<<EERE); //读使能return EEDR; //返回读入EEDR里面的数据}void main(void){unsigned char temp=123;unsigned char data;HC_595_init();EEPROM_write(0x01,temp);data=EEPROM_read(0x01);while(1){Seg7_Led_display(data); //调用显示函数将写入的数据又读出来 }}/*定时器0和2(均为八位的定时计数器)有四种工作模式,此例是工作在普通模式。