mega128例程
xmega128学习笔记

XMEGA128学习笔记1-bootloader下载程序首先需要感谢AVR和与非网举办这次AVR大赛,其次要感谢在学习板申请当中阿呆给予我们小组的帮助,最后要感谢我们的指导老师。
我们小组将在论坛版块连载《XMEGA128学习笔记》系列,分享学习心得与大家共同探讨,也欢迎大家分享自己学习的心得,共同进步。
今天主要是叙述如何使用XMEGA的BOOTLODER功能下载程序。
首先请大家将附近的内容下载,由于论文附件大小的限制,Flip Installer - 3.4.3这个软件分成三个压缩包,需要大家一起解压,解压后进行安装,安装过程大家点击下一步就可以了。
第二个附件是“AVR1927_XMEGA-A1_Xplained_Example_Applications.zip”,这个压缩包是板子的程序和驱动。
大家解压后将“ATxmega128A1.xml”文件拷贝到“X:\Program Files\Atmel\Flip 3.4.3\bin\PartDescriptionFiles”,其中X表示您安装FLIP软件所在的盘符,如图所示:第三步:将XMEGA开发板用USB连接线插入到电脑中,这时候电脑会提示发现新硬件,有驱动需要安装,如图2所示,选择“从列表或指定位置安装(高级)”位置选择“AVR1927_XMEGA-A1_Xplained_Example_Applications\Driver”安装后效果如图4,电脑多个一个虚拟串口,我的电脑显示的是COM8。
第三步:拔掉USB,如何安装板上的SW0按键不放,在插上USB,使得XMEGA进入BOOTLOADER状态。
第四步:打开第一步安装的FLIP软件,首先选择器件和串口的端口,成功后效果如图:这时就可以打开一个HEX文件进行下载,附件中有一个是流水灯的HEX文件,大家下载进去后再复位,看看是不是板上的流水灯在闪烁。
更多参考内容请看《Atmel AVR1927 XMEGA-A1 Xplained Getting Started Guide.pdf》《FLIP软件帮助》今天的内容就到这里,谢谢大家的关注。
mega128程序之IIC24C08

#include <mega128.h>#include <delay.h>#define TWIE 0#define TWEN 2#define TWWC 3#define TWSTO 4#define TWSTA 5#define TWEA 6#define TWINT 7#define TWPS0 0#define TWPS1 1#define TWS3 3#define TWS4 4#define TWS5 5#define TWS6 6#define TWS7 7#define TWGCE 0/*********主机发送模式状态码***********/#define START 0X08#define RE_START 0X10#define MT_SLA_ACK 0X18#define MT_SLA_NOACK 0X20#define MT_DATA_ACK 0X28#define MT_DATA_NOACK 0X30#define MT_ACK_FAUIL 0X38/*********主机接收模式状态码***********/#define MR_SLA_ACK 0X40#define MR_SLA_NOACK 0X48#define MR_DATA_ACK 0X50#define MR_DATA_NOACK 0X58/*********24C01地址***********/#define RD_DEVICE_ADDR 0XA1#define WD_DEVICE_ADDR 0XA0/******主模式写和读**************/#define start() (TWCR =(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) // 启动#define stop() (TWCR =(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) // 停止#define wait() {while (!(TWCR & (1<<TWINT)));} // 等待中断发生#define test_ack() (TWSR & 0xF8) // 检测状态码#define set_ack() (TWCR |= (1<<TWEA)) // 做出ACK应答#define set_noack() (TWCR &= ~(1<<TWEA)) // 做出NOACK应答#define twi() (TWCR = (1<<TWINT)|(1<<TWEN)) // 再启动#define write_8_bit(x) {TWDR = (x);TWCR = (1<<TWINT)|(1<<TWEN);} // 写数据/*********显示端口定义***********/#define DIS_UNM PORTC#define wei_en PORTG|=0x04#define wei_cle PORTG&=0XFB#define duan_en PORTA|=0X80#define duan_cle PORTA&=0X7Fvoid PORT_INIT(void){DDRA=0XFF;PORTA=0X00;DDRC=0XFF;PORTC=0X00;DDRG=0XFF;PORTG=0X00;DDRD=0X00;PORTD=0X00;}void TWI_INIT(void);unsigned char IIC_WRITE(unsigned char wdata,unsigned char addr);unsigned char IIC_READ(unsigned char addr);void LED_display(unsigned int temp_data);unsigned char SEG7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴极unsigned char qian,bai,shi,ge,qian_data,bai_data,shi_data,ge_data,display_flag; void main(void){unsigned char i=0;PORT_INIT();TWI_INIT();i=IIC_READ(6);//delay_ms(15);i++;IIC_WRITE(i,6);//delay_ms(10);while(1){LED_display(i);}}void TWI_INIT(void){TWBR = 0X30;TWCR = 0X04;TWSR = 0X00;}unsigned char IIC_WRITE(unsigned char wdata,unsigned char addr){start();wait();if(test_ack()!=START) //判断是否是启动信号return 1;write_8_bit(WD_DEVICE_ADDR);//delay_ms(5); //写器件地址----找器件wait();if(test_ack()!=MT_SLA_ACK) //器件是否应答了return 1;write_8_bit(addr); //delay_ms(5); // 写器件中存储地址wait();if(test_ack()!=MT_DATA_ACK) //是否应答return 1;write_8_bit(wdata);// delay_ms(5); //向器件存储地址中写数据wait();if(test_ack()!=MT_DATA_ACK) //return 1;stop();return 0;}unsigned char IIC_READ(unsigned char addr){unsigned char temp;start();wait();if(test_ack()!=START)//return 1;write_8_bit(WD_DEVICE_ADDR);//delay_ms(5);//写器件地址----找器件wait();if(test_ack()!=MT_SLA_ACK) //return 1;write_8_bit(addr); // delay_ms(5); // 写器件中存储地址wait();if(test_ack()!=MT_DATA_ACK) //return 1;start(); //wait();if(test_ack()!=RE_START) //return 1;write_8_bit(RD_DEVICE_ADDR); //delay_ms(5); //读器件地址--读命令wait();if(test_ack()!=MR_SLA_ACK)// 主机接收return 1;twi();//重新启动IICwait();if(test_ack()!= MR_DATA_NOACK)return 1;temp=TWDR; //读出数据赋给变量stop();delay_ms(2); //此延时非同寻常!!! return temp;}void LED_display(unsigned int temp_data){qian_data=temp_data/1000;temp_data=temp_data%1000;bai_data=temp_data/100 ;temp_data=temp_data%100; //取余运算shi_data=temp_data/10 ;temp_data=temp_data%10; //取余运算ge_data=temp_data;qian=SEG7[qian_data];bai =SEG7[bai_data];shi =SEG7[shi_data];ge =SEG7[ge_data];switch(display_flag){case 0x00:duan_en;DIS_UNM=0x00;duan_cle;wei_en;DIS_UNM=0xFE;wei_cle;delay_ms(2);duan_en;DIS_UNM=ge;duan_cle;display_flag++;delay_ms(2);break;case 0x01:duan_en;DIS_UNM=0x00;duan_cle;wei_en;DIS_UNM=0xFD;wei_cle;delay_ms(2);duan_en;DIS_UNM=shi;duan_cle;display_flag++;delay_ms(2);break;case 0x02:duan_en;DIS_UNM=0x00;duan_cle;wei_en;DIS_UNM=0xFB;wei_cle;delay_ms(2);duan_en;DIS_UNM=bai;duan_cle;display_flag++;delay_ms(2);break;case 0x03:duan_en;DIS_UNM=0x00;duan_cle;wei_en;DIS_UNM=0xF7;wei_cle;delay_ms(2);duan_en;DIS_UNM=qian;duan_cle;display_flag=0;delay_ms(2); break;default:// DIS_UNM=0X00;}}。
新Mega128版说明

新Mega128版说明
新Mega128版说明测试程序
1."TestLCD128"为实验室8803液晶的测试程序
接端口P2。
正常应该显示“三峡大学”字样。
2."USART128"为串口测试程序,打开超级终端,
设置波特率为4800(16M晶振),如果是8M晶振则波特率为2400 数据位8
奇偶校验无
停止位 1
数据流控制硬件
完成后将有汉字和英文在屏幕上交替显示。
重要说明
1.新单片机第一次使用前务必设置熔丝位为如下模式:
Mega128
Mega16
当然也可以设置为其他模式,不过如果你不是高手建议不要修改!
2.由于新板子P8口数据端口PD0与PD1紧挨单片机时钟引脚XTAL1 , XTAL2 ,建议不要使用该端口进
行高速数据操作,以免单片机出错!
冯进伟
2009-8-9。
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>
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串口通讯测试程序/********************************************************说明: 需要串口调协助实验(波特率设为9600)在串口调试助手中输入要发送的内容,点发送后M128会返回相同的数据CPU型号: ATMEGA128时钟: 8MHZ日期:2014.7.22默认9600 8 1********************************************************/#include#includevoid USART0_Init( void );void USART0_Transmit( unsigned char data );unsigned char USART0_Receive( void );void main(void){unsigned char n=0,tmp=0;DDRB |=0X10; //PB4设为输出PORTB|=0X10; //关闭PB4外接的LEDDDRF |=0X0E; //LED及数码管锁存IO口设为输出PORTF|=0X0E;DDRA=0XFF; //LED IO口设为输出PORTA=0XFF;PORTF&=0xF7; //锁存数据关闭LEDPORTA=0X00;PORTF&=0XF8; //锁存数据关闭数码管USART0_Init(); //波特率9600 初始化串口while(1){if(UCSR0A&(1<<="">{tmp=USART0_Receive(); //接收数据USART0_Transmit(tmp); //发送数据}}}void USART0_Init( void ){unsigned int tmp;UBRR0L=51; /* 设置波特率*/UCSR0B = (1<<rxen0)|(1<<="" p="" 接收器与发送器使能*=""> UCSR0C = (1<<ucsz00)|(1<<="" 个数据位,="" 设置帧格式:=""> // 数据发送【发送5 到8 位数据位的帧】void USART0_Transmit( unsigned char data ){/* 等待发送缓冲器为空*/while ( !( UCSR0A & (1<<="" p="">/* 将数据放入缓冲器,发送数据*/UDR0 = data;}// 数据接收【以5 到8 个数据位的方式接收数据帧】unsigned char USART0_Receive( void ){/* 等待接收数据*/while ( !(UCSR0A & (1<<="" p="">/* 从缓冲器中获取并返回数据*/return UDR0;}</ucsz00)|(1<</rxen0)|(1<。
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里选择。
mega128程序之EEPROM

/******************************************/ 1、写EEPROM
1. 关中断,等待 EEWE 为 0,上次写操作结束。(无中断可以忽略) 2. 等待 SPMCSR 寄存器的 SPMEN 为零。 3. 将新的 EEPROM 地址写入 EEAR。 4. 将新的 EEPROM 数据写入 EEDR。 5. 对 EECR 寄存器的 EEMWE 写 "1“ ,同时清零EEWE 6. 开中断。(无中断可以忽略) 7. 在置位 EEMWE 的 4 个周期内,置位 EEWE。 2、读EEPROM 1.SREG=0;//关中断 (无中断可以忽略) 2.等待上次写操作结束 3.找到EEPROM 地址写入 EEAR 4.读使能 EERE置1. 5.将EEDR中数据 送出 /*******************************************/ AUTHOR :Ash DATE : 20121024 /*********************************************/ #include <mega128.h> /****需要定义以下寄存器值,头文件中没有定义******/ #define EERE 0 #define EEWE 1 #define EEMWE 2 #define EERIE 3
INT8U EEP_READ(INT16U EE_ADD) {
INT8U edata; SREG=0; while(EECR&(1<<EEWE)); EEAR= EE_ADD; EECR|=(1<<EERE); edata = EEDR; return edata;
} void main(void) {
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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:number007cool@ *//*时间: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); //输出高电平,使能595 PORTB = 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:15 void 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); //调用显示函数将写入的数据又读出来}}4、定时器0(轮循方式)/*定时器0和2(均为八位的定时计数器)有四种工作模式,此例是工作在普通模式。