(PCB印制电路板]单片机实验报告.pdf
(PCBPCB 印制电路板)单片印制电路板)单片机实验报告机实验报告目录实验一、单片机间的多机通信.0实验二、I2C 总线应用技术.8实验三、层次原理图设计.12实验四、元件封装的创建.15实验五、自动布局.17实验六、开关控制 LED.21实验七、中断计数器.24实验八、UART.29实验一、单片机间的多机通信实验一、单片机间的多机通信(1 1)实验题目实验题目采用 C 语言实现单片机间的多机通信。实现内容:三个 51 单片机进行多机通信。一个单片机用于温度的采集(可采用可变电阻模拟温度值),一个单片机用于控制8 个 LED 灯循环显示,显示的时间间隔从主机中获得,主机用于发送温度的大小值及循环显示的时间给从机。(2 2)实验目的实验目的掌握 proteus 和软件环境keilC 的联机调试过程掌握基于 ARMc 编程基础(3 3)实验设备实验设备1.Proteus 8 Professional 仿真开发环境;2.Keil uVision4(4 4)实验步骤实验步骤1.1打开Proteus 8,选择isis绘制电路图,点击p添加元件AT89C51,BUTTON,CAP,CAP-ELEC,CRYSTAL,RES.1.2 绘制电路图如图所示:2.1 打开 Keil uVision5,new project 和 new file2.2 编写代码:(c 语言)/*实验一*主机*发送循环显示时间和温度值给从机*/#include#include#define _SUCC_ 0 x0f/数据传送成功#define _ERR_0 xf0/数据传送失败#define uchar unsigned char#define uintunsigned intuint Time=0,1,2,3,4,5,6,7;/循环显示时间间隔(s)uint T=22,33,66,77,88,99;sbit KEY1=P33;sbit KEY2=P35;uchar count=0;/延时 1ms 函数void delay_1ms(uint t)uint y;while(t-)/串口初始化函数void serial_init()TMOD=0 x20;/定时器 1 工作于方式 2TH1=0 xfd;TL1=0 xfd;/波特率为 9600for(y=110;y0;y-);PCON=0;SCON=0 xd0;/串口工作于方式 3TR1=1;TI=0;RI=0;/发送数据函数void SEND_data(uint*Buff)TI=0;TB8=0;/发送数据长度/发送数据帧/开启定时器P2=Buffcount;SBUF=Buffcount;while(!TI);TI=0;count+;count=count%5;/向指定从机地址发送数据void ADDR_data(uchar addr,uint*Buff)uchar temp=0 xff;while(temp!=addr)/主机等待从机返回其地址作为应答信号SEND_data(Buff);TI=0;/发送从机地址/发送地址帧TB8=1;SBUF=addr;while(!TI);TI=0;RI=0;while(!RI);temp=SBUF;RI=0;/main 函数void main()serial_init();while(1)if(KEY1=0)delay_1ms(5);if(KEY1=0)if(KEY2=0)delay_1ms(5);if(KEY2=0)while(!KEY2);ADDR_data(0 x02,T);while(!KEY1);ADDR_data(0 x01,Time);/*实验一*从机 1*接收主机发送的温度值*/#include#include#include#define addr0 x02/从机 2 的地址#define _SUCC_0 x0f/数据传送成功#define _ERR_0 xf0/数据传送失败#define uint unsigned int#define uchar unsigned charunsigned char Buff20;/数据缓冲区uchar flag=0;/请求标志sbit cs=P10;sbit clk=P11;sbit dio=P12;/串口初始化函数void serial_init()TMOD=0 x20;/定时器 1 工作于方式 2TH1=0 xfd;TL1=0 xfd;/波特率为 9600PCON=0;SCON=0 xd0;/串口工作于方式 3TR1=1;/开启定时器TI=0;RI=0;/-/延时/-void delay(uint x)/-/得到 ad 转结果/-uchar get_ad_result()uchar i,dat1=0,dat2=0;cs=0;uint i;while(x-)for(i=0;i 120;i+);clk=0;dio=1;_nop_();_nop_();clk=1;_nop_();_nop_();clk=0;dio=1;_nop_();_nop_();clk=1;_nop_();_nop_();clk=0;dio=0;_nop_();_nop_();clk=1;dio=1;_nop_();_nop_();clk=0;dio=1;_nop_();_nop_();for(i=0;i8;i+)clk=1;for(i=0;i8;i+)dat2=dat2|(uchar)(dio)i);_nop_();_nop_();_nop_();_nop_();clk=0;_nop_();_nop_();dat1=dat11|dio;clk=1;clk=0;_nop_();_nop_();cs=1;return(dat1=dat2)?dat1:0;/-/主函数/-void main()uint i=0,j=0;uchar temp=0,temp2=0;uchar aa=0 xff;serial_init();while(1)SM2=1;/接收地址帧aa=0 xff;while(aa!=addr)/从机等待主机请求自己的地址RI=0;while(!RI)temp=get_ad_result();/温度采集结果if(temp!=temp2)P2=temp;temp2=temp;aa=SBUF;RI=0;TI=0;/一旦被请求,从机返回自己地址作为应答,等待接收数据TB8=0;SBUF=addr;while(!TI);TI=0;SM2=0;/接收数据帧RI=0;while(!RI);Buffi=SBUF;/数据帧RI=0;/*实验一P2=Buffi;/查看接收到的数据*从机 2*接收主机发送的循环显示时间*/#include#include#include#define addr0 x01/从机 2 的地址#define _SUCC_0 x0f/数据传送成功#define _ERR_0 xf0/数据传送失败#define uint unsigned int#define uchar unsigned charuint code sTable=0,10,20,40,60,80,100,150;uint Buff20;/数据缓冲区uchar light=0 x00;uint speed=0;uint tcount=0;/串口初始化函数void serial_init()TMOD=0 x20;/定时器 1 工作于方式 2TH1=0 xfd;TL1=0 xfd;/波特率为 9600PCON=0;SCON=0 xd0;/串口工作于方式 3TR1=1;/开启定时器TI=0;RI=0;/-/延时/-void T0_INT()interrupt 1if(tcount+speed)return;/-/主函数/-void main()tcount=0;P1=light;light=_crol_(light,1);uint i=0,j=0;uchar aa=0 xff;serial_init();IE=0X82;TR0=1;uint m;while(1)SM2=1;/接收地址帧aa=0 xff;while(aa!=addr)/从机等待主机请求自己的地址RI=0;while(!RI);aa=SBUF;RI=0;TI=0;/一旦被请求,从机返回自己地址作为应答,等待接收数据TB8=0;SBUF=addr;while(!TI);TI=0;SM2=0;/接收数据帧RI=0;while(!RI);m=SBUF;/数据帧RI=0;speed=sTablem;P2=m;/查看接收到的数据2.3 compile file,生成.HEX 文件light=0 x01;(5 5)实验小结实验小结本次实验,实验二、实验二、I2CI2C 总线应用技术总线应用技术(1)(1)实验题目实验题目实验题目:采用 C 语言完成 I2C 的通信。实现内容:放置两个 I2C 芯片,一个是 24C01 存储器,一个是 24C02,分别向两个芯片中写入 016,1733。然后读出相加并将值写入单片机相关单元。(2)(2)实验目的实验目的掌握 proteus 和软件环境keilC 的联机调试过程(3)(3)实验设备实验设备1.Proteus 8 Professional 仿真开发环境;2.Keil uVision5(4)(4)实验步骤实验步骤1.1打开Proteus 8,选择isis绘制电路图,点击p添加元件AT89C51,BUTTON,CAP,CAP-ELEC,CRYSTAL,RES.1.2 绘制电路图如图所示:2.1 打开 Keil uVision5,new project 和 new file2.2 编写代码:(c 语言)/-/-/实验二、实验二、I2CI2C 总线应用技术总线应用技术/采用采用 C C 语言完成语言完成 I2CI2C 的通信。的通信。/实现内容:放置两个实现内容:放置两个 I2CI2C 芯片,一个是芯片,一个是 24C0124C01 存储器,一个是存储器,一个是 24C0224C02,/分别向两个芯片中写入分别向两个芯片中写入 0 01616,17173333。然后读出相加并将值写入单片机相关单元。然后读出相加并将值写入单片机相关单元。/-/-#include#include#include#include#define uchar unsigned char#define uchar unsigned char#define uint unsigned int#define uint unsigned int#define NOP4()_nop_();_nop_();_nop_();_nop_();#define NOP4()_nop_();_nop_();_nop_();_nop_();sbit SCL=P30;sbit SCL=P30;sbit SDA=P31;sbit SDA=P31;uchar*ptr=0 x30;uchar*ptr=0 x30;/保存相加结果的地址保存相加结果的地址/-/-/延时函数延时函数/-/-void delayms(uint x)void delayms(uint x)/-/-/开始开始/-/-void start()void start()SDA=1;SCL=1;NOP4();SDA=0;NOP4();SCL=0;SDA=1;SCL=1;NOP4();SDA=0;NOP4();SCL=0;/-/-/停止停止/-/-void stop()void stop()SDA=0;SCL=0;NOP4();SCL=1;NOP4();SDA=1;SDA=0;SCL=0;NOP4();SCL=1;NOP4();SDA=1;/-/-/写完等待从器件应答写完等待从器件应答/-/-bit ACK(void)bit ACK(void)uchar i;SCL=1;NOP4();i=SDA;SCL=1;NOP4();SCLuchar i;SCL=1;NOP4();i=SDA;SCL=1;NOP4();SCL=0;=0;if(i=1)return 0;if(i=1)return 0;else return 1;else return 1;/-/-/读完发送停止读的信号读完发送停止读的信号/-/-void NO_ACK()void NO_ACK()SDA=1;SCL=1;SDA=1;SCL=1;NOP4();SCL=0;SDA=0;NOP4();SCL=0;SDA=0;/-/-/写字节写字节/-/-void I2C_writebyte(uchar d)void I2C_writebyte(uchar d)uchar i;uchar i;while(x-)for(i=0;i120;i+);while(x-)for(i=0;i120;i+);uint i;uint i;for(i=0;i8;i+)for(i=0;i8;i+)d=1;SDA=CY;_nop_();SCL=1;NOP4();SCL=0;d=1;SDA=CY;_nop_();SCL=1;NOP4();SCL=0;/-/-/读字节读字节/-/-uchar I2C_readbyte()uchar I2C_readbyte()uchar i,d;uchar i,d;for(i=0;i8;i+)for(i=0;i8;i+)SCL=1;d=1;d|=SDA;SCL=0;SCL=1;d=1;d|=SDA;SCL=0;/-/-/写地址及数据写地址及数据/-/-void I2C_write_addr(uchar sl,uchar addr,uchar dat)void I2C_write_addr(uchar sl,uchar addr,uchar dat)start();start();/-/-/读当前地址的数据读当前地址的数据/-/-uchar I2C_read_current(uchar s)uchar I2C_read_current(uchar s)/-/-/读指定地址的数据读指定地址的数据/-/-uchar d;uchar d;I2C_writebyte(s+0 x01);I2C_writebyte(s+0 x01);d=I2C_readbyte();d=I2C_readbyte();NO_ACK();NO_ACK();stop();stop();return d;return d;start();start();I2C_writebyte(sl);I2C_writebyte(sl);I2C_writebyte(addr);I2C_writebyte(addr);I2C_writebyte(dat);I2C_writebyte(dat);stop();stop();delayms(10);delayms(10);return d;return d;ACK();ACK();uchar I2C_read_random(uchar sl,uchar addr)uchar I2C_read_random(uchar sl,uchar addr)/-/-/主函数主函数/-/-void main()void main()uchar i;uchar i;uint dat1=0;uint dat1=0;uint dat2=17;uint dat2=17;uchar sl=0 xa0,0 xaE;uchar sl=0 xa0,0 xaE;for(i=0;i 16;i+)for(i=0;i 16;i+)dat1=I2C_read_random(sl0,i);dat1=I2C_read_random(sl0,i);dat2=I2C_read_random(sl1,i);dat2=I2C_read_random(sl1,i);dat2=dat2+dat1;dat2=dat2+dat1;*ptr=dat2;*ptr=dat2;P2=P2=dat2;dat2;delayms(100);delayms(100);ptr+;ptr+;for(i=0;i 16;i+)for(i=0;i 16;i+)I2C_write_addr(sl0,i,dat1);I2C_write_addr(sl0,i,dat1);I2C_write_addr(sl1,i,dat2);I2C_write_addr(sl1,i,dat2);dat1+;dat1+;dat2+;dat2+;uchar d;uchar d;I2C_writebyte(sl);I2C_writebyte(sl);I2C_writebyte(addr);I2C_writebyte(addr);d=I2C_read_current(sl);d=I2C_read_current(sl);return d;return d;start();start();while(1);while(1);2.3 compile file,生成.HEX 文件2.4proteus 下运行仿真,暂停,查看 cpu 内存:(6 6)实验小结实验小结本次实验目的:掌握 I2C 总线应用技术,用单片机通过总线控制2 块 I2C 芯片。难点是通过程序模拟 I2C 的时序,开始、应答、传送字节。但一条总线挂了多个 I2C 芯片时,需要设定每个芯片的地址,主机在发送的帧中包含地址信息(A2A1A0).实验三、层次原理图设计实验三、层次原理图设计(1 1)实验题目实验题目完成 P126 的电路图设计。要求采用层次电路图的方式进行设计,并进行电气规则检查,生成元件报表、网络表。(2 2)实验目的实验目的掌握 proteus 层次原理图设计(3 3)实验设备实验设备1.Proteus 8 Professional 仿真开发环境;(4 4)实验步骤实验步骤原电路原理图1.创建子电路经过分析,决定对选取其中的一部分电路作为子电路进行层次设计。使用子电路工具建立层次图。2.将光标放置在子图上,点右键,并选择菜 单命令“Goto Child Sheet”(默认组合键为“Ctrl+C”),这时 ISIS 加载一空白的子图页3.编辑子电路4.子电路编辑完后,选择菜单命令【Design】【Goto Sheet】,这时出现如图 8-50所示对 话框,选择“Root sheet1”,然后单击“OK”按钮,即使 ISIS 回到主设计图页。5.电气规则检查6.生成网络表。(5 5)实验小结实验小结本次实验,ISIS 支持层次设计。对于一个较大、较复杂的电路图,不可能一次完成,也不可能将这个电路图画在一张图纸上,更不可能由一个人单独来完成。利用层次电路图可以大大提高设计速度,也就 是将这种复杂的电路图根据功能划分为几个模块,由不同的人员来分别完成各个模块,做到多层次并行设计。实验四、元件封装的创建实验四、元件封装的创建(1 1)实验题目实验题目完成实验二的 PCB 设计,要求进行元件的布局、手工布线。(2 2)实验目的实验目的掌握 proteus 和软件环境keilC 的联机调试过程(3 3)实验设备实验设备1.Proteus 8 Professional 仿真开发环境;(4 4)实验步骤实验步骤1.实验二电路原理图2.生成网络表3.在 ARES 中导入网络表文件。4.在自动布局之前需要先画一个板框。在 ARES 左 侧的工具箱中选择,从主窗口底部左下角下拉 列表框中选择“Board Edge”(黄色),在适当的位置 画一个矩形,作为板框。5.自动布局6.手工布线。(6 6)实验小结实验小结Proteus 软件提供自动布局和手工布局两种方式。在进 行布局时,推荐使用自动布局和手工布局相结合的方式,即先使用自动布局,然后进行手工调整实验五、自动布局实验五、自动布局(1)(1)实验题目实验题目完成实验一的 PCB 设计。要求进行元件的布局、自动布线。(2)(2)实验目的实验目的掌握 proteus 和软件环境keilC 的联机调试过程(3)(3)实验设备实验设备1.Proteus 8 Professional 仿真开发环境;(4)(4)实验步骤实验步骤1.实验一电路原理图:把单片机的时钟复位电路设计成子电路2.为元器件指定相应的封装。2.1 元件封装的创建本次实验用到的 8 段数码管在 package library 中找不到封装,自己画一个该器件的封装并添加进 user 库。2.2 给数码管指定自己的封装3.检查电器规则4.生成元件列表(略)5.自动布局6.手动调整7.自动布线(5)(5)实验小结实验小结Proteus ARES 基于网格的布线既灵活又快速,并能 使用任何导线密度或孔径宽度,以 90或 45在 18 层上布线。在电子世界最近的PCB 软件评论上 排列 A 类。布线参数设置好后,就可以利用Proteus ARES 提供 的布线器进行自动布线了,执行自动布线的方法如下。选择【Tools】【Auto Router】菜单项,或者 单击工具按钮 即可弹出如图 9-38所示的自动布线设置对话框本次实验难点在于元器件封装的创建和指定。因为proteus 版本不同,功能有所变动,课件上的方法有些不适用,后来经过查找资料最后成功完成。实验六、开关控制实验六、开关控制 LEDLED(1 1)实验题目实验题目ARM 的 P0.8 口接按钮,P0.9 口接 LED 等,通过开关控制 LED 的亮、灭。(2 2)实验目的实验目的掌握 proteus 和软件环境keilC 的联机调试过程掌握基于 ARMc 编程基础(3 3)实验设备实验设备1.Proteus 8 Professional 仿真开发环境;2.Keil uVision4(4 4)实验步骤实验步骤1.1 打开 Proteus 8,选择 isis 绘制电路图,点击 p 添加元件 LPC21011.2 绘制电路图如图所示:2.1 打开 Keil uVision5,new project 和 new file2.2 编写代码:(c 语言)/*实验六、开关控制 LED*ARM 的 P0.8 口接按钮,P0.9 口接 LED 等,通过开关控制 LED 的亮、灭。*/#include#define P0_1 0X100;/-/延时/-void delay()unsigned volatile long i;int main()int p01state;PINSEL0=0;IO0DIR=0X000200;IO0SET=0X000200;while(1)p01state=IO0PIN&P0_1;if(p01state=0)IO0CLR=0X000200;else IO0SET=0 x000200;delay();delay();for(i=0;i 10000;i+);2.3 compile file,生成.HEX 文件(5 5)实验小结实验小结ARM 需要初始化很多的功率寄存器和引脚设置的寄存器 这在 STC 的 51 上都是没有的 但是在启动代码里都帮你做好了 编程的时候只需要对引脚和外设进行初始化就可以 如果需要改变运行的频率再去该功率寄存器。首选你需要设置引脚的功能模块 ARM 很多引脚功能都是复用的 你要用 UART 或者普通IO 的功能 必须要设置引脚的功能模块 在 UART 中 你也需要设置UART 相应的寄存器 比如速度 模式等寄存器 另外如果你选用新的一些ARM芯片 例如CORTEX M 系列的 那么你还必须要设置使能这个IOCON GPIO UART 功能的时钟举个例子sbit led=P20;这句在 ARM 里就需要首先设置引脚为 GPIO 功能 在设置它为输出功能再给它高电平才能实现首先来说说 PINSEL0 和 PINSEL1。因为这个芯片很多引脚是复用的,自然多个功能不可能同时使用,所以就需要选择引脚功能,用的就是这两个寄存器,具体细节就不说了,自己看Datasheet 吧LPC2103 中 PINSEL0 管 PIN0.0-PIN0.15,PINSEL1 管 PIN0.16-PIN0.31。值的设定基本是00010203GPIO第一复用功能第二复用功能第三复用功能这两个寄存器的复位值都是000000000,也就是所有引脚复位都是做GPIO 用的。再下来是 GPIO 的控制寄存器了。IOPIN 管脚值寄存器。可以用来读取当前的管脚值,赋值也可以控制管脚输出。IOSET 用来管脚置位的寄存器。写0 无效,写 1 管脚置高电平。IOCLR 用来管脚清除的寄存器。写0 无效,写 1 管脚置低电平。IODIR 管脚方向控制寄存器。0 对应输入,1 对应输出。复位值:000000000(所有管脚复位为输入)#define LED1(117)ARM 中操作单个 IO 不能逐位操作只能通过与运算和或运算操作(15)代表 1 向左移五位 二进制 0000 0001 左移 5 位后变成 0010 0000这样就 GPIO的第 5 位输出 1 其他输出 0 向外输出通过 GPIO_PB|=(15)来只把第 5 位置 1,不影响其他位。通过 GPIO_PB&=(10;dly-)for(i=0;i25000;i+);/*向 74HC595 发送一个字节数据;发送数据时,高位先发送*/void HC595_SendData(uint8 dat)uint8 i;IOCLR0=SPI_CS;/SPI_CS=0;for(i=0;i8;i+)/发送 8 位数据IOCLR0=SPI_CLK;/SPI_CLK=0/*设置 SPI 的 DATA输出值*/if(dat&0 x80)!=0)IOSET0=SPI_DATA;elseIOCLR0=SPI_DATA;dat=dat1;IOSET0=SPI_CLK;/SPI_CLK=1 IOSET0=SPI_CS;/SPI_CS=1,输出显示数据void _irq IRQ_Eint1(void)uint32 i;/i=VICIRQStatus;/*p=i;i=IO0PIN;if(i&LEDCON)=0)IOSET0=LEDCON;else IOCLR0=LEDCON;count-;while(EXTINT&0 x02)!=0)/等待外部中断信号恢复为高电平(若信号为低,则中断标志会一直置位)EXTINT=0 x02;VICVectAddr=0 x00;/在终端发生时硬件会自动将对应的地址 VICVectAddr?装入 VICVectAddr,故退出时要清零/*在退出中断服务程序时要清零相应外设的中断标 志,以及VICVectAddr寄存器,为响应下次中断作 好准备。*/void _irq IRQ_Eint2(void)uint32 i;/i=VICIRQStatus;/*p=i;i=IO0PIN;if(i&LEDCON)=0)IOSET0=LEDCON;else IOCLR0=LEDCON;count=0;while(EXTINT&0 x04)!=0)/等待外部中断信号恢复为高电平(若信号为低,则中断标志会一直置位)EXTINT=0 x04;VICVectAddr=0 x00;/在终端发生时硬件会自动将对应的地址 VICVectAddr?装入 VICVectAddr,故退出时要清零/*在退出中断服务程序时要清零相应外设的中断标 志,以及VICVectAddr寄存器,为响应下次中断作 好准备。*/void _irq IRQ_Eint0(void)uint32 i;/i=VICIRQStatus;/*p=i;i=IO0PIN;if(i&LEDCON)=0)IOSET0=LEDCON;else IOCLR0=LEDCON;count+;while(EXTINT&0 x01)!=0)/等待外部中断信号恢复为高电平(若信号为低,则中断标志会一直置位)EXTINT=0 x01;VICVectAddr=0 x00;/在终端发生时硬件会自动将对应的地址 VICVectAddr?装入 VICVectAddr,故退出时要清零/*在退出中断服务程序时要清零相应外设的中断标 志,以及VICVectAddr寄存器,为响应下次中断作 好准备。*/int main(void)Const uint8DISP_TAB16=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90,0 x88,0 x83,0 xC6,0 xA1,0 x86,0 x8E;PINSEL0=0 xa0000000;/设置所有引 脚连接 GPIOPINSEL1=0 x00000001;IO0DIR=LEDCON|SPI_IOCON;/设置 SPI 控制口为输 出IO0CLR=LEDCON;IO0SET=LEDCON;EXTMODE=EXTMODE|0 x01;/边缘触发EXTPOLAR=EXTPOLAR&0 x0e;/下降沿触发*/*设置向量中断控制器*/VICIntSelect=VICIntSelect&(714);/EINT1、2、0 中断分配为 IRQ 中断VICVectCntl1=0 x20|15;/EINT1中断分配为向量 IRQ 通道 1VICVectCntl2=0 x20|16;VICVectCntl3=0 x20|14;VICVectAddr1=(uint32)IRQ_Eint1;/向量 IRQ 通道 1 的中断服务程序地址为 Eint1_ISRVICVectAddr2=(uint32)IRQ_Eint2;VICVectAddr3=(uint32)IRQ_Eint0;VICIntEnable=(714);/EINT1 中断使能while(1)HC595_SendData(DISP_TABcount);/输出 LED 显示数据DelayNS(5);return 0;/在 project 选项里面勾选 use memory layout from target dialog!2.3 compile file,生成.HEX 文件(5 5)实验小结实验小结74HC595 简介引脚说明:1、Q0Q7 为 8 位并行数据输出2、Q7 第 9 脚,串行数据输出,用于级联3、MR 第 10 脚 主复位(低电平)4、SH_CP 第 11 脚 移位寄存器时钟输入5、ST_CP 第 12 脚 存储寄存器时钟输入6、OE 第 13 脚 输出有效(低电平)7、DS 第 14 脚 串行数据输入LPC21XX 外部中断输入概述LPC2106 具有 3 路外部中断,可以设置为2 种类型:边沿触发:上升沿触发下降沿触发电平触发:高电平触发低电平触发本次实验用到一些比较难懂的中断寄存器:中断选择寄存器(VICIntSelect):位功能31保留18A/D 转换器17外部中断 32ARM内核10WDT寄存器中每一位控制着一个中断源,各中断源的位置与中断源列 表所示相同。向某位写入 1 时,对应中断源产生的中断为FIQ 中断,否则为 IRQ 中断向量 IRQ 中断相关寄存器向量地址寄存器(VICVectAddr015):该寄存器中存放对应优先级向量IRQ 中断服务程序的入口地址。位功能765EN4.0中断源序号VICVectCntlx4:0:分配给此优先级向量IRQ 中断的中断源序号;VICVectCntlx5:该位为 1,使能当前优先级的向量IRQ 中断。否则为禁止。向量控制寄存器(VICVectCntl015):位功能31:0中断服务程序入口地址使用 VIC 的注意要点如果在片内 RAM 中调试程序,并使用了中断,那么必须将存储器映射控制设置为内部 RAM 模式;将多个中断源设置为 FIQ,将增加中断响应延时,所以建议 FIQ 中断只有一个中断源;ADS1.2 规定在定义中断服务函数时必须加入关键 字“_irq”,保证函数返回时会切换处理器模式;在退出中断服务程序时要清零相应外设的中断标 志,以及VICVectAddr 寄存器,为响应下次中断作好准备实验八、实验八、UARTUART(1 1)实验题目实验题目采用中断实现通过串口 0 发送“Hello World!”,然后在虚拟终端接收器上查看。(2 2)实验目的实验目的掌握 proteus 和软件环境keilC 的联机调试过程掌握基于 ARMUART编程基础(3 3)实验设备实验设备1.Proteus 8 Professional 仿真开发环境;2.Keil uVision4(4 4)实验步骤实验步骤1.1 打开 Proteus 8,选择 isis 绘制电路图,点击 p 添加元件 LPC21011.2 绘制电路图如图所示:2.1 打开 Keil uVision5,new project 和 new file2.2 编写代码:(c 语言)/*实验八、UART*采用中断实现通过串口 0 发送“Hello World!”,然后在虚拟终端接收器上查看。*/#includelPC21XX.H/*=LPC21XX 串口使用接收发送中断=*/#define Fosc 11059200/晶振频率,10MHz25MHz,应当与实际一至#define Fcclk(Fosc*5)/系统频率,必须为Fosc 的整数倍(132),且=60MHZ#define Fcco(Fcclk*4)/CCO 频率,必须为 Fcclk 的 2、4、8、16 倍,范围156MHz320MHz#define Fpclk(Fcclk/4)*1/VPB 时钟频率,只能为(Fcclk/4)的 1 4 倍 通常只需要设置 Fosc 即可。需要更改 Fcclk 和 Fcco 时,参照注释。#define UART_BPS 9600;/串口波特率#define uint32 unsigned int#define uint8 unsigned charuint8 send_buffer=Hello world!;uint8 msg=transfer has completed!;/-/延时/-void delay()unsigned int i;/-/UART初始化/-for(i=0;i 10000;i+);void UART_init()uint32 Fdiv;PINSEL0=0 x00000005;U0LCR=0X83;/置位除数锁存位Fdiv=(Fpclk/16)/UART_BPS;/根据波特率计算分频U0DLM=Fdiv/256;U0DLL=Fdiv%256;U0LCR=0X03;/清除除数锁存位,并设置工作模式/U0FCR=0 x81;/使能 FIFO,并设置触发点为 8 字节U0IER=0 x02;/允许 THRE 中断/-/UART0 发送一个字符/-void UART0_SendByte(uint8 byte)U0THR=byte;delay();IO0DIR=0X08;IO0CLR|=0X08;/-/UART0 发送一串字符/-void UART0_SendBuf(uint8*p)while(*p!=0)UART0_SendByte(*(p+);/-/UART0 中断服务函数/-void_irq IRQ_UART0()uint32 data;UART0_SendBuf(send_buffer);U0THR=0 x0d;UART0_SendBuf(msg);IO0SET|=0X08;data=U0IIR;VICVectAddr=0 x00;/在终断发生时硬件会自动将对应的地址 VICVectAddr?装入 VICVectAddr,故退出时要清零/-/主函数/-int main()UART_init();VICIntSelect=0 x00000000;VICVectCntl0=(0 x20|6);VICVectAddr0=(int)IRQ_UART0;VICIntEnable=16;2.3 compile file,生成.HEX 文件(5 5)实验小结实验小结UART 结构图使用 UART 前需要设置的寄存器寄存器名称功能UnLCRUnFCRUnDLL、UnDLMUnIERU1MCRUART 应用示例操作流程设置 UARTn 的通信格式。设置