[单片机实验报告 x]

| 浏览次数:

《单片机系统实验》

实验报告

院 系:

学 号:

姓 名:

2017年12月

一、实验目的

了解32位单片机(STM32系列)原理及其应用,熟悉单片机的资源,掌握单片机的最小系统设计及扩展技术,掌握单片机的编程语言。

通过本实验了解LCD液晶工作原理,能通过编程操作液晶的显示。

二、实验设备

STM32实验系统一套,PC机一台。

三、实验原理

(1)I/O口及定时器实验:STM32的GPIO口控制4个发光二极管,了解其硬件连接方式,学会使用STM32的一个定时器,掌握对定时器计时方式的编程。编写程序循环点亮4个发光二极管,控制点亮时间为1秒钟闪烁。

(2)外部中断实验:掌握STM32单片机外部中断的用法,学会设置中断优先级,在实验(1)的基础上完成,如果有外部中断发生改变发光二极管的发光规律。(如,仅其中2个灯亮,再次触发外部中断后,发光二极管重新变成4个灯循环点亮。)

(3)串行口通信实验:掌握STM32单片机与计算机之间的硬件连接方式,了解二者之间的传输协议,进行数据传输。

(4)LCD实验:掌握STM32单片机与液晶之间的硬件连接方式,单片机如何驱动液晶进行显示。

四、内容与步骤

学会使用IAR或KEIL的编译链接调试环境,熟悉有关STM32使用到的库,并能顺利建立包含各种库文件的工程。(2学时)

I/O口实验:在建立工程的基础上能点亮发光二极管。(2学时)

定时器实验:循环定时(用定时器做)点亮4个灯,即每1秒闪烁点亮一个灯,循环往复(或叫跑马灯实验)。(2学时)

外部中断实验:按键作为触发外部中断的条件,中断发生时,改变发光二极管的点亮规律。(2学时)

串行口通信实验:编写串行口通信实验程序,能在计算机与STM32系统间进行ASCII码的传输。(2学时)

LCD实验:通过自行编写库文件和了解液晶显示字库,能在液晶上显示“北京航空航天大学机械工程及自动化学院”字样。(6学时)

五、关键代码

I/O口及定时器实验

/*通过定时器3中断函数实现跑马灯,现象为每个LED灯依次点亮1秒后熄灭*/

void TIM3_IRQHandler(void)

{

extern uint8_t LED_Status[5];

if(TIM3->SR&0X0001)//溢出中断

{

if(LED_Status[1]==0)

{

LED1_ON;

LED2_OFF;

LED3_OFF;

LED4_OFF;

LED_Status[1]=1;

}

else if(LED_Status[1]==1)

{

LED1_OFF;

LED2_ON;

LED3_OFF;

LED4_OFF;

LED_Status[1]=2;

}

else if(LED_Status[1]==2)

{

LED1_OFF;

LED2_OFF;

LED3_ON;

LED4_OFF;

LED_Status[1]=3;

}

else if(LED_Status[1]==3)

{

LED1_OFF;

LED2_OFF;

LED3_OFF;

LED4_ON;

LED_Status[1]=0;

}

}

TIM3->SR&=~(1<<0);//清除中断标志位

}

外部中断实验

/*LED灯的发光规律有两种:一种是每个LED灯依次点亮1秒后熄灭,另一种是每次2个LED灯同时点亮,持续1秒后向前移动1个LED灯的位置。通过触发PA8对应的按键来改变LED灯的发光规律。*/

uint8_t LED_Status[5];/*LED状态保存数组,其中LED_Status[0]用于控制发光规律,LED_Status[1]~ LED_Status[4]用于控制4个LED灯的亮灭状态*/

//按键中断函数

void EXTI9_5_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line8) != RESET) //检测中断线8是否发生中断

{

if(LED_Status[0]==0)

LED_Status[0]=1;

else

LED_Status[0]=0;

//清除中断请求标志

EXTI_ClearITPendingBit(EXTI_Line8);

}

}

//定时器3中断函数

void TIM3_IRQHandler(void)

{

if(TIM3->SR&0X0001)//溢出中断

{

if(LED_Status[0]==0)

{

if(LED_Status[1]==0)

{

LED1_ON;

LED2_OFF;

LED3_OFF;

LED4_OFF;

LED_Status[1]=1;

}

else if(LED_Status[1]==1)

{

LED1_OFF;

LED2_ON;

LED3_OFF;

LED4_OFF;

LED_Status[1]=2;

}

else if(LED_Status[1]==2)

{

LED1_OFF;

LED2_OFF;

LED3_ON;

LED4_OFF;

LED_Status[1]=3;

}

else if(LED_Status[1]==3)

{

LED1_OFF;

LED2_OFF;

LED3_OFF;

LED4_ON;

LED_Status[1]=0;

}

}

else

{

if(LED_Status[1]==0)

{

LED1_ON;

LED2_ON;

LED3_OFF;

LED4_OFF;

LED_Status[1]=1;

}

else if(LED_Status[1]==1)

{

LED1_OFF;

LED2_ON;

LED3_ON;

LED4_OFF;

LED_Status[1]=2;

}

else if(LED_Status[1]==2)

{

LED1_OFF;

LED2_OFF;

LED3_ON;

LED4_ON;

LED_Status[1]=3;

}

else if(LED_Status[1]==3)

{

LED1_ON;

LED2_OFF;

LED3_OFF;

LED4_ON;

LED_Status[1]=0;

}

}

}

TIM3->SR&=~(1<<0);//清除中断标志位

}

串行口通信实验

/*利用串口中断函数实现上位机和下位机的通信。实验现象为上位机发给下位机什么数据,下位机就返回上位机什么数据*/

void USART1_IRQHandler(void)

{

u8 res;

if(USART1->SR&(1<<5))//串口状态寄存器USART_SR第5位RXNE被置1,表示接收到数据

{

if(LED_Status[0]==0)

LED_Status[0]=1;

else

LED_Status[0]=0;

res=USART1->DR;//数据寄存器USART_DR,当串口接收到数据时,数据存在该寄存器内;当向该寄存器写数据时,串口就会自动发送

USART1->DR=res& (uint16_t)0x01FF;

while((USART1->SR&0X40)==0);//USART_SR第6位TC被置1,表示数据发送完成,此处为等待发送结束

}

}

LCD实验

//在字体库文件中创建汉字点阵数组hanzi[18][32],而后逐个显示字体库中的汉字。这里只给出了“北”、“京”和“学”、“院”,全部的有“北京航空航天大学机械工程及自动化学院”

const unsigned char hanzi[18][32]={

{

/* 以下是 '北' 的 16点阵宋体 字模,32 byte */

0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x44,

0x04,0x4E,0x7C,0x58,0x04,0x60,0x04,0x40,

0x04,0x40,0x04,0x40,0x0C,0x40,0x34,0x42,

0xE4,0x42,0x44,0x42,0x04,0x3E,0x00,0x00,

},

{

/* 以下是 '京' 的 16点阵宋体 字模,32 byte */

0x02,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,

0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,

0x10,0x10,0x1F,0xF0,0x01,0x00,0x11,0x10,

0x11,0x08,0x21,0x04,0x45,0x04,0x02,0x00,

},

…,

{

/* 以下是 '学' 的 16点阵宋体 字模,32 byte */

0x22,0x08,0x11,0x08,0x11,0x10,0x00,0x20,

0x7F,0xFE,0x40,0x02,0x80,0x04,0x1F,0xE0,

0x00,0x40,0x01,0x80,0xFF,0xFE,0x01,0x00,

0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,

},

{

/* 以下是 '院' 的 16点阵宋体 字模,32 byte */

0x00,0x40,0x78,0x20,0x4B,0xFE,0x52,0x02,

0x54,0x04,0x61,0xF8,0x50,0x00,0x48,0x00,

0x4B,0xFE,0x48,0x90,0x68,0x90,0x50,0x90,

0x41,0x12,0x41,0x12,0x42,0x0E,0x44,0x00,

},

};

//用 LCD_Showhanzi函数来显示单个16*16汉字

void LCD_Showhanzi(u8 x, u16 y, u8 num, u8 size, u16 PenColor, u16 BackColor)

{

#define MAX_CHAR_POSX 232

#define MAX_CHAR_POSY 304

u16 temp;

u8 pos,t;

if(x>MAX_CHAR_POSX||y>MAX_CHAR_POSY)return;//超过显示范围,直接退出

if(XY) //竖屏显示

{

LCD_WindowMax(x,y,x+size,y+size); //设置窗口

LCD_WriteReg(0x11, 0x6860);

LCD_SetCursor(x, y);

}

else //横屏显示

{

LCD_WindowMax(x,y-size/2,x+size,y); //设置窗口

LCD_WriteReg(0x11, 0x6858);

LCD_SetCursor(x, y-1); //设置光标位置

}

LCD_WriteRAM_Prepare(); //开始写入GRAM

//num=num-' '; //得到偏移后的值

for(pos=2;pos<size*2;pos += 2)

{

temp=(hanzi[num][pos] << 8) + hanzi[num][pos+1]; //调用1608字体

for(t=0;t<size;t++)

{

if(temp&0x01) //从低位开始

{

LCD_WR_DATA(PenColor); //画字体颜色 一个点

}

else

LCD_WR_DATA(BackColor); //画背景颜色 一个点

temp>>=1;

}

}

for(pos=0;pos<2;pos += 2)

{

temp=(hanzi[num][pos] << 8) + hanzi[num][pos+1]; //调用1608字体

for(t=0;t<size;t++)

{

if(temp&0x01) //从低位开始

{

LCD_WR_DATA(PenColor); //画字体颜色 一个点

}

else

LCD_WR_DATA(BackColor); //画背景颜色 一个点

temp>>=1;

}

}

LCD_WindowMax(0x0000,0x0000,320,240); //恢复窗体大小

}

// LCD_Show函数通过反复调用LCD_Showhanzi函数将所有目标汉字显示于LCD屏幕上

void LCD_Show(void)

{

LCD_Showhanzi(69,15,0, 16,RED,GREEN); //北

LCD_Showhanzi(85,15,1, 16,RED,GREEN); //京

LCD_Showhanzi(101,15,2, 16,RED,GREEN); //航

LCD_Showhanzi(117,15,3, 16,RED,GREEN); //空

LCD_Showhanzi(133,15,4, 16,RED,GREEN); //航

LCD_Showhanzi(149,15,5, 16,RED,GREEN); //天

LCD_Showhanzi(165,15,6, 16,RED,GREEN); //大

LCD_Showhanzi(181,15,7, 16,RED,GREEN); //学

LCD_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_Showhanzi(133,47,13, 16,RED,GREEN); //自

LCD_Showhanzi(149,47,14, 16,RED,GREEN); //动

LCD_Showhanzi(165,47,15, 16,RED,GREEN); //化

LCD_Showhanzi(181,47,16, 16,RED,GREEN); //学

LCD_Showhanzi(197,47,17, 16,RED,GREEN); //院

}

六、实验感想

虽然自己本科是机电控制专业毕业的,本实验的相关内容在大四上学期的专业课程设计时也学过,但之前一直是抱别人的大腿,自己并不怎么会单片机的编程。这次由于同组的另一位同学单片机也不怎么熟,所以这次就认真学了一把,算是把以前学习上欠的债给还了吧。

由于单片机用C语言编程,语法其实很简单,关键在于以下3点:

1,对工程的文件系统要熟悉,要理解各个文件之间是怎么联系起来的,其中学会如何使用头文件是很重要的一点;

2,要熟悉STM32单片机硬件如何进行配置。同一类硬件的配置代码其格式是固定的,因此可以拷贝一份配置得比较全的工程文件,然后根据自己具体使用的硬件进行内容的局部改动即可;

3,实验中经常出现出不来现象或现象与预期不匹配的情况,这时候最重要的是保持信心和耐心。由于编译已经通过,明显的语法错误在之前已经被纠正了。这时候首先要考虑的是自己逻辑上有没有错误,可以从主函数入手,依次跳转到各个子函数去。如果还是不解决问题,很可能是自己代码中的接口与实际接口没匹配上或者相关参数设置错误,这时候只能挨个检查和修改各段代码,直至调试成功。

通过这次实验,不仅验证了之前所学的单片机的原理知识,更使我对单片机的编程和使用更加熟练,提高了自己的实践能力。实验中老师和助教的热情指导,使我能更快地掌握实验要点,从而顺利完成实验,在此表示衷心地感谢。

相关热词搜索: 实验报告 单片机 实验 报告

【[单片机实验报告 x]】相关推荐

工作总结最新推荐

NEW
  • 精选大学见习生工作自我鉴定报告4篇领导干部在2023年招商引资工作总结会上的讲话近年来,xxx经开区始终把制造业摆在突出位置,聚焦省“xxx”要求,贯彻落实市委

  • 2023年干部个人述职报告范文选集3篇简短新教师培训体会可借鉴简短新教师培训体会可借鉴学高为师,身正为范。经过自己的努力,很高兴我成为了一名人民教师,怀着忐忑的

  • 教师职称述职报告怎样写随着时钟的转动,一个学期的工作转眼间就结束了。回顾这学期的点点滴滴,真的有喜怒哀乐。孩子们取得的每一个进步都归功于每一位老师的努力,当

  • 离任经理述职报告胡xx各位同仁:上午好!xx市是全省管辖县最多的市,也是全省产险经营主体较多三个市之一,xx分公司业务散、数据量大、人员多、成本高。本人自2

  • 党风廉政建设报告篇立党为公,执政为民,是党的性质和宗旨所决定的,是党的作风建设的根本目的。党员干部廉洁从政,直接关系人心向背和党的执政地位的巩固。作为一名党

  • 音乐教师个人述职报告最新范本时光如梭,一个学期转眼间就过去了,从我任教以来这已经是第八个学期了,在经历了班主任,科学教师等工作后,我开始了音乐教师的工作,上

  • 述职报告全面深化改革述职报告述职全面从严治党述职报告按照县直机关工委要求,我局就2019年抓基层党建、党风廉政建设、意识形态工作情况进行述职,请各位领导和同

  • 网络安全工作开展情况报告为了认真贯彻落实公安部《关于开展重要信息系统和重点网站网络安全保护状况自检自查工作的通知》文件精神,为进一步做好我院网络与信息系统安

  • 关于个人自查报告模板个人查摆剖析材料根据河南省公安厅的统一部署,全省公安机关开展了“正风肃纪”教育整顿活动,通过学习有关文件和法律法规,使我充分了解了教

  • 民主生活会情况报告_民主生活会整改报告优秀叙职爱国守则教学方法:回复观后感简历欢迎词注意事项;颁奖词鄂教版了寓言党支部运营!团结学习计划教学法职业道德三角形