ATmega16单片机蓝牙串口控制程序

2019-10-19来源: 51hei关键字:ATmega16  单片机  蓝牙  串口控制

/*

          HC-06蓝牙模块      ATmega16单片机

        

        VCC----------------VCC

        GND----------------GND

        TXD----------------RXD(PD0端口,设置输入)

        RXD----------------TXD(PD1端口,设置输出)

        

*/


/*ICCAVR7.2编程软件*/

/*使用内部8M晶振*/

/*手机搜索下载<蓝牙串口SPP>*/


/*头文件*/

#include

#include

/*宏定义*/

#define uchar unsigned char

#define uint unsigned int

/*全局变量*/

uchar rdata;

uchar flag=0;

/*端口初始化*/

void IO_init(void)

{          

         DDRA = 0XFF;

         DDRB = 0XF0;

         DDRC = 0XFF;

         //DDRD = 0XFF; 

        PORTA = 0X00;

        PORTB = 0X00;

        PORTC = 0XFF;

        //PORTD = 0XFF;

}

/*延时函数*/

void delayms(uint i)

{

    while(i--)

    {                          

            uint j;                

        for(j=1;j<=1332;j++);      

    } 

}

/*串口初始化,波特率设置*/

void uart_init()

{

         /*控制寄存器清零*/

        UCSRB=0x00;

        UCSRA=0x00;

        /*异步模式,禁止奇偶校验,停止位为1位,数据位为8位*/

        UCSRC=(1<

        /*9600bps @8.0000MHZ 不倍数*/

        UBRRH=(unsigned char)(0x33>>8);

        UBRRL=(unsigned char)0x33;

        /*接收、发送使能,接收中断使能*/

        UCSRB=(1<

        /*开全局中断*/

        SREG=BIT(7);

        /*配置TX为输出*/

        DDRD|=0x02;

}

/*数据发送*/

void uart_senddata(uchar data)

{

         /*第五位UDRE为高,数据寄存器空*/

        while(!(UCSRA&(BIT(UDRE))));

        /*发数据至UDR*/

        UDR=data;

        /*第六位TXC高, 发送结束*/

        while(!(UCSRA&(BIT(TXC)))); 

        /*置位TXC*/

        UCSRA|=BIT(TXC); 

}

/*数据接收中断服务*/

#pragma interrupt_handler uart_recdata:12

void uart_recdata(void)

{

         UCSRB&=~BIT(RXCIE);

        rdata=UDR;

        flag=1;

        UCSRB|=BIT(RXCIE);

}

/*主函数*/

void main(void)

{

        /*端口初始化*/

        IO_init();

        /*串口初始化*/

        uart_init();

        /*大循环*/

        while(1)

        {

                /*接收到蓝牙数据后发送*/

                if(flag)

                {

                         uart_senddata(rdata);

                        flag=0;

                }

                /*LED灯控制*/

                switch(rdata)

                {

                          case 0xFF: 

                                            PORTC=0xFE;

                                           delayms(2000);

                                           PORTC=0XFF; 

                                           break;

                        case 0xFE: 

                                            PORTC=0xFD;

                                           delayms(2000);

                                           PORTC=0XFF; 

                                           break;

                        case 0xFD: 

                                            PORTC=0Xfb;

                                           delayms(2000);

                                           PORTC=0XFF; 

                                           break;

                        case 0xFB: 

                                            PORTC=0xF7;

                                           delayms(2000);

                                           PORTC=0XFF; 

                                           break;

                }

        }

}


关键字:ATmega16  单片机  蓝牙  串口控制 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic477683.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:使用excel制作的AVR寄存器配置助手---轻松搞定AVR
下一篇:Atmega16l单相逆变器SPWM原理图PCB及源程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

Atmega32A驱动LCD1602显示屏
对于初学者来说,最烦躁的可能就是调试程序,往往小小一个问题,要找个一个小时,甚至几个小时才能解决,这个程序是刚调试完的,整整九个多小时啊,现在看着挺简单的,没调试好前根本不敢肯能调得好.高手别笑,初学者参考编程环境Atmel Studio 7.0 和Proteus 8仿真,说明:仿真和真实电路是有点区别的,仿真Proteus 8只能用内部晶振,最大8MHz,我的DIY板是16M,所以实际电路总是比仿真的跑快好多单片机源程序:/** LCD1602_AVR.h** Created: 2017/3/19 23:07:51*  Author: lyl*LCD1602的基本操作时序     
发表于 2019-11-11
Atmega32A驱动LCD1602显示屏
ATMEGA16L实现时间和温度的循环显示程序分享
//ICC-AVR application builder : 2/13 20:52:33/******************************************************************************** 版权:     ** 单片机:   ATMAGE16L* 晶振:     外部8MHz* 编译器:   ICC 7.22** 文件名:   main.c* 作者:     木子工作室* 版本:     1.0* 完成日期: * 功能描述: 在12M晶振下
发表于 2019-11-09
基于ATmega128单片机的红外控制电机系统源码
单片机源程序如下:#include "Main.h"SIGNAL(SIG_OVERFLOW0) //中断每1秒发一个数{                TCNT0 = 200;         TIMSK &= ~_BV(TOIE0);  //TIMSK中TOIE0置0        if(++g_bCount>1)        {     
发表于 2019-11-09
AVR stdio写的ATMEGA16控制步进电机正反转和速度
AVR stdio写的ATMEGA16控制步进电机正反转和速度,供大家免费参阅和批评适合初学者,总共七个按键  三个按键控制三个速度正转,三个按键控制三个速度反转,一个按键控制停止。本程序控制步进电机是和步进电机驱动器相连接的,所以脉冲只有一路,如果想直接连步进电机只需要稍加改动即可。 主程序预览:#define F_CPU 800000UL#include <avr/io.h>#include <util/delay.h>#define INT8U unsigned int#define INT16U unsigned intconst INT8U FFW[]={0x01
发表于 2019-11-09
AVR stdio写的ATMEGA16控制步进电机正反转和速度
atmega16与24l01按键主程序
; */typedef signed   char  int8;                    /* defined for signed 8-bits integer variable       有符号8位整型变量  */typedef unsigned short uint16;          
发表于 2019-11-08
ATmega8+PT100热敏电阻+AD824S proteus仿真与源程序
;: 2011-4-16Author  : Company : Comments: Chip type           : ATmega8Program type        : ApplicationClock frequency     : 8.000000 MHzMemory model        : SmallExternal RAM size   : 0Data Stack size     : 256
发表于 2019-11-08
ATmega8+PT100热敏电阻+AD824S proteus仿真与源程序
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved