51单片机C语言编程实验指导书.doc

上传人:一*** 文档编号:77551772 上传时间:2023-03-15 格式:DOC 页数:167 大小:1.88MB
返回 下载 相关 举报
51单片机C语言编程实验指导书.doc_第1页
第1页 / 共167页
51单片机C语言编程实验指导书.doc_第2页
第2页 / 共167页
亲,该文档总共167页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《51单片机C语言编程实验指导书.doc》由会员分享,可在线阅读,更多相关《51单片机C语言编程实验指导书.doc(167页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、9 一键多功能按键识别技术1实验任务 如图4.9.1所示,开关SP1接在P3.7/RD管脚上,在AT89S51单片机的P1端口接有四个发光二极管,上电的时候,L1接在P1.0管脚上的发光二极管在闪烁,当每一次按下开关SP1的时候,L2接在P1.1管脚上的发光二极管在闪烁,再按下开关SP1的时候,L3接在P1.2管脚上的发光二极管在闪烁,再按下开关SP1的时候,L4接在P1.3管脚上的发光二极管在闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此轮流下去。2电路原理图 图4.9.13系统板上硬件连线 (1 把“单片机系统”区域中的P3.7/RD端口连接到“独立式键盘”区域中的SP1端口上;(

2、2 把“单片机系统”区域中的P1.0P1.4端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1L8”端口上;要求,P1.0连接到L1,P1.1连接到L2,P1.2连接到L3,P1.3连接到L4上。 4程序设计方法 (1 设计思想由来 在我们生活中,我们很容易通过这个叫张三,那个叫李四,另外一个是王五;那是因为每个人有不同的名子,我们就很快认出,同样,对于要通过一个按键来识别每种不同的功能,我们给每个不同的功能模块用不同的ID号标识,这样,每按下一次按键,ID的值是不相同的,所以单片机就很容易识别不同功能的身份了。 (2 设计方法 从上面的要求我们可以看出,L1到L4发光二极管在每个时

3、刻的闪烁的时间是受开关SP1来控制,我们给L1到L4闪烁的时段定义出不同的ID号,当L1在闪烁时,ID0;当L2在闪烁时,ID1;当L3在闪烁时,ID2;当L4在闪烁时,ID3;很显然,只要每次按下开关K1时,分别给出不同的ID号我们就能够完成上面的任务了。下面给出有关程序设计的框图。5程序框图 图4.9.2 7C语言源程序 #include unsigned char ID; void delay10ms(void) unsigned char i,j; for(i=20;i0;i-) for(j=248;j0;j-); void delay02s(void) unsigned char i

4、; for(i=20;i0;i-) delay10ms(); void main(void) while(1) if(P3_7=0) delay10ms(); if(P3_7=0) ID+; if(ID=4) ID=0; while(P3_7=0); switch(ID) case 0: P1_0=P1_0; delay02s(); break; case 1: P1_1=P1_1; delay02s(); break; case 2: P1_2=P1_2; delay02s(); break; case 3: P1_3=P1_3; delay02s(); break; 13 动态数码显示技术

5、1 实验任务 如图4.13.1所示,P0端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,P1.7接一个开关,当开关接高电平时,显示“12345”字样;当开关接低电平时,显示“HELLO”字样。 2 电路原理图 图4.13.1 3 系统板上硬件连线 (1 把“单片机系统”区域中的P0.0/AD0P0.7/AD7用8芯排线连接到“动态数码显示”区域中的ah端口上;(2 把“单片机系统”区域中的P2.0/A8P2.7/A15用8芯排线连接到“动态数码显示”区域中的S1S8端口上; (3 把“单片机系统”区域中的P1.7端口用导线连接到“独立式键盘”区域中的SP1端口上; 4 程序设计

6、内容 (1 动态扫描方法 动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。 (2 在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。 (3 对于显示的字形码数据我们采用查表方法来完成。 5 程序框图7 C语言源程序 #include unsigned char code table1=0x06,0x5b,0x4f,0x66,0x6d; unsigned char code table2=0x78,0x79,

7、0x38,0x38,0x3f; unsigned char i; unsigned char a,b; unsigned char temp; void main(void) while(1) temp=0xfe; for(i=0;i5;i+) if(P1_7=1) P0=table1i; else P0=table2i; P2=temp; a=temp(7-i); temp=a|b; for(a=4;a0;a-) for(b=248;b0;b-); 14 44矩阵式键盘识别技术1 实验任务 如图4.14.2所示,用AT89S51的并行口P1接44矩阵键盘,以P1.0P1.3作输入线,以P1.

8、4P1.7作输出线;在数码管上显示每个按键的“0F”序号。对应的按键的序号排列如图4.14.1所示 2 硬件电路原理图 图4.14.2 3 系统板上硬件连线 (1 把“单片机系统“区域中的P3.0P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1C4R1R4端口上;(2 把“单片机系统”区域中的P0.0/AD0P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个ah端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,P0.7/AD7对应着h。 4 程序设计内容 (1 44矩阵键盘识别处理 (2 每个按键有它的行值和列值,行值和列值的组合就是识别这个

9、按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。 5 程序框图 图4.14.3 7 C语言源程序 #include unsigned char code table=0x3f,0x06,0x5b,0x4f, 0

10、x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71; unsigned char temp; unsigned char key; unsigned char i,j; void main(void) while(1) P3=0xff; P3_4=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) for(i=50;i0;i-) for(j=200;j0;j-); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp

11、 & 0x0f; switch(temp) case 0x0e: key=7; break; case 0x0d: key=8; break; case 0x0b: key=9; break; case 0x07: key=10; break; temp=P3; P1_0=P1_0; P0=tablekey; temp=temp & 0x0f; while(temp!=0x0f) temp=P3; temp=temp & 0x0f; P3=0xff; P3_5=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) for(i=50;i0;i-) for(j

12、=200;j0;j-); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: key=4; break; case 0x0d: key=5; break; case 0x0b: key=6; break; case 0x07: key=11; break; temp=P3; P1_0=P1_0; P0=tablekey; temp=temp & 0x0f; while(temp!=0x0f) temp=P3; temp=temp & 0x0f; P3=0xff

13、; P3_6=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) for(i=50;i0;i-) for(j=200;j0;j-); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: key=1; break; case 0x0d: key=2; break; case 0x0b: key=3; break; case 0x07: key=12; break; temp=P3; P1_0=P1_0; P0=tablek

14、ey; temp=temp & 0x0f; while(temp!=0x0f) temp=P3; temp=temp & 0x0f; P3=0xff; P3_7=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) for(i=50;i0;i-) for(j=200;j0;j-); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: key=0; break; case 0x0d: key=13; break; case

15、0x0b: key=14; break; case 0x07: key=15; break; temp=P3; P1_0=P1_0; P0=tablekey; temp=temp & 0x0f; while(temp!=0x0f) temp=P3; temp=temp & 0x0f; 15 定时计数器T0作定时应用技术(一)1 实验任务 用AT89S51单片机的定时/计数器T0产生一秒的定时时间,作为秒计数时间,当一秒产生时,秒计数加1,秒计数到60时,自动从0开始。硬件电路如下图所示2 电路原理图 图4.15.13 系统板上硬件连线 (1 把“单片机系统”区域中的P0.0/AD0P0.7/A

16、D7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个ah端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,P0.7/AD7对应着h。(2 把“单片机系统”区域中的P2.0/A8P2.7/A15端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个ah端口上;要求:P2.0/A8对应着a,P2.1/A9对应着b,P2.7/A15对应着h。 4 程序设计内容 AT89S51单片机的内部16位定时/计数器是一个可编程定时/计数器,它既可以工作在13位定时方式,也可以工作在16位定时方式和8位定时方式。只要通过设置特殊功能寄存器TMOD,即可完成。定时/计数器何时工作也是

17、通过软件来设定TCON特殊功能寄存器来完成的。现在我们选择16位定时工作方式,对于T0来说,最大定时也只有65536us,即65.536ms,无法达到我们所需要的1秒的定时,因此,我们必须通过软件来处理这个问题,假设我们取T0的最大定时为50ms,即要定时1秒需要经过20次的50ms的定时。对于这20次我们就可以采用软件的方法来统计了。因此,我们设定TMOD00000001B,即TMOD01H下面我们要给T0定时/计数器的TH0,TL0装入预置初值,通过下面的公式可以计算出TH0(21650000)/256TL0(21650000)MOD256当T0在工作的时候,我们如何得知50ms的定时时间

18、已到,这回我们通过检测TCON特殊功能寄存器中的TF0标志位,如果TF01表示定时时间已到。5 程序框图 7 C语言源程序(查询法) #include unsigned char code dispcode=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00; unsigned char second; unsigned char tcount; void main(void) TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50

19、000)%256; TR0=1; tcount=0; second=0; P0=dispcodesecond/10; P2=dispcodesecond%10; while(1) if(TF0=1) tcount+; if(tcount=20) tcount=0; second+; if(second=60) second=0; P0=dispcodesecond/10; P2=dispcodesecond%10; TF0=0; TH0=(65536-50000)/256; TL0=(65536-50000)%256; 2 C语言源程序(中断法) #include unsigned char

20、code dispcode=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00; unsigned char second; unsigned char tcount; void main(void) TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; ET0=1; EA=1; tcount=0; second=0; P0=dispcodesecond/10; P2=dispcodesecond%

21、10; while(1); void t0(void) interrupt 1 using 0 tcount+; if(tcount=20) tcount=0; second+; if(second=60) second=0; P0=dispcodesecond/10; P2=dispcodesecond%10; TH0=(65536-50000)/256; TL0=(65536-50000)%256; 16 定时计数器T0作定时应用技术(二)1 实验任务 用AT89S51的定时/计数器T0产生2秒钟的定时,每当2秒定时到来时,更换指示灯闪烁,每个指示闪烁的频率为0.2秒,也就是说,开始L1指

22、示灯以0.2秒的速率闪烁,当2秒定时到来之后,L2开始以0.2秒的速率闪烁,如此循环下去。0.2秒的闪烁速率也由定时/计数器T0来完成。2 电路原理图 图4.16.1 3 系统板硬件连线 (1 把“单片机系统”区域中的P1.0P1.3用导线连接到“八路发光二极管指示模块”区域中的L1L4上4 程序设计内容 (1 由于采用中断方式来完成,因此,对于中断源必须它的中断入口地址,对于定时/计数器T0来说,中断入口地址为000BH,因此在中断入口地方加入长跳转指令来执行中断服务程序。书写汇编源程序格式如下所示:ORG00H LJMPSTART ORG0BH;定时/计数器T0中断入口地址 LJMP IN

23、T_T0 START:NOP;主程序开始 . . INT_T0:PUSH ACC;定时/计数器T0中断服务程序 PUSH PSW POP PSW POP ACC RETI;中断服务程序返回 END (2 定时2秒,采用16位定时50ms,共定时40次才可达到2秒,每50ms产生一中断,定时的40次数在中断服务程序中完成,同样0.2秒的定时,需要4次才可达到0.2秒。对于中断程序,在主程序中要对中断开中断。 (3 由于每次2秒定时到时,L1L4要交替闪烁。采用ID来号来识别。当ID0时,L1在闪烁,当ID1时,L2在闪烁;当ID2时,L3在闪烁;当ID3时,L4在闪烁 5 程序框图 7 C语言源

24、程序 #include unsigned char tcount2s; unsigned char tcount02s; unsigned char ID; void main(void) TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; ET0=1; EA=1; while(1); void t0(void) interrupt 1 using 0 tcount2s+; if(tcount2s=40) tcount2s=0; ID+; if(ID=4) ID=0; tcount02s+; if(tcount02s=

25、4) tcount02s=0; switch(ID) case 0: P1_0=P1_0; break; case 1: P1_1=P1_1; break; case 2: P1_2=P1_2; break; case 3: P1_3=P1_3; break; 17 99秒马表设计1 实验任务 (1 开始时,显示“00”,第1次按下SP1后就开始计时。(2 第2次按SP1后,计时停止。 (3 第3次按SP1后,计时归零。 2 电路原理图 图4.17.13 系统板上硬件连线 (1 把“单片机系统”区域中的P0.0/AD0P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a

26、h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,P0.7/AD7对应着h。(2 把“单片机系统”区域中的P2.0/A8P2.7/A15端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个ah端口上;要求:P2.0/A8对应着a,P2.1/A9对应着b,P2.7/A15对应着h。 (3 把“单片机系统“区域中的P3.5/T1用导线连接到”独立式键盘“区域中的SP1端口上; 4 程序框 图4.17.2 6 C语言源程序 #include unsigned char code dispcode=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07

27、, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00; unsigned char second; unsigned char keycnt; unsigned int tcnt; void main(void) unsigned char i,j; TMOD=0x02; ET0=1; EA=1; second=0; P0=dispcodesecond/10; P2=dispcodesecond%10; while(1) if(P3_5=0) for(i=20;i0;i-) for(j=248;j0;j-); if(P3_5=0) keycnt+; s

28、witch(keycnt) case 1: TH0=0x06; TL0=0x06; TR0=1; break; case 2: TR0=0; break; case 3: keycnt=0; second=0; P0=dispcodesecond/10; P2=dispcodesecond%10; break; while(P3_5=0); void t0(void) interrupt 1 using 0 tcnt+; if(tcnt=400) tcnt=0; second+; if(second=100) second=0; P0=dispcodesecond/10; P2=dispcodesecond%10; 18 “嘀、嘀、”报警声1 实验任务 用AT89S51单片机产生“嘀、嘀、”报警声从P1.0端口输出,产生频率为

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁