微机程序设计.pdf

上传人:本田雅阁 文档编号:2489086 上传时间:2019-04-03 格式:PDF 页数:68 大小:1.27MB
返回 下载 相关 举报
微机程序设计.pdf_第1页
第1页 / 共68页
微机程序设计.pdf_第2页
第2页 / 共68页
微机程序设计.pdf_第3页
第3页 / 共68页
微机程序设计.pdf_第4页
第4页 / 共68页
微机程序设计.pdf_第5页
第5页 / 共68页
点击查看更多>>
资源描述

《微机程序设计.pdf》由会员分享,可在线阅读,更多相关《微机程序设计.pdf(68页珍藏版)》请在三一文库上搜索。

1、 近代无线电实验 实验指导书(2 ) 华东师范大学电子信息实验教学中心 2 0 0 5 年 9 月 目 录 1.1 量程自动控制的数字频率计 3 1.2 锁相环的研究和频率合成 6 1.3 单片微型机实时控制的简单动画制作 14 1.4 非线性磁性材料干扰脉冲检测电路和有源滤波器的设计与调 试 19 1.5 热释电红外传感控制器 24 1.6 无线电编、译码发射和接收遥控器 27 1.7 智能小车的直流电机控制 29 1.8 计算机与智能小车的串口通信 37 1.9 智能小车的自动寻迹实验 44 1.10 三自由度的机械爬虫的运动原理 49 1.11 附录 ICCAVR 简介 65 1.12

2、附录串口调试软件 68 1.1 量程自动控制的数字频率计 一、 实验目的: 1、数字系统的设计与调试 2、TTL 数字集成电路的使用 3、量程自动控制的逻辑设计 二、实验要求: 设计、制作、调试一个量程自动控制的数字频率计,其要求如下: 显示位数:四位,最大显示数 9999 闸门时间:10 ms,100 ms , 1 s, 根据被测频率大小,量程自动切换。 量程:、100HZ999.9KHZ, 闸门时间 10ms 、10HZ99.99KHZ,闸门时间 100ms 、1HZ0.999KHZ,闸门时间 1s 自动量程要求:计数器值大于 9999 时(溢出) ,量程自动升高一档(闸门时间缩短十分 之

3、一) ,当计数值小于 0800 时量程自动降低一档(闸门时间增大十倍) 。 输入被测电压:10HZ1MHZ 方波或正弦波,幅度为 3mv3v(有效值) 显示器件:TTL 电平的七段数码管(RS202 或 2BS111) 数字电路:TTL 数字集成电路,实验室能提供下述电路: 7 4 L S 2 0 四输入端双与非门 7 4 L S 2 7 P 三输入端三或非门 7 4 L S 0 0 双输入端四与非门 7 4 L S 2 4 8 BCD 七段译码器驱动器 7 4 L S 7 5 4 位双稳锁存器 7 4 L S 9 0 二、五混合进制,十进制计数器 7 4 L S 2 2 1 斯密特触发输入双

4、单稳多谐振荡器 7 4 L S 7 4 双 D 触发器 7 4 L S 7 6 双 JK 触发器 三、实验原理: 数字频率测量的原理图见图 2- 1,简单的数字频率计的方框图见图 2- 2。 放大整形电路将输入的被测交流电压 fx 放大,限幅,整形后变成方波或脉冲送主闸门, 晶体振荡器送出的标准频率经分频后得到时间不等的一组闸门信号, 经开关选择后也送主闸 门,主闸门在闸门信号控制下打开或关闭,主闸门在开放的那一段标准的闸门时间 T 内, 计数器对被测频率 fx 计数,待主闸门关闭后计数器已计至一定的脉冲数 N,显然,f x = N/T 在主闸门关闭后单稳电路先后送出两个脉冲作为锁存器的送数指

5、令及计数器的清零指令, 将 计数器的数字送锁存器寄存,然后将计数器清零,以备下一次的测量,不同的量程可以通过 切换闸门时间来改变。较高的量程对于较短的闸门时间。 显然,闸门时间应选择适当,闸门时间过短则因计数有效位数少而降低了测量精度,过 长则因计数器溢出也得不到正确的读数。 合适的闸门时间(正确的量程)可以用波段开关手动选择,但是从使用方便来考虑,闸 门时间应能自动选择在最佳点上,如被测频率 f x 较高,致使计数溢出,闸门时间自动缩短 (升量程) ;如被测频率 f x 较低,计数器计数值不足某预定值,闸门时间自动增长(降量 程) 。为了保证闸门时间能最终稳定,升量程与降量程的读数之比不应是

6、十比一,而应稍大 于十比一,本实验要求读数大于 9999 则升量程,小于 0800 则降量程。 如果选择在大于 9999 升量程,小于 999 降量程,则如被测频率正好为 1000.00KHZ 时, 由于频率计在测量频率时 1 个字的原理误差,量程将在(闸门时间为 10)与(闸门时 间为 100 变动而不能最终稳定。 实现自动量程首先要解决的问题是计数值的检测,即如何知道计数值已大于 9999 或小 于 0800,对于标准的四位 BCD(二十进制,8421 码)计数器来说,在计数过程中第四位计 数的 QD 出现过下降沿意味着计数器已溢出, (计数器值大于 9999) 。如果计数过程中第三 位计

7、数器的 Q 3 D 未出现过上升沿,则意味着计数器值小于 0800。因此,可以利用这两个 特征很方便地检测出计数值的溢出或不足。 其次要解决的一个问题是如何实现量程的升降, 移位寄存器, 可以左右移的移位寄存器, 加法计数器,可逆计数器等都可以实现量程的升降。图 2- 3 触发器构成的移位寄存器实现量 程升降的一个例子。工作过程是:降量程指令使 Q1、Q2、Q3置成 100 状态,于是量程选择 在档(闸门时间为 1) 。升降量程指令使状态右移,量程逐渐上升,直至适当的闸门时间 被选中。与用左右移位寄存器的量程控制电路相比,它比较简单,但当从量程降到量程 时,先要从降到,再从升到。 自动切换量程

8、的同时必须同时切换小数点,否则,读数因无量程信息在很大程度上失去 意义。 晶体振荡器:T T L电路很容易构成晶体振荡器,图 2- 4 是 100KHZ 的晶体振荡器电路。 本实验可利用晶体稳频的脉冲发生器(自制的) ,它输出有 1MHZ,100KHZ,10KHZ,以 及有单脉冲输出。对调试电路很有用处。 输入放大器:它的好坏是决定频率计优劣的重要因素之一,本实验要求输入放大器在 10HZ1MHZ 频率范围内,对 3mv3v(有效值)的方波或正弦波输入电压提供足够的增 益,经整形后可靠地触发 TTL 电路. 本实验可分两步做,首先做好一个四位的常规数字频率计。然后,再做自动量程控制 部分。 1

9、.2 锁相环的研究和频率合成 一、实验目的: 1. 振荡器(VCO)的 Vf 特性的研究 2. 对称波锁相环基本特性的研究 3. 利用锁相环实现频率合成 二、锁相环原理: 锁相环(Phase Lock Loop )是一个自动相位控制系统,框图 3- 1 描述了一个基本锁 相系统的主要组成部分,其中包括相位比较器(Phase Detector) 、 电压控制振荡器(V oltage Controlled Osillator) 、低通滤波器(Low Past Filter ) 。 这个系统的传递函数 H(S)可以用下列方程描述: SSKoKdF SSKoKdF SQi SQ SH / )(1 /

10、)( )( )(0 )( + = 其中 K0压控振荡器的转换增益 Kd相位比较器的转换增益 F(S)低通滤波器的传递函数 设 S SKoKdF SG )( )(= 则 )(1 )( )( SG SG SH + = 所以,框图 3- 1 表示的系统是一个典型的全反馈系统, G(S)为系统的开环传递函数,它由 Ko、Kd、F(S)来确定。 1、 控振荡器(VCO) 本实验中用一片 74LS221 双单稳态电路组成 VCO 振荡器,原理如图 3- 2,改变 A 点电 压就能改变振荡频率,一般 A 点电压位 1.1 伏以上就开始振荡,输出频率还与 R1、R2、R3 以及 C1、C2值有关。通过实验测出

11、 fVc 关系曲线如图 3- 2 所示,并可看出f / V 在不同 控制电平下,并不全部一样,在低电平处f / V 值比较大。而高电平处却比较小,这就决 定了最佳控制点的选择(线性部分) 。 2 、相位比较器(P D ) 相位比较器又称为相位检波器, 对于占空系数为 5 0 % 的对称方波可以用一个异或门来构 成,如图 3 - 4 所示。 PD VCO Qi(S) V e(S) Vd(S) Qo(S) 低通滤波器 (Fi(S) ) 相 位 比 较 器(Ko) 压 控 振 荡 器(Kd) 图 3- 1 由异或门真值表可以看出,当异或门的两个输入端 A 、B上加入两个占空比为 5 0 % 的方 波

12、时,三个输入波之间的相位在 0 1 8 0 之间变化时输出波形 f的占空比也随着变化, 如果取出波形的平均值,其值也将随着 A 、B 端输入波形的相位而变化,如果用 R , C 构成低 通滤波器,则其传递函数为: STSCR SC SF + = + = 1 1 /1 /1 )( 式中 T 为时间常数,滤波器的参数决定着捕捉范围的大小。T =RC 3、实验电路:以下为实验电路,供参考(图 3- 5) 。静态工作点的 A 点电压约在 4 伏左 右。 4、 沿控制比较器 它是一种适合不对称波形的相对检波器,其结构如图 3- 6,它是由 R- S 触发器和控制门 构成。工作原理可分三个方面来分析:首先

13、(9)、(10)门不可能同时为“1” ,因为(9)、(10)门 同时为 1,必须(1)、(2)、(5)、(6)、(7)输出为“0” ,而要求(7)输出为“0” ,则(1)、(2)、(5)、 (6)中必须有一个或一个以上为“1” ,显然同前面提出要求(9)、(10)输出“1”的条件矛盾, 所以(9)、(10)不可能同时为“1” 。 第二为 fco 和 fin 两者同时上跳和同时下跳时的状态,假定(8)、(9)输出为“0” 。此时, f i n 和 f c o同时上跳,则门( 1 ) 和门( 6 ) 输出为“0 ” ,所以由( 2 ) 、( 3 ) 以及(4)、(5)组成的二 只 R- S 触发器

14、的状态保持不变, 亦即门(7)的输出状态也不变, 所以(8)、 (9)的输出还是为 “0” 。 如果 fin 和 fco 同时下跳,则门(1)和门(6)的输出为“1” ,导致两个 R- S 触发器反转,使门(2) 和(5)输出为“0” ,但这并不影响门(7)的输出状态,所以(8)、(9)的输出还是为“0” 。 第三为 fin 和 fco 相位不同。假定 fin 和 fco 相位提前,此时门(6)的输出为“1” ,所以 (4)、(5)触发器反转,使门(5)输出为“0” ,所以此时门(1)、(3)、(7)均为“0” ,使门(8)输出 为“1” 。经过一段时间后,fco 亦上跳,使门(6)输出由“1

15、”变为“0” ,门(7)的全部输入为 “0” ,所以输出为“1” ,这就使二只 R- S 触发器复位,并将门(8)的输出从“1”反转为“0” 。 同样可以分析当 fin 相位滞后于 fco 时,将在 fco 上跳时使(9)为“1”直到 fin 上跳到 来时才使(9)为“1” 。 总之,当 fin 超前 fco 时,(8)出现一串脉冲,(9)为“0” ,当 fin 滞后于 fco 时,(9)出 现一串脉冲,(8)为“0” 。 图 3- 7 为一比例加法器,它是利用运算放大器构成,其输入端分别接到(8)、(9),在输 出端即可合成一条比较理想的鉴相曲线。 5、寻找同步范围 锁相环的工作范围可用捕捉

16、带和保持带来表示。捕捉带和保持带的示意图如图 3- 8 所 示。 通常保持带宽会大于捕捉带宽,用双踪示波器观察输入、输出是否同步。按图 3- 8 分别 记录锁相环的捕捉带和保持带。 三、锁相环的典型应用频率合成 CC4046 的引脚图如图 3- 9 所示。 锁相环的重要用途之一就是用作频率合成。所谓频率合成是指将任一给定的频率 f0 (通 常是由石英晶体振荡器产生的高稳定度的频率)变换成一系列新的频率 f 01、 f 02 f 0n。 这些新的频率的稳定度与基准频率相当。例如,f 0 的稳定度为 10 (即百万分之一) ,则 一系列新频率的稳定度也达到 10 。 本实验利用 CC4046 锁相

17、环实现 1KHZ999KHZ 频率 合成。 锁相环用于频率合成的原理方框图如图 3- 10 所示。我们已经知道,把分频器(N) 插在锁相环压控振荡器 vco 的输出端与相位比较器的输入端之间, 锁相环即可对输入频率进 行准确的 N 倍频。图 3- 10 中,设晶体振荡器频率为 f0,经过固定式分频电路(M)得到 基准频率 f1,再送至锁相环 CC4046 的相位比较器的信号输入端。若由压控振荡器 vco 产 生的频率信号为 f2,经过一个可预置数的分频器,可得到 f 2=f 2/ N(N 为预先设定的分频 系数) ,然后再送到相位比较器的比较信号输入端。当 CC4046 相位锁定时,有关系式

18、f 2 =f 1, 即 f 2/ N= f 1, 则 f 2=N f 1。此时,锁相环输出信号的频率是输入信号频率 f 1的 N 倍。 f0 f1 f0 输出 f2=f2/ N CC4046 晶体 振荡器 分频器 M 相 位 比 较器 分频器 N 压控 振荡器 低通滤 波器 如果分频系数 N 是可变的,N=N1、N2 Nn,例如能从 1 连续变化到 999,这时即 可得到 999 个不同的 f 2输出,从而实现了频率合成。 频率合成的一种实用电路如图 3- 11 所示。本电路可输出 1KHZ999KHZ 范围内,间隔 为 1KHZ 的 999 种标准频率。图 3- 11 电路看起来比较复杂,但

19、与图 3- 10 对照来看,就可明 显的看出它由基准频率产生,锁相环及分频器N 三部分组成。 基准频率产生部分采用 JA9 型 100KHZ 金属壳石英谐振器与六反相器 CC4049 (只用了 其中三个反相器)组成晶振和放大整形电路,得到 100KHZ 的矩形脉冲。再经过双二 十进制同步计数器 CC4518 完成 100 分频,以获得KHZ 的基准频率 f 1。f 1经 CC4046 的 第 14 脚送至相位比较器。然后从 vco 输出信号 f 2。 我们已经知道,在 vco 的输出端 4 与相位比较器的输入端 3 之间插入一个分频器(N), 就能起到倍频作用,使 vco 的输出信号频率 f

20、2=N f 1。若设 N=175,则 f 2=1751KHZ 175KHZ。 图中用三块 CC14522 可编程 1/ N 计数器和三只 8,4,2,1 编码的拨盘开关组成。有 关拨盘开关的原理,可参看无线电 1986 年第 89 期的有关文章。 如果分频系数 N 是个三位数,则可表示成 N=100N3+10N2+N1,这里的 N1、N2、N3 分别代表个位、十位、百位上的数字,也就是拨盘开关 KA1、KA2、KA3 上分别设定的数 值。因此使用三只拨盘开关,即可组成 001 到 999 范围内的任何数。例如,按图2 所示,将 KA3 拨至数字 1,数字 1 对应的 BCD 码位 0001,所

21、以前三个开关断开,最后一个开关闭合。 同理,将 KA2 拨至 7(0111),KA拨至 5(0101),各开关即如图 3- 11 所示状态,就可得到分 频系数 N100110715175。当然 N 也可以设定 001999 中的其他值。由于每 设定一次,就相当于给/ N 计数器编一次运算程序,因此称它为可编程/ N 计数器。 图 3- 10 该计数器的个位、十位、百位分别是 CC14522、CC14522、CC14522。电路采用 正逻辑,即“1”为高电平(VDD), “0”为低电平(VSS)。在介绍其工作过程之前,先对各端 子做一些简单的说明。 CC14522 型计数器的 CP 端和 E N

22、 端均为输入脉冲端。电路规定:当 E N 端接“0 ”电平 时,输入脉冲应加至 C P 端,且用脉冲的上升沿触发;当 C P 接“1 ”电平时,输入脉冲应加 至 E N 端,此时用脉冲的下降沿触发。在图 3 - 1 1 中,选定从 C P 端输入脉冲,所以 E N 端固 定接地为“0 ”电平,从 v c o 输出的信号作为输入脉冲加到 C C 1 4 5 2 2 的 C P 端。 每块 1 4 5 2 2的 D1D4端是预置数输入端,P E是预置允许端。以个位 1 4 5 2 2 为例,当 P E 时,不管原来的计数状态如何,可立刻将拨盘开关 K A 1 设定的 5 ( 0 1 0 1 ) 从

23、 D1D4端置 入计数器。 C C 1 4 5 2 2 的 C r 端是复零端。当 C r 1 时,能强迫计数器复零,计数电路停止工作。图 3 - 1 1 中的 C r 端固定接“0 ”电平,可使电路循环工作下去。 计数器的 Oc 端是全“0”信号输出端,仅当计数器状态为“0000” ,且 CF 为“1”时, Oc 才输出“1” 。CF 是级连反馈端,它们分别与前一级的 Oc 端相连。这样当前级计数器为 “0000”状态时,其 Oc“1”的信号就反馈到下一级的 CF 端,使 CF 为高电平。 三级计数器的 PE 端与个位计数器的 Oc 端相连。这样,当个位计数器状态从 5 一直减 到 0(相当

24、于完成一次5 运算)时,CC14522为“0 0 0 0 ”状态。由于个位计数器的级连反馈 端 C F 与十位计数器的 O c 端接通,若假定十位计数器也是“0 0 0 0 ”状态 O c 1 ,此信号就送 到各位计数器的 C F 端,使之也为高电平。对个位计数器而言,由于 C F 1 ,并且计到“0 0 0 0 ” 状态,因此从 O c 端输出高电平信号,这个高电平信号,一方面作为第二次置数信号( P E 1 ) , 另一方面作为 f 2的输出端。 应当说明,上面讲的除法运算,实际上是通过连续做减法来实现的。例如,假定 N 1 7 5 , 即 N 1 5 ,N 2 7 ,N 3 1 。分频器

25、的工作过程是:首先是把 D1D4端的预置数 1 7 5 分别置入 个位、十位和百位计数器。由图 3 - 1 1 可见,三个拨盘开关的 A 1 、A 2 、A 3 是接 V D D的,个位 开关 K A 1 中 4 刀和 1 刀接通,且接至 C C 1 4 5 2 2 的 D3、D1端,因而 D3、D1端为高电平“1 ” 。 而 D2、D4端未接通 V D D ,故为低电平“0 ” 。这样 8 4 2 1码的 0 1 0 1 ( 数字 5 ) 就送入了 D1D4端。 同理,8 4 2 1码 0 1 1 1 ( 数字 7 ) 送入 C C 1 4 5 2 2 的 D3、D2、D1端。8 4 2 1

26、码的 0 0 0 1 ( 数字 1 ) 送入 C C 1 4 5 2 2 的 D1端。 计数器完成预置后,从个位计数器开始做减法运算。V C O的输出信号是一串脉冲,C P 端每输入一个脉冲, C C 1 4 5 2 2 就自动( 这是由集成电路内部控制的) 减 1 ,这时预置数5 减 1 变为 4 。输入 5 个脉冲( 减 5 次) 后,即为 0 0 0 0 。 当第六个脉冲到来时,C C 1 4 5 2 2 从 Q4端向十进制计数器 C C 1 4 5 2 2 的 C P 端借 1 ,这个 1 对于个位来说相当于 1 0 ,这时 C C 1 4 5 2 2 可从 0 0 0 0直接变成 1

27、 0 0 1 ( 数字 9 ) 。而 C C 1 4 5 2 2 因送出一个高电平借位信号,而从预置数 7中减去 1变成 6 。这样继续下去,连续减 7 5 次以后,十进制计数器也变成了 0 0 0 0 。当第 7 6 个脉冲来到时,百位计数器减 1 变成 0 ,它 的O c 端变成高电平, 与它相连的C F 端也变成高电平。 直至十进制计数器也减成0 时, C C 1 4 5 2 2 的 O c端和 C C 1 4 5 2 2 的 C F端也均为高电平。再等个位计数器也减为 0 ( 这时共减了 1 7 5 次) 时,个位计数器的 O c 端才变成高电平,输出一个脉冲。由于每输入 1 7 5

28、个脉冲,个位计 数器的 O c 端才输出一个脉冲( 即前面所说的 f2信号) ,O c 端就是分频器的输出端,故也就 完成了 1 7 5 分频。因此,f2f2/ 1 7 5 。f2接至 C C 4 0 4 6 的第 3 脚,相位比较器经过对 f1 和 f2进行相位比较,产生误差电压 U X ,滤波后得到控制电压 U d ,去控制 V C O 的输出频率。 当相位锁定时,对于上面的例子,V C O 输出的是高稳定度的 1 7 5 K H Z 的基准频率。 为便于读者阅读,图 3 - 1 1 中标明了锁相环中各信号的去向。电路中拨盘开关选用 型按键式开关,利用按键代替手拨转轮,操作非常方便。 除此

29、以外,锁相环还可用作电压频率( V / f ) 转换器(单独使用锁相环中的压控振荡 器,即可构成 V / f 转换器) 。利用锁相环还可以对调频信号进行解调,从中取出音频信号。 目前,国外已把锁相技术应用到彩色电视机的电路中,例如,法国汤姆逊 T F E 5 1 1 4 D K型 2 0 英寸彩电。 1.3 单片微型机实时控制的简单动画制作 一、 实验目的 1. 掌握 Intel MCS- 51 系列单片机的内部构造, 接口技术, 扩展技术及其汇编语言特点; 2. 初步掌握应用仿真器来调试开发单片机用户程序的技术; 3. 通过实验提高综合调试各种仪器的能力,培养发现、分析、解决问题的能力。 二

30、、具体要求 1. 设计一个以单片机( 8031)为核心、应用动态扫描原理、实现一幅静态画面的显示; 2. 以上面显示为基础实现简单的画面移动(左移,右移,上移,下移) ; 3. *设计一个画面旋转的显示,如一条直线绕一固定点做旋转的动画; 4. *综合运用查询及中断功能实现即时控制的动画显示。 三、实验器材 1. PC 机一台; 2. 仿真器(DSICEII)开发系统装置一套; 3. 稳压电源一台; 4. 示波器一台; 5. 万用表一只 四、实验原理 1、单片微型计算机 单片微型计算机(简称单片机:Single- chip Microcomputer ) ,就是把中央处理器 CPU(Centr

31、al Processing Unit),随机存取存取器 RAM(Random Access Memory) ,只读存储 器 ROM (Read Only Memory ) ,定时器/计数器以及 IO(Input /Output)接口电路等主要计算机 部件集成在一块集成芯片上的微型计算机。从其组成和功能上看,已是具备了计算机系统的 含义,其典型结构如图 6- 1 所示: 2、 动态扫描显示 实验电路中是由一个 1632 的 LED 点阵构成, 以这些 LED 作为显示画面的象素显示一 幅分辨率为 1632 的图象。如果显示的是汉字,则可显示二个 1616 的汉字。由于 8031 的 DataBu

32、s 只有 8bits,因此无法一次显示一幅 1632 的图象或 1616 的汉字;但是单片机的工 作频率较高(实验中采用 6MHz 晶振) ,利用人眼的视觉暂留效应,只要不断地向点阵送数 据,就可实现整幅画面的显示。 T0 T1 时钟 电路 ROM RAM 定时/计数 并行接口 串行接口 中断系统 CPU P0 P1 P2 P3 TXD RXD INT0 INT1 图 6- 1 典型单片机结构框图 3、 * Bresenham 算法 Bresenham 算法解决了显示一条直线的问题。实验中要求有直线的旋转画面,因此要用 到显示屏上的画线技术。设直线从(x, y)画至(x+x, y+y), 定义

33、误差项 d,置其初值为零, 且直线的斜率的绝对值小于 1,即|y/x| 左转一圈 右转一圈 前进一段 后退一段 停下 /ICC-AVR application builder : 2005-5-19 19:12:13 / Target : M8515 / Crystal: 4.0000Mhz #include #include unsigned int time; unsigned int yan; void port_init(void) PORTA = 0x00; DDRA = 0xFF; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; DDRC = 0x

34、00; PORTD = 0x00; DDRD = 0xFF; PORTE = 0x00; DDRE = 0xFF; /call this routine to initialize all peripherals void init_devices(void) /stop errant interrupts until set up CLI(); /disable all interrupts port_init(); MCUCR = 0x00; EMCUCR =0x00; GICR = 0x00; TIMSK = 0x00; SEI(); /re-enable interrupts /all

35、 peripherals are now initialized void delay(unsigned int yan) while(yan0) yan-; void runforth(void) while(time #include unsigned char a; unsigned char p; unsigned char m; unsigned char n; void port_init(void) PORTA = 0x00; DDRA = 0x00; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; DDRC = 0x00; PORTD = 0x

36、00; DDRD = 0x70; PORTE = 0x00; DDRE = 0x04; /TIMER0 initialize - prescale:64 / WGM: Normal / desired value: 40Hz / actual value: Out of range void timer0_init(void) TCCR0 = 0x00; /stop timer TCNT0 = 0xfa /*INVALID SETTING*/; /set count value TCCR0 = 0x03; /start timer #pragma interrupt_handler timer

37、0_ovf_isr:8 void timer0_ovf_isr(void) TCNT0 = 0xfa /*INVALID SETTING*/; /reload counter value if(m=a) PORTD=0x70; TCCR1B=0x03; TCCR0=0x00; n=1; elsem+; /TIMER1 initialize - prescale:64 / WGM: 0) Normal, TOP=0xFFFF / desired value: 40Hz / actual value: 40.013Hz (0.0%) void timer1_init(void) TCCR1B =

38、0x00; /stop TCNT1H = 0xff; /setup TCNT1L = 0xfa; OCR1AH = 0x06; OCR1AL = 0x1A; OCR1BH = 0x06; OCR1BL = 0x1A; TCCR1A = 0x00; TCCR1B = 0x00; #pragma interrupt_handler timer1_ovf_isr:7 void timer1_ovf_isr(void) TCNT1H = 0xff; /reload counter high value TCNT1L = 0xfa; /reload counter low value if(n=250-

39、a) PORTD=0x20; TCCR0=0x03; TCCR1B=0x00; m=1; if(p=0)if(a=125)p=1; elsea+; elseif(a=1)p=0; elsea-; elsen+; /call this routine to initialize all peripherals void init_devices(void) /stop errant interrupts until set up CLI(); /disable all interrupts port_init(); timer0_init(); timer1_init(); MCUCR = 0x

40、00; EMCUCR = 0x00; GICR = 0x00; TIMSK = 0x82; SEI(); /re-enable interrupts /all peripherals are now initialized void main(void) a=0; p=0; m=1; n=1; init_devices(); while(1) PORTE=0x04; 1.8 计算机与智能小车的串口通信 【实验目的】 学会使用串口调试软件 熟悉 ICCAVR 编译环境 进一步熟悉单片机的原理及应用 能够编写程序实现计算机与单片机之间的串口通信 【实验器材】 小车一辆 数据线一根 下载线一根 【实

41、验原理】 所谓“串行通信”就是指外设和计算机间使用一根数据信号线( 另外需要地线, 可能还需 要控制线) , 数据在一根数据信号线上一位一位地进行传输, 每一位数据都占据一个固定的时 间长度。 计算机上的串行接口一般是 D B 9 ,它可以分为公口(针型)和母口(孔型),图 1 给出 了公口(针型)和母口(孔型)的图示,由图可知母口的 2 ,3 脚刚好与公口相反,2 脚为 发送 T X D 。单片机则是通过 U A R T (即 U n i v e r s a l A s y n c h r o n o u s R e c e i v e r T r a n s m i t t e r 通 用

42、异步收发器)来收发数据的, 它允许在串行链路上进行全双工的通信。U A R T 主要有由数 据总线接口、控制逻辑、波特率发生器、发送部分和接收部分等组成。 包括微处理器接口, 发送缓冲器(T X B )、发送移位寄存器(T S R )、帧产生、奇偶校验、并转串、数据接收缓冲 器(R X B )、接收移位寄存器(R S R )、帧产生、奇偶校验、串转并。 图 2 是 U A R T 的典型应 用,本实验所用的芯片是 A t m e g a 8 5 1 5 ,有兴趣的同学可以查阅一下它的 d a t a s h e e t 。 图 1 图 2 【实验步骤】 (1) 连接好电路,把数据线,下载线连接

43、好,打开电源 (2) 进入 ICCAVR 编译环境,调试程序直至没有错误,编译环境简介请参见附录一 (3) 下载,烧录进单片机,在串口调试软件上观看实验结果,关于串口调试软件参 见附录二 (4) 反复修改调试程序,逐渐增强其功能 (5) 写好实验报告,实验心得体会 实验电路: 【程序示例】 (1 )功能:计算机发送一个字节到单片机,单片机把接收到的字节的 A S C I I 码加一后 再发送给计算机。程序运行结果如图 2 - 7 所示,输入“a b c d e f g ”时,输出为“b c d e f g h ”. 1 用查询方法实现 #include #include void port_i

44、nit(void) PORTA = 0x00; DDRA = 0x00; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; DDRC = 0x00; PORTD = 0x00; DDRD = 0x02; PORTE = 0x00; DDRE = 0x00; /UART0 初始化/ 波特率: 9600 void uart0_init(void) UCSRB = 0x00; UCSRA = 0x00; UCSRC = BIT(URSEL) | 0x06; UBRRL = 0x19; UBRRH = 0x00; UCSRB = 0xD8; #pragma interr

45、upt_handler uart0_rx_isr:10 void uart0_rx_isr(void) /uart has received a character in UDR #pragma interrupt_handler uart0_tx_isr:12 void uart0_tx_isr(void) /character has been transmitted /call this routine to initialize all peripherals void init_devices(void) CLI(); /全局中断关 port_init(); uart0_init()

46、; MCUCR = 0x00; EMCUCR = 0x00; GICR = 0x00; TIMSK = 0x00; SEI(); /使能中断 /初始化完成 /*发送子程序 * void Transmit(unsigned char da) while ( !( UCSRA unsigned char pos; unsigned char str1=“Please input A,B,C or D : n n If you input A,it will tell you you have input a A ; n n If you input B,The led will display 1

47、111 ; n n If you input C,it will run forword ; n n If you input D,it will run backword .n n“; unsigned char str2=“You have input a An“; void port_init(void) PORTA = 0x00; DDRA = 0xFF; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; DDRC = 0xFF; PORTD = 0x00; DDRD = 0xFF; PORTE = 0x00; DDRE = 0xFF; void uart0_init(void) UCSRB = 0x00; UCSRA = 0x00; UCSRC = BIT(URSEL) | 0x06; UBRRL = 0x19; UBRRH = 0x00; UCSRB = 0xD8; /*刹车子程序* void black(void) PORTE=0x00; PORTD=0x00; /-延时子程序-

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1