下单片机实验报告.doc

上传人:文库蛋蛋多 文档编号:4151116 上传时间:2023-04-07 格式:DOC 页数:59 大小:564.50KB
返回 下载 相关 举报
下单片机实验报告.doc_第1页
第1页 / 共59页
下单片机实验报告.doc_第2页
第2页 / 共59页
下单片机实验报告.doc_第3页
第3页 / 共59页
下单片机实验报告.doc_第4页
第4页 / 共59页
下单片机实验报告.doc_第5页
第5页 / 共59页
点击查看更多>>
资源描述

《下单片机实验报告.doc》由会员分享,可在线阅读,更多相关《下单片机实验报告.doc(59页珍藏版)》请在三一办公上搜索。

1、实验一 流水灯实验2实验二 数码管静态显示实验3实验三 按键输入与数码管静态显示实验6实验四 数码管动态显示实验一10实验五 数码管动态显示实验二12实验六 键盘扫描实验15实验七 外部中断实验一17实验八 外部中断实验二20实验九 定时器实验一22实验十 定时器实验二24实验十一 定时器实验三27实验十二 串口实验一28实验十三 串口实验二29实验十四 串口实验三31实验十五 AD实验35实验十六 DA实验38实验十七 点阵屏显示实验39实验十八 LCD1602显示实验41实验一 流水灯实验一、实验要求1. 在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路2. 继续在

2、Proteus软件中绘制电路,将P1口做输出口,接八只发光二极管3. 在Keil软件中编写程序,实现功能,间隔1S点亮一个发光二极管,顺序从P1.0到P1.7依次点亮。二、实验目的1. 学习Proteus软件的使用方法2. 学习Keil软件的使用方法3. 学习端口输出的使用方法4. 掌握延时程序的设计三、实验说明(条理清晰,含程序的一些功能分析计算)在Proteus软件中把实验要求的电路连接好,再利用Keil软件把要实现的功能编写程序,生成hex文件,把hex文件导到Proteus软件中进行仿真。在编写程序时需要延时1s,我们选的单片机是12MHz的,一机器周期是12个时钟脉冲,一个时钟脉冲的

3、时间是1/12us,即一个机器周期为1us。程序中子函数void delay_ms(int x)中x为1是可延时1ms,以此类推可得1s=1000ms,当x=1000时刚好延时1s。四、硬件原理图及程序设计(一)硬件原理图设计电路中P1.0到P1.7为LED控制端口,排阻RP1阻值为330,AT89c51单片机的9脚(RST)为复位引脚;31引脚(EA)为存取外部存储器使能引脚:单片机内部已接地,所以我们不用再接了。图如下:(二)程序流程图设计开始 设置初始值0x7f 输出/延迟左移 7次?Yesno(三)程序设源代码#include /定义头文件#define LED P1 /LED接至P1

4、口void delay_ms(int x); /声明延时函数main() /主函数 int k; /定义变量 while(1) LED=0x7f; /01111111 最右边一个亮 for(k=0;k8;k+) LED=LED1; delay_ms(1000);/延时1s void delay_ms(int x) /延时函数的开始 int i,j; for(i=0;ix;i+) for(j=0;j120;j+);五实验总结1、本实验应该是比较简单的,但实验中就是算时间的部分刚开始比较不懂,后通过同学的帮助让自己理解了是怎么来计算的。2、通过本次实验对点亮LED灯有了一定的了解,这样也使自己对学

5、这门课变得更有兴趣。实验二 数码管静态显示实验一、实验要求1. 在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路2. 在电路中增加一个7段数码管(共阳/共阴自选),将P2口作数据输出口与7段数码管数据引脚相连 3. 在Keil软件中编写程序,采用静态显示法,实现数码管循环显示数字09,显示数字延时间隔1秒钟二、实验目的1. 巩固Proteus软件和Keil软件的使用方法2. 学习端口输入输出的高级应用3. 掌握7段数码管的连接方式和静态显示法4. 掌握查表程序和延时等子程序的设计三、实验说明(条理清晰,含程序的一些功能分析计算)在proteus中把实验所要求的把电路图连

6、接好,然后在kile软件中开始按实验要求来进行编程。本实验是要实现数码管09间隔1s加一的显示,到9又从0开始到9的不断循环,这样可一用for语句实现。它的每一秒的延时的计算跟实验一所表达的一样。四、硬件原理图及程序设计(一)硬件原理图设计电路中P2口作为数据的输出口,并再与数码管相连接之间加一个排阻,作为限流作用,此电路的数码管是采用共阳级的,所以公共端要接电源。AT89c51单片机的9脚(RST)为复位引脚,当RST为高电平的时间达到2个机器周期时系统就会被复位。18、19引脚是接晶振脚。 开始(二)程序流程图设计 声明驱动数组声明延迟函数i=0赋值数码管TABi,并延时1si+i10no

7、Yes(三)程序设源代码#include /定义头文件#define SEG P2 /数码管接至P2口unsignedchar code TAB=0xc0,0xf9,0xa4,0xb0,0x99, /数字040x92,0x83,0xf8,0x80,0x98; /数字59void delay_ms(int x); /声明延时函数main() int i; while(1) for(i=0;i10;i+) SEG=TABi; delay_ms(1000); /延时1s void delay_ms(int x) /延时函数开始 int i,j; for(i=0;ix;i+) for(j=0;j9)I

8、f(show_value 0)YesYesshow_value =9show_value =0nonoP2=TABshow_value(三)程序设源代码#include /定义8051寄存器的头文件#define LED P2 /声明LED接至P2口sbit KEY1=P30; /声明按钮1接至P3.0sbit KEY2=P31; /声明按钮1接至P3.1unsigned char TAB=0XC0,0XF9,0XA4,0XB0,0X99, /数字040X92,0X83,0XF8,0X80,0X98; /数字59char show_value=0;void delay_ms(int x); /

9、声明延时函数main() while(1) /无穷循环 LED=TABshow_value; KEY1=1; if(KEY1=0) /判断按键加按下 delay_ms(20); /去抖动 if(KEY1=0) /确定按键加按下 while(KEY1=0); /等待按键加放开show_value+; if(show_value9) show_value=0; KEY2=1; if(KEY2=0) /判断按键减按下 delay_ms(20); /去抖动 if(KEY2=0) /确定按键减按下 while(KEY2=0); /等待按键减放开 show_value-; if(show_value0)

10、show_value=9; void delay_ms(int x) /延时函数开始 int i,j; for(i=0;ix;i+) for(j=0;j120;j+); 五实验总结这次试验当我按照所要求的功能来编写程序完成的时候,我对本程序进行了编译发现没什么错误,但是只实现了一半的功能,发现按键按下减一不能减了,即按下无效,后来经过不断的检查发现其中有一个大括号的位置放错了,这样其实也好,如果说每个程序编下来都没任何问题,也许一有那么一次遇到问题会让你无从下手,这样的锻炼应该会对你做事的认真仔细会有一定的帮助。这样可以把理论跟实践紧密结合。实验四 数码管动态显示实验一一、实验要求1. 在Pr

11、oteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路2. 在电路中增加四个7段数码管(共阳/共阴自选),将P2口作数据输出口与7段数码管数据引脚相连 ,P1.0P1.3引脚输出选控制信号3. 在Keil软件中编写程序,采用动态显示法,实现数码管分别显示数字1,2,3,4 二、实验目的5. 巩固Proteus软件和Keil软件的使用方法6. 学习端口输入输出的高级应用7. 掌握7段数码管的连接方式和动态显示法8. 掌握查表程序和延时等子程序的设计三实验说明(条理清晰,含程序的一些功能分析计算)电路是将所要显示的七段显示码由P2口分别送数据给4个数码管,在由P1.0p1.3的低四位将

12、扫描信号直接通过PNP三极管集电极分送到4个数码管的4个公共端,使这4个七段数码管显示“1234”,本程序是用for语句来实现对4个数码管的位选和段选进行扫描给予数据和位选。四、硬件原理图及程序设计(一)硬件原理图设计下图所示,可以很直观的看出此图所要涉及的电路接线法与实现的功能。该电路的P2口为数据输出口,在数码管的数据输入端串上220欧限流电阻。用的是四个共阳数码管。电路中的P10P13口分别接至PNP基极,发射极接电源VCC,集电极接公共端,给数码管驱动。(二)程序流程图设计 该电路按下开始时就开始调用赋值函数,for语句循环四次,如果for语句中i4四次则会一直循环着,直到for语句中

13、i=4时将停止循环。返回调用函数赋初值,并一直以此一直循环着开始 声明变量与调用赋初值Yes4次扫描?noSEG=TABjSCANP=scani(三)程序设源代码#include /定义8051寄存器的头文件#define SEG P2 /定义七段LED数码管接至P2#define SCANP P1 /定义信号扫描接至P1unsignedchar code TAB=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98;char scan=0xfe,0xfd,0xfb,0xf7; char disp=1,2,3,4; /声明显示数据char i,j;

14、void delay_ms(int x); /声明延迟函数main() while(1) for(i=0;i4;i+) /for语句的开始,循环4次 j=disp3-i; /取出显示数字 SCANP=scani; /输出扫描信号 SEG=TABj; /转换成驱动信号并输出至P2 delay_ms(4); void delay_ms(int x) /延迟函数的开始int i,j; for(i=0;ix;i+) for(j=0;j120;j+);五实验总结实验过程中遇到的问题及解决方法、体会这是我们做的第四个实验,我发现单片机可以做的功能越来越多,j=disp3-i; SCANP=scani; S

15、EG=TABj;程序中的这几句,让我觉得应用的很好,它能把先对应的位和先对应要送的数结合起来。这次实验是采用扫描的方式来实现的,一开始让我对动态扫描有点不理解吗,后来经过上课时间再请教老师,后来就慢慢理解了。实验五 数码管动态显示实验二一、实验要求1. 在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路2. 在电路中增加四个7段数码管(共阳/共阴自选),将P2口作数据输出口与7段数码管数据引脚相连 ,P1.0P1.3引脚输出选控制信号3. 在Keil软件中编写程序,采用动态显示法,实现数码管显示变量unsigned int show_value的值(show_value的

16、值范围为00009999),即把show_value的千百十个位的值用数码管显示出来。二、实验目的1. 巩固Proteus软件和Keil软件的使用方法2. 学习端口输入输出的高级应用3. 掌握7段数码管的连接方式和动态显示法4. 掌握查表程序和延时等子程序的设计三实验说明(条理清晰,含程序的一些功能分析计算)这个实验十将P2口作为数据输出口送数据给四个数码管,P1.0P1.3作为选控信号直接用三极管的集电极送给4个数码管的公共端,让其达到实验的要求。实验中是用for语句来循环扫描位选和段选信号的。四、硬件原理图及程序设计(一)硬件原理图设计下图所示,可以很直观的看出此图所要涉及的电路接线法与实

17、现的功能。该电路的P2口为数据输出口,在数码管的数据输入端串上220欧限流电阻。用的是四个共阳数码管。电路中的P10P13口分别接至PNP基极,发射极接电源VCC,集电极接公共端,给数码管驱动。其中18、19、9、31管脚所接的电路就是单片机的复位和晶振电路。(二)程序流程图设计开始 函数的声明与定义i=0Noi100000YesShow赋值显示i+(三)程序设源代码#include#define SEG P2#define SCANP P1unsignedchar code TAB=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98;char

18、disp4;char scan4=0xfe,0xfd,0xfb,0xf7;unsigned int show=1905;void Display();void Get();void delay_ms(int x);main() while(1) Display(); Get(); void Display()int i,j; for(i=0;i4;i+) j=disp3-i; SCANP=scani; SEG=TABj; delay_ms(4); void Get() disp0=show/1000; disp1=show%1000/100; disp2=show%100/10; disp3=

19、show%10;void delay_ms(int x)int i,j; for(i=0;ix;i+) for(j=0;j120;j+);五实验总结实验过程中遇到的问题及解决方法、体会这个实验4需要多一些显示变量unsigned int show_value 的值(show_value的值范围为00009999),即把show_value的千百十个位的值用数码管显示出来。这个实验是在实验的基础上多加了一些变量,所以这次的实验基本没什么问题,因为在第4个上的问题已经解决了,所以说知识先后是有联系的,要学好这门课就必须每个课时都认真学好。真正做在融会贯通。实验六 键盘扫描实验一、实验要求1. 在P

20、roteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路2. 在电路中设计P1口与一个7段数码管相连接(共阳/共阴自选);3. 电路中绘制一个4X4键盘,分别定义键盘值从0到9,A,B,C,D,E,F,与P2口相连接;4. 在Keil软件中编写程序,对键盘进行扫描,将扫描到的键盘值用数码管进行显示。 二、实验目的1. 学习端口输入输出的高级应用2. 掌握7段数码管的连接方式和显示法3. 掌握4X4键盘的扫描原理和程序三实验说明(条理清晰,含程序的一些功能分析计算)该电路是P1口作为数据输出口,与一个共阳数码管相接,P2口是4x4键盘数据输入口,当键盘上的任意一个键按下时,数码管就会

21、显示该按键所对应的数字,并且放开按键后能继续保持显示,当按下另一个按键时,就会显示按下那个按键所对应的数字。实现键盘扫描数组和显示数组分别定义了scan数组和TAB数组,在键盘扫描后经过kcode = 4 * col + row进行计算出按键的值。四、硬件原理图及程序设计(一)硬件原理图设计该电路是P1口做为数据输出口,在数据输入数码管前加了一个限流电阻,P3口就是4*4的扫描键盘的设置,其中18、19、9、31管脚接的电路就是单片机的复位电路和晶振电路。(二)程序流程图设计 声明变量与函数数输出显示数据与扫描信号读取按键值按键按下?第零行?row=0第一行?row=1第二行?row=2第三行

22、?row=3调用延迟函数放开按键?计算键值开始读取键值noYesYesnoyesnoYesnoyesnoyesno这个流程图主要就是在不断的扫描,当有按键按下,就会进行按键值的判断和计算。(三)程序设源代码#include /定义8051寄存器头文件#define SEG P1 /定义七段LED数码管连接到P1#define KEY P2 /定义按键连接到P2unsigned char code TAB=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0xa0,0x83,0xa7,0xa1,0x84,0x8e;char scan4=0xef,

23、0xdf,0xbf,0x7f; /显示器及键盘扫描码void delay_ms(int x); /延迟函数声明main() unsigned char row,col,rowkey,kcode; /声明变量(col:列,row:行,rowkey:行键 while(1) 值,kcode:按键值) for(col=0;col4;col+) KEY=scancol; rowkey=KEY&0x0f; /读入KEYP低四位,反向清除高4位求行键值 if(rowkey!=0) if(rowkey=0x01) row=0; else if(rowkey=0x02) row=1; else if(rowke

24、y=0x04) row=2; else if(rowkey=0x08) row=3; kcode=4*col+row;SEG=TABkcode;while(rowkey!=0)rowkey=KEY&0x0f; /再读入行键值 delay_ms(4); void delay_ms(int x) /延迟函数的开始int i,j; for(i=0;ix;i+) for(j=0;j120;j+);五实验总结实验过程中遇到的问题及解决方法、体会这是我们的第六个实验,发现自己的思维必须更加清晰,因为程序越来越复杂,所以必须加强课外的练习,和借助和课外书的参考,起初对rowkey=KEY&0x0f;一直不理

25、解,后来经过自己不断的看书和反复的思考和同学的讨论解决的。实验七 外部中断实验一一、实验要求1. 在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路;2. P1口上拉接8个LED;3. 在Keil软件中编写程序,对LED显示进行控制,显示方式有两种:(1)0、7亮,1、6亮,2、5亮,3、4亮,0、7亮循环;(2)3、4亮,2、5亮,1、6亮,0、7亮,3、4亮循环。 4. 在P3.2连接一个按键K,当按键弹起时引脚为高电平,当按键按下时引脚为低时平;5. 编写程序:系统对LED显示进行控制,一开始显示方式为(1),当按下P3.2连接的按键K时,显示方式为(2),再按下P

26、3.2连接的按键K时,显示方式为(1);即当按下P3.2连接的按键K时,系统在显示方式(1)和(2)之间切换;二、实验目的1. 学习端口输入输出的高级应用2. 掌握LED查表显示法3. 掌握外部中断的工作原理4. 掌握外部中断程序设计三实验说明(条理清晰,含程序的一些功能分析计算)按照实验的要求把电路路在仿真中连接好,其中包括了复位电路和晶振电路,8个LED与P1口相接,开关与P3.2相接,当按下开关时LED的显示方式进行切换,再次按下再进行一次的变换,只要按下开关就会不断的在两种方式切换,这个是采用外部中断的方式完成的。四、硬件原理图及程序设计(一)硬件原理图设计(二)程序流程图设计开始变量

27、定义与赋值if(b=0)For(i=0)LED=TABi;i+;NoYesi4;NoFor(i=0)Yesi4;LED=TAB3-i;i+;INT0b=b(三)程序设源代码#include /定义8051寄存器头文件 #define LED P1 /定义P1为LED控制口unsigned char code TAB=0x7e,0xbd,0xdb,0xe7; /定义LED数组int a,b; /定义变量void delay_ms(int x); /延时函数声明main() EA=1; /开启中断总开关 EX0=1; /开启外部中断0 IT0=1; b=0; while(1) if(b=0) /工

28、作方式为1 for(a=0;a=0;a-) LED=TABa; delay_ms(500); void INT0_ISK(void) interrupt 0 /外部中断0子函数 b=b; void delay_ms(int x) /延迟函数的开始int i,j; for(i=0;ix;i+) for(j=0;j120;j+); 五实验总结实验过程中遇到的问题及解决方法、体会这是第七个实验,实验过程中一开始我是把一种直接放在主程序里面,另一种状态放在中断函数中这样导致按键按下只有一次切换到另一个状态,再次按下变的无法切换回第一个状态了,这样之后我再想到了一个办法就是再定义了一个变量b,把两种状态

29、全部放入到了主函数中,当b=0执行第一个状态,当b=1执行第二个状态,这样中断函数中只要b=b即可。实验过程中就是要多思考,这样对自己写程序的思维才能更好的锻炼。实验八 外部中断实验二一、实验要求1. 在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路;2. 在电路中增加一个7段数码管(共阳/共阴自选),将P2口作数据输出口与7段数码管数据引脚相连 ;3. 在P3.2和P3.3分别连接一个按键,当按键弹起时引脚为高电平,当按键按下时引脚为低时平;4. 在Keil软件中编写程序:实现数码管循环显示数字09,程序一开始数码管显示0,当按下P3.0引脚对应按键时,显示数字加一;

30、当按下P3.1引脚对应按键时,显示数字减一;(注意按键采用外部中断方式识别)二、实验目的1. 掌握7段数码管的连接方式和静态显示法2. 巩固中断的知识,学会外部中断的使用3. 掌握查表程序、中断服务子程序和延时等子程序的设计三实验说明(条理清晰,含程序的一些功能分析计算)把实验要求的电路在仿真软件中连接好,开始写程序先把要用的函数、变量先定义好,其中是采用外部中断的方式识别,当按下P3.2时数字加一,当按下P3.3时数字减一。在数值大于9和小于0的时候要做出判断,这样才能不出错。四、硬件原理图及程序设计(一)硬件原理图设计P2作为数据的输出口,在数据输入数码管前加一个限流电阻,在P3.2、P3

31、.3直接加两个开关,用这个来控制中断。另外9、18、19、31管脚接的电路就是复位电路和晶振电路。(二)程序流程图设计开始声明函数、变量INT0初值显示0按键1按下?加一并输出INT1按键按下? 减一并输出YesnoYesno保持保持 (三)程序设源代码#include /定义8051寄存器头文件 #define SEG P2 /定义数码管的位置unsigned char code TAB=0xc0, 0xf9, 0xa4, 0xb0, 0x99, /数字04的码值0x92, 0x83, 0xf8, 0x80, 0x98 ; /数字59的码值char i;main() SEG=TAB0; /赋

32、初值 IE=0X85; /开启外部中断的总开关及外部中断0和外部中断1 IT0=1; IT1=1; while(1) SEG=TABi; void INT0_ISR(void) interrupt 0 /外部中断0开始 i+; if(i9) i=0; void INT1_ISR(void) interrupt 2 /外部中断1开始 i-; if(i0) i=9; 五实验总结实验过程中遇到的问题及解决方法、体会这个实验采用的是外部中断的方式来控制数码管显示的加减,实验中单片机的两个外部中断都用到了,一个用来中断增一,一个用来中断减一。实验过程中把两个外部中断名取一样了,结果导致了错误,后来经过了

33、改正使程序变的成功。实验九 定时器实验一一、 实验要求1. 用定时器方式现P.口输出0.5K的方波2. 用定时器方式现P.口输出1K的方波3. 用定时器方式现P.口输出5K的方波4. 以上方式查询法和中断法均可。二、实验目的1. 巩固中断的知识,学会定时器的使用方法;2. 掌握定时器初值的计算和工作方式的使用;3. 掌握中断服务子程序的设计三实验说明(条理清晰,含程序的一些功能分析计算)这个实验是用定时器中断的方法来产生0.5k、1k、5k的方波,把实验要求的把P1口作为输出的控制口,其中TMOD=0x01是让它工作在方式一,TH0=(65536-count)/256; TL0=(65536-

34、count)%256;是先给定时器赋初值,就是溢出一次是100us,所以程序中Time-cnt+,Time-cnt=T-cnt,T-cnt=5、T-cnt=10、T-cnt=50,分别就代表0.5k、1k、5k方波的产生。四、硬件原理图及程序设计(一)硬件原理图设计(二)程序流程图设计Time-cnt=T_cnt开始开启定时器0并且赋初值。T_cnt=5;Key=0Key=1Key=2T_cnt=10;T_cnt=50;NoNoYesYesYesNoTF0TH0=(65535-100)/256;TH1=(65535-100)%256;T+;Time-cnt=0;P20=P20;YesNo(三)程序设源代码#include /定义8051寄存器的头文件#define count 100 /T0(Mode1)的计数值,约0.1mssbit P2_0=P20;unsigned int T_cnt; /定义定时器中断的次数unsigned int Time_cnt;unsigned char key=0;main() /主程序开始 TMOD=0x01; /定时器选择工作方式1 TH0=(65536-count)/256; TL0=(65536-count)%256; IE=0X82;

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

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号