最新范文 方案 计划 总结 报告 体会 事迹 讲话 倡议书 反思 制度 入党

avr单片机中使用MODBUS协议的方法

日期:2020-06-05  类别:最新范文  编辑:一流范文网  【下载本文Word版

avr单片机中使用MODBUS协议的方法 本文关键词:机中,协议,方法,avr,MODBUS

avr单片机中使用MODBUS协议的方法 本文简介:Avr单片机中使用modbus协议的方法有幸做了个项目,其中使用到了单片机和上位机通讯的程序,上位机用组态实现功能,探索了些方法,写出来和大家分享一下,这些知识本不是什么秘密,本人参考了许多资料,自己整合了一下。每种程序都是算法多样,最终功能实现就行。大家做单片机串口通讯时是不是总想有一种以不变应万

avr单片机中使用MODBUS协议的方法 本文内容:

Avr单片机中使用modbus协议的方法

有幸做了个项目,其中使用到了单片机和上位机通讯的程序,上位机用组态实现功能,探索了些方法,写出来和大家分享一下,这些知识本不是什么秘密,本人参考了许多资料,自己整合了一下。每种程序都是算法多样,最终功能实现就行。

大家做单片机串口通讯时是不是总想有一种以不变应万变的思想,就是在底层单片机硬件和软件不变的情况下,去适应任何上位机软件系统,当然可以实现,这就需要用到标准的通讯协议了,以下我就和大家分享一下我做的modbus协议(单片机端),如果上位机用组态软件的情况下,你直接使用通讯协议就行它会自动和单片机通讯。

大家在设计单片机程序时首先要定义好数据结构,先构想一下需要哪些采集数据,上位机需要查询什么数据,数据的类型和全局与否,运算的精度等等。然后把上位机需要采集的数据用一个数组管理起来,便于modbus协议的实现。单片机里串口通讯程序尽量用查询发送,中断接收的方式,要定义发送缓冲区和接收缓冲区,以便提高系统效率。以下程序用gcc实现,单片机用avr单片机。

ISR(USART0_RX_vect)//串口0接收中断服务程序

{

volatile

unsigned

char

status,data;

cli();//关中断

status

=

UCSR0A;//ucsr0a赋值状态标志

data

=

UDR0;//接收的数据放入data变量

usart0_rx_complete=0;//接收完成标志赋值0,还没有完成

if

((status

//接收缓冲区指针加一

switch

(usart0_rx_count)

{

case

1:

if(data==add//第一个字节是地址,读入内部本机地址进行比较

{

usart0_rx_buf[0]=data;

TIMSK0=0x01;//启动定时器0,进行超时控制

}

else

{

usart0_rx_count=0;

}

break;

case

2:

if

(((data==0x03)||(data==0x01)||(data==0x05)||(data==0x10))==0)//如果第一位不等于读指令0x03,01,05,10功能码,则清接收缓冲区指针

{

usart0_rx_count=0;

}

else//等于这几个功能码则进行,则将他放入接收数组,并预计接收数组长度,不是10码时都是8个字节

{

usart0_rx_buf[1]=data;

if

(data!=0x10)

{

rx0_buf_size=8;

}

}

break;

case

3:

usart0_rx_buf[2]=data;

break;

case

4:

usart0_rx_buf[3]=data;

break;

case

5:

usart0_rx_buf[4]=data;

break;

case

6:

usart0_rx_buf[5]=data;

break;

case

7:

usart0_rx_buf[6]=data;//10码时接收的字节计数

if

(usart0_rx_buf[1]==0x10)

{

rx0_buf_size=9+usart0_rx_buf[6];

}

break;

case

8:

usart0_rx_buf[7]=data;//1,用10功能码时有效的数据位,system_reg_data的数据,这里规定最多接收26个字节(不带crc)

break;

case

9:

usart0_rx_buf[8]=data;//2

break;

case

10:

usart0_rx_buf[9]=data;//3

break;

case

11:

usart0_rx_buf[10]=data;//4

break;

case

12:

usart0_rx_buf[11]=data;//5

break;

case

13:

usart0_rx_buf[12]=data;//6

break;

case

14:

usart0_rx_buf[13]=data;//7

break;

case

15:

usart0_rx_buf[14]=data;//8

break;

case

16:

usart0_rx_buf[15]=data;//9

break;

case

17:

usart0_rx_buf[16]=data;//10

break;

case

18:

usart0_rx_buf[17]=data;//11

break;

case

19:

usart0_rx_buf[18]=data;//12

break;

case

20:

usart0_rx_buf[19]=data;//13

break;

case

21:

usart0_rx_buf[20]=data;//14

break;

case

22:

usart0_rx_buf[21]=data;//15

break;

case

23:

usart0_rx_buf[22]=data;//16

break;

case

24:

usart0_rx_buf[23]=data;//17

break;

case

25:

usart0_rx_buf[24]=data;//18

break;

case

26:

usart0_rx_buf[25]=data;//19

break;

case

27:

usart0_rx_buf[26]=data;//20

break;

case

28:

usart0_rx_buf[27]=data;//21

break;

case

29:

usart0_rx_buf[28]=data;//22

break;

case

30:

usart0_rx_buf[29]=data;//23

break;

case

31:

usart0_rx_buf[30]=data;//24

break;

case

32:

usart0_rx_buf[31]=data;//25

break;

case

33:

usart0_rx_buf[32]=data;//26

break;

case

34:

usart0_rx_buf[33]=data;//27

break;

case

35:

usart0_rx_buf[34]=data;//28

break;

}

if(usart0_rx_count>=rx0_buf_size)//串口0接收到了指定个数的数组则

{

usart0_rx_count=0;//接收缓冲区指针清零

usart0_rx_complete=1;//串口0接收完标志

time0_num=0;//串口0的中断次数清零。它是超时控制的依据

TIMSK0=0x00;//收到数据后则停止定时器0不进行超时控制

}

}

else

{

usart0_rx_count=0;

}

sei();

//开中断

}

以上中断接收程序可以实现上位机发来的0x03,01,05,10功能码指令,并且可以自动判断上位机发来10功能码的包长。大家首先要深入了解modbus通讯协议的内涵,仔细体会各行程序的含义。其中本人加入了对通讯的超时控制,实际应用中很有必要。

前面已经将上位机发来的命令,用中断接收的方式存入了单片机的接收缓冲区,中断服务程序不能执行太长时间,所以要将对指令的解读放入了主程序里。

把对modbus指令的解读程序列出,如下,只给出框架,因为每种应用是不一样的,需自己加入。

void

run_modbus(void)

{

switch

(usart0_rx_buf[1])

{

//判断主机发来的modbus

功能码是什么

case

0x01://读继电器输出的当前状

要加入回传数据

break;

case

0x03://功能码03

要加入回传数据

break;

case

0x05://05功能码

要加入回传数据

break;

case

0x10://10功能码

要加入回传数据

break;

}

}

以上程序完全依赖一个提供给上位机数据的数组,自己要仔细排列好数据顺序,定义好长度。

这里的程序使用一年有余完全正确和稳定。

以上是基于串口实现的,信息高速发达的今天串口已经力不从心了。关于通讯,建议大家面向未来,了解一下can总线网络通信,嵌入式工业以太网网络通信、zigbee无线网络通信、IrDA无线遥控通信、wifi无线网络通信、gprs通信等等,本人喜欢zigbee,精力有限不能全学啊。有心得会继续分享。

篇2:单片机实现MIDI音乐知识介绍

单片机实现MIDI音乐知识介绍 本文关键词:单片机,知识,介绍,音乐,MIDI

单片机实现MIDI音乐知识介绍 本文简介:单片机实现MIDI音乐相关知识介绍1.乐音基础知识2.midi知识3.乐理知识4.乐器分类和波形乐音基础知识:从听觉角度来讲,声音主要由四种属性——高低、长短、强弱、色彩(即常说的音色)。其中:1.音的高低是由发音源在一定时间内的振动次数(频率)来决定的。振动次数越多,频率越高,音也就越高。反之则低

单片机实现MIDI音乐知识介绍 本文内容:

单片机实现MIDI音乐相关知识介绍

1.

乐音基础知识

2.

midi知识

3.

乐理知识

4.

乐器分类和波形

乐音基础知识:

从听觉角度来讲,声音主要由四种属性——高低、长短、强弱、色彩(即常说的音色)。其中:

1.

音的高低是由发音源在一定时间内的振动次数(频率)来决定的。振动次数

越多,频率越高,音也就越高。反之则低;

2.

音的长短是由发音源振动时所持续的时间来决定的。持续的时间越长,音越长,反之则短;

3.

音的强弱取决于由发音源的振动幅度(振幅),幅度越大,音越强,幅度小音就弱;

4.

而发音源的材质、形状及泛音数的多少则决定了音色。

声音的以上这四种属性,在音乐的表现中都是非常重要的,其中又以“高低”和“长短”最为重要。比如一首歌曲,本来是由人声演唱的,但是如果我们把它改编为器乐曲、并且减小音量,虽然改变了音的长短和音色,但是仍然可以很容易地分辨出它的旋律。但是,如果我们把这首乐曲中每个声音的长短、高低随意的改变

,其原来的旋律马上会受到严重的破坏——面目全非呀!由此可见,无论是创作、演奏、歌唱的时候都应该对声音的高低(音高)和长短(即后面

要谈到的“时值”、“节奏”)加以特别的注意。

由于物体在振动的时候并不是总是规则的,所以声音又有“乐音”和“噪音”之分。规则振动发出的是乐音,反之则称为噪音。在音乐中,用的最多的是乐音,但是这并不代表噪音就不属于音乐的组成部分,乐队中的大部分节奏打击乐

器所发出的声音就属于噪音,但它同样具有非常丰富的音乐表现力,甚至成为了现代通俗音乐中不可缺少的部分。

最后,还需要再提到的一点是——我们平时听到的某一个音都不只是一个单独的纯正的音在响,而是许多个声音的结合,我们称之为“复合音”。这是因为物体在振动的时候不仅整体在振动,而且各个部分也在振动。以吉他为例,在我们拨响一根琴弦地的同时,这根琴弦的1/2、1/3、1/4……各个部分也都在分别振动。这种由琴弦(发音源)整体振动产生的声音称为“基音”,是最容易被人耳听到的音。其它部分振动产生的音,称为“泛音”在与基音同时发声的时候是不容易被听到的,除非我们刻意地抑制基音,突出泛音

MIDI知识:

了解midi这部分实际是对和弦音樂程式在EM78806

C上的谱子部分了解。

可以进行这样的想象:如果我们听到一首音乐是一个人独奏吉它发出来的,MIDI则相当于该独奏曲的乐谱。虽然乐谱本身不能产生出任何实际的声音来,但是乐谱确定了音乐演奏得有多快,拨哪个音符,以及应该用多大的力度弹奏吉它。MIDI技术的一大优点是它送到和存储在你电脑里的数据量相当小就MIDI信号(或数据)本身而言,不过只是一堆数据而已,没有任何的声音。是Music

Instrument

Digital

Interface的缩写,意思是:音乐设备的数字化界面(或连接)。我们可以把一大堆乐器的音色先录下来,然后每个音色给它一个编号。比如Acoustic

Piano编号为00。接着再给所有的音高也用一串编号表示(因为我们通常用的是12平均律),比如C3音我们编号为00。剩下就是音符的时值问题,我们可以把8分音符编号为60。好,

现在如果要一个原声钢琴8分音符的C3音,就可以用一串数字“00

00

60”来表示。

乐理知识:

聲音三要素:

(一):音高(pitch)聲波頻率的高低

(二):音量(volume)聲波振幅的高低

(三):音色(timbre)基音和泛音所組合的頻率成分

樂曲組成要素:

(一):Tempo:

beat

per

minute(拍子)

每分鐘的拍數(其中beat為樂譜中表示音符長度的單位)

一般可見beat長度-1/16,1/8,1/4,1/3,1/2,1,2,4

(二):Pitch

Scale(音阶)每個八度有12個半音(12平均率)

-C,C#,D,D#,E,F,F#,G,G#,A,A#,B每個八度音高差兩倍

-A3:

220Hz,A4:

440Hz,A5:

880Hz每個半音之間音高相差12√2

下面描写了2-7个频段中个音符的频率

2

3

4

5

6

7

C

32.70

65.41

130.81

261.63

523.25

1046.50

C#

34.65

69.30

138.59

277.18

554.37

1108.73

D

36.71

73.42

146.83

293.66

587.33

1174.66

D#

38.89

77.78

155.56

311.13

622.25

1244.51

E

41.20

82.41

164.81

329.63

659.26

1318.51

F

43.65

87.31

174.61

349.23

698.46

1396.91

F#

46.25

92.50

185.00

369.99

739.99

1479.98

G

49.00

98.00

196.00

392.00

783.99

1567.98

G#

51.91

103.83

207.65

415.30

830.61

1661.22

A

55.00

110.00

220.00

440.00

880.00

1760.00

A#

58.27

116.54

233.08

466.16

932.33

1864.66

B

61.74

123.47

246.94

493.88

987.77

1975.53

乐音的四要素

乐音四要素是:音强、音高、音色和波形包络。现将它们的含义分述如下:

1.音强

音强就是人们在听闻时感到的响度,也就是我们通常说的声音的强弱或大、小,重,轻。它是人耳对声音稳弱的主观评价尺度之一。其客观评价尺度——也即物理量的测量,是声波的振幅。

声频范围也就是人们可以听到的声振动频率范国,为20赫到20千赫。20赫以下称为次声,20千赫以上称为超声。在声频频率范围内,人耳对中频段1~3千赫的声音最为灵敏,对高、低频段的声音,特别是低频段的声音则比较迟钝。人耳还有一种特征,对很强的声音,感觉其响度与频率的关系不大,或者说同振幅的各频率的声音,听起来响度差不多.但对低声级信号(即很轻的声音),感觉到它的响度与频率关系甚大:对于同样振幅的声音,低、高频段的声音听起来响度比中频段的轻。

2.音高

音高或称音调,是人耳对声音调子高低的主观评价尺度。它的客观评价尺度是声波的频率。和音强与振幅的关系不一样,音高与频率基本上是一致的。当两个声音信号的频率相差一倍时,也即f2=2f1时,则称f2比f1高一个倍频程。音乐中的1(do)与i,正好相差一个倍频程,在音乐学中也称相差一个八度音。在一个八度音内,有12个半音。以1—i八音区为例,

12个半音是:1—#1、#1—2、2—#2、#2—3、3—4、4—#4,#—5、5一#5、#5—6、6—#6、#6—7、7—i。请注意,这12个音阶的分度基本上是以对数关系来划分的。

各种不同的乐器,当演奏同样的频率的音符时,人们感觉它们的音高相同,这里指的演奏的声音具有同样的基频。但乐器每发一个音,这个音除了具有基频fo,以外,还有与fo成正

整数倍关系的谐波。前面说过,每个音的音高感觉由fo决定,而每种乐器的不同各次谐波成分,则决定乐器特有的音色

3音色

人们除对响度、音高有明显的都别力外,还能准确地判断声音的“色调”。单簧管、圆号虽然演奏同一音高(基频)的音符,但人们能够明确分辨出哪个是单管管,哪个是圆号,而不会混淆。这是由于它们的音色、波形包络不同。音色决定于乐音的泛音(谐波)频谱,也可以说是乐音的波形所确定的。因为乐音的波形(可由电子示波器上看到)绝大多数都不是简单的正弦波,而是一种复杂的波。分析表明这种复杂的波形,可以分解为一系列的正弦波,这些正弦波中有基频f0,还有与f0成整数倍关系的谐波:f1、f2、f3、f4,它们的振幅有特定的比例。这种比例,赋予每种乐器以特有的“色彩”一—音色。如果没有谐波成分,单纯的基音正弦信号是毫无音乐感的。因此,乐器乐音的频率范围,决非只是基频的频率范围,应把乐器乐音的各次谐波都包括在内,甚至很高次数的泛音,对乐器音色影响仍很大。

4.波形包络

乐音的波形包络指乐音演奏(弹、吹、拉,拨)每一音符时,单个乐音振幅起始和结束的瞬态,也就是波形的包络。有些乐器,在弹、吹、拉、拨的开始一瞬间,振幅马上达到最大值,然后振幅逐步衰减,有的乐器则相反,在开始的瞬间振奋较小,然后逐渐加大,再逐渐衰减。这些波形包络变化也影响乐器的音色。

樂器及波形:

一、

樂器分類:

一般樂器大致可以分成三類

1.

銅管樂器:

小號,法國號,長號,上低音號與低音號等

2.

木管樂器

長笛,豎笛,薩克斯風等

3.

打擊樂器(分有調打擊樂器跟無調打擊樂器)

無調打擊樂器(音高不變的):

大鼓,小鼓,鈸,三角鐵,響板等

有調打擊樂器(音高富於變化):

定音鼓,木琴,鐵琴等

二、

波形:

钢琴

钢琴放大图

小号

小号放大

    以上《avr单片机中使用MODBUS协议的方法》范文由一流范文网精心整理,如果您觉得有用,请收藏及关注我们,或向其它人分享我们。转载请注明出处 »一流范文网»最新范文»avr单片机中使用MODBUS协议的方法
‖大家正在看...
设为首页 - 加入收藏 - 关于范文吧 - 返回顶部 - 手机版
Copyright © 一流范文网 如对《avr单片机中使用MODBUS协议的方法》有疑问请及时反馈。All Rights Reserved