AVR单片机ATmega128程序参考
AVR_atmega128里程仪

通信与信息工程学院2015 /2016 学年第一学期课程设计实验报告模块名称A VR单片机课程设计专业学生班级学生学号学生姓名指导教师A VR单片机课程设计报告1.1设计课题与要求设计课题:基于LCD12864的里程仪的设计设计要求:1、由处理器ATmega128的定时器/计数器1生成0-20Hz的方波信号,由引脚OC1A输出,作为模拟测速传感器生成的信号;生成的方波信号作为定时/计数器3的输入捕捉信号,由引脚ICP3输入。
2、使用板载4个按键,其中的两个分别作为加速按键及减速按键,频率步进值为1Hz,另外两个作为开始行驶键和停止行驶键。
3、假定开始行驶后生成的方波信号每个脉冲对应的行驶距离为2米,通过测量脉冲个数计算总行车里程。
通过本次行车时间及总行车里程计算平均速度,当按下停止行驶键,模拟测速传感器的信号停止生成,本次行驶时间结束。
4、使用发光二极管作为超速告警指示灯,当即时速度超过90km/h时,告警指示灯闪烁报警,闪烁周期为1秒,正常行驶状态下,告警指示灯熄灭。
5、使用液晶屏显示主要参数:即时速度、平均速度、行车时间、行车里程。
1.2 硬件设计图1单片机PE端口图图2 LED图图3单片机PB端口图图4 四个按键图本次课程设计中相关的硬件部分见图1-图4,用到了PE0口的I/O口功能,控制LED灯的亮灭作为超速告警,PE7口定时器3的输入捕捉功能(ICP3),PB5口的比较匹配输出功能(OC1A),PB5口和PE7口用外接导线进行了连接,四个按键实现了改变T/C 1 的OCR1A值的功能和开始/关闭T/C 1的功能。
1.3软件设计1.3.1总体设计实现功能:定时器1在CTC模式下实现在OC1A口输出的方波频率在1~20HZ 之间,OC1A口的输出作为定时器3的输入捕捉信号,测量脉冲个数并记录下产生脉冲的周期,根据脉冲个数与行驶距离的换算关系,计算出即时速度,平均速度,行车时间和行车路程,并在LCD12864上进行实时显示。
atmega128单片机系列例程

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>
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的编译器优化程度可以说是目前世界上民用软件中做的最好的,另外,它有一个非常大优点是,免费!在国外,使用它的人几乎是最多的。
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 同时输出
姚磊-基于AVR的atmega128单片机读取DS1307数据在LCD12864上显示程序

//////////以下是DS1307头文件/////////////////////////////#include <avr/io.h>#include <util/delay.h>#define uchar unsigned char#define uint unsigned int#define IIC_PORT PORTF //定义是使用PROTF口,定义scl连接的是PF1,定义sda连接的是PF0#define IIC_DDR DDRF//IIC_DDR&=SSDA;-设置SDA为输入口//IIC_DDR|=SDA;-设置SDA为输出口#define SCL 0X02 // IIC_PORT|=SCL; -scl置1#define SDA 0X01 // IIC_PORT|=SDA; -sda置1#define SSCL 0XFD // IIC_PORT&=SSCL; -scl置0#define SSDA 0XFE // IIC_PORT&=SSDA; -sda置0uint aa[7]; //定义一个数组以便接受数据void delay(unsigned int us){while(us--);}void Start_I2C(void)IIC_PORT|=SDA; //sdaIIC_PORT|=SCL; //sclasm("nop");IIC_PORT&=~SDA;asm("nop");IIC_PORT&=~SCL;}/******************************************** 内部函数,I2C结束********************************************/void Stop_I2C(void){IIC_PORT&=~SDA;IIC_PORT&=~SCL;asm("nop");IIC_PORT|=SCL;asm("nop");IIC_PORT|=SDA;asm("nop");/********************************************内部函数,等待ACK********************************************/void Ack_I2C(void){unsigned char errtime=20;IIC_PORT|=SDA; //上拉IIC_DDR&=~SDA; //设置为输入口IIC_PORT|=SCL;asm("nop");while(PIND&SDA){errtime--;if(!errtime){Stop_I2C();IIC_PORT&=~SDA; //超时,给他个离开的理由}}IIC_PORT&=~SCL;asm("nop");IIC_DDR|=SDA; //设置为输出口}/********************************************内部函数,I2C发送ACK********************************************/void SendAck_I2C(){IIC_PORT &= ~SDA; //数据线保持拉低,时钟线发生一次从高低的跳变发送一个应答信号asm("nop");IIC_PORT |= SCL;asm("nop");IIC_PORT &= ~SCL;}/********************************************内部函数,向总线传送非响应********************************************/void SendNotAck_I2C(){IIC_PORT |= SDA; //数据线保持高,时钟线发生一次从高低的跳变没有应答asm("nop");IIC_PORT |= SCL;asm("nop");IIC_PORT &= ~SCL;}/********************************************内部函数,向总线传送字节@ch 数据********************************************/void Send_I2C (int ch){int i,a;for (i=1;i<=8;i++) //发送八位{IIC_PORT &= ~SCL; //总线放空delay(1);a = (ch&0x80); //根据给定数据,又高位到低位逐步提出字节位,发送到总线上if(a){IIC_PORT |= SDA;}else{IIC_PORT &= ~SDA;}ch <<= 1; //左循环以便输出下一位delay(1);IIC_PORT |= SCL; //总线使能,发送总线数据delay(1);}IIC_PORT &= ~SCL; //总线8位传送完成,总线放空}/********************************************内部函数,向总线传送字********************************************/unsigned int Receive_I2C(){unsigned char i,a;IIC_DDR &= ~SDA; //设置为输入口IIC_PORT |= SDA; //不知道为啥,1的时候读入正确0的时候读入全部为0;for(i=1;i<=8;i++) //读入八个位{a<<=1; // 读入数据左循环IIC_PORT &= ~SCL; //总线放空delay(1);IIC_PORT |= SCL; //时钟做一次从低到高的跳变可以接收一位数据delay(1);if(PINF&SDA)////////////////////////此处特别注意,变更SDA引脚时这个一定要跟着变{a |= 1;}else{a |= 0;} // 将数据编入变量a}IIC_PORT &= ~SCL; //总线放空IIC_DDR |= SDA; //io变成输出return a; //反馈接收到的信息}/********************************************外部函数向芯片D1307 之中地址为address的寄存器写入数据date 仅为八位字节@addtess 要写数据的地址@date 要写的数据********************************************/void write_time(int address,int date){Start_I2C(); //启动总线Send_I2C (0xD0); //呼叫芯片D1307,并定义为写动作Ack_I2C(); //等待响应信号Send_I2C (address); //发送地址Ack_I2C(); //等待响应信号Send_I2C (date); //发送数据Ack_I2C(); //等待响应信号Stop_I2C (); //停止总线}/********************************************外部函数从芯片D1307读出10为字节地址1:秒2:分3:时4:星期5:号6:月7:年8 控制字@addtess 要读数据的地址********************************************/int read_time(){int i=0;Start_I2C(); //启动传送Send_I2C (0xD0); //呼叫芯片D1307,并定义为写动作Ack_I2C(); //等待响应信号Send_I2C (0x00); //发送起始地址Ack_I2C(); //等待响应信号Stop_I2C (); //关闭总线Start_I2C(); //启动总线Send_I2C (0xD1); //呼叫芯片D1307,并定义为读动作Ack_I2C();for(i=0;i<7;i++){ aa[i]=Receive_I2C(); //接受自初始地址开始的10个字节地址1:秒2:分3:时4:星期5:号6:月7:年8 控制字if(i<6)SendAck_I2C(); //每成功接受一位发送一个响应信号以便接受下一位if(i==6)SendNotAck_I2C();}Stop_I2C (); //接受完成停止}void ds1307init(){write_time(0x00,0x40);write_time(0x01,0x32);write_time(0x02,0x10);write_time(0x03,0x01);write_time(0x04,0x30);write_time(0x05,0x10);write_time(0x06,0x17);}//////////以下是LCD12864头文件//////////////////////////////**==================================================== ==================================================== ** File : ws_lcd_st7920.h* Hardware Environment:* Build Environment : AVR Studio 4.16 + Winavr 20090313* Version : V1.0* By : Wu Ze** (c) Copyright 2005-2009, WaveShare* * All Rights Reserved**==================================================== ==================================================== */#include <util/delay.h>#include <string.h>#include <stdarg.h>#include <avr/io.h>#define LCD_DELAY() _delay_us(75)unsigned int lcd_buffer[64];/**-------------------------------------------------------------------------------------------------------** 从SPI接口发送1byte的数据**-------------------------------------------------------------------------------------------------------*/void spiSendChar(uint8_t send_char){SPDR = send_char;while (!(SPSR & (1<<SPIF)));}/**-------------------------------------------------------------------------------------------------------** 给LCD控制芯片ST7920发送指令的函数**-------------------------------------------------------------------------------------------------------*/void sendCodeST7920(uint8_t code){spiSendChar(0xF8);spiSendChar(code & 0xF0);spiSendChar((code<<4));LCD_DELAY();}/**-------------------------------------------------------------------------------------------------------** 给LCD控制芯片ST7920发送数据的函数**-------------------------------------------------------------------------------------------------------*/void sendDataST7920(uint8_t data){spiSendChar(0xFA);spiSendChar(data & 0xF0);spiSendChar((data<<4));LCD_DELAY();}/**-------------------------------------------------------------------------------------------------------** 读取数据栈内容刷新LCD函数* *lcd_stack指向用于刷新LCD的数据栈,需64byte容量**-------------------------------------------------------------------------------------------------------*/void refreshLCD(const uint8_t *lcd_stack){uint8_t addr;sendCodeST7920(0x02); /*地址归位*/for(addr=0;addr < 16;addr++){sendDataST7920(*(lcd_stack + addr));}for(addr=32;addr < 48;addr++){sendDataST7920(*(lcd_stack + addr));}for(addr=16;addr < 32;addr++){sendDataST7920(*(lcd_stack + addr));}for(addr=48;addr < 64;addr++){sendDataST7920(*(lcd_stack + addr));}}/**-------------------------------------------------------------------------------------------------------** 将十进制数据转换成ASCII字符的函数* *str是转换ASCII后存放用的栈* dec是需要转换的十进制数据* width是转换成ASCII后的宽度(高位填充'0')**-------------------------------------------------------------------------------------------------------*/void decToAscii(uint8_t* str,uint16_t dec,uint8_t width){while(width){switch(width){case 5:{*str = (dec/10000+'0');dec%=10000;break;}case 4:{*str = (dec/1000+'0');dec%=1000;break;}case 3:{*str = (dec/100+'0');dec%=100;break;}case 2:{*str = (dec/10+'0');dec%=10;break;}case 1:{*str = (dec+'0');break;}default: *str = '0';}width--;str++;}}/**-------------------------------------------------------------------------------------------------------** 将十六进制数据转换成ASCII字符的函数* *str是转换ASCII后存放用的栈* hex是需要转换的十六进制数据* width是转换成ASCII后的宽度(高位填充'0')**-------------------------------------------------------------------------------------------------------*/void hexToAscii(uint8_t* str,uint16_t hex,uint8_t width){uint16_t tmp;while(width){switch(width){case 4:{tmp=(hex>>12);if(tmp>9) *str = tmp+('A'-10);else *str = tmp+'0';break;}case 3:{tmp=(hex>>8)&0x000F;if(tmp>9) *str = tmp+('A'-10);else *str = tmp+'0';break;}case 2:{tmp=(hex>>4)&0x000F;if(tmp>9) *str = tmp+('A'-10);else *str = tmp+'0';break;}case 1:{tmp=hex&0x000F;if(tmp>9) *str = tmp+('A'-10);else *str = tmp+'0';break;}default: *str = '0';}width--;str++;}}/**-------------------------------------------------------------------------------------------------------** showLine是用于编辑LCD数据栈的函数* showLine的使用方法与功能类似于ANSI C的printf函数* 例子:showLine(0,0,lcd_buffer,"My name is %c%c.%d3...",'W','s',12);* 上面的例子通过refreshLCD函数刷新后,在带有ST7920控制芯片的LCD上显示的效果为"My name is Ws.012..."* x对应LCD的横坐标* y对应LCD的纵坐标* *lcd_stack指向用于刷新LCD的数据栈* *str指向用于将要显示的内容**-------------------------------------------------------------------------------------------------------*/void showLine(const uint8_t x,const uint8_t y,uint8_t* lcd_stack,char * str,...){uint8_t coordinate = 16*y + x;va_list marker;va_start(marker,str); /* Initialize variable arguments. */while(*str!='\0'){if(coordinate>64) break; /*防止堆栈溢出*/if(*str == '\\'){str++;lcd_stack[coordinate] = *str;else if(*str == '%'){str++;if (*str=='d'||*str=='D'){str++;decToAscii(&lcd_stack[coordinate],va_arg(marker,uint16_t),(*str-'0'));coordinate+=(*str-'0'-1);}else if(*str=='c'||*str=='C'){lcd_stack[coordinate] = va_arg(marker,uint16_t);}else if(*str=='x'||*str=='X'){str++;hexToAscii(&lcd_stack[coordinate],va_arg(marker,uint16_t),(*str-'0'));coordinate+=(*str-'0'-1);}/*如有新的转义符指令请添加在这里*/else{lcd_stack[coordinate] = *str;}str++;coordinate++;}va_end( marker ); /* Reset variable arguments. */}void st7920LcdInit(void)// SPI initialization// SPI Type: Master// SPI Clock Rate: 2*1843.200 kHz// SPI Clock Phase: Cycle Half// SPI Clock Polarity: Low// SPI Data Order: MSB First{ DDRB|=0x87;PORTB|=0xF8;SPCR=0x50;SPSR=0x01;sendCodeST7920(0x0C);//整体显示sendCodeST7920(0x01);//清屏_delay_ms(2);memset(lcd_buffer,' ',sizeof(lcd_buffer));}//////////以下是主函数/////////////////////////////#include <avr/io.h>#include <util/delay.h>#include <avr/interrupt.h>#include "ws_lcd_st7920.h"#include"ds1307.h"#define uchar unsigned char#define uint unsigned intextern uint lcd_buffer[64];extern uint aa[7];void main(void){ uchar a1,a2,b1,b2,c1,c2,d1,d2,e1,e2,f1,f2,g1,g2,h1,h2,key=0;st7920LcdInit(); /*LCD init*/IIC_DDR|=SCL;IIC_DDR|=SDA;//设置SCL,SDA为输出口ds1307init();///不可每次都初始化while (1){ read_time();a1=aa[0]>>4; a2=aa[0]&0x0F;//秒b1=aa[1]>>4; b2=aa[1]&0x0F;//分c1=aa[2]>>4; c2=aa[2]&0x0F;//时d1=aa[3]>>4; d2=aa[3]&0x0F;//星期e1=aa[4]>>4; e2=aa[4]&0x0F;//号f1=aa[5]>>4; f2=aa[5]&0x0F;//月g1=aa[6]>>4; g2=aa[6]&0x0F;//年showLine(3,1,lcd_buffer,"time is:");showLine(2,2,lcd_buffer,"20%d1%d1-%d1%d1-%d1%d1-%d1%d1",g1,g2,f1,f2,e1,e 2,d1,d2);showLine(2,3,lcd_buffer,"%d1%d1:%d1%d1:%d1%d1",c1,c2,b1,b2,a1,a2);refreshLCD(lcd_buffer); /*刷新LCD*/}}。
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++) {
AVR ATmega128全功能工业控制器设计文档说明书

AVR单片机的全功能工业控制器设计吴焕琅深圳市中天越华自动控制科技有限公司摘要:介绍一款工业级的实用全功能控制器。
该控制器能隔离采集多种输入信号,输出多种控制信号;具有实时时钟、历史数据存储功能,彩色液晶显示界面,带有触摸屏操作和远程通信接口。
核心部分CPU采用AVR ATmega128单片机。
目前已用于批量生产。
关键词:隔离采集控制单片机彩色显示485接口ATmega128DS1642引言在自动控制产品的设计过程中,实现方案的选择常常是很矛盾的。
使用可编程逻辑控制器(PLC)和人机界面(HMI)来实现,开发速度较快,但成本太高,所开发的产品没有市场竞争力;使用单片机开发,成本低但开发周期长、开发量大且通用性不好。
用户需要的是一种成本低、开发周期较短、通用性较好的控制器,因此全功能工业控制器有很大的应用市场。
全功能工业控制器的整个电路分为信号隔离输入部分、控制器输出部分、实时时钟与历史数据存储部分、彩色液晶显示和触摸屏控制部分、通信接口等。
1信号隔离输入电路信号隔离输入电路分为开关量隔离输入、模拟量隔离输入、高速电脉冲隔离输入,电路如图1所示,开关量的隔离输入较为简单,输入信号采用光耦进行隔离后送入单片的普通I/O,单片机用查询方式进行采集。
图1信号隔离输入电路高速电脉冲的采集需要注意的是,所设计的电路必须适应高速信号采集的要求,因此隔离光耦应采用高速光耦(如6N137等)。
采用查询方式采集高速脉冲容易造成采集数据的丢失,高速脉冲应采用中断方式进行采集。
模拟量隔离采集是本控制器的一个重点和难点,笔者之前采用了线性光耦等多种方式进行模拟量的隔离采集实验,均未获满意的效果。
这里采用一种先将模拟量数字化(使用AD7705),然后通过有光耦隔离的数据口送到CPU进行模拟量隔离采集的方式,效果理想。
2控制器输出电路控制器的输出方式有继电器输出、晶体管输出、模拟电压输出,如图2所示。
继电器输出和晶体管输出电路较为简单,这里不作详细的介绍。
AVR单片机mega128例程大全

AVR单片机mega128例程大全//16超声波LED显示#include //PA0接控制引脚PA7接接收引脚#include #define chao 100longint time=0;void delay(long int z){inti,j;for(i=0;i<z;i++)< bdsfid="72" p=""></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)< bdsfid="92" p=""></chao)<> {if(time<chao)< bdsfid="95" p=""></chao)<>{o=500;while(o--)PORTD=0x04;}}if(time>chao){if(time>chao){o=500;while(o--)PORTD=0x08;}}}}//AD#include#include#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);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);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)));< bdsfid="173" p=""></spif)));<> delay(10);PORTB|=(1<<0);}void delay(z){unintx,y;for(x=0;x<z;x++)< bdsfid="181" p=""></z;x++)<>for(y=0;y<200;y++);}void main(){unintcount,chl;DDRC |= (1<<7);PORTC &= (1<<7);DDRB |= (1<<2)|(1<<1)|(1<<0);SPCR = (1<<spe)|(1<<mstr)|(1<<spr0)|(1<<spr1);< bdsfid="192" p=""></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#include#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)));< bdsfid="260" p=""></spif)));<> delay(10);PORTB|=(1<<0);}void delay(z){unintx,y;for(x=0;x<z;x++)< bdsfid="268" p=""></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);< bdsfid="278" p=""></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#include#define uchar unsigned char#define uint unsigned intvoid main(){DDRB|=0X60;TCCR1A=0X50;TCCR1B=0X09;OCR1A=0X7CF;}//D口矩阵键盘检测#include "config.h"#include#include#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++)< bdsfid="360" p=""></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++)< bdsfid="370" p=""></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++)< bdsfid="382" p=""></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);。
AVR单片机Atmega128外扩RAM

AVR单片机Atmega128外扩RAM关键字:AVR单片机Atmega128 外扩RAM由于AVR系列单片机采用的是内部外部RAM统一编址,ATmega128工作在非ATmega 103模式时具有4k+256B的包括寄存器文件(通用工作寄存器)、I/O寄存器、扩展I/O寄存器和内部SRAM的连续内部存储空间。
所以在扩展外部RAM时,和内部SRAM地址重叠的外部RAM地址是不能直接访问的。
也就是说扩展的外部RAM每64k要浪费掉内部SRAM那么大的空间(AT90系列如此)。
所幸的是mega系列解决了这一缺点,专门有一个寄存器XMCRB用来解决对与内部SRAM地址空间相同地址的外部RAM访问。
其低三位XMM2 、XMM1 、XMM0三位的设置,决定高位地址线PC口的哪些口线被释放为普通I/O,而不是作为高位地址。
这样就可以巧妙地屏蔽高位,就ATmega128而言,要避开内部的4k+245B空间,注意到,只要所访问的地址范围大于0X1100(且MCUCR,XMCRA设置正确),那么所访问的就是外部RAM空间。
所以在访问小于4k+245B的外部地址时,只要使地址大于0X10FF就可以访问了。
0X1100用二进制表示为:0001,0001,0000,0000,高位地址线PC5、PC6、PC7没有使用到。
在访问的时候就可设置XMCRB的XMM1、XMM0位为1,释放该三根地址线为普通I/O,将其设为输出。
并且输出0;并在外部地址加上一个虚地址以使地址超过0X1100,如此设置,就可以访问外部0X0000~0X10FF空间了。
超出这个空间,CPU就自动将其识别为外部相应的地址了,不用设置XMCRB寄存器(即不需释放任何总线),也不需加虚地址,按照正常外部RAM访问即可。
在此约定所加的虚地址为0X2000,XMCRB寄存器设置为****,*011,所释放的地址线输出0。
表10-0X10FF范围的寄存器状态和寻址范围(略)表2各寻址范围地址线和寄存器状态表(略)表3各寻址范围地址线和寄存器状态表(略)比如要访问外部0X0200地址,用二进制表示为0000,0010,0000,0000。
ATmega128单片机指导手册

ATmega128
方框图
Figure 2. 方框图
PF0 - PF7
PA0 - PA7
PC0 - PC7
VCC GND PORTF DRIVERS PORTA DRIVERS PORTC DRIVERS
DATA REGISTER PORTF
DATA DIR. REG. PORTF
DATA REGISTER PORTA
X Y Z
TIMER/ COUNTERS
PEN
PROGRAMMING LOGIC
INSTRUCTION DECODER
INTERRUPT UNIT
CONTROL LINES
ALU
EEPROM
STATUS REGISTER
USART0
SPI
USART1
TWO-WIRE SERIAL INTERFACE
CALIB. OSC
OSCILLATOR JTAG TAP
OSCILLATOR
ON-CHIP DEBUG
PROGRAM FLASH
SRAM
MCU CONTROL REGISTER
TIMING AND CONTROL
BOUNDARYSCAN
INSTRUCTION REGISTER
GENERAL PURPOSE REGISTERS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49
48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33
PA3 (AD3) PA4 (AD4) PA5 (AD5) PA6 (AD6) PA7 (AD7) PG2(ALE) PC7 (A15) PC6 (A14) PC5 (A13) PC4 (A12) PC3 (A11) PC2 (A10) PC1 (A9) PC0 (A8) PG1(RD) PG0(WR)
Atmega128AD转换程序

}
/*******************************************************/
/****** 函数名称: SPI_putchar()
******/
/****** 功 能: SPI 发送数据
**/
/****** 参 数: 无
******/
/****** 返回值 : 无
SPI_putchar((unsigned char)((i&0x003f)<<2));
Set_CS5615;
//释放 TLC5615
delay_nms(2);
//延时
}
for(i=1023;i>0;i--)
//电压逐渐变低
{
Clr_CS5615;
//片选 TLC5615
SPI_putchar((unsigned char)((i&0x03c0)>>6));//发送数据
**/
/****** 参 数: 无
******/
/****** 返回值 : 无
******/
/*******************************************************/
void SPI_Init(void)
{
char i;
DDRB|=0x07;
//MISO(PB3)输入 MOSI(PB2),SCK(PB1),SS(PB0)输出
void main(void)
{
unsigned int i;
DDRG=0x1f;
//设置 PORTG 输出
SPI_Init();
while(1)
{
for(i=0;i<1024;i++)
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;
AVR ATMEGA128 串口简单好使程序

//以上是串口发送接收函数
int main(void)
{
//PORTE=0B01000011;//调整让单片机的发送和接收直接连到MAX3232上
//DDRE =0B11100110;
PORTE=0B01110011;//针对本电路中的相关设置RS485通信
DDRE =0B11110110;
unsigned char temp;
Usart0_init();
while(1)
{
temp=Usart0_receive();
Usart0_transmit(temp);
//Usart0_transmit(0x5f);
}
//return 0;
}
#include <avr/io.h>
#include <avr/interrupt.h>
#include<util/delay.h>
#define UDRE0 5
#define RXC0 7
void Usart0_init(void) ;
//设置波特率9.6k,8位数据位,无校验,接收发送使能,1位停止位
UCSR0B=(1<<RXEN0)|(1<<TXEN0); //发送接收使能,使用查询方式,故没有使能中断
}
void Usart0_transmit(unsigned char c) //查询方式发送接收字符函数
{
while( !(UCSR0A&(1<<UDRE0)));//等待发送缓冲区为空
UDR0=c;
void Usart0_transmit(unsigned char c);
史上最全的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(均为八位的定时计数器)有四种工作模式,此例是工作在普通模式。
ATmega128,AVR单片机AD采样

#include <avr/signal.h>
#include <avr/eeprom.h>
//常量声明
#define F_CPU 7372800
#define BAUD 115200
#define RX_BUFFER_SIZE 256
}
else if(RX_data_OK=1)
{
RX_data2[num++] = ADCH;
}
}
{
if(RX_data_OK==1)//判断电压是否大于0.5V
{
eeprom_write_block (RX_data1,0x00,256);//将前256个数据存入单片机eeprom中256字节
eeprom_write_block (RX_data2,0x255,768);//将后768个数据存入单片机eeprom中768字节
UCSR0A=0x00;
UBRR0H=(F_CPU/BAUD/16-1)/256;
UBRR0L=(F_CPU/BAUD/16-1)%256;//%为取余运算符
UCSR0B|=(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);//发送使能,接受使能,接受结束中断使能。
for(i=0;i<256;i++)
{
Usart_PutChar(RX_data1[i]);
}
for(i=0;i<768;i++)
{
Usart_PutChar(RX_data2[i]);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void delay(unsigned int t)
{
unsigned int i,j;
for (i=1;i<t;i++)
for (j=1;j<10;j++)
asm volatile ("nop");
}
int main()
{
DDRE=0X04;
for (i=1;i<t;i++)
for (j=1;j<100;j++)
asm volatile ("nop");
}
int main()
{
DDRG=0XFF;
PORTG=0X00;
while (1)
{
unsigned int i,j;
for (i=1;i<=3;i++)
for (i=0;i<T;i++)
for (j=0;j<100;j++)
asm volatile ("nop"); //汇编指令,让单片机运行空指令
}
void main()
{
DDRA=0XFF;
//DDRA=0B11111111; //定义PA端口全为输出
DDRE = 0x04;
{
unsigned int i,j;
for (i=0;i<T;i++)
for (j=0;j<100;j++)
asm volatile("nop");
}
unsigned long exptwo(unsigned int n)
{
unsigned int j;
unsigned long t=1;
ATmege128单片机初学者奋战一星期成果~~纪念一哈~~
ATmega128 晶振频率 16MHz 使用TS8900-M128学习板
1)IO输入输出
LED亮灯
1.#include<avr/io.h>
void Delay(unsigned int T)
{
unsigned int i,j;
{
k=0X00;
for (j=i;j>=i-t+1;j--)
if ((j<=7)&&(j>=0)) k=k+exptwo(j);
delay(1000);
PORTA=0XFF-k;
delay(1000);
}
for (i=6+t;i>=0;i--)
{
k=0X00;
for (j=i;j>=i-t+1;j--)
//TCCR1B指的是定时器/寄存器1的控制寄存器B,bit0~bit2为控制定时器/寄存器1的始终选择;
//见ATmage128使用手册P122;
TCNT1=31250;//TCNT1为定时器/寄存器1;
//TCNT1H=0X7A;TCNT1L=0X12同理,为对定时器/寄存器1进行初始化设定;
delay(100);
DDRD=0X00;
while(1)
{
unsigned char a;
a=PIND;
delay(100);
PORTA=0XFF;
delay(100);
PORTA=a;
delay(100);
PORTA=0XFF;
delay(100);
}
return 0;
{
delay(1000);
PORTA=0XFF-exptwo(i);
delay(1000);
}
for (i=7;i>=0;i--)
{
delay(1000);
PORTA=0XFF-exptwo(i);
delay(1000);
}
}
}2.#include<avr/io.h>
PORTE=0X04;
PORTA=0XFF;
while(1)
{
for (t=1;t<=8;t++)
{
k=0X00;
for (i=0;i<=6+t;i++)
{
k=0X00;
for (j=i;j>=i-t+1;j--)
if ((j<=7)&&(j>=0)) k=k+exptwo(j);
for (j=0;j<100;j++)
asm volatile("nop");
}
unsigned long exptwo(unsigned int n)
{
unsigned int j;
unsigned long t=1;
if (n==0) {return 1;}
else
for (j=1;j<=n;j++) t*=2;
return t;
}
void main()
{
int i,j,k,t;
DDRA=0XFF;
DDRE=0X04;
PORTE=0X04;
PORTA=0XFF;
while(1)
{
for (t=1;t<=8;t++)
{
k=0X00;
for (i=0;i<=6+t;i++)
DDRE = 0X04;
PORTE= 0X04;
PORTA= 0X00;
k=0x00;
while (1)
{
Delay(1000);
if (k!=0xff)
{k++;
PORTA=k;
}
else k=0x00;
Delay(1000);
}
}3.#include<avr/io.h>
delay(1000);
PORTA=0XFF-k;
delay(1000);
}
}
PORTA=0XFF;
for (t=7;t>=1;t--)
{
k=0X00;
for (i=0;i<=6+t;i++)
{
k=0X00;
for (j=i;j>=i-t+1;j--)
if ((j<=7)&&(j>=0)) k=k+exptwo(j);
{
unsigned int i,j;
for (i=1;i<t;i++)
for (j=1;j<10;j++)
asm volatile ("nop");
}
int main()
{
DDRE=0X04;
PORTE=0X04;
DDRA=0XFF;
delay(100);
PORTA=0XFF;
#include<stdio.h>
void delay(unsigned int T)
{
unsigned int i,j;
for (i=0;i<T;i++)
for (j=0;j<100;j++)
asm volatile("nop");
}
unsigned long exptwo(unsigned int n)
void Delay(unsigned int T)
{
unsigned int i,j;
for (ห้องสมุดไป่ตู้=0;i<T;i++)
for (j=0;j<1000;j++)
asm volatile ("nop");
}
void main()
{
unsigned int k;
DDRA=0B11111111;
delay(1000);
PORTA=0XFF-k;
delay(1000);
}
}
}
}5.#include<avr/io.h>
#include<stdio.h>
void delay(unsigned int T)
{
unsigned int i,j;
for (i=0;i<T;i++)
#include<stdio.h>
void delay(unsigned int T)
{
unsigned int i,j;
for (i=0;i<T;i++)
for (j=0;j<100;j++)
asm volatile("nop");
}
void main()
{
DDRA=0XFF;
PORTE= 0X04;//开发板控制LED时需要PE2使能端置1
while (1)