资源描述:
《单片机实验报告》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
《单片机系统实验》实验报告院系:—学号:姓名:2017年]2月
1一、实验目的1.了解32位单片机(STM32系列)原理及其应用,熟悉单片机的资源,掌握单片机的最小系统设计及扩展技术,掌握单片机的编程语言。2.通过本实验了解LCD液晶工作原理,能通过编程操作液晶的显示。二、实验设备STM32实验系统一套,PC机一台。三、实验原理(1)I/O口及定时器实验:STM32的GPIO口控制4个发光二极管,了解其硬件连接方式,学会使用STM32的一个定时器,掌握对定时器计时方式的编程。编写程序循环点亮4个发光二极管,控制点亮时间为1秒钟闪烁。(2)外部中断实验:掌握STM32单片机外部中断的用法,学会设置中断优先级,在实验(1)的基础上完成,如果有外部中断发生改变发光二极管的发光规律。(如,仅其中2个灯亮,再次触发外部中断后,发光二极管重新变成4个灯循环点亮。)(3)串行口通信实验:掌握STM32单片机与计算机之间的硬件连接方式,了解二者之间的传输协议,进行数据传输。(4)LCD实验:掌握STM32单片机与液晶之间的硬件连接方式,单片机如何驱动液晶进行显示。四、内容与步骤1.学会使用IAR或KEIL的编译链接调试环境,熟悉有关STM32使用到的库,并能顺利建立包含各种库文件的工程。(2学时)2.I/O口实验:在建立工程的基础上能点亮发光二极管0(2学时)3.定时器实验:循环定时(用定时器做)点亮4个灯,即每1秒闪烁点亮一个灯,循环往复(或叫跑马灯实验)o(2学时)4.外部中断实验:按键作为触发外部中断的条件,中断发生时,改变发光二极管的点亮规律。(2学时)5.串行口通信实验:编写串行口通信实验程序,能在计算机与STM32系统间进行ASCII码的传输。(2学时)6.LCD实验:通过自行编写库文件和了解液品显示字库,能在液晶上显示“北京航空航天大学机械工程及自动化学院”字样。(6学时)
2五、关键代码1.I/O口及定时器实验/*通过定时器3中断函数实现跑马灯,现象为每个LED灯依次点亮1秒后熄灭*/voidTIM3_IRQHandlcr(void){externuint8_tLED_Status|5J:if(TIM3.>SR&0X0001)〃溢出中断{if(LED_Status[lJ==O)(LEDl.ON:LED2.OFF;LED3_OFF:LED4.OFF:LED_Stalus|l]=l;}elseif(LED_Status[l|=l)(LED1_OFF:LED2.ON:LED3_OFF:LED4_OFF;LED_Status|l]=2;1elseif(LED_Status(lJ=2){LEDl.OFF;LED2_OFF;LED3_ON;LED4.OFF:LED_Status|lJ=3;}elseif(LED_Status[l|=3)(LEDl.OFF:LED2.OFF:LED3_OFF:LED4_ON;LED_Stalus|l]=O;TIM3->SR&=-(l«0)y/淸除中断标志位
32.外部中断实验/*LED灯的发光规律有两种:一种是每个LED灯依次点亮1秒后熄火,另一种是每次2个LED灯同时点亮,持续1秒后向前移动1个LED灯的位置。通过触发PA8对应的按键来改变LED灯的发光规律。*/uint8jLED_Stams[5]:/*LED状态保存数组,其中LED_Status[O]用于控制发光规律,LED_S〔atus[l]~LED_Status[4]用于控制4个LED灯的亮灭状态*/〃按键中断函数voidEXTI9_5_IRQHandler(void){if(EXTLGctITStatus(EXTLLine8)!=RESET)"检测中断线8是否发生中断(if(LED_Status|0|==0)LED_Status[O]=l;elseLED_Slatus[O|=O;〃淸除中断请求标志EXTI_ClearITPendingBit(EXTI_Line8);//定时器3中断函数voidTIM3_IRQHandler(void)(if(TIM3->SR&OXOOO1)〃溢出中断(if(LED_Sta【us[O]==O){if(LED_Status[l]==O){LED1_ON;LED2.OFF:LED3_OFF:LED4_OFF:LED_Status|l]=l;}elseif(LED_Stalus[l]=l){LEDl.OFF;LED2_ON;LED3_OFF:
4LED4.OFF:LED_Status|l]=2;elseif(LED.Status[l]=2)LEDl.OFF:LED2.OFF:LED3.ON;LED4.OFF;LED_Status[l]=3;elseif(LED_Status[l]=3)LEDl.OFF:LED2_OFF:LED3_OFF:LED4.ON;LED_Status|1]=0:else(if(LED_Status[l]==O){LED1_ON;LED2.ON:LED3_OFF:LED4_OFF;LED_Status|l]=l;}elseif(LED_Status[l]=l){LEDl.OFF;LED2.ON;LED3.ON:LED4.OFF:LED_Status|l]=2;}elseif(LED_Status[l]=2)(LEDl.OFF:LED2.OFF:LED3_ON;LED4_ON:LED_Status|l]=3;}elseif(LED_Status[l]=3)(LED1_ON:
5LED2_OFF:LED3_OFF:LED4_ON;LED_Status|I]=0:TIM3->SR&=~(1vSR&(l«5))//串口状态寄存器USART.SR第5位RXNE被置1,表示接收到数据if(LED_Status[0]=0)LED_Status[O]=l;elseLED_Status|0|=O:res=USARTl->DR7/数据寄存器USART_DR.当串口接收到数据时,数据存在该寄存器内:当向该寄存器写数据时,串口就会自动发送USARTl->DR=rcs&(uintl6_t)0x01FF:while((USARTl->SR&0X40)=0)y/USART_SR第6位TC被置1,表示数据发送完成,此处为等待发送结束I}4.LCD实验〃任字体库文件中创建汉字点阵数组hanzi[18H32],而后逐个显示字体库中的汉字。这里只给岀了“北”、“京”和“学”、“院”,全部的有“北京航空航天大学机械工程及自动化学院”constunsignedcharhanzi[l8]|32]={{/*以下是’北’的16点阵宋体字模,32byte*/0x04,0x40.0x04,0x40.0x04,0x40,0x04,0x44,OxO4・Ox4E.0x7C,Ox58.0xO4.0x60.0xO4.Ox4O,0x04.0x40.0xO4.0x40.0x0CQx4O.0x34.0x42,OxE4.Ox42.Ox44.0x42.Ox04.Ox3E・OxOO.OxOO.
6/*以下是'京'的16点阵宋体字模,32byte*/
70x02,0x00.0x01.OxOO.OxFF.OxFE.OxOO.OxOO.0x00.0x00.0x1EOxFO.Ox10.Ox10.Ox10.0x10.Ox10.Ox10.Ox1EOxFO.OxO1.OxOO.OxILOxl0.Ox11.0x08,0x21.0x04,0x45,0x04,0x02,0x00./*以下是’学’的16点阵宋体字模.32byte*/0x22,0x08.0x11.0x08,0x11,0x10.0x00.0x20,Ox7E0xFE.0x40,Ox02.Ox8O,Ox()4,0xlF.OxEO,0x00.0x40.0x01.Ox80.OxFF.OxFE.Ox01.OxOO.0x01.OxOO.OxOl・0x00.0x05,0x00.0x02.0x00./*以下是’院’的16点阵宋体字模•32byte*/OxOO.Ox40.Ox78.Ox20.Ox4B,OxFE・Ox52.Ox02・Ox54.Ox04.Ox61.OxF8.Ox50.OxOO・Ox48,OxOO.Ox4B.0xFE・0x48・Ox9O・Ox68.Ox90.0x50・0x90.0x41,Ox12.0x41.Ox12.0x42,0x0E,0x44.0x00,〃用LCD^Showhanzi函数来显示单个16*16汉字voidLCD_Showhanzi(u8x,ul6y,u8num.u8size,u16PenColonul6BackColor){ffdcfincMAX_CHAR_POSX232^defineMAX_CHAR_POSY304u!6temp;u8pos,t;if(x>MAX_CHAR_POSXIIy>MAX_CHAR_POSY)rcuim;//超过显示范I札直接退出if(XY)〃竖屏显示LCD_WindowMax(x,y.x+size,y+size);LCD_WriteReg(OxlL0x6860);LCD_SetCursor(x.y);〃设置窗「1〃横屏显示LCD_WindowMax(x,y-size/2,x+size?y);LCD_WriteReg(OxlL0x6858);LCD_SetCursor(x.y・l);〃设置窗口〃设置光标位置LCD.WriteRAM_Prepare();〃num=num-'〃开始写入GRAM〃得到偏移后的值
8
9for(pos=2:pos10LCD_Showhanzi(53,47.8・16.RED.GREEN);〃机LCD_Showhanzi(69.47.9.16.RED.GREEN):〃械LCD_Showhanzi(85.47.10.16.RED.GREEN):〃工LCD_Showhanzi(101.47,11.16.RED.GREEN)://程LCD_Showhanzi(117.47,12.16、RED.GREEN);〃及LCD_Showlianzi(133,47,13,16.RED.GREE、):〃自LCD_Showhanzi(149.47.14,16.RED.GREEN);〃动LCD_Showhanzi(165.47.15.16.RED.GREEN):〃化LCD_Showhanzi(l81.47.16.16.RED.GREEN)://学LCD_Showhanzi(197,47,17,16.RED.GREEN):〃院六、实验感想虽然自己本科是机电控制专业毕业的,本实验的相关内容在大四上学期的专业课程设计时也学过,但之前一直是抱别人的大腿,自己并不怎么会单片机的编程。这次由于同组的另一位同学单片机也不怎么熟,所以这次就认真学了一把,算是把以前学习上欠的债给还了吧。由于单片机用C语言编程,语法其实很简单,关键在于以下3点:1,对工程的文件系统要熟悉,要理解各个文件之间是怎么联系起来的,其中学会如何使用头文件是很重要的一点;2,要熟悉STM32单片机硬件如何进行配置。同一类硬件的配置代码其格式是固定的,因此可以拷贝一份配置得比较全的工程文件,然后根据自己具体使用的硬件进行内容的局部改动即可;3,实验中经常出现出不来现象或现象与预期不匹配的情况,这时候最重要的是保持信心和耐心。由于编译己经通过,明显的语法错误在之前己经被纠正了。这时候首先要考虑的是自己逻辑上有没有错误,可以从主函数入手,依次跳转到各个子函数去。如果还是不解决问题,很可能是自己代码中的接口与实际接口没匹配上或者相关参数设置错误,这时候只能挨个检查和修改各段代码,直至调试成功。通过这次实验,不仅验证了之前所学的单片机的原理知识,更使我对单片机的编程和使用更加熟练,提高了自己的实践能力。实验中老师和助教的热情指导,让我能更快地掌握实验的要点,从而顺利完成实验,在此表示衷心地感谢。