AVR 单片机 实例,ATMEGA128,atmega128 , LED灯实验

合集下载

第2章_ATmega128硬件结构

第2章_ATmega128硬件结构

广州大学 机电学院 庞志
$100CA
$1006:LDI R1,$0A $1008:LDS R2,$FF00 $100A:ADD R2,R1 $100C:STS $$FFFF0000(($$110A)) $FF00,R2
R1=$0A R2=$$11AA0
2020年5月19日星期二
广州大学 机电学院 庞志
广州大学 机电学院 庞志
ATmega128
单 片 机 方 框 图
2020年5月19日星期二
广州大学 机电学院 庞志
ATmega128
单 片 机 指 令 执 行 过 程
2020年5月19日星期二
广州大学 机电学院 庞志
$1006
10+(0xFF00$)1=0>0(60:xLFDFI 0R0)1,$0A
当RAMPZ0=1: ELPM/SPM可以访问程序存储器地址 $8000——$FFFF(高64K字节)
2020年5月19日星期二
广州大学 机电学院 庞志
2.2.3 指令执行时序
AVR CPU由系统时钟clkCPU驱动。
并行取指和执行时序
2020年5月19日星期二
广州大学 机电学院 庞志
单时钟周期ALU 操作
模拟比较器
2020年5月19日星期二
广州大学 机电学院 庞志
2.1.2 主要性能 (续)
特殊的处理器特点
上电复位 可编程的掉电检测 片内RC振荡器 片内/片外中断源 6种睡眠模式: 空闲模式、ADC噪声抑制模式、省电模
式、掉电模式、Standby模式以及扩展的Standby模式 可选的时钟频率 可选ATmega103兼容模式 全局上拉禁止功能
Bit 6 – T: 位拷贝存储 Bit 4 – S: 符号位,S=N⊕V Bit 2 – N: 负数标志 Bit 0 – C: 进位标志

atmega128单片机系列例程

atmega128单片机系列例程

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延时函数{。

mega328的例子程序

mega328的例子程序

mega328的例子程序以下是一个简单的Arduino示例程序,演示了如何使用ATmega328芯片来控制LED灯的闪烁。

该程序使用Arduino IDE编写,并且假定你已经熟悉了Arduino编程环境的基本操作。

c.// 定义LED引脚。

int ledPin = 13;void setup() {。

// 初始化LED引脚为输出。

pinMode(ledPin, OUTPUT);}。

void loop() {。

// 将LED引脚设为高电平,点亮LED.digitalWrite(ledPin, HIGH);// 程序延时1秒。

delay(1000);// 将LED引脚设为低电平,熄灭LED.digitalWrite(ledPin, LOW);// 程序延时1秒。

delay(1000);}。

在这个示例程序中,我们首先定义了一个整型变量`ledPin`,用来存储LED的引脚号。

在`setup()`函数中,我们通过`pinMode()`函数将LED引脚设置为输出模式。

在`loop()`函数中,我们使用`digitalWrite()`函数来控制LED引脚的电平,从而控制LED的亮灭,并通过`delay()`函数来实现延时效果。

这只是一个非常简单的示例程序,演示了如何使用ATmega328芯片来控制外围设备。

实际上,ATmega328芯片具有丰富的功能和强大的性能,可以用于各种嵌入式系统和电子项目中。

通过合理的编程和外围电路设计,ATmega328芯片可以实现复杂的控制和处理任务,包括但不限于传感器数据采集、通信接口、电机控制等。

希望这个简单的示例程序能够帮助你更好地了解如何使用ATmega328芯片进行编程。

如果你有更具体的问题或者需要进一步的帮助,请随时告诉我。

atmega128实用双串口通讯

atmega128实用双串口通讯

}
tx_data[21] =data;
led_2_0();
//----------------数据校验、处理部分
if( (tx_data[0]==0xfe) && (tx_data[21]==0x16) )

//--------------------------略 }
} //--------uart 1----RX-----中断方式- 同上---------------------ISR(USART1_RX_vect) {
unsigned char status,data; status=UCSR1A; data=UDR1; unsigned char f; //----status &= ~(FRAMING_ERROR1 | PARITY_ERROR1 | DATA_OVERRUN1); //----f=data;
//---------------------------------------------
#define
led_1_1() (PORTE |= bit(3))//--1
#define #define #define #define #define #define #define #define #define
Atmega128 实用串口通讯程序
1、 双串口异步通讯, USART0——发送使能,接收使能 、2400bps/8 位/偶校验/1 停止位
USART1——发送使能、9600bps/8 位/无校验/1 停止位
2、 外围 5 个 LED 指示 共阳极, PE3~PE7
#include <avr/io.h> #include <util/delay.h> #include <stdio.h> #include <avr/interrupt.h> #include <avr/wdt.h>

AVR ATmega128全功能工业控制器设计文档说明书

AVR ATmega128全功能工业控制器设计文档说明书

AVR单片机的全功能工业控制器设计吴焕琅深圳市中天越华自动控制科技有限公司摘要:介绍一款工业级的实用全功能控制器。

该控制器能隔离采集多种输入信号,输出多种控制信号;具有实时时钟、历史数据存储功能,彩色液晶显示界面,带有触摸屏操作和远程通信接口。

核心部分CPU采用AVR ATmega128单片机。

目前已用于批量生产。

关键词:隔离采集控制单片机彩色显示485接口ATmega128DS1642引言在自动控制产品的设计过程中,实现方案的选择常常是很矛盾的。

使用可编程逻辑控制器(PLC)和人机界面(HMI)来实现,开发速度较快,但成本太高,所开发的产品没有市场竞争力;使用单片机开发,成本低但开发周期长、开发量大且通用性不好。

用户需要的是一种成本低、开发周期较短、通用性较好的控制器,因此全功能工业控制器有很大的应用市场。

全功能工业控制器的整个电路分为信号隔离输入部分、控制器输出部分、实时时钟与历史数据存储部分、彩色液晶显示和触摸屏控制部分、通信接口等。

1信号隔离输入电路信号隔离输入电路分为开关量隔离输入、模拟量隔离输入、高速电脉冲隔离输入,电路如图1所示,开关量的隔离输入较为简单,输入信号采用光耦进行隔离后送入单片的普通I/O,单片机用查询方式进行采集。

图1信号隔离输入电路高速电脉冲的采集需要注意的是,所设计的电路必须适应高速信号采集的要求,因此隔离光耦应采用高速光耦(如6N137等)。

采用查询方式采集高速脉冲容易造成采集数据的丢失,高速脉冲应采用中断方式进行采集。

模拟量隔离采集是本控制器的一个重点和难点,笔者之前采用了线性光耦等多种方式进行模拟量的隔离采集实验,均未获满意的效果。

这里采用一种先将模拟量数字化(使用AD7705),然后通过有光耦隔离的数据口送到CPU进行模拟量隔离采集的方式,效果理想。

2控制器输出电路控制器的输出方式有继电器输出、晶体管输出、模拟电压输出,如图2所示。

继电器输出和晶体管输出电路较为简单,这里不作详细的介绍。

广大ATmega128单片机实验报告实验一 系统认识实验

广大ATmega128单片机实验报告实验一 系统认识实验

广州大学学生实验报告开课学院及实验室:计机楼503 2014年 05月 08日学院机械与电气工程学院年级、专业、班电信122 姓名王健学号1207400051实验课程名称信号与系统成绩实验项目名称实验一系统认识实验指导老师庞志一、实验项目1、熟悉AVR Mega128学习板开发环境。

2、掌握C语言程序设计的编程及调试方法。

3、运行流水灯显示程序。

二、实验类型验证性。

三、计划学时2学时。

四、实验目的了解AVR Mega128学习板开发环境:1、硬件平台:AVR Mega128学习板,AVR下载/仿真器。

2、软件开发工具:ICCA VR C语言程序开发软件、AVR STUDIO软件调试平台、C语言。

五、实验设备与平台1、实验设备:计算机(PC),AVR Mega128学习板,AVR下载/仿真器。

2、平台:ICCA VR C语言程序开发软件、AVR STUDIO软件调试平台。

六、涉及的知识点AVR Mega128单片机、C语言程序设计。

七、实验内容与步骤1、AVR Mega128学习板,见下图:图 1.1 AVR Mega128学习板图1.2 AVR Mega128学习板电路结构图1.3 AVR Mega128学习板硬件系统组成连接系统步骤:1)连接AVR下载/仿真器:将AVR下载/仿真器的排线接到AVR Mega128学习板的CH2 JTAG 插座;使用USB连线将AVR下载/仿真器和PC 连接起来。

2)连接AVR Mega128学习板电源:将电源线的圆插头插入到AVR Mega128学习板的J1插座,另一端扁形插头插入PC的USB口,系统运行内置的程序。

2、修改、编译程序1)打开ICCA VR软件,选择Project下拉菜单的Open…打开工程。

图1.4 打开工程示意图2)打开例子程序里面的工程文件01LED.prj:图1.5 打开工程文件示意图3)打开工程后,工程栏里面显示工程包含文件信息,双击右边工程栏中的main.c文件,程序显示在编辑区,可以修改程序。

AVR 单片机 串口通信 串行通讯 详细例程介绍

AVR 单片机 串口通信 串行通讯 详细例程介绍
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;

AVR ATMEGA128 串口简单好使程序

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);

西安交通大学电子系统设计专题实验.(DOC)

西安交通大学电子系统设计专题实验.(DOC)

电子系统设计专题实验报告实验一、基于 AVR ATMega128 的硬件(PCB)设计 一、 实验目的和要求目的: (1)掌握印制电路板设计的基本原则及印制电路板的设计制作流程。

(2)掌握 Protel DXP 2004 SP2 软件的基本功能。

(3)在 Protel DXP 2004 SP2 软件平台,完成电路图到 PCB 图的设计制作过 程。

要求: (1)根据实验要求, 完成原理图的设计,并在 Protel DXP 2004 SP2 软件平台 上设计制作出相应的 PCB 图。

(2)要求 PCB 图布局布线美观,抗干扰性能强。

图中所用到的元件封装必须 符合实际的元件尺寸。

二、 实验设备及设计开发环境操作系统: XP 软件:Protel DXP 2004 SP 2三、 实验内容根据 ATMega128 的电路图设计一个单片机电路板,其中包括基本电路、复位 电路、时钟振荡器(ISP、键盘、RT Clock)。

MCU 原理图如图四、 实验步骤1. 创建新的工程项目,并新建原理图图纸 2. 设置工程参数,包括基本原理图参数设置。

3. 绘制原理图:在元件库中查找所用元件,并进行必要说明,如标签、总线、 端口等。

4. 放置各个模块与图纸合适位置,方便之后端口的对接及导入。

5. 对原理图进行电气检查,编译查错时,直至消除后保存原理图。

6. 创建新的 PCB 文件,并对 PCB 进行正确合理的参数设置(注意:在设置尺 寸时,不宜设置太小,不利于元件布局及布线),保存文件。

7. 导入原理图,将元件合理放置,原则:组合功能的元件(键盘开关)有序放 置在一起,使得各个元件布线交叉尽可能的少。

8. 对电路板自动布线,进行规则检查,注意检查 PCB 有没有缺线、缺元件的 情况修改错误的地方,并注意印刷线路的宽度设置,不宜太宽。

9. 重复步骤 8,对电路板布局不断进行修改优化,直到 PCB 的规则检查没有警告、错误,电路板元件布局思路清晰,布线方式正确合理。

基于Atmega128单片机的智能照明系统设计

基于Atmega128单片机的智能照明系统设计

科技广场2010.80引言自爱迪生点亮了我们的世界,照明就成了我们生活中不可或缺的一部分。

传统的照明系统配有传统镇流器的日光灯以100HZ的频率闪动,这种频闪会使眼睛疲劳。

智能照明系统的可调光电子镇流器是工作在40-70HZ的频率中,这样不仅克服了频闪,而且消除了起辉时的亮度不稳定,为人们提供了健康、舒适的环境。

最重要的是它能进行预设,它不仅可控制照明光源的发光时间、亮度,而且能在不同的应用场合做出相应的灯光场景。

智能照明系统是整个智能家居的基础部分,为了使用方便,我们采用人体红外感应作为感应开关,当有人走到感应区域的时候灯就会自动打开,较于传统开关灯更加的深入人心。

另外智能控制照明系统还能达到节约能源的目的,借助不同的智能元件对系统进行控制。

采用光敏检测对不同时间不同环境的光照度进行检测,检测后通过A/D转换控制LED灯的点亮频率和占空比来实现调光节能,这种自动调节亮度的方式,充分利用了室外的自然光,达到了环保节能效果。

1方案论证与比较该系统可自由控制灯的亮度、颜色和情景模式,另外还加入自动检测亮度调节和人体红外感应开关等功能。

首先确定了该系统分为控制模块(包括主机和分机控制)、触摸模块、电源模块、无线接收发送模块、人体红外感应模块和环境亮度检测模块构成。

系统框图如图一所示:基于Atmega128单片机的智能照明系统设计Atmega128-based Design of Intelligent Lighting System张仁朝谢谨Zhang Renchao Xie Jin(广州铁路职业技术学院,广东广州510430)(Guangzhou Institute of Railway Technology,Guangdong Guangzhou510430)摘要:本文主要采用AVR单片机Atmega128作为主机控制器,辅以太阳能充电电源模块、触摸控制模块、无线发送模块,分机采用单片机Atmega8L作为控制,以无线接收模块、人体红外感应检测模块、环境亮度检测模块、LED照明模块,总体构成了一个基于单片机控制的智能照明系统。

广大ATmega128单片机实验报告实验二 1x8键盘和LED显示实验

广大ATmega128单片机实验报告实验二 1x8键盘和LED显示实验

广州大学学生实验报告开课学院及实验室:计机楼503 2014年 05月 08日学院机械与电气工程学院年级、专业、班电信122 姓名王健学号1207400051实验课程名称信号与系统成绩实验项目名称实验2 1×8键盘和LED显示实验指导老师庞志一、实验项目利用连接在PE口的8个按键分别控制连接在PB口的8盏LED 的亮灭。

二、实验类型验证性。

三、计划学时2学时。

四、实验目的1、熟悉A VR单片机的I/O口配置方法。

2、掌握A VR单片机I/O口控制LED显示的方法。

3、掌握A VR单片机I/O口检测按键的方法。

五、实验设备与平台1、实验设备:计算机(PC),AVR Mega128学习板,AVR下载/仿真器。

2、软件平台:ICCA VR C语言程序开发软件,AVR STUDIO软件调试平台。

六、涉及的知识点A VR单片机I/O口的原理及其配置、LED亮灭控制、读按键。

七、实验相关知识1、电路原理图2.1 8个按键和8盏LED位置示意图图2.28个按键和8盏LED电路图2、与I/O口相关的寄存器8个按键8盏LED表2.1 端口A数据寄存器PORTAPORTA 位功能描述初始值PORTA[7:0] [7:0] 当引脚配置为输出时,若PORTAn为“1”,引脚输出高电平,否则输出低电平。

当引脚配置为输入时,若PORTAn 为“1”,上拉电阻将使能。

如果需要关闭这个上拉电阻,可以将PORTAn清零,或者将这个引脚配置为输出。

三态PORTA寄存器地址:0x3B表2.2 端口A数据方向寄存器DDRADDRA 位功能描述初始值DDRA7 [7] 1=输出0=输入0 DDRA6 [6] 1=输出0=输入0 DDRA5 [5] 1=输出0=输入0 DDRA4 [4] 1=输出0=输入0 DDRA3 [3] 1=输出0=输入0 DDRA2 [2] 1=输出0=输入0 DDRA1 [1] 1=输出0=输入0 DDRA0 [0] 1=输出0=输入0寄存器DDRA地址:0x3A表2.3 端口A输入引脚寄存器PINAPINA 位功能描述初始值PINA[7:0] [7:0] 通过读取PINAn可获得端口A各引脚电平:0=低电平1=高电平不定寄存器PINA地址:0x39表2.4 端口B数据寄存器PORTBPORTB 位功能描述初始值PORTB[7:0] [7:0] 当引脚配置为输出时,若PORTBn为“1”,引脚输出高电平,否则输出低电平。

Almel ATmega128 ATmega128L 可编程 Flash 说明书

Almel ATmega128 ATmega128L 可编程 Flash 说明书
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
+ -
PORTE DRIVERS
PORTB DRIVERS
PORTD DRIVERS
PORTG DRIVERS
PE0 - PE7
PB0 - PB7
PD0 - PD7
PG0 - PG4
RESET
XTAL1
XTAL2
3
2467L–AVR–05/04
AVR 内核具有丰富的指令集和 32 个通用工作寄存器。所有的寄存器都直接与算逻单元 (ALU) 相连接,使得一条指令可以在一个时钟周期内同时访问两个独立的寄存器。这种结 构大大提高了代码效率,并且具有比普通的复杂指令集微处理器高 10 倍的数据吞吐率。 ATmega128 具有如下特点 : 128K 字节的系统内可编程 Flash( 具有在写的过程中还可以读 的能力,即 RWW)、 4K 字节的 EEPROM、 4K 字节的 SRAM、 53 个通用 I/O 口线、 32 个通用工作寄存器、实时时钟 RTC、4 个灵活的具有比较模式和 PWM 功能的定时器 / 计 数器 (T/C)、两个 USART、面向字节的两线接口 TWI、 8 通道 10 位 ADC( 具有可选的可 编程增益 )、具有片内振荡器的可编程看门狗定时器、 SPI 串行端口、与 IEEE 1149.1 规 范兼容的 JTAG 测试接口 ( 此接口同时还可以用于片上调试 ),以及六种可以通过软件选 择的省电模式。空闲模式时 CPU 停止工作,而 SRAM、 T/C、 SPI 端口以及中断系统继 续工作;掉电模式时晶体振荡器停止振荡,所有功能除了中断和硬件复位之外都停止工 作,寄存器的内容则一直保持;省电模式时异步定时器继续运行,以允许用户维持时间基 准, 器件的其他部分则处于睡眠状态; ADC 噪声抑制模式时 CPU 和所有的 I/O 模块停止 运行,而异步定时器和 ADC 继续工作,以减少 ADC 转换时的开关噪声; Standby 模式 时振荡器工作而其他部分睡眠,使得器件只消耗极少的电流,同时具有快速启动能力;扩 展 Standby 模式则允许振荡器和异步定时器继续工作。 器件是以 Atmel 的高密度非易失性内存技术生产的。片内 ISP Flash 可以通过 SPI 接口、 通用编程器,或引导程序多次编程。引导程序可以使用任何接口来下载应用程序到应用 Flash 存储器。 在更新应用 Flash 存储器时引导 Flash 区的程序继续运行, 实现 RWW 操作。 通过将 8 位 RISC CPU 与系统内可编程的 Flash 集成在一个芯片内, ATmega128 为许 多嵌入式控制应用提供了灵活而低成本的方案。 ATmega128 AVR 有整套的开发工具, 包括 C 编译器, 宏汇编, 程序调试器 / 仿真器和评估 板。

基于ATmega128L单片机太阳能路灯的设计

基于ATmega128L单片机太阳能路灯的设计

基于ATmega128L单片机太阳能路灯的设计作者:熊慧芳来源:《无线互联科技》2015年第08期摘要:在全球经济不断发展的今天,人们的科技水平和生活质量也有了质的飞跃,人们对能源的需求日趋增长。

基于现有太阳能路灯系统的需求,文章设计出了一个基于ATmegal28L 单片机太阳能路灯。

该路灯主要采用ATmega128L主控芯片和Speic电路,可有效控制照明系统的电流电压输出,实现太阳能路灯控制系统的最佳运行。

实验结果表明该控制器运行稳定、可靠性高、性价比高,具有良好的市场前景。

关键词:ATmega128L单片机;太阳能路灯;设计1引言近年来,人们开始关注到再生能源,而再生能源在整个能源消耗中也占有较高的使用比例。

太阳能是目前较为常见的一种再生能源,符合我国低温光热利用范畴,具有一定的构建价值,且与太阳能相关的技术研究也日趋成熟。

太阳能路灯就是典型的太阳能光伏发电应用产品,它是以太阳能作为电能供给,用来提供夜间道路照明。

因为不需要消耗电网电能、不需要架设输电线路或挖沟铺设电缆,不污染环境、安全可靠,因而在公共照明及亮化装饰领域有着广阔的前景。

本文以单片机设计为基础,设计出了一种太阳能路灯只能控制系统,该系统可自动控制太阳能路灯的充电时间、点亮时间等功能设定。

2太阳能路灯系统的结构太阳能路灯系统由太阳能电池组件、太阳能控制器、蓄电池组、灯具等部分组成、)若需输出电源为交流220v或110v,还需要配置逆变器、)太阳能路灯系统结构如图1所示。

太阳能路灯系统是利用太阳能电池的光生伏特效应原理,白天太阳能电池吸收太阳能光子能量产生一定的电动势,通过控制器对蓄电池进行充电,将光能转换为电能贮存起来蓄电池充电到一定程度时控制器内的自动保护系统动作,切断充电电源。

到夜晚或路灯周围光照度较低时,蓄电池通过控制器给照明灯供电。

当蓄电池所储存的电能放完时,控制器要控制蓄电池不被过放电,保护蓄电池、控制器控制着蓄电池的供电,到设定的时间后切断,保证蓄电池的正常使用,整个系统还具有限荷保护和防需装置,以保护系统设备的过负载运行及免遭需击,保证系统设备的安全。

基于Atmega128单片机的智能照明系统设计

基于Atmega128单片机的智能照明系统设计

基于Atmega128单片机的智能照明系统设计
张仁朝;谢谨
【期刊名称】《科技广场》
【年(卷),期】2010(000)008
【摘要】本文主要采用AVR单片机Atmega128作为主机控制器,辅以太阳能充电电源模块、触摸控制模块、无线发送模块,分机采用单片机Atmega8L作为控制,以无线接收模块、人体红外摩应检测模块、环境亮度检测模块、LED照明模块,总体构成了一个基于单片机控制的智能照明系统.其突出点在于使用Atmega8L控制PWM输出.从而控制PT4115降压恒流源的驱动,最后实现了能自由控制LED灯的亮度、颜色以及情景可调的节能照明系统.该系统成本低、低功耗,大大提高了能源的使用效率.
【总页数】4页(P130-133)
【作者】张仁朝;谢谨
【作者单位】广州铁路职业技术学院,广东,广州,510430;广州铁路职业技术学院,广东,广州,510430
【正文语种】中文
【中图分类】TP273
【相关文献】
1.基于ATmega128L单片机太阳能路灯的设计 [J], 熊慧芳
2.基于ATmega128单片机的点阵广告屏设计 [J], 朱志强;包军卫;仲博;朱净霞;王

3.基于ATmega128单片机的智能蒸柜控制系统设计 [J], 赵敏华;胡娟平;李金
4.基于ATmega128单片机的自动投切开关电源设计 [J], 王建;赖奕佳
5.基于ATmega128单片机的非机动车电子警示闸设计 [J], 鹿龙奇;郭林
因版权原因,仅展示原文概要,查看原文内容请购买。

ATmega128,AVR单片机AD采样

ATmega128,AVR单片机AD采样
#include <avr/interrupt.h> //中断函数头文件
#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]);

基于AVR高速单片机的一种太阳能空调智能控制器

基于AVR高速单片机的一种太阳能空调智能控制器

基于A VR高速单片机的一种太阳能空调智能控制器摘要:基于A VR高速单片机ATMEGA128的一种太阳能空调智能控制器。

关键词:A VR ;ATMEGA128;太阳能空调;智能控制器1引言:随着能源的日益紧张,太阳能作为可再生能源驱动的太阳能空调逐渐被人们所利用,以热能驱动制冷装置的技术到目前已发展为比较成熟。

要使以光热转换的太阳能空调集成系统能够全天候运行,并且做到合理利用太阳能,更加节能环保,需要一个智能控制器。

本文主要介绍以A VR高速单片机ATMEGA128为核心在太阳能空调智能控制器上应用,实现夏季制冷,冬季供暖功能。

2 以热能驱动的太阳能空调系统介绍2.1太阳能空调系统组成2.2太阳能空调系统组成图说明:1-太阳能集热器;2-吸收式溴化锂机组;3-储热水箱;4-储冷水箱;5-空调末端风机盘管;6-电动三通阀;7-集热循环泵;8-储热水箱与溴化锂机组的供热循环泵;9-储冷水箱与溴化锂机组空调水循环泵;10-储冷水箱与空调末端风机盘管的供冷循环水泵;11-储热水箱与空调末端风机盘管的供暖循环水泵;12-管路;13-辅助电加热装置。

2.3太阳能空调工作原理简述储热水箱3的水通过集热循环泵7送至集热器1,将集热器1的热水储存在储热水箱3;热水通过供热循环泵8送至溴化锂机组驱动溴化锂机组进行制冷,制取的冷水通过空调水循环泵9储存在储冷水箱4;冷水通过末端供冷循环水泵10送至空调末端风机盘管5,冷水通过风机盘管5与室内的空气进行冷热交换,使房间温度降低;当末端需要供暖时,储存在储热水箱3的热水通过末端供暖循环水泵11送至空调末端风机盘管5,热水通过风机盘管5与室内空气进行冷热交换,使房间温度升高,实现供暖功能。

当天气不好时,而且热水温度无法进行制冷或者供暖时,储热水箱的热水通过供热循环水泵8送至辅助电加热装置进行加热。

3 太阳能空调智能控制器组成3.1在集热器出水口设置放置温度探头;在溴化锂机组热水入口放置温度探头和流量计;在溴化锂机组空调水出口放置温度探头和流量计,在末端供暖回水放置温度探头和流量计;在末端供冷回水放置温度探头和流量计。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PORTB = led; delay_ms(1000);
led <<=1; led |=0x01; k --; if(led == 0x7f)
led = 0xfc; } } if(mode == 6) //两个LED 一会左移,一会右移 { u8 led=0b11111100;
while(1) { while(led !=0b00111111) { PORTB = led; delay_ms(1000); led <<= 2; led |= 0b00000011;
void main(void) {
DDRA = 0x00; PORTA = 0xff; DDRB = 0xff; PORTB = 0xff;
if(mode == 1) ///只是单纯的闪,8个LED灯 一亮一灭 { while(1) { delay_ms(1000); PORTB ^= 0xff; // PORTB异或ff,PORTB与FF发生异或,得 // PORTB=0,再次异或得1,循环 } }
#define delay_us(x) _delay_us(x) #define delay_ms(x) _delay_ms(x) #define u8 unsigned char #define u16 unsigned int #define mode 2 /////// 这个地方写2 就执行下面的2, 写1就执行1,
}
}
}
if(mode == 3)
//单个LED灯 左移
{
u8 led = 0xfe;
while(1)
{
PORTB = led;
delay_ms(1000); Nhomakorabealed=(led <<=1) | 0x01;
if(led==0xff)
led = 0xfe;
}
}
if(mode == 4)
//单个LED灯 右移
if(mode == 2) { while(1) { u16 i,j=0x01; for(i=0;i<7;i++) { PORTB = j; delay_ms(1000); j<<=1; } j=0x80;
for(i=0;i<7;i++)
{
PORTB = j;
delay_ms(1000);
j>>=1;
} while(led != 0b11111100)
{ PORTB = led; delay_ms(1000);
led >>= 2; led |= 0b11000000; } } } }
///////////////////////本人也是刚学学习ATMega128芯片,如果我发的代码有不懂的可 以加QQ问,我们共同学习,QQ:710424648、///////////
///////////////////我使用的是 AVR studio 加 WinAVR环境////////
#include<avr/io.h> #include<util/delay.h>
{
u8 led = 0x7f;
u16 k = 64;
while(k!=0) { PORTB = led; delay_ms(1000); led = (led >>=1)|0x80; k --;
if(led == 0xff) led = 0x7f;
} } if(mode == 5) //两个个LED灯 左移 { u8 led = 0xfc; u16 k = 64; while(k!=0) {
相关文档
最新文档