第7组(单片机实验总结).doc

上传人:小飞机 文档编号:4295751 上传时间:2023-04-14 格式:DOC 页数:58 大小:763.50KB
返回 下载 相关 举报
第7组(单片机实验总结).doc_第1页
第1页 / 共58页
第7组(单片机实验总结).doc_第2页
第2页 / 共58页
第7组(单片机实验总结).doc_第3页
第3页 / 共58页
第7组(单片机实验总结).doc_第4页
第4页 / 共58页
第7组(单片机实验总结).doc_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《第7组(单片机实验总结).doc》由会员分享,可在线阅读,更多相关《第7组(单片机实验总结).doc(58页珍藏版)》请在三一办公上搜索。

1、广东药学院实验报告总结班级: 生物医学工程11(电子仪器) 组别:第19组 组长:陈均连组员:陈春明、骆伟伟2013年12月15 日实验三 单片机I/O口控制实验1、要求利用P1口做输出口,接八只发光二极管。编写程序,使发光二极管循环点亮,或者产生有一定规律的花样,花样要求如下(提示:每一个要求编一个程序):第一个发光管以间隔200ms闪烁#include /1#define uint unsigned intvoid delayms(uint);sbit led1=P10;void main()while(1)led1=0;delayms(200);led1=1;delayms(200);v

2、oid delayms(uint xms)uint i,j;for(i=xms;i0;i-)for(j=110;j0;j-);8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。#include/2#include#define uint unsigned intvoid delayms(uint);uint aa;sbit beep=P15; void main()P2=0xff;aa=0xfe;beep=1;while(1)P2=aa;beep=0;delayms(500);P2=0xff;beep=1;delayms(500)

3、;aa=_crol_(aa,1);void delayms(uint xms)uint i,j;for(i=xms;i0;i-)for(j=110;j0;j-);8个发光管来回流动,第个管亮100ms,流动时让蜂鸣器发出“滴滴”声。#include/3#include#define uint unsigned intvoid delayms(uint);uint aa,i;sbit beep=P23; void main()P1=0xff;beep=1;aa=0xfe;delayms(500);while(1)for(i=0;i8;i+)P1=aa;beep=1;delayms(100);be

4、ep=0;delayms(100);aa=_crol_(aa,1);if(aa=0xfe) break;aa=0x7f; for(i=0;i0;i-)for(j=110;j0;j-);用8个发光管演示出8位二进制数累加过程,结合两个开关(一加一减)实现加减运算。#include /4#define uchar unsigned char#define uint unsigned intsbit s0=P20;sbit s1=P21;uchar a;void delayms(uint z) int i,j; for(i=z;i0;i-) for(j=110;j0;j-);void main()

5、while(1) a=0; if(s0=0) while(a!=256) a+; P1=a; delayms(500); a=0xff; if(s1=0) while(a!=0) a-; P1=a; delayms(500); 8个发光管间隔200ms由上至下,再由下至上,再重复一次,然后全部熄灭再以300ms间隔全部闪烁5次。重复此过程。#include/5#include#define uint unsigned intvoid delayms(uint);uint a,i,j;void main()while(1)a=0xfe;for(j=0;j2;j+)for(i=0;i8;i+)P1

6、=a;a=_crol_(a,1);delayms(200);a=0x7f;for(i=0;i7;i+)a=_cror_(a,1);P1=a;delayms(200);P1=0xff;delayms(500);for(i=0;i0;i-)for(j=110;j0;j-);间隔300ms第一次一个管亮流动一次,第二次两个管亮流动,依次到8个管亮,然后重复整个过程。#include/6#include#define uint unsigned intvoid delayms(uint);uint i,a;void main()while(1)a=0xfe; for(i=0;i8;i+) P1=a;a

7、=_crol_(a,1);delayms(500); delayms(500); a=0xfc; for(i=0;i4;i+) P1=a;a=_crol_(a,2);delayms(500); delayms(500); a=0xf8; for(i=0;i3;i+) P1=a;a=_crol_(a,3);delayms(500); delayms(500); a=0xf0; for(i=0;i2;i+) P1=a;a=_crol_(a,4);delayms(500); delayms(500); a=0xe0; for(i=0;i2;i+) P1=a;a=_crol_(a,5);delayms

8、(500); delayms(500); a=0xc0; for(i=0;i2;i+) P1=a;a=_crol_(a,6);delayms(500); delayms(500); a=0x80; for(i=0;i0;i-)for(j=110;j0;j-);间隔300ms先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;8个全部闪烁3次;关闭发光管,程序停止。#include /7#include#define uint unsigned intvoid delayms(uint);uint a,i,j;void main()for(i=0

9、;i3;i+)P1=0xaa; /0101 0101delayms(1000);P1=0x55; /1010 1010delayms(1000);P1=0xff;delayms(500);for(i=0;i3;i+)a=0xfe;for(j=0;j7;j+)P1=a;delayms(500);a=_crol_(a,1);for(j=0;j8;j+)P1=a;delayms(500);a=_cror_(a,1);P1=0xff;delayms(500);for(i=0;i3;i+) P1=0x7e;delayms(1000);P1=0xbd;delayms(1000);P1=0xdb;delay

10、ms(1000);P1=0xe7;delayms(1000);P1=0xff;delayms(500);for(i=0;i3;i+)P1=0xe7;delayms(1000);P1=0xdb;delayms(1000);P1=0xbd;delayms(1000); P1=0x7e;delayms(1000);P1=0xff;delayms(500);for(i=0;i0;i-)for(j=110;j0;j-);心得体验:本实验主要学习使用单片机的I/O口控制发光二极管的亮灭,同时要熟悉延时子函数的调用,熟练进行移位操作,比如左移,等指令。应该注意的是:单片机上电时,没有人为地控制I/O口的状态

11、,所有未控制的I/O口都默认为高电频。刚开始学习单片机这门课程,因为学过C语言,所以还是稍微能上手的。学习实验三,从中掌握了I/O口的工作原理和它的数据输出方式,通过P1口观察程序的运行。而且掌握了二个新软件proteu isis和keil,可以进行仿真实验,也和单片机实物结合理论联系实际,提高动手能力,从而全面掌握单片机的应用。而在实验三中,首先要理解题目要求,相应地去编程,要有自己的思路,先把大概的脉络写出来,还要不断地去调试,最终才可以满足题目要求,在仿真和实物单片机都能实现需要的现象。7实验四 LED数码管控制实验1.单片机AT89C51读入4位开关的输入状态(0F),并将其输出到数码

12、管显示。#include /数码管共阳,按键共阴 (1)#include#define uchar unsigned char#define uint unsigned intsbit k1=P20;sbit k2=P21;sbit k3=P22;sbit k4=P23;uint a,b,c,d,m;uchar code table=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e;void main()a=k1;b=k2;c=k3;d=k4;m=(8*!d+4*!c+2*!b+1*!

13、a);P0=tablem;/P02、 数码管动态显示。#include /数码管共阴 (2)#include#define uchar unsigned char#define uint unsigned intuint i; /1/2 /3 /4 /5 /6uchar code dula=0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;uchar code wela=0x7f,0xbf,0xdf,0xef,0xf7,0xfb;void delayms(uint xms)uint i,j;fo

14、r(i=xms;i0;i-)for(j=110;j0;j-);void main()while(1) for(i=0;i6;i+)P2=welai;/P1P0=dulai;delayms(500);P0=0xff;/消影delayms(100);心得体验:本实验主要是熟练掌握I/O口对数码管显示的控制,在编写程序时,应先确定选用的数码管是共阴还是共阳数码管,不同的数码管使用不同的编码。数码管的动态显示中,一般都要上一句P0=0xff,即是消影。如果不进行消影,就会出现显示混乱的现象。学习了P1口和P2口的使用方法,要把P0口、P1口和P2口在keil中调出来调试观察0和1数值(高低电平)变化,

15、由于买的单片机是内部接线固定好,只能通过修改程序和仿真图去满足实验要求,比其他同学所做的工作更多,也更复杂,不过我觉得这样可以让我更深入地去了解了单片机的结构。8实验五 广告流水灯中断控制1、利用定时/计数器T0从P1.0输出周期为1s的方波,让发光二极管以1HZ闪烁,设晶振频率为12MHz。#include /1#define uint unsigned intsbit led=P10;uint num;void main()TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;while(1)if(nu

16、m=20)num=0;led=led;void T0_time() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;num+;2、利用定时/计数器T1产生定时时钟,由P1口控制8个发光二极管,使8个指示灯依次一个一个闪动,闪动频率为10次/秒(8个灯依次亮一遍为一个周期),循环。#include /2 单数码管共阳#include#define uint unsigned int#define uchar unsigned charUchar code dula=0x79,0x24,0x30,0x19,0x12,0x02,0x78,

17、0x00,0x10,0x40;uint a,num,i;void main()TMOD=0x10; /T1TH1=(65536-10000)/256; /10msTL1=(65536-10000)%256;EA=1;ET1=1;TR1=1;num=0;i=0;a=0xfe;while(1)if(num=7) P1=a;P0=dulai;i+;if(num=10)num=0;P1=0xff; if(i=10)i=0;a=_crol_(a,1);/P1=0xff;void T1_time() interrupt 3TH1=(65536-10000)/256;TL1=(65536-10000)%25

18、6;num+;3、用定时器以间隔500MS在6位数码管上依次显示0、1、2、3.C、D、E、F,重复(电路自己设计)。#include /3 共阴#define uint unsigned int#define uchar unsigned charuchar code dula=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;uchar code wela=0x7f,0xbf,0xdf,0xef,0xf7,0xfb;uint num,i,j;void main()TMOD=0x01

19、;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;i=0;num=0;while(1)if(num=10)num=0;P2=welaj;/0选中 位选P3=dulai;/段选i+;if(i=16) i=0;j+;if(j=6) j=0;void T0_time() interrupt 1TH0=(65536-50000)/256; /45872TL0=(65536-50000)%256;num+;选做:INT0、INT1同时存在,P1为输出口,INT1优先级高于INT0,均为电平触发。要求:主程序8个发光二极管左、右移动

20、2轮,再闪烁2次,INT0的中断服务程序控制P1口的8个发光二极管闪烁5次,INT1的中断服务程序控制P1口的8个发光二极管左、右移动3轮(所有计数通过数码管显示),信号灯优先级控制程序流程图如图8-5所示。#include/选做 单数码管共阳#include#define uint unsigned int#define uchar unsigned charuchar code dula=0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x40;/19uint a,b,num0,num1,i,j;sbit N0=P32;sbit N1=P33;vo

21、id delayms(uint xms)uint i,j;for(i=xms;i0;i-)for(j=110;j0;j-);void main()TMOD=0xdd;TCON=0x00;PX1=1; /外部中断1为高优先PX0=0; /0为低EA=1; /全局允许中断EX1=1; /开外部中断1EX0=1; /开外部中断0num0=0;num1=0;i=0;a=0xfe;b=0xff;while(1)for(j=0;j2;j+)/移动2轮for(i=0;i7;i+) /左P1=a;delayms(200);a=_crol_(a,1);for(i=0;i7;i+) /右P1=a;delayms(

22、200);a=_cror_(a,1);j=0;for(j=0;j2;j+)/闪2次P1=b;delayms(200);P1=b;delayms(200);void exter0() interrupt 0b=0xff;while(1)P1=b;P0=dulanum0;delayms(200);P1=b;delayms(200);num0+;if(num0=5)while(1)P1=b;void exter1() interrupt 2a=0xfe;while(1)for(i=0;i7;i+) /左P1=a;delayms(200);a=_crol_(a,1);for(i=0;i7;i+) /右

23、P1=a;delayms(200);a=_cror_(a,1);P0=dulanum1;num1+;if(num1=3) while(1)P1=b;实验五心得:由于水平有限,在实验五花了好长时间,先要了解了定时器/计数器工作方式,而且要搞清楚题目的中断延时要求,既要设计实验仿真电路,又要编程去实现要求。在实验中学习到了外部中断基本使用方法和中断优先级,学习了中断程序的编写程序方法。而在选做实验中断嵌套中进一步地利用了中断优先级去控制程序。9 实验六 方波发生器(1)用内部定时器/计数器0的定时功能,实现周期为400us的方波输出。#include /(1)#define uchar unsig

24、ned char#define uint unsigned intsbit a=P35;sbit b=P37;uchar num;void main() TMOD=0x01; /启动T0 TH0=(65536-100)/256; /400US TL0=(65536-100)%256; EA=1; ET0=1; TR0=1;a=0; b=0; while(1)if(num=2) num=0; a=!a; b=!b; void T0_time()interrupt 1 TH0=(65536-100)/256; TL0=(65536-100)%256; num+;(2)用内部定时器/计数器1的定时功

25、能,在P3.0引脚上产生周期为10ms的方波输出,定时器采用查询和中断两种方式实现。#include /(2)#define uchar unsigned char#define uint unsigned intsbit a=P30;uchar num;void main() TMOD=0x10; /启动T1 TH1=(65536-1000)/256; /10ms TL1=(65536-1000)%256; EA=1; ET1=1; TR1=1;a=0; while(1)if(num=10) num=0; a=!a; void T1_time()interrupt 3 TH1=(65536-

26、1000)/256; TL1=(65536-1000)%256; num+;(3)用内部定时器/计数器0的方式2,在P3.0引脚上产生矩形波, 高电平为50us,低电平为300us。#include /(3)#define uchar unsigned char#define uint unsigned intsbit a=P30;uchar num;void main() TMOD=0x02; /启动T0 TH0=(65536-50)/256; /50US TL0=(65536-50)%256; EA=1; ET0=1; TR0=1;a=0; while(1)/为什么在while里面程序不能

27、实现?void T0_time()interrupt 1 TH0=(65536-50)/256; TL0=(65536-50)%256; num+; if(a=1&num=1) a=!a; num=0; if(a=0&num=6) a=!a;num=0; (4)同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔300ms依次输出1,10,50,100,200,400,800,1k(hz)的方波。#include/(4)#include/包含有左右循环移位子函数的库 #define uint unsigned int/宏定义#define uchar unsi

28、gned char sbit a=P30;sbit b=P15; uchar tt; uint i,f,flag; uchar code FB=1,10,50,100,200,400,800,1000;void main() /主函数 i=0;f=50000;TMOD=0x11;/设置定时器0,定时器1为工作方式1 TH0=(65536-f)/256;TL0=(65536-f)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;/开总中断 ET0=1;/开定时器0中断ET1=1;TR1=1;TR0=1; /启动定时器0while(1) /

29、等待中断产生 if(tt=f)tt=0;a=!a;b=!b;if(flag=6) flag=0;i+; f=FBi;void T0_time() interrupt 1/定时器0中断 TR0=0; /进中断后先把定时器0中断关闭,防止内部程序过多而造成中断丢失TH0=(65536-f)/256;TL0=(65536-f)%256;tt+;6、选作-计数器方式,原理图如下图9-10所示,流程图如图9-11、9-12、9-13所示(1)用内部定时器/计数器1的计数功能,工作在方式2,实现计数10次产生中断使P1.7所接发光二极管点亮(计数用数码管显示,需加数码管)。#include /选做(1)

30、单数码管共阳 接按键于P35#include#define uint unsigned int#define uchar unsigned charuchar code dula=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10;/09void T1_time() interrupt 3 /定时器1中断用来产生300微秒时间定时 TH1=(65536-50000)/256;TL1=(65536-50000)%256;flag+;sbit led=P17;uchar Count = 0;void main()TMOD = 0x60; /T1工作于

31、计数器方式2TH1=255; /计数值设为256-1=255,当P3.5有键按下时,负跳变会使计数器初值255加1,TL1=255; /计数器立即溢出而触发计数中断,计数中断函数将计数变量Count累加ET1=1; /允许T1中断EA =1; /开总中断TR1=1; /启动T1while(1)P0= dulaCount; if(Count=9) led=0; else led=1;void Key_Counter() interrupt 3 /T1计数器中断函数 Count=(Count + 1) %10; /计数控制在10以内无需再加if语句控制初值 (2)用内部定时器/计数器1的计数功能,

32、工作在方式1,8位发光二极管以二进制显示按键次数。#include /选做(2) 单数码管共阳void main() TMOD = 0x50; /设置T1为计数器,工作于方式1,最大计数值为65535TH1 = 0x00; /初值为0TL1 = 0x00;TR1 = 1; /启动T1while(1) P1 = TL1;/显示计数值低字节 P1 = TH1; /显示计数值高字节实验六心得:实验六要用到单片机内部定时器的定时功能,通过查询书本学习到了内部定时器的硬件结构和应用,熟悉了定时器T0和T1的两种用途的其中一种是作为定时器实现定时控制,掌握了TMOD、TCON的意思,也熟悉了使用VSM虚拟

33、示波器来观测波形,也在编程时,熟悉了内部定时器的编程方法。实验七 键盘设计与显示实验1、 将AT89C51的P3端口分别连接8个按键,编号从18, P2端口连接LED数码管,在数码管上显示相应的键值。实验代码与结果: #include#define uchar unsigned char#define uint unsigned intsbit k1=P30;sbit k2=P31;sbit k3=P32;sbit k4=P33;sbit k5=P34;sbit k6=P35;sbit k7=P36;sbit k8=P37;uchar code table=0x3f,0x06,0x5b,0x4

34、f,0x66,0x6d,0x7d,0x07,0x7f;void delayms(uint);uchar num;void delayms(uint xms) uint i,j; for(i=xms;i0;i-) for(j=110;j0;j-);void keyscan() if(k1=0) delayms(10); if(k1=0) num=1;while(!k1); if(k2=0) delayms(10); if(k2=0) num=2;while(!k2);if(k3=0) delayms(10); if(k3=0) num=3;while(!k3);if(k4=0) delayms(10); if(k4=0) num=4;while(!k4);if(k

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号