初步学习单片机实验所学所得(若资料好的话,请给力评价一下).doc_第1页
初步学习单片机实验所学所得(若资料好的话,请给力评价一下).doc_第2页
初步学习单片机实验所学所得(若资料好的话,请给力评价一下).doc_第3页
初步学习单片机实验所学所得(若资料好的话,请给力评价一下).doc_第4页
初步学习单片机实验所学所得(若资料好的话,请给力评价一下).doc_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

元器件对应英文:独立式键盘:button电容:CAP 旁路电容:CAP-ELEC 晶振:CRYSTAL 扬声器:SPEAKER继电器:RLY-SPCO 灯泡:LAMP 拨动开关:DIPSWC条形LED:LED-BARGRAPH-. 双向排阻(8个电阻并排):RX8计算机键盘:KEYPAD1602液晶显示模块:LM016L1.单片机C语言unsigned char code table code 是什么作用?code的作用是告诉单片机,我定义的数据要放在ROM(程序存储区)里面,其实是相当与汇编里面的寻址MOVX(好像是),因为C语言中没办法详细描述存入的是ROM还是RAM(寄存器),所以在软件中添加了这一个语句起到代替汇编指令的作用,对应的还有data是存入RAM的意思定义一个无符号字符型一维数组,table是数组名table,中的,省掉了一个参数,如果有参数,参数就表示些数组包含的个数,里的值就是数组包含的值。上面的代码可以写成unsigned char code table16=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,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+; delay(); else i=0;4. 音谱对应的频率5.LM386N1:音频功率放大器图3-3LM386N1乃音频功率放大器,主要应用于低压消费类产品。为使外围元件最少,电压增益内置为20。但在1脚和8脚之间增加一只外接电阻和电容,便可将电压增益调为任意值,直至200。输入端以地为参考,同时输出端被自动偏置到电源电压的一半,在6V电源电压下,它的静态功耗仅为24mW,加之封装形式有塑封8引线双列直插式和贴片式,使LM386N1具有静态功耗低(约为4mA),可用电池供电;工作电压范围宽(4-12V or 5-18V);外围元件少等特点。图3-4LM386N1管脚示意图如图3-3。 LM386N 外围电路如图3-4所示意。其中R3为正相输入电阻,取值为10K;R4、R5是分压电阻,取值分别为0.5K和0.01K;C9、C10是旁路电容,取值分别为0.1uf、10uf;C11是一个耦合电容,取值为47uf;C12是旁路电容,取值为0.047uf。 6. 警报器FLAG BIT 00H ;设置一个包含1比特的变量ORG 00HSTART:JB P1.7,START ;如果P1.7为1,跳到STARTJNB FLAG,NEXT ;如果FLAG不为1,跳到NEXTMOV R2,#200 ;把立即数200放入R2DV: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放入R2DV1:CPL P1.0 ;P1.0的值求反LCALL DELY500 ;调用延时子程序DJNZ R2,DV1 ;跳转到DV1,直到R2的值为0。配合前面对R2的操作,可以发现这里是进行了一个200次的循环CPL FLAG ;FLAG的值求反SJMP START ;跳转到开头DELY500:MOV R7,#250; ;把立即数250放入R7LOOP:NOP ;空操作DJNZ R7,LOOP ;跳转到LOOP,直到R7的值为0。配合前面对R7的操作,可以发现这里是进行了一个250次的循环RET ;子函数返回END另外,在Keil3下编译时没有出现警告。答案补充把左侧Source Group中的那个.A51的文件从Source Group中Remove掉,那个文件是给C程序用的7. 读段码表中的数据时,可以用两种方法进行查询;一种可以把寄存器中的数当作变量,然后查询;另一种是把DPTR当作变量,自加,然后一直查询。例如:一种是:ORG0000HBEGIN:LJMPSTARTORG0030HSTART:MOVDPTR,#TABLEMOVR1,#00HMOVR4,#10LOOP:MOVA,R1MOVCA,A+DPTRMOVP0,ADELAY: MOV R5,#20D2: MOV R6,#20D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1DJNZ R5,D2INCR1DJNZR4,LOOPSJMPSTARTTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND另外一种是:ORG0000HBEGIN:LJMPSTARTORG0030HSTART:MOVDPTR,#TABLEMOVR4,#10LOOP:CLRAMOVCA,A+DPTRMOVP0,ADELAY: MOV R5,#20D2: MOV R6,#20D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1DJNZ R5,D2INCDPTRDJNZR4,LOOPSJMPSTARTTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND8. 按键识别法#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循环亮,松开键钮之后,则灯停止 流动。 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 char 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)/主循环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(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=hour%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,则分钟自动加1,并且秒回0second=0;minite+;/分钟加1if(minite=60)/如果分钟等于0,则小时值自动加1,并且分钟回0minite=0;hour+;/小时值加1if(hour=24)/如果小时值等于24,则回0hour=0;dispbuf0=second%10;/刷新显示缓冲寄存器dispbuf1=second/10;dispbuf3=minite%10;dispbuf4=minite/10;dispbuf6=hour%10;dispbuf7=hour/10;10. 这么多的“10”是干什么用的?unsigned char code dispbitcode=0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f;unsigned char code dispcode=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00;unsigned char dispbuf8=10,10,10,10,10,0,0,0;这个程序我用的是八个数码管,可是最后显示数字的是只有后面的三个数码管,我想知道一下,为什么这个dispbuf8=10,10,10,10,10,0,0,0前五个数码管初值都是10呢,但是我查了有的资料,有的还可以是16,这个是为什么啊?麻烦知道人士给我解释一下。解答:10 对应dispcode10 = 0x00; 看你的数码管是共阴(这个数码管灭)还是共阳(这个数码管亮)的 如果是灭的话就表示不用这几个数码管 让它熄灭不亮 只关心后面的三位数码管的显示数字 当你引用dispcode这个数组中的元素超过初始化元素时,系统会自动初始化为0 那么dispcode16=0;也是不显示11. 用P2口的时候,记得接上拉电阻。12. 网上搜索4X4键盘程序/4x4矩阵键盘&数码管显示1/*P3.0-P3.3低四位作行输出线,P3.4-P3.7高四位作列输入线P0口接数码管显示0F -by langzi*/#includeunsigned char code table = 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71;void delay()unsigned char n, m;for (n = 100; n 0; n-) for (m = 300; m 0; m-); void display(unsigned char S) /显示子程序P0 = tableS;delay(); P2 = 0x7f; /数码管选通开关unsigned char Keycan(void)static unsigned char rcode, ccode;P3 = 0xF0; / 发全0行扫描码,列线输入if(P3&0xF0) != 0xF0) / 若有键按下 delay();/ 延时去抖动 if(P3&0xF0) != 0xF0) rcode = 0xFE; / 逐行扫描初值 while(rcode&0x10) != 0) P3 = rcode; / 输出行扫描码 if(P3&0xF0) != 0xF0) / 本行有键按下 ccode = (P3&0xF0)|0x0F; do;while(P3&0xF0) != 0xF0); /等待键释放 return (rcode) + (ccode); / 返回键编码 else rcode = (rcode1)|0x01; / 行扫描码左移一位 return 0; / 无键按下,返回值为0void KeyDispaly(unsigned char key) switch(key) case 0x11: display(0); break; case 0x21: display(1); break; case 0x41: display(2); break; case 0x81: display(3); break; case 0x12: display(4); break; case 0x22: display(5); break; case 0x42: display(6); break; case 0x82: display(7); break; case 0x14: display(8); break; case 0x24: display(9); break; case 0x44: display(10); break; case 0x84: display(11); break; case 0x18: display(12); break; case 0x28: display(13); break; case 0x48: display(14); break; case 0x88: display(15); break; default: break; int main(void) unsigned char Key; while(1) Key = Keycan(); KeyDispaly(Key); return 0;/4x4矩阵键盘&数码管显示2/*P3.0-P3.3低四位作列输入线,P3.4-P3.7高四位作行输出线P0口接数码管显示0F (注:该方法的每条行线必须串个4.7K左右的电阻高电平上拉)-by langzi*/#includesbit P3_0=P30;sbit P3_1=P31;sbit P3_2=P32;sbit P3_3=P33;sbit P3_4=P34;sbit P3_5=P35;sbit P3_6=P36;sbit P3_7=P37;unsigned char code table = 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71;void delay()unsigned int n, m;for (n=0;n4000;n+)for (m=0;m10;m+);void display(unsigned char S) /显示子程序P0=tableS;delay(); P2=0x7f; /数码管选通开关int main() P3 = 0xF0; do ; /空操作 while(P3&0xF0 != 0xF0);delay(); /有闭合键,则延时消抖while(1) P3=0x10; / 第1列/ P3_4=1; if(P3_0=1) display(0); if(P3_1=1) display(4); if(P3_2=1) display(8);if(P3_3=1) display(12);P3=0x20; / 第2列/ P3_5=1; if(P3_0=1) display(1); if(P3_1=1) display(5); if(P3_2=1) display(9);if(P3_3=1) display(13);P3=0x40; / 第3列/ P3_6=1; if(P3_0=1) display(2); if(P3_1=1) display(6); if(P3_2=1) display(10);if(P3_3=1) display(14);P3=0x80; / 第4列/ P3_7=1; if(P3_0=1) display(3); if(P3_1=1) display(7); if(P3_2=1) display(11);if(P3_3=1) display(15); return 0;/4x4矩阵键盘&数码管显示3/*P3.0-P3.3低四位作列输入线,P3.4-P3.7高四位作行输出线P0口接数码管显示0F -by langzi*/#includesbit P3_4 = P34;sbit P3_5 = P35;sbit P3_6 = P36;sbit P3_7 = P37;unsigned char code table = 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71; unsigned char temp; unsigned char key; unsigned char i,j; void Delay(void) for(i = 100; i 0; i-) for(j = 300; j 0; j-); void display(unsigned char S) /显示子程序P0 = tableS;Delay(); P2 = 0x7f; /数码管选通开关int main(void) while(1) P3 = 0xff; P3_4 = 0; temp = P3; temp = temp & 0x0f; if (temp != 0x0f) / 若有键按下 Delay(); / 延时消抖 temp = P3; temp = temp & 0x0f; if (temp != 0x0f) temp = P3; temp = temp & 0x0f; switch(temp) case 0x0e: key = 0; break; case 0x0d: key = 1; break; case 0x0b: key = 2; break; case 0x07: key = 3; break; default: break; display(key); temp = P3; temp = temp & 0x0f; while(temp != 0x0f) / 等待键释放 temp = P3; temp = temp & 0x0f; P3 = 0xff; P3_5 = 0; temp = P3; temp = temp & 0x0f; if (temp != 0x0f) Delay(); 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 = 7; break; default: break; display(key); temp = P3; temp = temp & 0x0f; while(temp != 0x0f) temp = P3; temp = temp & 0x0f; P3 = 0xff; P3_6 = 0; temp = P3; temp = temp & 0x0f; if (temp != 0x0f) Delay(); temp = P3; temp = temp & 0x0f; if (temp != 0x0f) temp = P3; temp = temp & 0x0f; switch(temp) case 0x0e: key = 8; break; case 0x0d: key = 9; break; case 0x0b: key = 10; break; case 0x07: key = 11; break; default: break; display(key); temp = P3; temp = temp & 0x0f; while(temp != 0x0f) temp = P3; temp = temp & 0x0f; P3 = 0xff; P3_7 = 0; temp = P3; temp = temp & 0x0f; if (temp != 0x0f) Delay(); temp = P3; temp = temp & 0x0f; if (temp != 0x0f) temp = P3; temp = temp & 0x0f; switch(temp) case 0x0e: key = 12; break; case 0x0d: key = 13; break; case 0x0b: key = 14; break; case 0x07: key = 15; break; default: break; display(key); temp = P3; temp = temp & 0x0f; while(temp != 0x0f) temp = P3; temp = temp & 0x0f; return 0;13. 排阻的电阻选择一般排阻的发光二极管的点亮电流为3mA,一般为3-10mA,所以选择当用VCC的时候,排阻的电阻选择一般为1K。14. 一定注意:51单片机所有I/O口上电之后都是高电平,而且这都是默认的,没得说。15. 怎么识别芯片?例如:STC89C52RC40C-PDIP0721CV4336.STC:代表STC公司89:一个系列C:表示内部是Coms器件52:2代表内部空间程序存储空间的大小是2X4=8K40:表示所能支持晶振的最高频率是40MC:表是商业级,还有一种型号是I(工业级)商业级是0-85摄氏度工业级是-40-125摄氏度军品级是-55-160摄氏度,具体上限不太清楚了DIP:表示封装格式PDIP:表示封装型号,双列直插式,就是单片机有两列,直接插进去的,还有TQFP等型号07:表示07年产的21:表示07年的第21周生产的CV4336.:后面的表示什么就不知道了16. C-51的数据类型扩充定义Sfr:特殊功能寄存器声明Sfr16:sfr的16位数据声明Sbit:特殊功能位声明Bit:位变量声明17. 当P0口做输出口时,必须外接上拉电阻。 P0,P1,P2做输入口时,必须先向端口写“1”操作。18. 发光二极管的识别 若发光二极管是的新的话,则可以直接通过引脚长短判断,长的一端为发光二极管的正极,短的一端为发光二极管的阴极。 若发光二极管已经分不清楚引脚长短的时候,这时注意:在阴极的一端的引脚上有个缺口,也就是说缺口下面的引脚为阴极。 利用万用表的欧姆档(最低档)进行测量识别。 当利用指针式万用表时,其黑色表笔是与内部的电池正极相连的。当指针有所指示或发光二极管发出微弱的光亮时,说明发光二极管已经导通,此时黑色表笔连接的一端为发光二极管的阳极。 当利用数字式万用表时,其红色表笔与内部的电池的真能国际相连。当表盘有数字显示或发光二极管发出微弱的光亮的时候,说明发光二极管已经导通,此时红色表笔连接的一端为发光二极管的阳极。 19.自己写的2x8键扫描程序#include /*设计2x8的键盘*/#define uchar unsigned char/*宏定义字节*/#define uint unsigned int/*宏定义整型*/uchar temp,keycnt;uchar code table=/*数字段码表*/0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0;void delay(uint z)/*延时程序*/uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);uchar keyscan();/*子函数键扫描声明*/void init()/*子函数初始化程序*/P0=table16;keycnt=16;void display(uchar a)/*子函数数码管显示程序*/P0=tablea;void main() /*主函数*/init();while(1)display(keyscan();uchar keyscan()/*键扫描子函数*/P3=0xfe; /*使P3.0为零*/temp=P2;/*读P2口的键值*/if(temp!=0xff)/*如果P2口不全为1则代表有键按下,那么就转入括弧内的程序*/*消抖,延时*/delay(5);/*再次使P3.0为零*/P3=0xfe;/*把P2口的值读入temp*/temp=P2;/*再次检测是否有键按下,若有则进入括弧内的程序*/if(temp!=0xff)P3=0xfe;/*有键按下,则再次把所有有关按键值读入*/temp=P2;switch(temp) /*switch语句,分别显示代表数码管显示什么数*/case 0xfe:keycnt=0; break;case 0xfd:keycnt=1; break;case 0xfb:keycnt=2; break;case 0xf7:keycnt=3; break;case 0xef:keycnt=4; break;case 0xdf:keycnt=5; break;case 0xbf:keycnt=6; break;case 0x7f:keycnt=7; break;while(temp!=0xff)/*消抖程序*/P3=0xfe;temp=P2;P3=0xfd;temp=P2;if(temp!=0xff)delay(5);P3=0xfd;temp=P2;if(temp!=0xff)P3=0xfd;temp=P2;switch(temp)case 0xfe:keycnt=8; break;case 0xfd:keycnt=9; break;case 0xfb:keycnt=1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论