实例介绍
//DMAVR-L型开发板RS485通信实验,程序具有收发一体的功能 //RS485之间通过双绞线连接,如果距离近,可以不使用120欧电阻匹配 //将2个DMAVR-L板子通过导线(双绞线、杜邦线等)连接,连接方式为A-A,B-B //将该程序分别下载到2个板子中,按任意一个板子的4个按键,都会将键值显示到另外一个板子的LED灯上 //显示LED为二进制形式,比如1,显示的是D1灭,其他的都亮 //发送端按下按键时,8个LED灯会同时灭掉 //也可以将485接口与485转232模块连接通信,通信操作方式一样,按4个按键发送不同的键值 //电脑端发送的话一定要16进制,单字节发送 //硬件相关的配置文件在Config.h里,自己建立项目时,需要复制到项目文件夹下 //编译环境 AVR Studio 4.17/AVR GCC 优化度-00 //系统时钟16MHZ,设置熔丝位为外部高频石英晶体振荡,启动时间4.1ms
//***********************************************************************
// 包含文件//***********************************************************************
#include <string.h>
#include <stdio.h>
#define F_CPU 16000000 // 单片机主频为16MHz,用于延时子程序,熔丝位必须设置到外部高频晶振才行
#include <util/delay.h>
#include <avr/io.h>
#include <avr/iom128.h>
#include <avr/interrupt.h> //中断信号头文件
#include <avr/pgmspace.h> //须增加的头文件,用来将数据存放在flash中
#include "Config.h" //配置头文件,与硬件相关的配置在这里更改
uchar key=0xFF;
uint tx_count=200,tx_flag=0xff;
static uchar A1,A2,A3;
uchar usart_rx_data=0xff;
volatile uchar key_check;
volatile uchar key_checkin;
uchar aa;
//***********************************************************************
// MSP430IO口初始化
//***********************************************************************
void Port_Init()
{
LEDDDR = 0xFF; //设置IO口方向为输出
LED = 0xFF; //PE口初始设置为FF
KEYDDR = 0x00; //设置为输入,并且要打开上拉电阻
KEYDDR = 0x00 | (1<<RS485_CTR_RDE);
KEYPort |= ((1 << PD1) |(1 << PD5)|(1 << PD6)|(1 << PD7)); //四位独立按键连接在PD1/PD5/PD6/PD7上
}
//**********************************************************************
// 键盘扫描子程序,采用逐键扫描的方式
//**********************************************************************
uchar keyboardscan(void)
{
key_checkin=KEYRead; //读取IO口状态,判断是否有键按下
key_checkin=KEYRead; //读取IO口状态,判断是否有键按下
key_checkin&= 0xE2; //读取IO口状态,判断是否有键按下
if(key_checkin!=0xE2) //IO口值发生变化则表示有键按下
{
delay_ms(20); //键盘消抖,延时20MS
key_checkin=KEYRead;
key_checkin&= 0xE2;
if(key_checkin!=0xE2) //再次读取状态,判断是否有按键按下
{
key_check=KEYRead;
switch (key_check & 0xE2)
{
case 0xE0:key=1;break; //S1按下
case 0xC2:key=2;break; //S2按下
case 0xA2:key=3;break; //S3按下
case 0x62:key=4;break; //S4按下
}
}
}
else
{
return(key);
}
}
//*************************************************************************
// MSP430串口1初始化
//*************************************************************************
void UART1_Init()
{
// DDRD |= (1<<PD3);
//DDRD &= ~(1<<PD2);
UCSR1A=0x00; //单倍速模式
UCSR1B=0x98; //接收中断允许,发送结束和寄存器空中断关闭,采用查询发送模式
UCSR1C=(1<<UCSZ11)|(1<<UCSZ10); //写UCSRC寄存器,异步通信无校验,8位数据1位停止位
UBRR1H=baud_h; //写波特率的值
UBRR1L=baud_l;
}
//*************************************************************************
// 串口1发送数据函数
//*************************************************************************
void Send_Byte(uchar usart_tx_data)
{
RS485_CTR1;
while(!(UCSR1A&(1<<UDRE1))); //等待发送寄存器空
UDR1=usart_tx_data; //写入发送数据
while(!(UCSR1A&(1<<TXC1))); //等待发送完毕
UCSR1A|=(1<<TXC1);
delay_ms(5); //切换之前先有个小延时
RS485_CTR0;
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论