初步学习单片机实验所学所得(若资料好的话,请给力评价一下)

上传人:j****9 文档编号:45449399 上传时间:2018-06-16 格式:DOC 页数:30 大小:812.06KB
返回 下载 相关 举报
初步学习单片机实验所学所得(若资料好的话,请给力评价一下)_第1页
第1页 / 共30页
初步学习单片机实验所学所得(若资料好的话,请给力评价一下)_第2页
第2页 / 共30页
初步学习单片机实验所学所得(若资料好的话,请给力评价一下)_第3页
第3页 / 共30页
初步学习单片机实验所学所得(若资料好的话,请给力评价一下)_第4页
第4页 / 共30页
初步学习单片机实验所学所得(若资料好的话,请给力评价一下)_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《初步学习单片机实验所学所得(若资料好的话,请给力评价一下)》由会员分享,可在线阅读,更多相关《初步学习单片机实验所学所得(若资料好的话,请给力评价一下)(30页珍藏版)》请在金锄头文库上搜索。

1、元器件对应英文:元器件对应英文:独立式键盘:独立式键盘:button电容:电容:CAP 旁路电容:旁路电容:CAP-ELEC 晶振:晶振:CRYSTAL 扬声器:扬声器:SPEAKER继电器:继电器:RLY-SPCO 灯泡:灯泡:LAMP 拨动开关:拨动开关:DIPSWC条形条形 LED:LED-BARGRAPH-. 双向排阻(双向排阻(8个电阻并排):个电阻并排):RX8计算机键盘:计算机键盘:KEYPAD1602液晶显示模块:液晶显示模块:LM016L1.单片机单片机 C 语言语言 unsigned char code table code 是什么作用?是什么作用?code 的作用是告诉单

2、片机,我定义的数据要放在 ROM(程序存储区)里面,其实是相当与汇编里面的寻址 MOVX(好像是),因为 C 语言中没办法详细描述存入的是 ROM 还是RAM(寄存器) ,所以在软件中添加了这一个语句起到代替汇编指令的作用,对应的还有data 是存入 RAM 的意思定义一个无符号字符型一维数组,table 是数组名 table,中的,省掉了一个参数,如果有参数,参数就表示些数组包含的个数,里的值就是数组包含的值。上面的代码可以写成unsigned char code table16=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77

3、,0x7c, 0x39,0x5e,0x79,0x71; 1.用用 C 语言循环控制灯的走向语言循环控制灯的走向 a=temp(8-i);/ b=temp7=0000 0001 P1=a|b; / a|b=1111 1101, P11亮灯,其他不亮 /其他同理,循环至 i=7, a=0000 0000, b=temp1=0111 1111, a|b=0111 1111 P17亮灯,其 他不亮3.C 语言不等指令语言不等指令 if(tablei!=0x01),若 if 语句不写全的话,只执行一次,若写全,加上 else,则可控制一直循环;例如:if(tablei!=0x01)P1=tablei;i

4、+;delay();elsei=0;4.音谱对应的频率音谱对应的频率5.LM386N1:音频功率放大器音频功率放大器LM386N1 乃音频功率放大器,主要应用于低压消费类产品。为使外围元件最少,电压增益内置为 20。但在 1 脚和 8 脚之间增加一只外接电阻和电容,便可将电压增益调为任意值,直至 200。输入端以地为参考,同时输出端被自动偏置到电源电压的一半,在 6V 电源电压下,它的静态功耗仅为 24mW,加之封装形式有塑封 8 引线双列直插式和贴片式,使 LM386N1 具有静态功耗低(约为 4mA) ,可用电池供电;工作电压范围宽(4-12V or 5-18V) ;外围元件少等特点。LM

5、386N1 管脚示意图如图 3-3。 LM386N 外围电路如图 3- 4 所示意。其中 R3为正相 输入电阻,取值为 10K;R4、R5是分压电阻, 取值分别为 0.5K 和图 3-3图 3-40.01K;C9、C10是旁路电容,取值分别为 0.1uf、10uf;C11是一个耦合电容, 取值为 47uf;C12是旁路电容,取值为 0.047uf。 6.警报器警报器 FLAG BIT 00H ;设置一个包含1比特的变量 ORG 00H START: JB P1.7,START ;如果 P1.7为1,跳到 START JNB FLAG,NEXT ;如果 FLAG 不为1,跳到 NEXT MOV

6、R2,#200 ;把立即数200放入 R2 DV: CPL P1.0 ;P1.0的值求反 LCALL DELY500 ;调用延时子程序 LCALL DELY500 ;调用延时子程序 DJNZ R2,DV ;跳转到 DV,直到 R2的值为0。配合前面对 R2的操作,可以发现 这里是进行了一个200次的循环 CPL FLAG ;FLAG 的值求反 NEXT: MOV R2,#200 ;把立即数200放入 R2 DV1: CPL P1.0 ;P1.0的值求反 LCALL DELY500 ;调用延时子程序 DJNZ R2,DV1 ;跳转到 DV1,直到 R2的值为0。配合前面对 R2的操作,可以发现

7、这里是进行了一个200次的循环 CPL FLAG ;FLAG 的值求反 SJMP START ;跳转到开头 DELY500: MOV R7,#250; ;把立即数250放入 R7 LOOP: NOP ;空操作 DJNZ R7,LOOP ;跳转到 LOOP,直到 R7的值为0。配合前面对 R7的操作,可以发 现这里是进行了一个250次的循环 RET ;子函数返回 END另外,在 Keil3下编译时没有出现警告。 答案补充答案补充 把左侧 Source Group 中的那个.A51的文件从 Source Group 中 Remove 掉,那个文件是给 C 程序用的 7.读段码表中的数据时,可以用两

8、种方法进行查询;读段码表中的数据时,可以用两种方法进行查询; 一种可以把寄存器中的数当作变量,然后查询; 另一种是把 DPTR 当作变量,自加,然后一直查询。 例如:一种是: ORG0000H BEGIN: LJMPSTARTORG0030H START: MOVDPTR,#TABLE MOVR1,#00H MOVR4,#10 LOOP:MOVA,R1 MOVCA,A+DPTR MOVP0,A DELAY: MOV R5,#20 D2: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 DJNZ R5,D2 INCR1 DJNZR4,LOOP SJ

9、MPSTART TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END另外一种是: ORG0000H BEGIN: LJMPSTART ORG0030H START: MOVDPTR,#TABLE MOVR4,#10 LOOP:CLRA MOVCA,A+DPTR MOVP0,A DELAY: MOV R5,#20 D2: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 DJNZ R5,D2 INCDPTR DJNZR4,LOOP SJMPSTART TABLE: DB 3FH,06H,5BH,4

10、FH,66H,6DH,7DH,07H,7FH,6FH END8.按键识别法按键识别法 #include unsigned char count; void delay10ms(void) unsigned char i,j;for(i=20;i0;i-)for(j=248;j0;j-);void main(void)while(1)if(P3_7=0)delay10ms();if(P3_7=0) count+;if(count=16)count=0;P1=count;while(P3_7=0); /本条指令是消除抖动,若没有本条指令的话,运行的结果如下:按下键之后,LED 从 0 到 15 循

11、环亮,松开键钮之后,则灯停 止流动。 9.P2 作为输出作为输出 作为输出的时候,要使锁存置 1,否则输出的是乱码段。10.数字钟#include unsigned char code dispcode=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00; /数码管显示段数据unsigned char dispbitcode=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/数码管位驱动,第一次驱动接在最低位的那一个数码管unsigned cha

12、r dispbuf8=0,0,16,0,0,16,0,0;/显示缓冲寄存器unsigned char dispbitcnt;unsigned char second; unsigned char minite;unsigned char hour;unsigned int tcnt;unsigned char mstcnt;unsigned char i,j;void main(void)TMOD=0x02;/设置定时器工作方式为2,8位定时状态,自动装入初值。TH0=0x06;/装入初值TL0=0x06;TR0=1;/起动定时器ET0=1;/开启定时器中断EA=1;/开总中断while(1)

13、/主循环if(P0_0=0)/如果 P0.0位等于0,往下走for(i=5;i0;i-)for(j=248;j0;j-);/延时防抖动if(P0_0=0)/再次判断 P0.0是否等于0,如果是,则设置秒second+;/秒加1if(second=60)/如果秒等于60,又重0开始,以便开始走时second=0;dispbuf0=second%10;/刷新秒个位,并装驱动显示缓冲寄存器dispbuf1=second/10;/刷新秒十位,同上。while(P0_0=0);/等待 P0.0放开。 (等待按键放开)if(P0_1=0)/如果 P0.1位等于0,往下走for(i=5;i0;i-)for(

14、j=248;j0;j-);/延时防抖动if(P0_1=0)/再次判断 P0.1是否等于0,如果是,则设置分钟值minite+;/分钟加1if(minite=60)/minite=0;dispbuf3=minite%10;/刷新分钟个位,并装驱动显示缓冲寄存器dispbuf4=minite/10;/刷新分钟十位,同上while(P0_1=0);/等待 P0.1放开。 (等待按键放开)if(P0_2=0)/大概意思同上,只是这里是用来设置小时值的for(i=5;i0;i-)for(j=248;j0;j-);if(P0_2=0)hour+;if(hour=24)hour=0;dispbuf6=hou

15、r%10;dispbuf7=hour/10;while(P0_2=0);void t0(void) interrupt 1 using 0/定时器中断子程序mstcnt+;/用于刷新所显示的数据,第中断8次显示1位数码管(动态显示)if(mstcnt=8)/判断中断8次没,如果是,则显示数据mstcnt=0;P1=dispcodedispbufdispbitcnt;/段位码送 P1口,驱动数码管显示P3=dispbitcodedispbitcnt;/选中数码管显示位dispbitcnt+;/显示索引,用于调哪一位数据if(dispbitcnt=8)/判断调完没,如果调完了,则又从第一位开始。dispbitcnt=0;tcnt+;/第中断一次自动加1,如果中断4000次,则秒自动加1(这里的中断次数可以跟据你所置的定时器初值来改变)if(tcnt=4000)tcnt=0;second+;/秒加1if(second=60)/如果秒等于60,则

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

当前位置:首页 > 中学教育 > 初中教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号