mega128例程

合集下载

xmega128学习笔记

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

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版说明
新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单片机系列例程

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 例程大全

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串口通讯测试程序

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单片机调试与设置

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

mega128程序之EEPROM
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) {

DS12C887的AVRmega128驱动程序

DS12C887的AVRmega128驱动程序
const uchar table_wei[]={0x01,0X02,0X04,0X08};
uchar ge=0,shi=0,bai=0,qian=0;
void main()
{
uchar miao,fen,shi,nian,yue,ri;
init();
RESET_887();
* 名称 : delay()
* 功能 : 8M晶振时延时1ms
* 输入 : 时间值
* 输出 : 无
***********************************************************************/
void delay(uint ms)
{
uint x,y;
void RESET_887()
{
WRITE_DATA_887(4,23);//设定时
WRITE_DATA_887(2,59);//设定分
WRITE_DATA_887(0,55);//设定秒
WRITE_DATA_887(9,0x0a);//设定年
WRITE_DATA_887(8,0x0c);//设定月
* 名称 : display()
* 功能 : 4位数码管的显示函数
* 输入 : 显示值,最大值为9999
* 输出 : 无
***********************************************************************/
void display(uint a)
for(x=0;x<ms;x++)
{
for(y=0;y<1141;y++);

mega128-128L原理与开发应用指南(中文)

mega128-128L原理与开发应用指南(中文)

产品特点•高性能、低功耗的 AVR® 8位微处理器•先进的 RISC 结构–133条指令 – 大多数可以在一个时钟周期内完成–32 x 8 通用工作寄存器 + 外设控制寄存器–全静态工作–工作于16 MHz时性能高达16 MIPS–只需两个时钟周期的硬件乘法器•非易失性的程序和数据存储器–128K 字节的系统内可编程Flash寿命: 10,000次写/擦除周期–具有独立锁定位、可选择的启动代码区通过片内的启动程序实现系统内编程真正的读-修改-写操作–4K字节的EEPROM寿命: 100,000次写/擦除周期–4K 字节的内部SRAM–多达64K字节的优化的外部存储器空间–可以对锁定位进行编程以实现软件加密–可以通过SPI实现系统内编程•JTAG接口(与IEEE 1149.1标准兼容)–遵循JTAG标准的边界扫描功能–支持扩展的片内调试–通过JTAG接口实现对Flash, EEPROM, 熔丝位和锁定位的编程•外设特点–两个具有独立的预分频器和比较器功能的8位定时器/计数器–两个具有预分频器、比较功能和捕捉功能的16位定时器/计数器–具有独立预分频器的实时时钟计数器–两路8位PWM–6路分辨率可编程(2到16位)的PWM–输出比较调制器–8路10位ADC8个单端通道7个差分通道2个具有可编程增益(1x, 10x, 或200x)的差分通道–面向字节的两线接口–两个可编程的串行USART–可工作于主机/从机模式的SPI串行接口–具有独立片内振荡器的可编程看门狗定时器–片内模拟比较器•特殊的处理器特点–上电复位以及可编程的掉电检测–片内经过标定的RC振荡器–片内/片外中断源–6种睡眠模式: 空闲模式、ADC噪声抑制模式、省电模式、掉电模式、Standby模式以及扩展的Standby模式–可以通过软件进行选择的时钟频率–通过熔丝位可以选择ATmega103兼容模式–全局上拉禁止功能•I/O和封装–53个可编程I/O口线–64引脚TQFP与 64引脚 MLF封装•工作电压–2.7 - 5.5V ATmega128L–4.5 - 5.5V ATmega128•速度等级–0 - 8 MHz ATmega128L–0 - 16 MHz ATmega128微处理器,具有128K字节的系统2ATmega1282467L–AVR–05/04引脚配置Figure 1. ATmega128的引脚综述ATmega128为基于AVR RISC 结构的8位低功耗CMOS 微处理器。

mega128技术文档

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 下载接口不需要任何的外围零件。

tm1627测试程序(mega128)

tm1627测试程序(mega128)

TM1627_CN:/view/b3a01509763231126edb116a.html注:1、上述说明文档中图18的上拉电阻和电容是成对的接在STB、CLK、DIO上的。

2、我在测试电路中仅在DIO上使用了2kΩ的上拉电阻,没有使用电容。

且在使用10kΩ上拉电阻时没有读到正确的值,原因未知。

3、我使用的主控芯片为mega128(16MHz),使用引脚见程序。

4、说明文档中提到读取数据时需要在CLK上升沿读取DIO电平,但是我在使用中遇到CLK上升沿读取DIO电平不准确的情况,最后改为在CLK下降沿读取DIO电平,数据准确。

5、在下属程序使用前PA口的0、1、2位已初始化为输出状态。

6、对IO口初始化后调用disp()即可显示数字,调用key_get()可得到处理后的键值(处理方法因键盘设计而异)等待按键按下、松开与两个按键同时按下检测的程序段为:/*************************************************************************/unsigned char temp_kv=0,kv=0;/*************************************************************************/temp_kv = key_get();//将键值赋给temp_kvwhile((temp_kv==13)||(inover==1)) //等待按键按下temp_kv = key_get();kv = temp_kv; //获得键值while((temp_kv!=13)||(inover==1)) //等待按键松开或输入完成{temp_kv=key_get();if(temp_kv==12) //若两个功能键都被按下,kv=12;}/**************************************************************************///头文件tm1627.h#define TM1627_H//#include <avr/io.h>#define CLR_0_STB PORTA&=0xFE //STB:PA0#define SET_1_STB PORTA|=0x01#define CLR_0_CLK PORTA&=0xFD //CLK:PA1#define SET_1_CLK PORTA|=0x02#define CLR_0_DIO PORTA&=0xFB //DIO:PA2#define SET_1_DIO PORTA|=0x04#define DIO_READ DDRA&=0xFB /*DIO设为输入电平读取*/#define DIO_SEND DDRA|=0x04 /*DIO设为输出*///unsigned char table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};extern unsigned char liangdu;extern unsigned char key_val;void delay_ms(unsigned char cn);void TM1627_write(unsigned char dat);unsigned char TM1627_read(void);void disp(unsigned int dat,unsigned char led);//显示函数显示一个unsigned int型数据并控制三个LED的亮暗unsigned char key_get(void);//返回已转换过的键值(0-12),其中键值12为S4和S12同时按下的键值//tm1627.c#include <avr/io.h>#include "tm1627.h"/*#define CLR_0_STB PORTA&=0xFE //STB:PA0#define SET_1_STB PORTA|=0x01#define CLR_0_CLK PORTA&=0xFD //CLK:PA1#define SET_1_CLK PORTA|=0x02#define CLR_0_DIO PORTA&=0xFB //DIO:PA2#define SET_1_DIO PORTA|=0x04*/unsigned char table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数码管码表unsigned char key[5];//unsigned char last_kv=12;void del(unsigned char cn){for(;cn>0;cn--);}unsigned char key_get(void){unsigned char i,j;unsigned char key_val;CLR_0_STB;TM1627_write(0x42);//读数据DIO_READ;// DDRA&=0xFB;//DIO设为输入// PORTA|=0x04;//使能上拉电阻TM1627j = PINA;for(i=0;i<5;i++){key[i]=TM1627_read();del(40);}SET_1_STB;DIO_SEND;// DDRA|=0x04;//DIO设为输出if(key[0]==0x01)key_val=1;else if(key[0]==0x08)key_val=2;else if(key[1]==0x18)key_val=12;else if(key[1]==0x01)key_val=3;else if(key[1]==0x08)key_val=10;else if(key[2]==0x01)key_val=4;else if(key[2]==0x08)key_val=5;else if(key[3]==0x01)key_val=6;else if(key[3]==0x08)key_val=0;else if(key[0]==0x02)key_val=7;else if(key[0]==0x10)key_val=8;else if(key[1]==0x02)key_val=9;else if(key[1]==0x10)key_val=11;elsekey_val=13;return key_val;}unsigned char TM1627_read(void) {unsigned char i;unsigned char temp=0;unsigned char bit;// SET_1_CLK;bit = PINA&0x04;for(i=0;i<8;i++){// temp>>=1;CLR_0_CLK;// for(j=0;j<20;j++);bit = PINA&0x04;if(bit == 0x04)temp|=0x80;//最高位置1SET_1_CLK;temp>>=1;// for(j=0;j<20;j++);}return temp;// SET_1_CLK;}void disp(unsigned int dat,unsigned char led) {// unsigned char ge,shi,bai,qian;unsigned char wei[4]={0,0,0,0};unsigned char i;wei[3]=dat%10;wei[2]=dat/10%10;wei[1]=dat/100%10;wei[0]=dat/1000;DDRA|=0x04;//DIO设为输出CLR_0_STB;TM1627_write(0x03);//7位10段SET_1_STB;delay_ms(5);CLR_0_STB;TM1627_write(0x40);//地址自动加一SET_1_STB;delay_ms(5);CLR_0_STB;TM1627_write(0xC0);//以下是14字节数据 for(i=0;i<4;i++){TM1627_write(table[wei[i]]);TM1627_write(0x00);}TM1627_write(led);TM1627_write(0x00);SET_1_STB;// delay_ms(5);CLR_0_STB;TM1627_write(liangdu);//脉冲宽度// TM1627_write(0x8F);//脉冲宽度SET_1_STB;}void TM1627_write(unsigned char dat){unsigned char i;// DIO_OUT(); //将DIO设置为推挽输出for(i=0;i<8;i++){CLR_0_CLK; //先将CLK置低if((dat&0x01)==0x01)SET_1_DIO; //将数据发至DAT线上elseCLR_0_DIO;dat >>= 1; //数据移位准备下一次的发送// delay_ms(3); //延时以等待TM1627接收SET_1_CLK; //将CLK置高del(10);}// SET_1_CLK;}void delay_ms(unsigned char cn)//不准确的延时{unsigned char i,j;for(;cn>0;cn--){for(i=0;i<100;i++)for(j=0;j<255;j++);}}电路原理图:。

atMega128的bootloader例程

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;

mega128程序

mega128程序

#include <iom128v.h>#include <macros.h>#include "12864.h"#pragma interrupt_handler time1_isr:15 //定时器1溢出//#pragma interrupt_handler ext_int0_isr:2 //指定外部中断函数#pragma interrupt_handler ext_int1_isr:3 //指定外部中断函数//#pragma interrupt_handler ext_int2_isr:4 //指定外部中断函数//#pragma interrupt_handler ext_int3_isr:5 //指定外部中断函数#define uint unsigned int#define uchar unsigned char#define set1 PORTA|=BIT(5)//一路输出#define clc1 PORTA&=~BIT(5)#define set2 PORTA|=BIT(6)//第二路#define clc2 PORTA&=~BIT(6)#define key1 PIND==0x9F#define key2 PIND==0x6F#define key3 PIND==0x5F#define key4 PIND==0xAF#define key5 PIND==0xBF#define key6 PIND==0x7F#define key7 PIND==0xDF#define key8 PIND==0xEF//unsigned char i=0;uint addata0;uint p;//求平均用uint q=0;//求平均用uint m=0;//求平均用uint num,num2;uint bizhi=5;//第一路uint bizhi2=5;//第二路uchar flag=0;//AD求平均uchar flag1=0;//AD求平均uchar flag3;//等于一时右边的等于零时左边的uchar flag4=0;//模式判断uchar flag5,flag6;//控制两路端口产生脉冲void time1_init(){TCCR1B=0X02;//16M 8分频/TCNT1H=0XF8;TCNT1L=0X30;TIMSK|=BIT(2);SREG|=BIT(7);}void init_port(void){DDRD=0X00;PORTD=0XFF;DDRA=0xff;PORTA=0x00;//EIMSK=0x02; //开外部中断int_0,对应按键K20EICRA=0x0c;SREG=0x80; //开全局中断}void delay(unsigned int x){unsigned int i,j;for(i=x;i>0;i--)for(j=0;j<330;j++);}unsigned int adc_init(void){DDRA&=~BIT(PA0);PORTA&=~BIT(PA0);//*端口设置ADMUX=0B11000000;//*选择ADC通道0ACSR=0x80;//关模拟比较器ADCSRA=0X86;//*ADC使能ADCSRA|=BIT(ADSC);//*开始转换while(!(ADCSRA&(BIT(ADIF)))); //*查询法确定等待是否转换完成addata0=ADCL; //读数据寄存器addata0=addata0+ADCH*256;//*接收数据ADCSRA&=~BIT(ADIF); //*清标志ADCSRA&=~BIT(ADEN); //*关闭转换return addata0;}void xieru(uint m){Lcd_WriteCmd(0x98+2);//Lcd_WriteData(m/10000+0x30);//Lcd_WriteData(m%10000/1000+0x30);Lcd_WriteData(m%1000/100+0x30);Lcd_WriteData(m%100/10+0x30);Lcd_WriteData(m%10+0x30);}void adc(){p=adc_init();q=q+p;flag++;if(flag==20){flag=0;q=q/20;flag1++;m=m+q;if(flag1==20){flag1=0;m=m/20;xieru(m);}}}void main(void){init_port();Lcd_Init();time1_init();Lcd_DisplayString(0,0,"遥控调光控制器");//Lcd_DisplayString(1,0,"****YKTGKZQ****");Lcd_DisplayString(3,0,"光照%");p=adc_init();p=1024-p;p=p/9;xieru(p);while(1){if(flag3==0){// adc(); //ad采样一百次求平均显示一次// p=adc_init();//xieru(p);//delay(100);while(key1&&flag3==0)//按键一{bizhi=1;//100%Lcd_DisplayString(1,0," 1 :1");xieru(100);}while(key2&&flag3==0)//按键二{bizhi=10;//0%Lcd_DisplayString(1,0," 1 :2"); xieru(0);}while(key3&&flag3==0)//按键三{bizhi=4;//60%Lcd_DisplayString(1,0," 1 :3");xieru(60);}while(key4&&flag3==0)//按键四{bizhi=7;//30%Lcd_DisplayString(1,0," 1 :4");xieru(30);}while(key5&&flag3==0)//按键五{if(bizhi<=9)bizhi++;//变an//bizhi=10;delay(7200);Lcd_DisplayString(1,0," 1 :5");p=adc_init();p=1024-p;p=p/9;xieru(p);}while(key6&&flag3==0)//按键六{if(bizhi>=2)bizhi--;//等于一时最亮Lcd_DisplayString(1,0," 1 :6");delay(7200);p=adc_init();p=adc_init();p=1024-p;p=p/9;xieru(p);}//////////////if(flag3==1){while(key1&&flag3==1)//按键一{Lcd_DisplayString(2,0,"2 :1");xieru(100);}while(key2&&flag3==1)//按键二{Lcd_DisplayString(2,0,"2 :2");xieru(0);}while(key3&&flag3==1)//按键三{Lcd_DisplayString(2,0,"2 :3");xieru(60);}while(key4&&flag3==1)//按键四{xieru(30);Lcd_DisplayString(2,0,"2 :4");}while(key5&&flag3==1)//按键五{Lcd_DisplayString(2,0,"2 :5");}while(key6&&flag3==1)//按键六{Lcd_DisplayString(2,0,"2 :6");}}while(key7&&flag4==0)//按键七二模式{flag3=1;flag4=1;Lcd_DisplayString(2,0,"2 :7");}while(key7&&flag3==1)//按键七一模式{flag4=0;flag3=0;Lcd_DisplayString(2,0,"1 :7");}/*if(key8)//按键八模式二{flag3=1;Lcd_DisplayString(2,0,"2 :8");}*/}}void ext_int1_isr(void){num=num2=0;}void time1_isr(){TCNT1H=0XF8;TCNT1L=0X30;num++;num2++;if(num>=bizhi)//一路拉高{if(bizhi!=10){num=0;set1;flag5=1;}}if(flag5==1&&num>=2)//两毫秒后拉低保证晶闸管响应{num=0;clc1;flag5=0;}if(num>=bizhi)//第二路拉高{if(bizhi2=10){num2=0;set2;flag6=1;}}if(flag6==1&&num2>=2)//两毫秒后拉低保证晶闸管响应{num2=0;clc2;flag6=0;}}。

史上最全的AVR128例程

史上最全的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(均为八位的定时计数器)有四种工作模式,此例是工作在普通模式。

tm1627测试程序(mega128)

tm1627测试程序(mega128)

TM1627_CN:/view/b3a01509763231126edb116a.html注:1、上述说明文档中图18的上拉电阻和电容是成对的接在STB、CLK、DIO上的。

2、我在测试电路中仅在DIO上使用了2kΩ的上拉电阻,没有使用电容。

且在使用10kΩ上拉电阻时没有读到正确的值,原因未知。

3、我使用的主控芯片为mega128(16MHz),使用引脚见程序。

4、说明文档中提到读取数据时需要在CLK上升沿读取DIO电平,但是我在使用中遇到CLK上升沿读取DIO电平不准确的情况,最后改为在CLK下降沿读取DIO电平,数据准确。

5、在下属程序使用前PA口的0、1、2位已初始化为输出状态。

6、对IO口初始化后调用disp()即可显示数字,调用key_get()可得到处理后的键值(处理方法因键盘设计而异)等待按键按下、松开与两个按键同时按下检测的程序段为:/*************************************************************************/unsigned char temp_kv=0,kv=0;/*************************************************************************/temp_kv = key_get();//将键值赋给temp_kvwhile((temp_kv==13)||(inover==1)) //等待按键按下temp_kv = key_get();kv = temp_kv; //获得键值while((temp_kv!=13)||(inover==1)) //等待按键松开或输入完成{temp_kv=key_get();if(temp_kv==12) //若两个功能键都被按下,kv=12;}/**************************************************************************///头文件tm1627.h#define TM1627_H//#include <avr/io.h>#define CLR_0_STB PORTA&=0xFE //STB:PA0#define SET_1_STB PORTA|=0x01#define CLR_0_CLK PORTA&=0xFD //CLK:PA1#define SET_1_CLK PORTA|=0x02#define CLR_0_DIO PORTA&=0xFB //DIO:PA2#define SET_1_DIO PORTA|=0x04#define DIO_READ DDRA&=0xFB /*DIO设为输入电平读取*/#define DIO_SEND DDRA|=0x04 /*DIO设为输出*///unsigned char table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};extern unsigned char liangdu;extern unsigned char key_val;void delay_ms(unsigned char cn);void TM1627_write(unsigned char dat);unsigned char TM1627_read(void);void disp(unsigned int dat,unsigned char led);//显示函数显示一个unsigned int型数据并控制三个LED的亮暗unsigned char key_get(void);//返回已转换过的键值(0-12),其中键值12为S4和S12同时按下的键值//tm1627.c#include <avr/io.h>#include "tm1627.h"/*#define CLR_0_STB PORTA&=0xFE //STB:PA0#define SET_1_STB PORTA|=0x01#define CLR_0_CLK PORTA&=0xFD //CLK:PA1#define SET_1_CLK PORTA|=0x02#define CLR_0_DIO PORTA&=0xFB //DIO:PA2#define SET_1_DIO PORTA|=0x04*/unsigned char table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数码管码表unsigned char key[5];//unsigned char last_kv=12;void del(unsigned char cn){for(;cn>0;cn--);}unsigned char key_get(void){unsigned char i,j;unsigned char key_val;CLR_0_STB;TM1627_write(0x42);//读数据DIO_READ;// DDRA&=0xFB;//DIO设为输入// PORTA|=0x04;//使能上拉电阻TM1627j = PINA;for(i=0;i<5;i++){key[i]=TM1627_read();del(40);}SET_1_STB;DIO_SEND;// DDRA|=0x04;//DIO设为输出if(key[0]==0x01)key_val=1;else if(key[0]==0x08)key_val=2;else if(key[1]==0x18)key_val=12;else if(key[1]==0x01)key_val=3;else if(key[1]==0x08)key_val=10;else if(key[2]==0x01)key_val=4;else if(key[2]==0x08)key_val=5;else if(key[3]==0x01)key_val=6;else if(key[3]==0x08)key_val=0;else if(key[0]==0x02)key_val=7;else if(key[0]==0x10)key_val=8;else if(key[1]==0x02)key_val=9;else if(key[1]==0x10)key_val=11;elsekey_val=13;return key_val;}unsigned char TM1627_read(void) {unsigned char i;unsigned char temp=0;unsigned char bit;// SET_1_CLK;bit = PINA&0x04;for(i=0;i<8;i++){// temp>>=1;CLR_0_CLK;// for(j=0;j<20;j++);bit = PINA&0x04;if(bit == 0x04)temp|=0x80;//最高位置1SET_1_CLK;temp>>=1;// for(j=0;j<20;j++);}return temp;// SET_1_CLK;}void disp(unsigned int dat,unsigned char led) {// unsigned char ge,shi,bai,qian;unsigned char wei[4]={0,0,0,0};unsigned char i;wei[3]=dat%10;wei[2]=dat/10%10;wei[1]=dat/100%10;wei[0]=dat/1000;DDRA|=0x04;//DIO设为输出CLR_0_STB;TM1627_write(0x03);//7位10段SET_1_STB;delay_ms(5);CLR_0_STB;TM1627_write(0x40);//地址自动加一SET_1_STB;delay_ms(5);CLR_0_STB;TM1627_write(0xC0);//以下是14字节数据 for(i=0;i<4;i++){TM1627_write(table[wei[i]]);TM1627_write(0x00);}TM1627_write(led);TM1627_write(0x00);SET_1_STB;// delay_ms(5);CLR_0_STB;TM1627_write(liangdu);//脉冲宽度// TM1627_write(0x8F);//脉冲宽度SET_1_STB;}void TM1627_write(unsigned char dat){unsigned char i;// DIO_OUT(); //将DIO设置为推挽输出for(i=0;i<8;i++){CLR_0_CLK; //先将CLK置低if((dat&0x01)==0x01)SET_1_DIO; //将数据发至DAT线上elseCLR_0_DIO;dat >>= 1; //数据移位准备下一次的发送// delay_ms(3); //延时以等待TM1627接收SET_1_CLK; //将CLK置高del(10);}// SET_1_CLK;}void delay_ms(unsigned char cn)//不准确的延时{unsigned char i,j;for(;cn>0;cn--){for(i=0;i<100;i++)for(j=0;j<255;j++);}}电路原理图:。

AVR单片机Mega128 485通信程序

AVR单片机Mega128 485通信程序

AVR单片机Mega128 485通信程序一、实物测试二、程序//#include <io.h> //用这个头文件也可以#include <mega128.h>#include <string.h>#include <stdio.h>#define F_CPU 16000000 // 单片机主频为16MHz,用于延时子程序,熔丝位必须设置到外部高频晶振才行#include "Config.h" //配置头文件,与硬件相关的配置在这里更改#define LED0 PORTE.0#define LED1 PORTE.1#define LED2 PORTE.2#define LED3 PORTE.3#define LED4 PORTE.4#define LED5 PORTE.5#define LED6 PORTE.6#define LED7 PORTE.7#define PD4 PORTD.4unsigned char str[50]={0};unsigned char in=0,a=0,lage=0;//uchar usart_rx_data;void delay_ms(int ms){for(;ms>0;ms--);}//************************************************ ***********************// MSP430IO口初始化//************************************************ ***********************void Port_Init(){LEDDDR = 0xFF; //设置IO口方向为输出LED = 0xFF; //PE口初始设置为FFDDRD = 0x18; //设置为输入,并且要打开上拉电阻//DDRD = 0x00 | (1<<RS485_CTR_RDE)| (1<<PD3);//PORTD |= ((1 << PD1) |(1 << PD5)|(1 << PD6)|(1 << PD7)); //四位独立按键连接在PD1/PD5/PD6/PD7上}//************************************************ *************************// MSP430串口1初始化//************************************************ *************************void UART1_Init(){UCSR1A=0x00; //单倍速模式UCSR1B=0x98; //接收中断允许,发送结束和寄存器空中断关闭,采用查询发送模式//UCSR1B=0x08;//UCSR1C=(1<<UCSZ11)|(1<<UCSZ10); //写UCSRC寄存器,异步通信无校验,8位数据1位停止位UCSR1C=0x86;UBRR1H=0; //写波特率的值UBRR1L=103;}//************************************************ *************************// 串口1发送数据函数//************************************************ *************************void Send_Byte(uchar data){while(!(UCSR1A&(1<<UDRE1))); //等待发送寄存器空UDR1= str[data]; //写入发送数据while(!(UCSR1A&(1<<TXC1))); //等待发送完毕UCSR1A|=(1<<TXC1);delay_ms(5); //切换之前先有个小延时}//************************************************ *************************// 处理来自串口1的接收中断//************************************************ *************************//数据接收结束中断向量interrupt[USART1_RXC]void usart_rx_isr(void)//中断服务程序{str[in]=UDR1;LED0=0;if(str[in]!=0x0A) //$为停止标志{in++;}else{LED3=0;in=0;lage=1;}}//************************************************ *************************// 主函数//************************************************ *************************void main(void){DDRE=0xFF;PORTE=0XFF;Port_Init(); //端口初始化UART1_Init(); //串口设置初始化PD4=0; //切换到接收状态delay_ms(2);SREG|=0x80; //开启全局中断while(1) //无限循环{if(lage==1){PD4=1; //开启发送for(a=0;;a++){Send_Byte(a);if(str[a]==0x0A){//lage=0; //放在这个位置也可以//PD4=0; //放在这个位置也可以break; //跳出循环}}a=0;lage=0;LED5=0;PD4=0;}}三、仿真原理图。

mega128技术文档

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 下载接口不需要任何的外围零件。

128简单例程

128简单例程

ATMEGA128相关例程1、流水灯/*硬件环境: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){;}}2、AD转换+数码管显示/*********************************************************************** ****//*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延时函数{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(均为八位的定时计数器)有四种工作模式,此例是工作在普通模式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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(均为八位的定时计数器)有四种工作模式,此例是工作在普通模式。

相关文档
最新文档