首页 > 编程知识 正文

单片机原理及应用,单片机原理与接口技术知识点

时间:2023-05-05 07:38:36 阅读:120907 作者:4021

参考文献: 《单片机原理与接口技术》(gldwblskdddd )编着

单片机的应用:智能仪表; 机电一体化; 实时控制; 分布式多机系统在人类生活中的应用。 单片机的主要发展趋势: CMOS化、低功耗化、低电压化; 低噪声和高可靠性。 单片机特点: 8051单片机是将CPU、ROM、RAM、I/O端口、定时器/计数器、中断功能集成在一个芯片上。 8051的CPU在8位芯片内有振荡器和时钟电路,有32条I/O线,对于外部存储器的地址范围,ROM、RAM各64KB,16位定时器/计数器2个,中断源5个,中断优先全双工串行端口; 布尔处理器。 振荡周期(指振荡源的周期,内部发生方式为石英晶体的振荡周期。

时钟周期:振荡周期的2倍,时钟周期=振荡周期P1振荡周期P2。

机械循环(一个机械循环包含六个时钟循环。

指令周期(完成一个指令周期所需的全部时间。

8051的指令周期包括1~4个机械周期,其中大多数为单周期指令,还有2周期指令和4周期指令。 单片机内存特点:采用哈佛结构,程序内存与数据内存分离,两者有各自独立的64KB地址空间。 中断是指CPU正常运行程序时,内部/外部事件或程序预先调度的事件中断CPU正在运行的程序,而内部/外部事件或预先调度的事件单片中总共有五个可能引起中断。 2个外部中断,2个计数器/计时器中断,1个串行中断。 中断是指CPU在处理中断源时,即运行中断服务程序时,首先出现

为了让更高的中断源申请中断,更着急的中断源及时获得服务,可以暂时中断当前运行的低级别中断服务程序,处理更高级别的中断源,运行完成后返回波中断3的中断服务程序但是,中断级别低或低的中断源不能中断中断级别高的中断服务。 中断源是引起单片机中断的任何事件,一般允许一个单片机有多个中断源。 外部中断0、外部中断1、芯片内定时器/计数器0、芯片内定时器/计数器1、芯片内串行端口收发中断。 中断服务函数的一般形式:返回值函数名称interruptn(usingn )。 位变量的绝对值不能用bit指定。 如果需要指定位变量的绝对值,则必须在sbit中定义。 内部RAM地址功能00H0区域4组通用寄存器R0~R7也可以用于RAM,R0、R1是可寻址08H1区域10H2区域1FH3区域20H位可寻址区域00H~7FH的所有可寻址区域的合计16字节、128位2FH30H 机床只能寻址7FH80H特殊功能寄存器的可寻址字节的可寻址位FFH中断号中断源入口地址0外部中断0(int0) 0003H1计时器/计数器0 ) t0 ) 000BH2外部中断1

# includere g51.h # includeabsacc.hmain () { unsigned char data a[5],b; b=DBYTE[0x30]; a[0]=b/100; a[1]=b0/10; a[2]=b; a[3]=a[1] 4; a[4]=a[3] | a[2]; DBYTE[0x20]=a[0]; DBYTE[0x21]=a[4]; wile(1; } 2.将压缩的BCD码转换为十六进制

# includere g51.h # includeabsacc.hmain () {unsigned char data a[3],b; b=DBYTE[0x30]; a[0]=b4; a[1]=b0x0F; a[2]=a[0]*10 a[1]; DBYTE[0x31]=a[2]; wile(1; }3.16进制转换为ASCII码

# includere g51.h # includeabsacc.hmain () { unsigned char a,b,c; a=DBYTE[0x30]; b=a 4; if(B9 ) b=b-10 'A '; else b=b0x30; c=a0x0F; if(C9 ) c=c-10 'A '; else c=c0x30; XBYTE[0x30]=b; XBYTE[0x31]=c; wile(1; }4.将一个ascii代码转换为十六进制

# includere g51.h # includeabsacc.hmain () {unsigned char a,b; a=DBYTE[0x30]; if(a=0x30a=0x39 ) b=a-0x30; ELSEif(a=0x41a=0x46 ) b=a-0x41 10; ELSEif(a=0x61a=0x66 ) b=a-0x61 10; XBYTE[0x31]=b; wile(1; )5.最小公倍数和最大公约数

# includere g51.h # includeabsacc.hmain ({ unsigned chara,b,c,d,I,j; a=DBY

TE[0x30]; b=DBYTE[0x31];c=a*b;for(i=1;i<=c;i++){if((c%i==0)&&(i%b==0)&&(i%a==0)){DBYTE[0x0A]=i;break;}else DBYTE[0x0A]=c;}j=DBYTE[0x0A];d=c/j;DBYTE[0x0B]=d;while(1);}

6. 实现一个BCD码加法

#include<reg51.h>#include<absacc.h>void main(){unsigned char a,b,c;a=DBYTE[0x08];b=DBYTE[0x09];c=(a>>4)*10+(a&0x0F)+(b>>4)*10+(b&0x0F);if(c>100){DBYTE[0x0A]=c-100;DBYTE[0x0B]=0x01;}else DBYTE[0x0A]=c;while(1);}

7. 所有偶数的累加和奇数累加和

#include<reg51.h>#include<absacc.h>main(){ unsigned char data a[5],i,sum; sum=0; for(i=0;i<5;i++) {a[i]=DBYTE[0x30+i]; if(!(a[i]&0x01)) {sum=sum+a[i];}} DBYTE[0x08]=sum; while(1);}#include<reg51.h>#include<absacc.h>main(){ unsigned char data a[5],i,sum; sum=0; for(i=0;i<5;i++) {a[i]=DBYTE[0x30+i]; if(a[i] & 0x01) {sum=sum+a[i];}} DBYTE[0x08]=sum; while(1);}

8. 所有偶正数的累加和负数累加和

#include<reg51.h>#include<absacc.h>main(){ unsigned char data a[5],i,sum; sum=0; for(i=0;i<5;i++) {a[i]=DBYTE[0x30+i]; if(a[i]>=0x80) {sum=sum+a[i];}} DBYTE[0x08]=sum; while(1);}#include<reg51.h>#include<absacc.h>main(){ unsigned char data a[5],i,sum; sum=0;for(i=0;i<5;i++) {a[i]=DBYTE[0x30+i]; if(a[i]<0x80) {sum=sum+a[i];}}DBYTE[0x08]=sum;while(1);}

9. 判断是否为素数

#include<reg51.h>#include<absacc.h>main(){unsigned char a,b,c;a=DBYTE[0x08];c=0xFF;for(b=2;b<a;b++){ if(a%b==0){c=0;break;}}DBYTE[0x09]=c;while(1);}

10. 由小到大排序

#include<reg51.h>#include<absacc.h>void main(){ unsigned char data a[10],t;unsigned char i,j;for(i=0;i<10;i++){a[i]=DBYTE[i+0x30];}for(i=0;i<9;i++) {for(j=0;j<9-i;j++) {if(a[j]>a[j+1]) {t=a[j];a[j]=a[j+1];a[j+1]=t;} }}for(i=0;i<10;i++){DBYTE[i+0x30]=a[i];}while(1);}

11. 次数不确定的累加和

#include<reg51.h>#include<absacc.h>#include<math.h>void main(){ unsigned int sum,i,n,x;n=DBYTE[0x30];x=DBYTE[0x31];sum=0;for(i=1;i<=n;i++){sum=sum+pow(i,x);}DBYTE[0x35]=sum;while(1);}#include<reg51.h>#include<absacc.h>void main(){ unsigned int sum,i,n; n=DBYTE[0x30]; sum=0; for(i=1;i<=n;i++) {sum=sum+i*i;} DBYTE[0x35]=sum; while(1);}#include<reg51.h>#include<absacc.h>main(){ unsigned char a,b,i,j,sum; a=DBYTE[0x30]; sum=0; for(i=1;i<=a;i++) {b=1; for(j=1;j<=i;j++) {b=j*b;} sum=sum+b;} DBYTE[0x31]=sum;while(1);}

12. 偶数拆分为两个素数之和

#include<reg51.h>#include<absacc.h>#include<math.h>void main(){ unsigned char a,b,c,d;a=DBYTE[0x30];for(b=3;b<=a/2;b+=2){ for(c=2;c<=sqrt(b);c++)if(b%c==0) break;if(c>sqrt(b)) d=a-b;else break;for(c=2;c<=sqrt(d);c++)if(d%c==0) break;if(c>sqrt(d)){DBYTE[0x31]=b;DBYTE[0x32]=d;} }while(1);}

13. 拆分为四个数的平方和

#include<reg51.h>#include<absacc.h>void main(){ unsigned char a,b,c,d,x;x=DBYTE[0x30];for(a=1;a<=x/2;a++)for(b=0;b<=a;b++)for(c=0;c<=b;c++)for(d=0;d<=c;d++)if(x==a*a+b*b+c*c+d*d) { DBYTE[0x20]=a;DBYTE[0x21]=b;DBYTE[0x22]=c;DBYTE[0x23]=d; }while(1);}

14.大写字母转换为小写字母,数字则不变

#include<reg51.h>#include<absacc.h>main(){ unsigned char x;x=DBYTE[0x30];if(x>=0x30&&x<=0x39) {DBYTE[0x08]=x;}else{x=x+0x20;}DBYTE[0x08]=x;while(1);}

15.在P1口输出50个矩形脉冲

#include<reg51.h> #include<absacc.h>sbit u=P1^4; //将u位定义为P1.4void delay30ms(void){ unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<100;n++); }void main(void){ unsigned char i;u=1; //初始化输出高电平for(i=0;i<50;i++) //输出50个矩形脉冲{ u=1;delay30ms();u=0;delay30ms(); }while(1) ; //无限循环,防止程序“跑飞”}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。