词条 | 单片机实例 |
释义 | 单片机类型概述(按数据位分类 按厂家分类 按处理速度分类 按指令集分类) 51单片机程序相关实例类型(1.闪烁灯 2.模拟开关灯 3.多路开关状态指示 4.串口应用 5.直流电机调速 6.蜂鸣器提示程序) 单片机类型概述单片机按照不同的分类依据可以分成多种类型。 按数据位分类按数据位数分8位,16位,32位。 按厂家分类按厂家分,atmel ,nxp,st,ti,intel,华邦,stc,philips,moto罗拉等等。 按处理速度分类按处理速度分低速,高速。 按指令集分类按指令集分哈佛结构 ,诺依曼结构 51单片机程序相关实例类型1.闪烁灯在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。 汇编源程序: ORG 0 START: CLR P1.0 LCALL DELAY SETB P1.0 LCALL DELAY LJMP START DELAY: MOV R5,#20 ;延时子程序,延时0.2秒 D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END C语言源程序 #include <AT89X51.H> sbit L1=P1^0; void delay02s(void) //延时0.2秒子程序 { unsigned char i,j,k; for(i=20;i>0;i--) for(j=20;j>0;j--) for(k=248;k>0;k--); } void main(void) { while(1) { L1=0; delay02s(); L1=1; delay02s(); } } 2.模拟开关灯监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。 汇编源程序 ORG 00H START: JB P3.0,LIG CLR P1.0 SJMP START LIG: SETB P1.0 SJMP START END C语言源程序 #include <AT89X51.H> sbit K1=P3^0; sbit L1=P1^0; void main(void) { while(1) { if(K1==0) { L1=0; //灯亮 } else { L1=1; //灯灭 } } } 3.多路开关状态指示单片机的P1.0-P1.3接四个发光二极管L1-L4,P1.4-P1.7接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,开关断开,对应的灯灭)。 方法一(汇编源程序) ORG 00H START: MOV A,P1 ANL A,#0F0H RR A RR A RR A RR A XOR A,#0F0H MOV P1,A SJMP START END 方法一(C语言源程序) #include <AT89X51.H> unsigned char temp; void main(void) { while(1) { temp=P1>>4; temp=temp | 0xf0; P1=temp; } } 方法二(汇编源程序) ORG 00H START: JB P1.4,NEXT1 CLR P1.0 SJMP NEX1 NEXT1: SETB P1.0 NEX1: JB P1.5,NEXT2 CLR P1.1 SJMP NEX2 NEXT2: SETB P1.1 NEX2: JB P1.6,NEXT3 CLR P1.2 SJMP NEX3 NEXT3: SETB P1.2 NEX3: JB P1.7,NEXT4 CLR P1.3 SJMP NEX4 NEXT4: SETB P1.3 NEX4: SJMP START END 方法二(C语言源程序) #include <AT89X51.H> void main(void) { while(1) { if(P1_4==0) { P1_0=0; } else { P1_0=1; } if(P1_5==0) { P1_1=0; } else { P1_1=1; } if(P1_6==0) { P1_2=0; } else { P1_2=1; } if(P1_7==0) { P1_3=0; } else { P1_3=1; } } } 4.串口应用使用晶体频率为22.1184MHz的AT89C52单片机,串行口应用工作方式1,以9600bps的波特率向外发送数据,数据为十个数字‘0’到‘9’,循环不断地发送。 数字字符为增量进二进制码,‘0’对应0x30,‘1’= ‘0’+ 1 = 0x31,从‘0’到‘9’对应编码为0x30到0x39,记忆二进制编码较难,实际编程中用单引号括起对应字符表示引用该字符的二进制编码值,如‘?’表示引用?号的编码值。 #include <at89x52.h> void main( void ) { TMOD = (TMOD & 0x0F) | 0x20; TH1 = -12; PCON |= 0x80; //SMOD = 1 TR1 = 1; SCON = 0x42; while( 1 ) { if( TI==1 ) { static unsigned char Dat=‘0’; SBUF = Dat; TI = 0; If( ++Dat > ‘9’) Dat=‘0’; } } } 5.直流电机调速#include <reg52.h> sbit KEY1 = P3^1; sbit PWM = P1^5; unsigned char CYCLE; //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 0.1ms unsigned char PWM_ON ;//定义高电平时间 void delay(unsigned int cnt) { while(--cnt); } main() { unsigned char PWM_Num;//定义档位 TMOD |=0x01;//定时器设置 1ms in 12M crystal TH0=(65536-1000)/256; TL0=(65536-1000)%256;//定时1mS IE= 0x82; //打开中断 TR0=1; CYCLE = 10;// 时间可以调整 这个是10步调整 周期10ms 8位PWM就是256步 while(1) { if(!KEY1) { delay(10000); if(!KEY1) { PWM_Num++; if(PWM_Num==4)PWM_Num=0; switch(PWM_Num){ case 0:P1=0xFE;PWM_ON=0;break;//高电平时长 case 1:P1=0xFD;PWM_ON=4;break; case 2:P1=0xFB;PWM_ON=6;break; case 3:P1=0xF7;PWM_ON=8;break; default:break; } } } } } void tim(void) interrupt 1 using 1 { static unsigned char count; // TH0=(65536-1000)/256; TL0=(65536-1000)%256;//定时1mS if (count==PWM_ON) { PWM = 1; //灯灭 } count++; if(count == CYCLE) { count=0; if(PWM_ON!=0) //如果左右时间是0 保持原来状态 PWM = 0;//灯亮 } } 6.蜂鸣器提示程序#include<reg52.h> sbit SPK=P1^2;//定义蜂鸣器端口 void delay(unsigned int cnt)//延时 { while(--cnt); } main() { unsigned int i; while(1) { for(i=0;i<200;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短 { delay(80);//参数决定发声的频率,估算值 SPK=!SPK; } SPK=1; //喇叭停止工作,间歇的时间,可更改 delay(20000); } } |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。