单片机基础实验_第1页
单片机基础实验_第2页
单片机基础实验_第3页
单片机基础实验_第4页
单片机基础实验_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1.内外数据交换(外部数据转到内部数据)1.内外数据交换(外部数据转到内部数据)查看程序结果:利用软件模拟器1.内外数据交换(外部数据转到内部数据)查看存储区(片内片外RAM的情况)以证明交换成功DATA(片内RAM)XDATA(片外RAM)这两个要勾选1.内外数据交换(外部数据转到内部数据)查看存储区(片内片外RAM的情况)以证明交换成功运行前运行后请自行练习1.内外数据交换(外部数据转到内部数据)除了使用指针还有什么办法?设全局变量1.内外数据交换(外部数据转到内部数据)查看存储区(片内片外RAM的情况)以证明交换成功DATA(片内RAM)XDATA(片外RAM)这两个要勾选复位单片机时(

2、默认),XDATA全部为FF请在0030(Xdata指针)处填写一个喜欢的数字(此处是33)并且不能和在31(data指针)处相同,否则无法判断这个数字是不是Xdata传来的2.跑马灯-1.0(仅让一个灯亮)1.怎么让灯亮?让单片机给一个低电平到LED灯即可2.单片机怎么给?通过IO(input output)接口3.那么多接口选择?选一个喜欢的(有一定限制条件,后面解释)4.怎么连线?电平(或者说脉冲)需要从IO口出来,进入LED灯,必然就是将你选择的IO口和LED灯接在一起即可2.跑马灯-1.0(仅让一个灯亮)2.跑马灯-1.0(仅让一个灯亮)查看程序结果:利用硬件记得将这个选项框的勾去掉

3、!连线:P1.0连接LED0结果:0号灯亮了推广:1.如果让灯灭怎么办?给低电平0即可2.如果控制八个灯怎么办?连接八个灯,从P1送八位并行数据即可(跑马灯0.0)2.跑马灯0.0(控制八个灯)连线:P1.0连接LED0,依次连接剩下的八个口,请注意顺序问题。这个实验不要求顺序,但接下来开始移动灯的时候,顺序问题就体现出来了,否则跑马灯跑的很乱推广:怎么跑起来?只需要给八个口不同的值,如0000 0001;0000 0010等等,就可以依次点亮了(跑马灯1.0)2.跑马灯1.0(控制八个灯,但是失败了)连线:P1.0连接LED0,依次连接剩下的八个口,请注意顺序问题,否则跑马灯跑的很乱2.跑马

4、灯1.1(控制八个灯,用延迟)结果:跑马灯全亮了,为什么?因为传输速度过快,无法分别。想解决这个问题,只能采用延时的方法(跑马灯1.1)2.跑马灯1.1(控制八个灯,但是失败了)延时程序:连线不变,结果正常推广:想玩花样,打开开关之后等闪烁两次?加入中断控制(跑马灯2.0)2.跑马灯2.0(控制八个灯,加中断,失败)1.什么是中断?中断就是允许单片机收到一个信号,当收到的时候立刻执行某些程序2.中断的来源?中断源只有五种,分别对应特有的中断函数interrupt,具体的情况请自行查表3.单片机怎么收到中断信号?利用P3口的第二功能,p3.2为零号外部中断,因而连线的时候将P3.2和某开关连在一

5、起,即可利用开关送一个电平,令单片机感受到中断4.中断函数的编写?和普通函数不同,需要加上中断号,关键字为interrupt,中断函数无需声明,因为我们并不主动在main函数中调用它,而是单片机系统自行调用。此外,严禁主动在main函数中主动调用中断函数,否则系统跑飞。(原因是因为,编译器处理中断函数时,一定会加入RETI这条命令。但是只有单片机系统自行调用时是真正的“中断调用”,如果是自行调用,则理论上应该用RET这条命令,可是编译器依然会执行RETI这条指令,故程序跑飞)另外,中断程序严禁给主程序返回任何值,否则程序跑飞,故一定要给中断函数加void5.主函数不变,和前面一样,因此只写中断

6、函数部分2.跑马灯2.0(控制八个灯,加中断,失败)连线:P1.0连接LED0,依次连接剩下的八个口,请注意顺序问题,否则跑马灯跑的很乱。另外P3.2连开关K0结果:拨动开关,灯还是没变化2.跑马灯2.0(控制八个灯,加中断,失败)1.原因?因为中断程序的使用必须进行一些初始化设置。其中相关的部分有:IE:中断允许寄存器,interrupt enable其中包含了:EA:总中断 ES:串口中断 ET1:计时器1中断 EX1:外部1中断 ET0:计时器0中断 EX0:外部0中断因而我们必须给EA高电平,EX0高电平,以打开中断推广:计时器和串口的中断也必须如此打开2.中断源的优先:中断源可以优先

7、控制,就是先相应谁。具体的内容由IP控制3.(非必须)C语言编程强调高内聚低耦合,意味着,尽可能的把程序分块,也就是说,从编程角度,应该单独设一个函数,例如inrenable(interrupt enable)函数,然后把关于中断控制的语句写在里头,然后在main函数中调用,以增加程序可读性,但是这部分不是必须的。(跑马灯2.1)2.跑马灯2.1(控制八个灯,加中断,不完美)然后请在主函数中调用这个FalshLedINI函数,并且,若这个函数的定义在主函数之后,请在主函数声明它结果:不能说失败,但是不完美,当开关打下来后,一直在闪烁,需要手动把开关打回去。这是为什么?原因在于,这时候默认是电平

8、触发,单片机只能自动撤掉脉冲触发,电平触发需要手动撤除信号。其实这相当于,开关打下来的时候,我们一直在给单片机中断信号,单片机刚刚从中断过程中回复过来,我们又中断了。假设这样不是我们想要的,我们希望开关打下来后就中断一次,也就是脉冲触发,应该怎么设置?(跑马灯2.2,改变中断触发方式)中断触发方式储存在TCON当中,TCON内容如下: IE1外部中断请求标志(硬件自动处理,和我们无关) IT1外部中断2.跑马灯2.2(控制八个灯,加中断,完美控制)然后请在主函数中调用这个FalshLedINI函数,并且,若这个函数的定义在主函数之后,请在主函数声明它中断触发方式储存在TCON当中,TCON内容

9、如下: IE1外部中断请求标志(硬件自动处理,和我们无关,当单片机从P3.3口接收到外部信号,硬件自动将IE1放1,请注意因为这里是外部中断1,所以是P3.3) IT1外部中断请求方式,0为电平触发(默认),1为脉冲触发IE0 IT0同理,是0号中断相关的TF1:和IE1类似,但是这是计数器的重点请求标志,当计数器1溢出时,这里计1TR1:当这里为1时,计数器1开始工作结果:给脉冲就触发,完美实现提高:要是想实现完美定时功能,想要几秒就要几秒怎么做?引入计数器定时器即可(跑马灯3.0)2.跑马灯3.0(中断花样+精确定时)定时器原理:单片机之中有一个“振荡器”,材质为石英晶体,我们又称晶振晶振

10、可以进行不停地震动,一次震动当然需要时间,我们就把这一次震动称之为晶振周期。单片机无法感知人类的秒,它们只能感受“机器秒”,也就是晶振的周期。于是单片机做出以下规定“晶振的十二分频称之为一个机械周期”,也就是说十二个晶振周期等于一个机器周期定时器又是一种什么结构呢?可以这样看待:定时器开关(TR)被打开后,每经过一个机械周期,它就会给定时器内部的一个内存单元+1(TL/TH),这个内存单元满了之后,它就会给一个开关(TF)置1这样一来,可以先计算一个机器周期,比如一秒,假设内存满值是10,如果我们计算两秒,那么就可以给内存先放8,经过两次机器周期,内存为0,溢出,来一个中断,我们就知道时间到了

11、问题在于,怎么通用的去计算“应该提前把这个内存单元”放多少值,根据上述原理,就可以得出这样的公式:65536-预留值=需要的计时时间/(1/晶振频率)*12 (晶振频率的倒数是机器周期,十二分频所以乘以12)要是预留值大于了最大内存容纳范围怎么办?很简单,多次启动计时器即可同时,这个内存单元存在TH1/TL1当中,这两个加起来共16位,最大计数次数就是65536,TH1为一号计数器的高位,TL1为一号计数器的低位,同理有TH0和TL0不妨设晶振为12MHZ,那么机器周期为10-6,想要0.2秒,则需要跳变200000,超过65536次。不放只让计时器计算0.05秒,四次自然是0.2秒,那么就需

12、要计数50000次,初值就是65536-50000=15536 转换十六进制就是3CB0,那么TH0放3C,TL放B0值得注意的是,一旦溢出之后,TH和TL的值就是0,需要重新装填,否则下次计时就从0开始,不是从15536开始,时间就不对了定时器相关设置储存在TCON当中,TCON内容如下: TF1:计数器请求标志,当计数器1溢出时,这里计1溢出后会自动调用中断号,interrupt 3(计数器1中断号,如果是0号计数器就是interrupt 1)TR1:当这里为1时,计数器1开始工作TF0 TR0则是0号计数器,同上后头那四位是外部中断开关,已经说过了,不再重复2.跑马灯3.0(中断花样+精

13、确定时)2.跑马灯3.0(中断花样+精确定时)但是问题在于,控制定时器的还有一个寄存器,名为TMOD,控制定时器的模式定时器一共有四种模式,分别为0 1 2 3. 0号和之前的一样,但是关键在于TH和TL只能用13位,只为了兼容性,不作考虑1号模式就和之前一模一样2号方式可以自动装填,既然自动装填,后果就是,只能把16位的内存拆成两部分,占据高八位的TH作为存放装填数的地方,拿TL做计数,也就是说,最大的次数只能是20483号方式是为了使用三个计数器,和方式0一样不常用,不做介绍其中TMOD内容如下:GATE1 CT M1 M0 ,这是前四位,是一号计数器的四个控制位GATE不做介绍,是为了测

14、脉冲宽度的CT位为方式选择,当CT=1是计数器,CT=0是定时器M1 M0组合起来,分别代表四种模式后四位和前四位一样,不过是控制零号计数器的注意的是,TMOD无法位寻址。意味着,你只能给TMOD整体赋值,也就是一口气把八位控制位全部确定,比如TMOD=0 x16 代表着一号定时器是定时,模式1,零号定时器是计数,模式2 相对比的是TCON,可以给TCON一起赋值,也可以单独对TR1等变量赋值2.跑马灯3.0(中断花样+精确定时)强调的是低耦合高内聚,依然是把初始化的部分单独作为一个函数,然后在main主函数里头调用,如果这个函数定义在后头,请在主程序内声明它2.跑马灯3.0(中断花样+精确定

15、时)2.跑马灯3.0(中断花样+精确定时)另附一个更改以后的主函数,空空如也,还有之前定义的两个全局变量连线无需更改,程序运行之后,跑马灯应该是按照给定时间正常运行。这时候,因为一次计时是0.05秒,只要更改相应的TIMER值,如果改成100,就可以计时五秒,自行更改尝试即可推广:思考这样一个问题,一个灯就要占用一个输出口,能不能只用一个输出口就能控制八个灯,这样就能节省IO口干别的事情,这就是串并转换(跑马灯4.0)另附:定时器中断使用实在是困难,并且容易和其他项目冲突,故在跑马灯4.0中不再使用定时器,而用简单的delay函数控制延迟(也就是跑马灯1.1)3.跑马灯4.0(串并转换)说到串

16、并转换,就不得不说一下“串口通信”这个东西(在之后的双机通信还会再次强调)所谓通信,不过是传输数据的一个过程。不妨联想一下网购之后快递运送的流程:首先卖家会告诉你,“我发货啦”!(TI发送中断标志)然后你得在指定的时间拿货(数据传输的波特率)之后你的告诉卖家,“我拿到货了”(RI接受中断标志)得验货看看这玩意儿对不对,坏没坏(奇偶校验)(和网购不太类似,因为坏了的数据不值钱,坏了就扔了,然后让卖家重发一份就行,不需要付款,也就不需要把错误数据返回)一个需要解释的地方就是波特率,简单地说,就是发东西的速度。很明显的例子,我每一秒发送一个脉冲,结果你每两秒接受一次,这样一来就会丢失一半的数据。这意

17、味着,接收方和发送方得约定一个一样的波特率,才能正常传输数据3.跑马灯4.0(串并转换)类似于计时器的TCON,对于串行口而言,也有SCON,来控制参数,内容如下SM1 SM0 类似TM0OD的M1 M0,分别决定四种不同的方式SM2用于多机通信,省略REN是允许串行接收位,控制是否可以接收TB8是第九位数据的发送端,也就是你要发送的第九位数据(方式2 3)RB8是第九位数据的接收端,也就是你接收到的第九位数据(方式2 3)TI是发送中断标志,置1说明发送完成,需要手动复位R1是接收中断标志,置1说明接收完成,同样需要手动复位RXD输出数据,TXD输出波特率工作方式0 2波特率固定,1 3波特

18、率可变工作方式0 1是八位数据,2 3是九位数据(不够准确但是可以近似理解)因而,当我们使用串并转换的时候,就可以利用工作方式0,然后接上数据移位器,(RXD接上数据移位器的AD,TXD接到数据移位器的脉冲输入)再将数据移位器的八个输出连接到八个LED灯,就可以通过一位IO口(RXD)(实际上是两位,因为还有脉冲输出)控制八个灯了3.跑马灯4.0(串并转换)void SINT(void)SCON=0 x00;/初始化SCON,方式0EA=1;ET0=1;/开启中断将单片机的P3.0连接162串并转换芯片(下称162芯片)的AD,P3.1连接162芯片脉冲数入,再将162芯片的八个输出口按顺序连接到LED灯上面最后一次推广:不再使用LED灯,而是想用七段数码管显示数字,应该怎么操作?很简单,把原本连接到LED灯的线按顺序连接到七段数码管的abcdefg即可,然后将LEDTABLE换成七段数码管的显示码(跑马灯终极版)3.跑马灯终极版(七段数码管)七段数码管和LED的完全一样,比如我们显示0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论