AVR单片机程序
AVR单片机程序
![AVR单片机程序](https://img.taocdn.com/s3/m/65acaa2983c4bb4cf7ecd118.png)
* 文件名:闪烁灯.c* 杜邦线接法:用单条杜邦线把PD.0和J38的1端相连接。
***********************************************************************/ #include <avr/io.h>#define F_CPU 8000000 //这里的值是单片机工作的相关晶振频率#include <util/delay.h>#define LED1 PORTD|=~0XFE //LED=1 LED不亮#define LED0 PORTD&=0XFE //LED=0 LED发光int main(void){DDRD = 0x01; //PD0定义为输出,PD的其他端口为输入。
while(1){LED1;_delay_ms(500);LED0;_delay_ms(500);}}* 文件名:闪烁灯2.c* 创建人:东流,2012年2月10日* 版本号:1.0* 杜邦线接法:用8针杜邦线把PD和J38的1--8连接(PD0对应J38的1端)。
用杜邦线把PB0对应J38的9端。
用杜邦线把PB1对应J38的10端。
用杜邦线把PB2对应J38的11端。
用杜邦线把PB3对应J38的12端。
***********************************************************************/ #include <avr/io.h>#define F_CPU 8000000 //这里的值是单片机工作的相关晶振频率#include <util/delay.h>int main(void){DDRD = 0xff;DDRB = 0x0f;while(1){/*北面的三个LED亮*/PORTD = 0xf8;PORTB = 0xff;_delay_ms(300);/*东面的三个LED亮*/PORTD = 0xc7;PORTB = 0xff;_delay_ms(300);/*南面的三个LED亮*/PORTD = 0x3f;PORTB = 0xfe;_delay_ms(300);/*西面的三个LED亮*/PORTD = 0xff;PORTB = 0xf1;_delay_ms(300);/*北面的两个LED亮,中间一个不亮*/PORTD = 0xfa;PORTB = 0xff;_delay_ms(300);/*东面的两个LED亮,中间一个不亮*/PORTD = 0xd7;PORTB = 0xff;_delay_ms(300);/*南面的两个LED亮,中间一个不亮*/PORTD = 0xbf;PORTB = 0xfe;_delay_ms(300);/*西面的两个LED亮,中间一个不亮*/PORTD = 0xff;PORTB = 0xf5;_delay_ms(300);/*12个LED全亮*/PORTD = 0x00;PORTB = 0xf0;_delay_ms(200);/*12个LED全灭*/PORTD = 0xff;PORTB = 0xff;_delay_ms(200);/*12个LED全亮*/PORTD = 0x00;PORTB = 0xf0;_delay_ms(200);/*12个LED全灭*/PORTD = 0xff;PORTB = 0xff;_delay_ms(200);_delay_ms(500); //延时0.5秒}}* 文件名:闪烁灯2.c* 描述: 在LED上根据要求,进行不同的显示。
avr单片机的超声波程序
![avr单片机的超声波程序](https://img.taocdn.com/s3/m/12c4b553ad02de80d4d84094.png)
//时钟12M 芯片M16 输出单位cm#include <avr/io.h>#include<stdio.h>#include <util/delay.h>#define CPUFREQ 12#define Trig PB0#define Echo PB1void send_str(unsigned char *str){unsigned char i;for (i=0;i<strlen(str);i++){while ( !( UCSRA & (1<<UDRE)) );/* 将数据放入缓冲器,发送数据*/UDR = str[i];// UCSRA|=_BV(UDRE);//清零中断标志不能加这句}while ( !( UCSRA & (1<<UDRE)) );/* 将数据放入缓冲器,发送数据*/UDR = ' ';}static int uart_putchar(char c, FILE *stream){ if (c == '\n')uart_putchar('\r', stream);loop_until_bit_is_set(UCSRA, UDRE);UDR = c;return 0;}static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,_FDEV_SETUP_WRITE);int main(void ){unsigned int num=0;float distance;char str[10]={0};unsigned char temp,temp1;stdout = &mystdout; //必须加上UCSRB=_BV(RXEN)|_BV(TXEN)|_BV(RXCIE);//发送接收使能接收中断使能UBRRL=78;//12m时钟DDRB=0x01;PORTB|=_BV(1);while(1){star:PORTB|=_BV(0); //启动发送_delay_us(13);PORTB&=(~_BV(0));_delay_us(10); //防止自身干扰while((PINB&_BV(1))==0); //等待Echo变高TCNT1=0x0000;TCCR1B=0X02; //8分频开始计时此分频值决定了测量最大距离7mTIFR|=(_BV(TOV1));while((PINB&_BV(Echo))!=0) //直到Echo变低{if((TIFR&_BV(TOV1))!=0) //等待时间过长就重发{TCCR1B=0x00; //停止计时TIFR|=(_BV(TOV1));TCNT1=0;printf("overflow");_delay_ms(100); //延时避免自身干扰goto star;}}TCCR1B=0X00; //停止计时num=TCNT1;TCNT1=0;distance=(0.136*num)/12;//单位厘米求得距离num=0;printf("S=%f\n",distance);_delay_ms(1000);}}。
avr单片机gcc程序设计
![avr单片机gcc程序设计](https://img.taocdn.com/s3/m/1aebb54c7ed5360cba1aa8114431b90d6c8589d6.png)
AVR单片机GCC程序设计1. 介绍AVR单片机是一种基于哈佛架构的8位微控制器,具有高性能、低功耗和广泛的应用领域。
GCC是一种开源的编译器套装,可用于编译C、C++和其他编程语言。
本文将介绍AVR单片机的GCC程序设计,包括开发环境的搭建、程序的编写和调试等内容。
2. 开发环境搭建为了进行AVR单片机的GCC程序设计,我们需要搭建相应的开发环境。
以下是搭建开发环境的步骤:2.1 安装AVR工具链AVR工具链是AVR单片机编程的基础,它包含了编译器、汇编器、链接器等工具。
可以从AVR官方网站上下载并安装AVR工具链。
2.2 安装开发环境在进行AVR单片机GCC程序设计之前,需要安装一个适合的开发环境。
常用的开发环境有AVR Studio和Atmel Studio等。
可以根据个人需求选择一个适合的开发环境进行安装。
2.3 配置编译器在开发环境中配置编译器是非常重要的步骤。
需要将AVR工具链的路径添加到系统环境变量中,以便编译器能够找到相应的工具。
3. GCC程序编写在搭建好开发环境后,就可以开始编写GCC程序了。
以下是GCC程序编写的基本步骤:3.1 编写主函数GCC程序的入口是一个名为”main”的函数。
可以在这个函数中进行初始化操作和主程序的编写。
#include <avr/io.h>int main() {// 初始化代码while (1) {// 主程序代码}}3.2 配置引脚AVR单片机的GPIO引脚可以作为输入或输出使用。
可以使用AVR提供的头文件来配置引脚。
#include <avr/io.h>int main() {DDRB = 0xFF; // 将PB引脚配置为输出while (1) {// 主程序代码}}3.3 读写引脚可以使用AVR提供的函数来读写引脚的电平。
#include <avr/io.h>int main() {DDRB = 0xFF; // 将PB引脚配置为输出while (1) {PORTB = 0xFF; // 将PB引脚输出高电平// 延时PORTB = 0x00; // 将PB引脚输出低电平// 延时}}3.4 中断处理AVR单片机支持外部中断,可以在需要的时候触发中断处理函数。
AVR单片机程序
![AVR单片机程序](https://img.taocdn.com/s3/m/76a85193a1116c175f0e7cd184254b35eefd1ac0.png)
A VR单片机程序* 文件名:闪烁灯.c* 杜邦线接法:用单条杜邦线把PD.0与J38的1端相连接。
***********************************************************************/ #include <avr/io.h>#define F_CPU 8000000 //这里的值是单片机工作的有关晶振频率#include <util/delay.h>#define LED1 PORTD|=~0XFE //LED=1 LED不亮#define LED0 PORTD&=0XFE //LED=0 LED发光int main(void){DDRD = 0x01; //PD0定义为输出,PD的其他端口为输入。
while(1){LED1;_delay_ms(500);LED0;_delay_ms(500);}}/********************************************************************* 文件名:闪烁灯2.c* 创建人:东流,2012年2月10日* 版本号:1.0* 杜邦线接法:用8针杜邦线把PD与J38的1--8连接(PD0对应J38的1端)。
用杜邦线把PB0对应J38的9端。
用杜邦线把PB1对应J38的10端。
用杜邦线把PB2对应J38的11端。
用杜邦线把PB3对应J38的12端。
***********************************************************************/ #include <avr/io.h>#define F_CPU 8000000 //这里的值是单片机工作的有关晶振频率#include <util/delay.h>int main(void){DDRD = 0xff;DDRB = 0x0f;while(1){/*北面的三个LED亮*/PORTD = 0xf8;PORTB = 0xff;_delay_ms(300);/*东面的三个LED亮*/PORTD = 0xc7;PORTB = 0xff;_delay_ms(300);/*南面的三个LED亮*/PORTD = 0x3f;PORTB = 0xfe;_delay_ms(300);/*西面的三个LED亮*/PORTD = 0xff;PORTB = 0xf1;_delay_ms(300);/*北面的两个LED亮,中间一个不亮*/ PORTD = 0xfa;PORTB = 0xff;_delay_ms(300);/*东面的两个LED亮,中间一个不亮*/ PORTD = 0xd7;PORTB = 0xff;_delay_ms(300);/*南面的两个LED亮,中间一个不亮*/ PORTD = 0xbf;PORTB = 0xfe;_delay_ms(300);/*西面的两个LED亮,中间一个不亮*/ PORTD = 0xff;PORTB = 0xf5;_delay_ms(300);/*12个LED全亮*/PORTD = 0x00;PORTB = 0xf0;_delay_ms(200);/*12个LED全灭*/PORTD = 0xff;PORTB = 0xff;_delay_ms(200);/*12个LED全亮*/PORTD = 0x00;PORTB = 0xf0;_delay_ms(200);/*12个LED全灭*/PORTD = 0xff;PORTB = 0xff;_delay_ms(200);_delay_ms(500); //延时0.5秒}}/********************************************************************* 文件名:闪烁灯2.c* 描述: 在LED上根据要求,进行不一致的显示。
基于AVR单片机的计算器程序
![基于AVR单片机的计算器程序](https://img.taocdn.com/s3/m/3a766590250c844769eae009581b6bd97f19bc06.png)
基于AVR单片机的计算器程序在当今的数字化世界中,计算器已成为我们日常生活和工作中不可或缺的工具。
尽管市面上存在许多不同类型的计算器,但基于AVR单片机的计算器程序具有更高的灵活性和可定制性。
本文将介绍如何使用AVR单片机开发一个简单的计算器程序。
一、硬件需求1、AVR单片机:选择一个适合你需求的AVR单片机,如ATmega328P,ATmega128等。
2、按键:你需要为每个数字和操作符提供按键。
3、LED或其他显示设备:用于显示计算器的输出结果。
4、编程器和调试器:用于将程序烧录到单片机上,并进行调试。
二、软件需求1、AVR-GCC:用于编写、编译和链接AVR单片机的程序。
2、AVR-Libc:这是AVR单片机的标准C库。
3、一个文本编辑器或集成开发环境(IDE):用于编写和调试程序。
三、程序设计1、定义按键和LED的接口:你需要定义每个按键和LED与单片机的接口。
这通常涉及设置单片机的特定引脚为输入或输出模式。
2、编写按键处理函数:然后,你需要编写一个函数来处理按键的输入。
这个函数应该能够检测按键的按下和释放,并相应地更新计算器的状态。
3、编写计算逻辑:接下来,你需要编写逻辑来处理各种计算操作。
这可能包括加减乘除、括号、取余等操作。
4、编写显示更新函数:你需要编写一个函数来更新LED上的显示内容。
这个函数应该根据当前的状态来决定显示什么结果。
四、调试和测试在完成程序设计后,你需要使用调试器将程序烧录到单片机上,并进行测试。
你可以通过单步执行程序来检查每个函数是否按预期工作,并确保计算器的整体行为符合预期。
五、结论基于AVR单片机的计算器程序具有很高的灵活性和可定制性,使大家可以根据需要开发出各种不同的计算器。
通过使用AVR单片机,大家可以控制整个系统的硬件和软件,从而能够创建出满足大家特定需求的计算器。
尽管这是一个复杂的项目,但只要大家掌握了AVR单片机的基础知识,大家就可以成功地完成这个项目。
GCC开发AVR单片机程序-静态库的使用
![GCC开发AVR单片机程序-静态库的使用](https://img.taocdn.com/s3/m/bc4399cf5fbfc77da269b1b3.png)
GCC开发AVR单片机程序
静态库的使用
本文档本只介绍GCC 开发AVR程序时,静态库的生成与使用,不涉及其它内容,更多内容请参考其它文档。
1.静态库的生成
编译.O文件后,调用avr-ar.exe 生成静态库文件。
静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。
命令格式如下:
avr-ar -cr libnew.a new.o
-c:create的意思。
-r:replace的意思,表示当插入的模块名已经在库中存在,则替换同名的模块。
如果若干模块中有一个模块在库中不存在,avr-ar显示一个错误消息,并不替换其他同名模块。
默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。
2.静态库的优点
使用静态库可减小程序代码体积,(只有被调用的函数被链接)。
内存占用更少(只有有函数调用或使用变量的.O文件中的全局变量被分配空间)。
3.静态库的使用
在链接.elf文件时加入静态库文件名,并在搜索路径中包含该库文件的路径,确保链接器能找到该静态库文件。
命令格式如下:
avr-g++.exe -o bin\test.elf obj\main.o -mmcu=atmega128 libnew.a。
avr单片机gcc程序设计
![avr单片机gcc程序设计](https://img.taocdn.com/s3/m/501324e1b04e852458fb770bf78a6529647d35a7.png)
avr单片机gcc程序设计一、前言AVR单片机是一种常见的嵌入式系统处理器,广泛应用于各种电子设备中。
GCC是一款常用的C语言编译器,也可以用于AVR单片机程序设计。
本文将介绍如何使用GCC进行AVR单片机程序设计。
二、准备工作1. 安装GCC编译器GCC编译器可以在Linux、Windows和Mac OS X等操作系统上安装。
安装方法请参考相关文档。
2. 安装AVR-GCC工具链AVR-GCC工具链包括编译器和调试器等工具,可以在Linux、Windows和Mac OS X等操作系统上安装。
安装方法请参考相关文档。
3. 准备开发板选择一款支持AVR单片机的开发板,并连接到计算机上。
4. 编写代码使用C语言编写程序,并保存为.c文件。
三、编译过程1. 编译源代码打开命令行终端,进入.c文件所在目录,执行以下命令:avr-gcc -mmcu=atmega328p -Wall -Os -o main.o main.c其中,-mmcu选项指定了目标单片机型号;-Wall选项启用所有警告信息;-Os选项启用优化;-o选项指定输出文件名。
2. 生成可执行文件执行以下命令:avr-gcc -mmcu=atmega328p -o main.elf main.o其中,-mmcu选项指定了目标单片机型号;-o选项指定输出文件名。
3. 生成HEX文件执行以下命令:avr-objcopy -j .text -j .data -O ihex main.elf main.hex其中,-j选项指定要复制的段;-O选项指定输出格式。
四、烧录过程使用AVR ISP编程器将HEX文件烧录到目标单片机中。
五、调试过程可以使用AVR-GDB进行调试。
首先需要在编译源代码时添加-g选项,生成带有调试信息的可执行文件。
然后执行以下命令:avr-gdb main.elf进入GDB调试界面后,可以使用各种GDB命令进行调试。
六、结语本文介绍了AVR单片机GCC程序设计的基本过程,包括准备工作、编译过程、烧录过程和调试过程。
AVR 单片机驱动12864典型程序
![AVR 单片机驱动12864典型程序](https://img.taocdn.com/s3/m/abf2f210c281e53a5802ffb5.png)
RS_0; //指令======= 先写好指令--- 开使能---赋值---关闭使能
RW_0; //写
E_1; // 使能
PORTA=c; //
#include <iom16v.h>
#include <macros.h>
#define uint unsigned int
#define uchar unsigned char
////////////////////////管脚定义及电平///////
#define RS_1 PORTD|=BIT(6); //寄存器选择,高数据
E_0; //
}
//////////////////////////写数据到LCD//////////
void wdata(uchar c)
{
// lcd_busy(); //判断LCD忙
RS_1; //数据========先写好数据--- 开使能---赋值---关闭使能
RST_1;
delay(10);
}
////////////////判断LCD忙函数/////////
/*void lcd_busy(void)
{
uchar busy;
RS_0;
RW_1; //读指令寄存器
PORTA=0x00; //数据口清零
}
E_0;
delay(10); //否则,禁能
}
DDRA=0xff;
E_0; //禁能
}*/
////////////////////////////写指令到LCD/////////
第三章 AVR单片机程序开发工具
![第三章 AVR单片机程序开发工具](https://img.taocdn.com/s3/m/8394c2126edb6f1aff001fa2.png)
• • •
•
•
JTAG接口有四个引脚。以JTAG的术语来 说,这些引脚组成了测试访问端口TAP。这 些引 脚是: ? TMS: 测试模式选择。此引脚用来实现 TAP 控制器各个状态之间的切换。 ? TCK: 测试时钟。JTAG 操作是与TCK 同 步的。 ? TDI:测试数据输入--需要移位到指令寄存 器或数据寄存器(扫描链)的串行输入数据。 ? TDO:测试数据输出-- 自指令寄存器或数 据寄存器串行移出的数据。
2.ICCAVR C语言开发环境
ImageCraft 的ICCAVR 是一种使用符合 ANSI 标准的C 语言来开发微控制器MCU程 序的一个工具,它是一个综合了编辑器和工程 管理器的集成工作环境IDE。
下面是ICC AVR软件自带的例子,发光二极管流水灯实验。采用ICC AVR自带的LED项目学习,省去了文件编写及工程创建等一大堆过程。 让初学者近快完成第一个实验,等到成功后再来学习一些创建过程及 相关设置(先实践再理论),ICC AVR编程例子。
3.AVR Studio调试与仿真
ATMEL AVR Studio集成开发环境(IDE),可 使用汇编语言进行开发(使用其它语言需 第三方软件协助),集软硬件仿真、调试、 下载编程于一体。ATMEL官方及市面上通 用的AVR开发工具都支持AVR Studio。
(1)AVR Studio之建立、打开相关调试文件
--使用JTAG ICE mkII仿真器,硬件仿真 与软件仿真不同的是:在打开项目文件的时候, 如下图:选择“JTAG ICE”,其它的步骤与软件仿真 一致,见上。
下面简单介绍使用AVRStudio进行仿真调试
1.开始调试(Start Debugging) 此命令将启动调试模式,并使所有的调试控制命令处于有效。通常在调试模 式下不能编辑程序。此命令将连接调试平台,装载目标文件并执行复位操作。 2.停止调试(Stop Debugging) 此命令将停止调试过程,并断开与调试平台的连接,进入编辑模式.
AVR单片机adc程序
![AVR单片机adc程序](https://img.taocdn.com/s3/m/78da261da300a6c30c229fb6.png)
#include <avr/io.h>#include <util/delay.h>#include <avr/interrupt.h> //中断函数头文件#define BAUD 9600 //波特率设定#define uchar unsigned char#define uint unsigned intvolatile uchar hh;uchar Transmit;uchar addata;void port_init(void);//端口初始化配置void usart_init(void);//USART寄存器设置void usart_putchar(uchar cTXData);//字节发送函数void usart_putstring(unsigned char *pcString);//发送字符串函数void ad_init(void);//ADC初始化uint ad_getdata();int main(void){uchar delay3s;port_init();usart_init();ad_init();usart_putchar("AD testing progrem");usart_putchar("the voliate is: ");sei();while(1){addata = (int)((long)ad_getdata()*5010/1024);//将获得的AD值转换为电压值 //单位为mv。
usart_putchar(addata/1000 + 0x30);//发送千位usart_putchar('.');//发送小数点usart_putchar(addata%1000/100 + 0x30);//发送百位usart_putchar(addata%100/10 + 0x30);//发送十位usart_putchar(addata%10 + 0x30);//发送个位usart_putchar('V');usart_putchar(0x0d); //usart_putchar(0x0a); // AD值发送结束,回车换行for(delay3s = 0;delay3s < 30;delay3s++) //延时3S{_delay_ms(90);}}}void port_init(){PORTD = 0X00;//USART的发送接收端口分别为PD0和PD1DDRD |= (1<<PD1);//PD0为接收端口,置为输入口;PD1为发送端口,置为输出口PORTA = 0X00;DDRA = 0x00; //ADC通道设置为输入口,高阻态}void usart_init(){UBRRL = (F_CPU / BAUD / 16 - 1) % 256; //波特率设置UBRRH = (F_CPU / BAUD / 16 - 1) / 256;UCSRB |= (1 << RXCIE) | (1 << RXEN) | (1 << TXEN); //发送使能}void usart_putchar(uchar cTXData)//字节发送函数{while(!(UCSRA&(1<<UDRE)));UDR = cTXData;while(!(UCSRA&(1 <<TXC )));//检查发送是否结束}void usart_putstring(unsigned char *pcString){while (*pcString){usart_putchar(*pcString++);}usart_putchar(0x0D);usart_putchar(0x0A); //结尾发送回车换行}//接收中断函数ISR(USART_RXC_vect ){unsigned char Rev;Rev = UDR; //从USART I/O数据寄存器-UDR中读出数据usart_putchar(Rev); //将接收到的数据发送hh = 1;usart_putchar(0x0D);usart_putchar(0x0A); //结尾发送回车换行}void ad_init(void){ADMUX |= (1 << REFS0);//设置ADC的参考电压源为AVccADCSRA |= (1 << ADEN)|(1 << ADPS2)|(1 << ADPS1);//使能ADC,64分频}uint ad_getdata(){ADCSRA |= (1 << ADSC);//AD开始转换while(!(ADCSRA&(1<<ADIF)));//等待转换完成ADCSRA |= (1 << ADIF);//清零ADC中断标志位,未用中断,不能由硬件清零,只能软件清零return ADC;//返回ADC值}。
个人总结的AVR的ATMEGA16L单片机程序
![个人总结的AVR的ATMEGA16L单片机程序](https://img.taocdn.com/s3/m/15b7c2cbda38376baf1faedb.png)
ATMAGE 16 的C语言程序ATMAGE 16 的C语言程序 (1)一、PB0 口的PB0.1 LED 发光管闪烁的程序: (3)二、PA0、PB0、PC0口的LED 发光管闪烁的程序: (5)三、I/O口的输入与输出 (6)四、跑马灯 (8)五、数码管计数显示设计 (10)六、控制直流电机正反转 (16)七、单片机的定时器(T/C0)应用 (20)AVR原理图 (24)一、PB0 口的PB0.1 LED 发光管闪烁的程序:#include <avr/io.h>int main( void ){unsigned char i, j, k,led=0;DDRB=0xFF; /* all outputs */while (1){if(led)PORTB|=0X01; /* |使最后一位为1 */elsePORTB&=0XFE; /*&最后一位为0 */ led=!led;//延时for (i=0; i<255; i++)for(j=0; j<255;j++)k++;}}/////////////////////////////////////////////////////////////// #include <avr/io.h>int main( void ){unsigned char i, j, k,led=0;DDRB=0xFF; /* all outputs */while (1){if(led)PORTB=0Xfe;elsePORTB=0Xff;led=!led;for (i=0; i<255; i++) //延时for(j=0; j<255;j++)k++;}}二、PA0、PB0、PC0口的LED 发光管闪烁的程序:#include <avr/io.h>int main( void ){unsigned char i, j, k,led=0;DDRA=0xFF;//为输出DDRB=0xFF;DDRC=0XFF;while (1){if(led){PORTA|=0XFF;PORTB|=0XFF;PORTC|=0XFF;}else{PORTA&=0X00;PORTB&=0X00;PORTC&=0X00;}led=!led;//取反////////////延时////////////////for (i=0; i<255; i++)for(j=0; j<255;j++)k++;}}三、I/O口的输入与输出#include <avr/io.h>///////////////////延时us//////////////////void delay_us(int t){dot--;while(t>1);}///////////////////延时ms///////////////// void delay_ms(unsigned int t){while(t!=0){delay_us(1142);t--;}}///////////////////主程序/////////////////////int main(void){DDRA = 0xff; /* all outputs */ DDRB = 0xff; /* all outputs */ DDRC = 0xff; /* all outputs */PORTA=0XFF;PORTB=0XFF;PORTC=0XFF;while(1){//***IO口输出低电平有效,如:0X01为十六进制数,二进制表示为00000001B,再取反////////A口输出//////PORTA=~0X01; // ~表示取反delay_ms(100);//延时N秒PORTA=~0X02;delay_ms(100);PORTA=~0X04;delay_ms(100);PORTA=~0X08;delay_ms(100);PORTA=~0X10;delay_ms(100);PORTA=~0X20;delay_ms(100);PORTA=~0X40;delay_ms(100);PORTA=~0X80;delay_ms(100);PORTA=0X00;//循环结束全亮////////B口输出//////PORTB=~0X01;delay_ms(100);PORTB=~0X02;delay_ms(100);PORTB=~0X04;delay_ms(100);PORTB=~0X08;delay_ms(100);PORTB=~0X10;delay_ms(100);PORTB=~0X20;delay_ms(100);PORTB=~0X40;delay_ms(100);PORTB=~0X80;delay_ms(100);PORTB=0X00;////////C口输出//////PORTC=~0X01;delay_ms(100);PORTC=~0X02;delay_ms(100);PORTC=~0X04;delay_ms(100);PORTC=~0X08;delay_ms(100);PORTC=~0X10;delay_ms(100);PORTC=~0X20;delay_ms(100);PORTC=~0X40;delay_ms(100);PORTC=~0X80;delay_ms(100);PORTC=0X00;}}四、跑马灯#include <avr/io.h>#define uchar unsigned char#define uint unsigned intvoid delayms(uint i){uint j;for(;i!=0;i--){for(j=8000;j!=0;j--);}}void horse(uchar i){switch (i){case 1:PORTB=0X01;break; case 2:PORTB=0X03;break; case 3:PORTB=0X07;break; case 4:PORTB=0X0f;break; case 5:PORTB=0X1f;break;case 6:PORTB=0X3f;break; case 7:PORTB=0X7f;break; case 8:PORTB=0Xff;break; default:break;}}void main(void){uchar i;DDRB=0XFF;PORTB=0XFF;PORTB=0X00;delayms(10);while(1){for(i=1;i<9;i++){horse(i);delayms(10);}for(i=7;i!=0;i--){horse(i);delayms(10);}}五、数码管计数显示设计1、两个按键PB0和PB1分别控制加减。
AVR单片机 mega16 C语言 数码管程序
![AVR单片机 mega16 C语言 数码管程序](https://img.taocdn.com/s3/m/9a9b4f8b6529647d27285297.png)
number=~BIT(number-1); //调整位选(指定时是1~6,而操作的时候是0~5)
PORTB=number; //输出位选
PORTA|=BIT(BITLK); //更新位选
Delayus(50); //调整时序
PORTA&=~BIT(BITLK); //锁存位选
函数名称: Cycle_smg_display
功 能: 6个数码管从右向左循环滚动显示指定的内容(循环一次)
参 数: *pdata--显示内容数组地址
返回值 : 无
/********************************************/
void Cycle_smg_display(uchar *pdata)
Delayus(50); //调ห้องสมุดไป่ตู้时序
PORTA&=~BIT(BITLK); //锁存位选
PORTB=SEGMENT[data]; //输出段选
PORTA|=BIT(SEGLK); //更新段选
Delayus(50); //调整时序
PORTA&=~BIT(SEGLK); //锁存段选
{
uchar i,j;
for(i=0;i<240;i++) //共滚动6次,每次内容显示40个循环
{
for(j=0;j<6;j++) //扫描6个数码管
{
One_smg_display(pdata[(i/40+j)%6],j+1);//显示
Delayus(2000); //调整显示时间和亮度(时间越长亮度越高,但是太长数码管就闪了)
AVR单片机Bootloader程序
![AVR单片机Bootloader程序](https://img.taocdn.com/s3/m/1d10c5b10129bd64783e0912a216147917117e84.png)
1.程序逻辑BootLoader的升级协议是基于128字节数据块的Xmodem通信协议,采用CRC16校验。
Xmodem 协议的帧格式Byte1Byte2Byte3Byte4~Byte131Byte132~Byte133控制字符包序号包序号反码128字节数据校验和升级协议具体流程:序程redaoLtooB机片单RVA下位机发送升级请求密码,等待上位机的升级密码boot96,5秒的时间内若上位机没有发送升级密码,下位机进入用户程序。
上位机有升级指令发送时,下位机间断发送’C’等待上位机接收并开始发送数据,若数据连续三次校验错误那么进入用户程序,成功发送后进入用户程序执行刚写入的程序。
2.平台及程序结构基于ATmega328PB 单片机,20M 晶振,AtmelStudio平台。
包括下图四个文件。
3.程序代码3.1.Bootloader.h 头文件#include <avr/io.h>#include <avr/wdt.h>#include <avr/boot.h>#include <avr/pgmspace.h>#ifndef BOOTLOADER_H_#defineBOOTLOADER_H_#ifndef F_CPU #define F_CPU20000000UL //20M 时钟频率#endif#define BAUDRATE 4800//串口波特率#define BAUDREG ((unsigned int)((F_CPU *10)/(16UL *BAUDRATE)-5)/10)//超时次数#define TimeOutCnt25//发送'C'的最大次数#define TimeOutCntC 10//同步时间间隔(ms)#define timeclk 200//同步密码长度#define CONNECTCNT 6//Boot 区起始地址#define BootStart 0x3C00UL //由具体硬件设置#define RS4850#ifRS485AVR单片机BootLoader程序#define RS485PORT xxxxx #define RS485TXEn xxxxx#define RS485Enable()PORTREG(RS485PORT)|=(1<<RS485TXEn)#define RS485Disable()PORTREG(RS485PORT)&=~(1<<RS485TXEn)#endif //同步密码unsigned char KEY []={'b','o','o','t','9','6',0x0E ,0x1C ,0x39,0x14,0x28,0x57,0xAA };//用户程序起始地址#define PROG_START 0x0000#define BUFFERSIZE 128#define BUFSIZE BUFFERSIZE//接收缓冲区unsigned char buf [BUFSIZE ];unsigned char bufptr ,pagptr ;unsigned char ch ,cl ;//Flash 地址unsigned int FlashAddr ;//提示信息const char msg1[20]="Waiting for password";const char msg2[8]="Time out";const char msg3[23]="Waiting to receive file";const char msg4[17]="Upgrade successed";const char msg5[14]="Upgrade failed";//Xmoden 控制字符#define XMODEM_NUL 0x00#define XMODEM_SOH 0x01#define XMODEM_STX 0x02#define XMODEM_EOT0x04#define XMODEM_ACK 0x06#define XMODEM_NAK0x15#define XMODEM_CAN 0x18#define XMODEM_EOF0x1A #define XMODEM_RWC 0x43//'C'#define DataInCom()((UCSR0A)&(1<<RXC0))#define ReadCom()UDR0#endif /*BOOTLOADER_H_*/AVR单片机BootLoader程序3.2.Bootloader.c 文件#include <avr/io.h>#include <compat/ina90.h>#include <avr/interrupt.h>#include <avr/sleep.h>#include <util/delay.h>#include <avr/pgmspace.h>#include <stdlib.h>#include "BootLoader.h"#include "usart.h"sram global ;//全局变量结构体//使用定时器1:产生以毫秒为单位的时间void TimerInit (){OCR1A =(unsigned int )(timeclk *(F_CPU /(1024*1000.0f )));//200msTCCR1A =0;//普通端口TCCR1B =(1<<WGM12)|(1<<CS12)|(1<<CS10);//CTC1024分频}//更新一个Flash 页void write_one_page (unsigned char *buf ){boot_page_erase (FlashAddr );//擦除FLASH 指定页boot_spm_busy_wait ();for (pagptr =0;pagptr <SPM_PAGESIZE ;pagptr +=2)//SPM_PAGESIZE 128{boot_page_fill (pagptr ,buf [pagptr ]+(buf [pagptr +1]<<8));//填充BootLoader 缓冲页}boot_page_write (FlashAddr );//缓冲写入FLASH 指定页boot_spm_busy_wait ();}//跳转到用户程序void quit (){boot_rww_enable ();//RWW 区读使能(*((void (*)(void ))PROG_START ))();//用户程序起始地址PROG_START 0x0000}int main (void ){AVR单片机BootLoader程序unsigned char cnt ;unsigned char packNO ;unsigned char crch ,crcl ;unsigned int crc ;unsigned char li ;_CLI ();//关中断USART_Init ();_delay_ms (1000);TimerInit ();//定时器初始化,CTC 普通端口USART_Transmit ((unsigned char *)msg1,20);//Waiting for passwordcnt =TimeOutCnt ;//超时次数255s 1s 发送一个等待密码cl =0;while (1){if (TIFR1&(1<<OCF1A ))//自动重载{TIFR1|=(1<<OCF1A );if (cl ==CONNECTCNT )//密码长度6break ;cnt --;if (cnt ==0){USART_Transmit ((unsigned char *)msg2,8);//Time outquit ();}if (cnt %5==0)USART_Transmit ((unsigned char *)msg1,20);//Waiting for password}if (DataInCom ()){if (ReadCom ()==KEY [cl ])//接收密码cl ++;elsecl =0;}}USART_Transmit ((unsigned char *)msg3,23);//Waiting to receive file cnt =TimeOutCntC ;//发送'C'超时次数10while (1){AVR单片机BootLoader程序if (TIFR1&(1<<OCF1A )){TIFR1|=(1<<OCF1A );WriteCom (XMODEM_RWC );//发送'C'cnt --;if (cnt ==0){USART_Transmit ((unsigned char *)msg2,8);//Time out quit ();}}if (DataInCom ()){if (ReadCom ()==XMODEM_SOH )//接收数据SOH 0x01break ;}}TCCR1B =0;packNO =0;cnt =0;FlashAddr =0x0000;do {packNO ++;bufptr =0;ch =WaitCom ();cl =~WaitCom ();if ((packNO ==ch )&&(packNO ==cl )){WriteCom (XMODEM_ACK );for (li =0;li <BUFFERSIZE ;li ++)//接收128个字节数据buf [bufptr ++]=WaitCom ();crch =WaitCom ();crcl =WaitCom ();crc =crc16(buf ,BUFFERSIZE );//CRC 校验ch =crc /256;cl =crc %256;if ((crch ==ch )&&(crcl ==cl ))//如果校验符合{if (FlashAddr <BootStart ){write_one_page (buf );//写flash 写一页FlashAddr +=SPM_PAGESIZE ;AVR单片机BootLoader程序}WriteCom (XMODEM_ACK );//发送ACKcnt =0;}else {WriteCom (XMODEM_NAK );//发送NAK cnt ++;}}else {WriteCom (XMODEM_NAK );//发送NAKcnt ++;}if (cnt >3)//无应答次数break ;}while (WaitCom ()!=XMODEM_EOT );//等待全部接收XMODEM_EOT 0x04WriteCom (XMODEM_ACK );_delay_ms (50);if (cnt ==0){USART_Transmit ((unsigned char *)msg4,17);//升级成功Upgrade successedquit ();}else {USART_Transmit ((unsigned char *)msg5,14);//Upgrade failed while (1);//应该是升级失败不让进入用户程序避免程序错乱带来不必要的麻烦}quit ();//跳转到用户程序return 0;}3.3.usart.h 头文件#ifndef USART_H_#define USART_H_#define RS485_RX PORTD &=~((1<<PORTD2)|(1<<PORTD3))//Receiving #define RS485_TXPORTD |=(1<<PORTD2)|(1<<PORTD3)//Transmitting#define RS485_HIGHZ PORTD |=(1<<PORTD3);PORTD &=~(1<<PORTD2)//High-Z void USART_Init (void );//串口初始化AVR单片机BootLoader程序unsigned char WaitCom ();//接收单字节void WriteCom (unsigned char dat );//发送单字节void USART_Transmit (unsigned char *data ,char num );//发送函数unsigned int crc16(unsigned char *buf ,unsigned char n );//CRC 校验//#define IDEL 0x00//#define ID_ACCORD 0X01//#define COMMAND 0x02//#define READ_COMMAND 0x03//#define WRITE_COMMAND 0x04#define TRANSMITTING 0x10//#define DATA_READY 0x08//#define KEY_MODE 0x07//按键模式//#define GetFreq_MODE 0x80//测试模式//#define BOOTLAODER_MODE 0xf0//Booterloader 升级#define USARTBUFNUM GPIOR1//串口字节个数typedef struct {unsigned char ptr ;unsigned char state ;unsigned char command ;unsigned char savestate ;//保存状态unsigned char *usartbuf ;unsigned char comBuffer [150];}sram ;extern sram global ;//全局变量结构体#endif /*USART_H_*/art.c 文件#include <avr/io.h>#include <compat/ina90.h>#include <avr/interrupt.h>#include <avr/sleep.h>#include <util/delay.h>#include <avr/wdt.h>#include "usart.h"//#include "wdtg.h"SIGNAL (USART0_RX_vect ){}AVR单片机BootLoader程序SIGNAL (USART0_UDRE_vect ){}SIGNAL (USART0_TX_vect ){}void USART_Init (void ){DDRD |=(1<<DDD1)|(1<<DDD2)|(1<<DDD3);//485芯片控制引脚输出PORTD |=(1<<PORTD2)|(1<<PORTD3);//184芯片引脚控制输出高TX PORTD |=(1<<PORTD1)|(1<<PORTD0);//TX 输出高,RX 上拉输入//UBRR0=143;//4800UBRR0=259;//1434800(11059200/16/4800-1)UCSR0B =(1<<RXEN0);//串口0接收使能UCSR0C =(1<<UCSZ01)|(1<<UCSZ00);RS485_RX ;}unsigned char WaitCom (){while (!(UCSR0A &(1<<RXC0)));return UDR0;}void WriteCom (unsigned char dat ){RS485_TX ;/*发送状态*/UCSR0B =(1<<TXEN0);/*发送使能*/UDR0=dat ;while (!(UCSR0A &(1<<TXC0)));UCSR0A |=(1<<TXC0);RS485_RX ;/*接收状态*/UCSR0B =(1<<RXEN0);/*接收使能*/}void USART_Transmit (unsigned char *data ,char num ){char i ;RS485_TX ;/*发送状态*/UCSR0B =(1<<TXEN0);/*发送使能*/for (i =0;i <num ;i ++){while (!(UCSR0A &(1<<UDRE0)));/*等待数据寄存器为空*/AVR单片机BootLoader程序UDR0=*data ;data ++;}UCSR0B =(1<<TXEN0);/*发送使能*/while ((UCSR0A &(1<<TXC0))==0);/*等待发送结束*/UCSR0A |=(1<<TXC0);/*发送结束标志位清零*/RS485_RX ;/*接收状态*/UCSR0B =(1<<RXEN0);/*接收使能*/}//CRC 校验unsigned int crc16(unsigned char *buf ,unsigned char n ){unsigned char j ;unsigned char i ;unsigned int crc ,t ;crc =0;for (j =n ;j >0;j --){crc =(crc ^(((unsigned int )*buf )<<8));for (i =8;i >0;i --){t =crc <<1;if (crc &0x8000)t =t ^0x1021;crc =t ;}buf ++;}//ch =crc /256;//cl =crc %256;return crc ;}AVR单片机BootLoader程序。
AVR单片机教程
![AVR单片机教程](https://img.taocdn.com/s3/m/181f7f50a31614791711cc7931b765ce05087a32.png)
AVR单片机教程一、AVR单片机的基本概念AVR(Alf and Vegard's RISC processor)是一种基于精简指令集(RISC)架构的微控制器,由爱尔兰的Atmel公司开发。
AVR系列微控制器以其高性能和低功耗而闻名,常用于嵌入式系统中。
AVR单片机使用C 语言进行编程,可以通过简单的指令完成各种功能。
二、AVR单片机的硬件结构AVR单片机由一个中央处理单元(CPU)、存储器、输入输出(IO)端口和定时器等组成。
其中,CPU是控制单元,负责执行指令;存储器用于存储程序和数据;IO端口用于与外部设备进行数据交互;定时器用于生成时间延迟。
三、AVR单片机的编程方法1. 安装开发环境:首先,需要安装一个开发环境,如Atmel Studio 等。
安装完成后,打开开发环境并创建一个新项目。
2.配置项目:在创建新项目后,需要配置项目的属性。
包括选择单片机型号、时钟频率等。
3.编写程序:使用C语言编写单片机程序。
可以通过调用库函数实现各种功能,如控制IO口、定时器等。
编写程序时,需要注意编码规范和注释。
4.编译程序:编写完程序后,需要将其编译成机器语言。
在开发环境中,可以通过点击编译按钮来完成编译。
5.烧录程序:将编译好的程序烧录到单片机中。
可以使用外部编程器或直接通过IDE进行烧录。
6.调试程序:将程序烧录到单片机后,可以进行调试。
可以通过添加断点、监视变量等方式来进行调试,以查找和修复错误。
四、AVR单片机的应用示例```c#include <avr/io.h>#include <avr/delay.h>void delayMs(uint16_t delay)while (delay--)_delay_ms(1);}int main(void)DDRA,=(1<<PA0);//将引脚PA0设置为输出while (1)PORTA,=(1<<PA0);//输出高电平delayMs(500); // 延时500msPORTA&=~(1<<PA0);//输出低电平delayMs(500); // 延时500ms}return 0;```以上示例代码实现了一个LED灯的闪烁,通过控制引脚PA0的电平状态来控制LED灯的亮灭。
AVR单片机C语言编程
![AVR单片机C语言编程](https://img.taocdn.com/s3/m/894c450d2f3f5727a5e9856a561252d380eb20ea.png)
输入输出端口的电压范围通常为0-5V。
输入输出端口的编程实例
• 以下是一个简单的AVR单片机输入输出端口的C语言编程示例
输入输出端口的编程实例
```c
int main(void)
输入输出端口的编程实例
{
DDRB |= (1 << DDB0); // 设置PB0为输出端口
串口发送数据
使用AVR单片机的发送缓冲寄存器,可以将数据发送到串口。
串口接收数据
使用AVR单片机的接收缓冲寄存器,可以接收来自串口的数据。
串口通信的扩展方法
扩展串口通信协议
根据实际需要,可以扩展串口通信协议,增加数据 传输的效率和可靠性。
多设备串口通信
通过多设备串口通信技术,可以实现多个设备之间 的数据传输和共享。
网络化串口通信
将串口通信与网络技术结合,可以实现远程控制和 数据传输。
06
AVR单片机的中断处理控 制
中断处理的工作原理
中断源
01
02
03
中断优先级
中断向量
AVR单片机具有多种中断源,包 括定时器/计数器中断、外部中 断、串行通信中断等。
多个中断同时发生时,需要根据 中断优先级来决定哪个中断先被 处理。
看门狗定时器控制
总结词
通过AVR单片机的C语言编程,可以实现看门狗定时器的控制。
详细描述
AVR单片机的看门狗定时器是一种用于系统恢复的机制。在C语言编程中,可 以使用内置的定时器/计数器或外部中断,实现对看门狗定时器的控制。
系统时钟设置控制
总结词
通过AVR单片机的C语言编程,可以实现对系统时钟 的设定和控制。
HMC5883程序AVR单片机
![HMC5883程序AVR单片机](https://img.taocdn.com/s3/m/419654dd3186bceb19e8bb5a.png)
//========基于A Tmega8的HMC5883L测试程序============= //** 模块:3-轴数字罗盘//** 用途:测磁场强度//** 协议:IIC 详细读写协议,请参考相关资料#include <iom8v.h>#include <macros.h>#include <math.h>#include <stdio.h>typedef unsigned char uchar;typedef unsigned int uint;/*LCD引脚定义*/#define CS_set PORTD |=BIT(6)#define CS_clr PORTD &=~BIT(6)#define SID_set PORTD |=BIT(7)#define SID_clr PORTD &=~BIT(7)#define CLK_set PORTB |=BIT(0)#define CLK_clr PORTB &=~BIT(0)/*IIC端口定义*/#define SCL_set PORTC |=(1<<5)#define SCL_clr PORTC &=~(1<<5)#define SDA_set PORTC |=(1<<4)#define SDA_clr PORTC &=~(1<<4)#define SDA_in DDRC &=~(1<<4)#define SDA_out DDRC |=(1<<4)#define SlaveAddress 0x3c //定义器件在IIC总线中的从地址uchar Rec_Data[6];/*延时函数*/void Delay(uint t){while(t--){}}/*LCD12232端口初始化*/void PORT_Init(void){ //LCD端口设置为输出,且为高电平DDRD |=(1<<6)|(1<<7);DDRB |=(1<<0);PORTD |=(1<<6)|(1<<7);PORTB |=(1<<0);DDRC |=(1<<5);//SCL设置为输出}/*LCD12232写数据*/void Send_DATA(uchar Data,uchar O_Z) {uchar i,Order;CS_clr;switch(O_Z){case 0 : Order=0xf8;break;//写指令case 1 : Order=0xfa;break;//写数据default : break;}CLK_clr;CS_set;for(i=0;i<8;i++){if(Order&0x80)SID_set;elseSID_clr;CLK_clr;CLK_set;Order<<=1;}Order=Data;Order &=0xf0;for(i=0;i<8;i++){if(Order&0x80)SID_set;elseSID_clr;CLK_clr;CLK_set;Order<<=1;}Order=Data;Order<<=4;for(i=0;i<8;i++){if(Order&0x80)SID_set;elseSID_clr;CLK_clr;CLK_set;Order<<=1;}CS_clr;Delay(20);}/*显示一字符串*/void Dis_str(uchar Addr,uchar *str){Send_DATA(Addr,0);Delay(30);while(*str!='\0'){Send_DATA(*str,1);str++;Delay(20);}}/*LCD12232初始化*/void Init_LCD(void){Delay(20000);Send_DATA(0x06,0);Delay(200);Send_DATA(0x02,0);Delay(200);Send_DATA(0x0c,0);Delay(200);Send_DATA(0x80,0);Delay(200);Send_DATA(0x30,0);Delay(200);Send_DATA(0x01,0);Delay(5000);}/********************************************* HMC5883L程序部分*******************************************/ /*起始信号*/void IIC_Start(void){SDA_out;SDA_set;SCL_set;Delay(35);SDA_clr;Delay(35);SCL_clr;}/*停止信号*/void IIC_Stop(void){SDA_out;SDA_clr;SCL_set;Delay(35);SDA_set;Delay(35);}/*接收应答信号*/uchar IIC_RecAck(void){uchar A;SDA_in;SCL_set;Delay(35);if(PINC & (1<<4))A=1;elseA=0;SCL_clr;Delay(35);return A ? 1:0;}/*向IIC总线发送一个字节数据*/void HMC5883_Send_Byte(uchar Dat){uchar i;SDA_out;for(i=0;i<8;i++){if(Dat & 0x80)SDA_set;elseSDA_clr;SCL_set;Delay(35);SCL_clr;Delay(35);Dat<<=1;}IIC_RecAck();}/*从IIC总线接收一个字节数据*/uchar HMC5883_Rec_Byte(void){uchar i,Dat=0;SDA_in;SDA_set;for(i=0;i<8;i++){Dat<<=1;SCL_set;Delay(35);if(PINC & (1<<4))Dat |=0x01;SCL_clr;Delay(35);}return Dat;}/*单字节写HMC5833*/void Single_Write_HMC5883(uchar Address,uchar Dat) {IIC_Start();HMC5883_Send_Byte(SlaveAddress);HMC5883_Send_Byte(Address);HMC5883_Send_Byte(Dat);IIC_Stop();}/*单字节读HMC5833*//*uchar Single_Read_HMC5883(uchar Addr){uchar Value;IIC_Start();HMC5883_Send_Byte(SlaveAddress);HMC5883_Send_Byte(Addr);IIC_Start();HMC5883_Send_Byte(SlaveAddress+1);V alue=HMC5883_Rec_Byte();IIC_SendAck(1);IIC_Stop();return Value;}*///初始化HMC5883,根据需要请参考pdf进行修改****void HMC5883_Init(void){Single_Write_HMC5883(0x02,0x00);}/***************************************************主函数*************************************************/void main(void){uchar N;int X,Y,Z;double Angle;uint Acr;Delay(60000);PORT_Init();Init_LCD();//Dis_str(0x80,"HMC5883L");HMC5883_Init();//HMC5883初始化do{Multiple_Read_HMC5883();//连续读出数据,存储在Rec_Data[]中X=Rec_Data[0]<<8 | Rec_Data[1];//Combine MSB and LSB of X Data output registerZ=Rec_Data[2]<<8 | Rec_Data[3];//Combine MSB and LSB of Z Data output registerY=Rec_Data[4]<<8 | Rec_Data[5];//Combine MSB and LSB of Y Data output registerAngle= atan2((double)Y,(double)X)*(180/3.14159265)+180;//单位:角度(0~360)Angle*=10;Acr=(uint)Angle;Send_DATA(0x82,0);Send_DATA(0x20,1);Send_DATA(Acr%10000/1000+0x30,1);Send_DATA(Acr%1000/100+0x30,1);Send_DATA(Acr%100/10+0x30,1);//Send_DATA('.',1);//Send_DATA(Acr%10+0x30,1);Send_DATA(0xa1,1);Send_DATA(0xe3,1);if((Acr>=0 && Acr<=300) || (Acr>=3300))Dis_str(0x92,"【东】");if(Acr>=600 && Acr<=1200)Dis_str(0x92,"【南】");if(Acr>=1500 && Acr<=2100)Dis_str(0x92,"【西】");if(Acr>=2400 && Acr<=3000)Dis_str(0x92,"【北】");for(N=12;N>0;N--)Delay(50000);}while(1);}。
AVR单片机Mega128 485通信程序
![AVR单片机Mega128 485通信程序](https://img.taocdn.com/s3/m/10295b7fbe1e650e52ea996f.png)
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;}}三、仿真原理图。
题目: 根据多种方法写出的AVR单片机流水灯C语言程序
![题目: 根据多种方法写出的AVR单片机流水灯C语言程序](https://img.taocdn.com/s3/m/a604af0a777f5acfa1c7aa00b52acfc789eb9f06.png)
题目: 根据多种方法写出的AVR单片机
流水灯C语言程序
题目:根据多种方法写出的AVR单片机流水灯C语言程序
介绍:
单片机流水灯是入门研究单片机的必备项目,通过研究实现单片机流水灯的过程可以让人更好地了解单片机的基本原理和编程方法。
本文将介绍两种方法编写AVR单片机流水灯的C语言程序。
方法一:
使用PORTA口输出高低电平,控制LED灯的亮灭。
具体实现过程如下:
1. 定义PORTA口输出为8位输出模式。
2. 定义output变量为初始值0x01。
3. 循环输出output变量的每一位,即可控制LED灯亮灭的顺序。
4. 循环输出时,可以通过暂停一段时间的方法控制流水灯亮灭的速度。
方法二:
使用函数编写流水灯程序,可以实现代码的可复用性,便于以后的项目开发。
具体实现过程如下:
1. 定义led_flow函数,函数有三个参数:流水灯的持续时间、流水灯的速度、流水灯的亮灭顺序。
2. 在led_flow函数中,定义PORTA口输出为8位输出模式,控制LED灯亮灭的操作与方法一相同。
3. 在调用led_flow函数时,传入相应的参数即可实现流水灯的亮灭效果。
本文介绍了两种方法编写单片机流水灯的C语言程序,旨在为初学者提供编写单片机程序的知识和技能。
希望本文对大家有所帮助。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
uchar table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};
DDRD = 0xff;//PD口定义为输出
DDRB = 0x0f;//PB口定义为输出
PORTD = 0xff;//PD口赋值高电平
PORTB = 0x0f;//PB口赋值高电平
while(1)
{/*南北红灯亮、东西绿灯亮、持续时20秒*/
LED1L;LED2M;LED3M;
LED4M;LED5M;LED6L;
#include <avr/io.h>
#define F_CPU 8000000 //这里值是单片机工作相关晶振频率
#include <util/delay.h>
#define uchar unsigned char
//定义北面三个灯两灭
#define LED1L PORTD&=0XFE //LED1=0 LED1红灯发光
/*12个LED全灭*/
PORTD = 0xff;
PORTB = 0xff;
_delay_ms(200);
/*12个LED全亮*/
PORTD = 0x00;
PORTB = 0xf0;
_delay_ms(200);
/*12个LED全灭*/
PORTD = 0xff;
PORTB = 0xff;
_delay_ms(200);
LED4L;LED5M;LED6M;
LED7M;LED8M;LED9L;
LED10L;LED11M;LED12M;
for(i=0;i<20;i++)
{
_delay_ms(1000);
}
/*南北黄灯亮、东西红灯亮、持续时间5秒*/
LED1M;LED2L;LED3M;
LED4L;LED5M;LED6M;
#define LED8L PORTD&=0X7F //LED8=0 LED8黄灯发光
#define LED9L PORTB&=0XFE //LED9=0 LED9绿灯发光
#define LED7M PORTD|=~0XBF //LED7=1 LED红灯不亮
#define LED8M PORTD|=~0X7F //LED8=1 LED黄灯不亮
/********************************************************************
*文件名:闪烁灯.c
*杜邦线接法:用单条杜邦线把PD.0和J381端相连接。
***********************************************************************/
用8针排线把PB口和J131-8连接(PB.7接J131端)。
***********************************************************************/
#include <avr/io.h>
#define F_CPU 8000000 //这里值是单片机工作相关晶振频率
*文件名:闪烁灯2.c
*杜邦线接法:用8针杜邦线把PD和J381--8连接(PD0对应J381端)。
用杜邦线把PB0对应J389端。用杜邦线把PB1对应J3810端。
用杜邦线把PB2对应J3811端。用杜邦线把PB3对应J3812端。
***********************************************************************/
LED1L;LED2M;LED3M;
LED4M;LED5L;LED6M;
LED7L;LED8M;LED9M;
LED10M;LED11L;LED12M;
for(i=0;i<5;i++)
{
_delay_ms(1000);
}
/*南北绿灯亮、东西红灯亮、持续时间20秒*/
LED1M;LED2M;LED3L;
#include <avr/io.h>
#define F_CPU 8000000 //这里值是单片机工作相关晶振频率
#include <util/delay.h>
#define LED1 PORTD|=~0XFE //LED=1 LED不亮
#define LED0 PORTD&=0XFE //LED=0 LED发光
PORTD = 0xff;
while(1)
{
temp = 0xf7;
for(i=0; i<4; i++)
{
PORTB = temp;//把值赋给P2口
_delay_ms(100);//延时(10毫秒* j)秒
temp = temp >> 1;//值右移一位
temp = temp | 0x08;
}
PORTB = 0xff;
#define LED10M PORTB|=~0XFD //LED10=1 LED红灯不亮
#define LED11M PORTB|=~0XFB //LED11=1 LED黄灯不亮
#define LED12M PORTB|=~0XF7 //LED12=1 LED绿灯不亮
int main(void)
{unsigned char i;
*文件名:闪烁灯2.c
*创建人:东流,2012年2月10日
*版本号:1.0
*杜邦线接法:用8针杜邦线把PD和J381--8连接(PD0对应J381端)。
用杜邦线把PB0对应J389端。
用杜邦线把PB1对应J3810端。
用杜邦线把PB2对应J3811端。
用杜邦线把PB3对应J3812端。
***********************************************************************/
PORTD = 0xbf;
PORTB = 0xfe;
_delay_ms(300);
/*西面两个LED亮,中间一个不亮*/
PORTD = 0xff;
PORTB = 0xf5;
_delay_ms(300);
/*12个LED全亮*/
PORTD = 0x00;
PORTB = 0xf0;
_delay_ms(200);
#define LED3M PORTD|=~0XFB //LED3=1 LED绿灯不亮
//定义东面三个灯两灭
#define LED4L PORTD&=0XF7 //LED4=0 LED4红灯发光
#define LED5L PORTD&=0XEF //LED5=0 LED5黄灯发光
#define LED6L PORTD&=0XDF //LED6=0 LED6绿灯发光
PORTB = 0xff;
_delay_ms(300);
/*东面三个LED亮*/
PORTD = 0xc7;
PORTB = 0xff;
_delay_ms(300);
/*南面三个LED亮*/
PORTD = 0x3f;
PORTB = 0xfe;
_delay_ms(300);
/*西面三个LED亮*/
PORTD = 0xff;
PORTB = 0xf1;
_delay_ms(300);
/*北面两个LED亮,中间一个不亮*/
PORTD = 0xfa;
PORTB = 0xff;
_delay_ms(300);
/*东面两个LED亮,中间一个不亮*/
PORTD = 0xd7;
PORTB = 0xff;
_delay_ms(300);
/*南面两个LED亮,中间一个不亮*/
temp = 0x7f;
for(i=0; i<8; i++)
{
PORTD = temp;//把值赋给P1口
_delay_ms(100);//延时(10毫秒* j)秒
temp = temp >> 1;//值右移一位
temp = temp | 0x80;
}
PORTD=0xff;
}
}
/********************************************************************
LED7L;LED8M;LED9M;
LED10M;LED11M;LED12L;
/*这里,我们调用_delay_ms()函数时候,参数不要过大,最好不要超过1000,怕引起溢出*/
for(i=0;i<20;i++)
{
_delay_ms(1000);//延时20个1秒,总共时间20秒
}/*南北ຫໍສະໝຸດ 灯亮、东西黄灯亮、持续时间5秒*/
_delay_ms(500); //延时0.5秒
}
}
/********************************************************************
*文件名:闪烁灯2.c
*描述:在LED上根据要求,进行不同显示。
*杜邦线接法:用8针杜邦线把PD和J381--8连接(PD0对应J381端)。
#define LED4M PORTD|=~0XF7 //LED4=1 LED红灯不亮
#define LED5M PORTD|=~0XEF //LED5=1 LED黄灯不亮