技术文档

51单片机开发实例 51单片机编程实例大全(下部)

小编 2024-11-24 技术文档 23 0

51单片机编程实例大全(下部)

学习单片机

// 实例 1:用单片机控制第一个灯亮

#include<reg51.h> //包含 51单片机寄存器定义的头文件void main(void)

{ P1=0xfe; //P1=1111 1110B,即 P1.0输出低电平

}

// 实例 2:用单片机控制一个灯闪烁:认识单片机的工作频率

#include<reg51.h> //包含单片机寄存器的头文件/ 函数功能:延时一段时间

/ void delay(void) //两个 void 意思分别为无需返回值,没有参数传递{

unsigned int i; // 定义无符号整数,最大取值范围 65535 for(i=0;i<20000;i++) // 做 20000次空循环

; //什么也不做,等待一个机器周期} / 函数功能:主函数 (C语言规定必须有也只能有 1个主函数)

/ void main(void) {

while(1) //无限循环{

P1=0xfe; //P1=1111 1110B, P1.0输出低电平delay(); //延时一段时间P1=0xff; //P1=1111 1111B, P1.0输出高电平delay(); //延时一段时间

} }

// 实例 3:将 P1 口状态分别送入 P0、P2、P3 口:认识 I/O 口

的引脚功能

#include<reg51.h> //包含单片机寄存器的头文件

/ 函数功能:主函数 (C语言规定必须有也只能有 1个主函数)

/

void main(void) {

while(1) //无限循环{

P1=0xff; // P1=1111 1111B,熄灭 LED P0=P1; // 将 P1口状态送入 P0口P2=P1; // 将 P1口状态送入 P2口

P3=P1; // 将 P1口状态送入 P3口}

}

// 实例 4:使用 P3 口流水点亮 8 位 LED

#include<reg51.h> //包含单片机寄存器的头文件/ 函数功能:延时一段时间

/

void delay(void) {

unsigned char i,j; for(i=0;i<250;i++)

for(j=0;j<250;j++) ;

} / 函数功能:主函数

/ void main(void) {

while(1) {

P3=0xfe; //第一个灯亮delay(); //调用延时函数P3=0xfd; //第二个灯亮delay(); //调用延时函数P3=0xfb; //第三个灯亮delay(); //调用延时函数

P3=0xf7; //第四个灯亮delay(); //调用延时函数P3=0xef; //第五个灯亮

delay(); //调用延时函数P3=0xdf; //第六个灯亮delay(); //调用延时函数P3=0xbf; //第七个灯亮

delay(); //调用延时函数P3=0x7f; //第八个灯亮

delay(); //调用延时函数}

}

//实例 7:通过对 P3口地址的操作流水点亮 8位 LED #include<reg51.h> //包含单片机寄存器的头文件sfr x=0xb0; //P3 口在存储器中的地址是 b0H, 通过 sfr 可定义 8051内核单片机

//的所有内部 8位特殊功能寄存器 ,对地址 x的操作也就是对 P1口的操作/ 函数功能:延时一段时间

/ void delay(void)

{ unsigned char i,j; for(i=0;i<250;i++)

for(j=0;j<250;j++) ; //利用循环等待若干机器周期,从而延时一段时间

} / 函数功能:主函数

/ void main(void) {

while(1) {

x=0xfe; //第一个灯亮delay(); // 调用延时函数x=0xfd; //第二个灯亮

delay(); // 调用延时函数x=0xfb; //第三个灯亮

delay(); // 调用延时函数x=0xf7; //第四个灯亮

delay(); // 调用延时函数x=0xef; //第五个灯亮

delay(); //调用延时函数x=0xdf; //第六个灯亮delay(); //调用延时函数x=0xbf; //第七个灯亮

delay(); //调用延时函数x=0x7f; //第八个灯亮

delay(); //调用延时函数}

}

//实例 8:用不同数据类型控制灯闪烁时间#include<reg51.h> //包含单片机寄存器的头文件/ 函数功能:用整形数据延时一段时间

/ void int_delay(void) //延时一段较长的时间{

unsigned int m; // 定义无符号整形变量,双字节数据,值域为 0~65535 for(m=0;m<36000;m++)

; //空操作} / 函数功能:用字符型数据延时一段时间

/ void char_delay(void) //延时一段较短的时间{

unsigned char i,j; //定义无符号字符型变量,单字节数据,值域 0~255 for(i=0;i<200;i++)

for(j=0;j<180;j++) ; //空操作

} / 函数功能:主函数

/ void main(void) {

unsigned char i; while(1)

{ for(i=0;i<3;i++)

{

P1=0xfe; //P1.0 口的灯点亮int_delay(); //延时一段较长的时间P1=0xff; //熄灭int_delay(); //延时一段较长的时间

} for(i=0;i<3;i++)

{ P1=0xef; //P1.4 口的灯点亮char_delay(); //延时一段较长的时间P1=0xff; //熄灭char_delay(); //延时一段较长的时间

}

}

}

// 实例 9:用 P0 口、 P1 口分别显示加法和减法运算结果

#include<reg51.h> void main(void) {

unsigned char m,n; m=43; //即十进制数 2x16+11=43 n=60; //即十进制数 3x16+12=60 P1=m+n; //P1=103=0110 0111B,结果 P1.3、P1.4、P1.7 口的灯被点亮P0=n-m; //P0=17=0001 0001B,结果 P0.0、P0.4的灯被熄灭

}

// 实例 10:用 P0、P1 口显示乘法运算结果

#include<reg51.h> //包含单片机寄存器的头文件void main(void) {

unsigned char m,n; unsigned int s; m=64;

n=71; s=m n; //s=64 71=4544,需要 16位二进制数表示,高 8位送 P1口,低 8

位送 P0口//由于 4544=17 256+192=H3 16 16 16+H2 16 16+H1 16+H0

//两边同除以 256,可得 17+192/256=H3 16+H2+(H1 16+H0)/256

//因此,高 8位 16进制数 H3 16+H2必然等于 17,即 4544除以 256的商

//低 8位 16进制数 H1 16+H0必然等于 192,即 4544除以 256的余数

P1=s/256; //高 8位送 P1口 ,P1=17=11H=0001 0001B, P1.0和 P1.4口灭,其余亮

P0=s%256; //低 8位送 P0口 , P3=192=c0H=1100 0000B,P3.1,P3.6,P3.7口灭,其余亮}

// 实例 11:用 P1、P0 口显示除法运算结果

#include<reg51.h> //包含单片机寄存器的头文件void main(void) {

P1=36/5; //求整数P0=((36%5) 10)/5; //求小数while(1)

; //无限循环防止程序"跑飞"}

// 实例 12:用自增运算控制 P0 口 8 位 LED 流水花样

#include<reg51.h> //包含单片机寄存器的头文件/ 函数功能:延时一段时间

/ void delay(void) {

unsigned int i; for(i=0;i<20000;i++)

; } / 函数功能

/ void main(void) {

unsigned char i; for(i=0;i<255;i++) //注意 i 的值不能超过 255 {

P0=i; //将 i的值送 P0口delay(); //调用延时函数

} }

// 实例 13:用 P0 口显示逻辑 "与"运算结果

#include<reg51.h> //包含单片机寄存器的头文件void main(void) {

P0=(4>0)&&(9>0xab);//将逻辑运算结果送 P0口while(1)

; //设置无限循环,防止程序"跑飞"}

// 实例 14:用 P0 口显示条件运算结果

#include<reg51.h> //包含单片机寄存器的头文件void main(void) {

P0=(8>4)?8:4;//将条件运算结果送 P0口,P0=8=0000 1000B while(1)

; //设置无限循环,防止程序"跑飞"}

// 实例 15:用 P0 口显示按位 "异或 "运算结果

#include<reg51.h> //包含单片机寄存器的头文件void main(void) {

P0=0xa2^0x3c;// 将条件运算结果送 P0口,P0=8=0000 1000B while(1)

; //设置无限循环,防止程序"跑飞"}

// 实例 16:用 P0 显示左移运算结果

#include<reg51.h> //包含单片机寄存器的头文件void main(void) {

P0=0x3b<<2;//将左移运算结果送 P0口,P0=1110 1100B=0xec while(1)

; //无限循环,防止程序"跑飞"}

// 实例 17:"万能逻辑电路 "实验

#include<reg51.h> //包含单片机寄存器的头文件sbit F=P1^4; //将 F位定义为 P1.4 sbit X=P1^5; //将 X位定义为 P1.5 sbit Y=P1^6; //将 Y位定义为 P1.6 sbit Z=P1^7; //将 Z位定义为 P1.7 void main(void) {

while(1) {

F=((~X)&Y)|Z; //将逻辑运算结果赋给 F ;

} }

// 实例 18:用右移运算流水点亮 P1 口 8 位 LED

#include<reg51.h> //包含单片机寄存器的头文件/

函数功能:延时一段时间/

void delay(void) { unsigned int n; for(n=0;n<30000;n++)

; } / 函数功能:主函数

/ void main(void) {

unsigned char i; while(1)

{ P1=0xff; delay(); for(i=0;i<8;i++)//设置循环次数为 8 {

P1=P1>>1; //每次循环 P1的各二进位右移 1位,高位补 0 delay(); //调用延时函数

} }

}

// 实例 19:用 if 语句控制 P0 口 8 位 LED 的流水方向

#include<reg51.h> //包含单片机寄存器的头文件sbit S1=P1^4; //将 S1位定义为 P1.4 sbit S2=P1^5; //将 S2位定义为 P1.5 / 函数功能:主函数

/ void main(void) {

while(1) { if(S1==0) //如果按键 S1按下

P0=0x0f; //P0 口高四位 LED点亮if(S2==0) //如果按键 S2按下

P0=0xf0; //P0 口低四位 LED点亮}

}

// 实例 20:用 swtich 语句的控制 P0 口 8 位 LED 的点亮状态

#include<reg51.h> //包含单片机寄存器的头文件sbit S1=P1^4; //将 S1位定义为 P1.4 / 函数功能:延时一段时间

/ void delay(void) { unsigned int n; for(n=0;n<10000;n++)

; } / 函数功能:主函数

/ void main(void) {

unsigned char i; i=0; //将 i初始化为 0 while(1) {

if(S1==0) //如果 S1键按下{

delay(); //延时一段时间if(S1==0) //如果再次检测到 S1键按下

i++; //i 自增 1 if(i==9) //如果 i=9,重新将其置为 1

i=1;

} switch(i) //使用多分支选择语句

{ case 1: P0=0xfe; //第一个 LED亮

break; case 2: P0=0xfd; // 第二个 LED亮

break;

case 3:P0=0xfb; //第三个 LED亮break;

case 4:P0=0xf7; //第四个 LED亮break;

case 5:P0=0xef; //第五个 LED亮break;

case 6:P0=0xdf; //第六个 LED亮break;

case 7:P0=0xbf; //第七个 LED亮break;

case 8:P0=0x7f; //第八个 LED亮break;

default: //缺省值,关闭所有 LED P0=0xff;

} }

}

// 实例 21:用 for 语句控制蜂鸣器鸣笛次数

#include<reg51.h> //包含单片机寄存器的头文件sbit sound=P3^7; // 将 sound位定义为 P3.7 / 函数功能:延时形成 1600Hz音频

/ void delay1600(void) { unsigned char n;

for(n=0;n<100;n++) ;

} / 函数功能:延时形成 800Hz音频

/ void delay800(void) { unsigned char n;

for(n=0;n<200;n++) ;

}

/

函数功能:主函数/

void main(void) {

unsigned int i; while(1) {

for(i=0;i<830;i++) {

sound=0; //P3.7 输出低电平delay1600(); sound=1; //P3.7 输出高电平delay1600();

} for(i=0;i<200;i++) {

sound=0; //P3.7 输出低电平delay800(); sound=1; //P3.7 输出高电平delay800();

}

}

}

// 实例 22:用 while 语句控制 LED

#include<reg51.h> //包含单片机寄存器的头文件/ 函数功能:延时约 60ms (3 100 200=60000μs)

/ void delay60ms(void) { unsigned char m,n; for(m=0;m<100;m++)

for(n=0;n<200;n++) ;

} / 函数功能:主函数

/ void main(void) {

unsigned char i; while(1) //无限循环{

i=0; //将 i初始化为 0 while(i<0xff) //当 i小于 0xff(255)时执行循环体{

P0=i; //将 i 送 P0口显示delay60ms(); //延时i++; //i 自增 1

} }

}

// 实例 23:用 do-while 语句控制 P0 口 8 位 LED 流水点亮

#include<reg51.h> //包含单片机寄存器的头文件/ 函数功能:延时约 60ms (3 100 200=60000μs)

/ void delay60ms(void) { unsigned char m,n; for(m=0;m<100;m++)

for(n=0;n<200;n++) ;

} / 函数功能:主函数

/ void main(void) {

do {

P0=0xfe; // 第一个 LED亮delay60ms(); P0=0xfd; // 第二个 LED亮delay60ms(); P0=0xfb; //第三个 LED亮delay60ms();

P0=0xf7; //第四个 LED亮delay60ms(); P0=0xef; //第五个 LED亮delay60ms(); P0=0xdf; //第六个 LED亮delay60ms(); delay60ms(); P0=0xbf; //第七个 LED亮delay60ms(); P0=0x7f; //第八个 LED亮delay60ms();

}while(1); //无限循环,使 8位 LED循环流水点亮}

// 实例 24:用字符型数组控制 P0 口 8 位 LED 流水点亮

#include<reg51.h> //包含单片机寄存器的头文件/ 函数功能:延时约 60ms (3 100 200=60000μs)

/ void delay60ms(void) { unsigned char m,n; for(m=0;m<100;m++)

for(n=0;n<200;n++) ;

} / 函数功能:主函数

/ void main(void) {

unsigned char i; unsigned char code Tab[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义无符

号字符型数组while(1) {

for(i=0;i<8;i++) {

P0=Tab[i];//依次引用数组元素,并将其送 P0口显示delay60ms();//调用延时函数

}

} }

// 实例 25: 用 P0 口显示字符串常量

#include<reg51.h> //包含单片机寄存器的头文件/ 函数功能:延时约 150ms (3 200 250=150 000μs=150ms

/ void delay150ms(void) {

unsigned char m,n; for(m=0;m<200;m++)

for(n=0;n<250;n++) ;

} / 函数功能:主函数

/ void main(void) {

unsigned char str[]={"Now,Temperature is :"}; // 将字符串赋给字符型全部元素赋值

unsigned char i; while(1) {

i=0; //将 i初始化为 0,从第一个元素开始显示while(str[i]!='\0') // 只要没有显示到结束标志 '\0' {

P0=str[i]; //将第 i个字符送到 P0口显示delay150ms(); //调用 150ms延时函数i++; // 指向下一个待显字符

} }

}

// 实例 26:用 P0 口显示指针运算结果??

#include<reg51.h> void main(void)

{ unsigned char p1, p2; //定义无符号字符型指针变量 p1,p2 unsigned char i,j; //定义无符号字符型数据i=25; //给 i 赋初值 25 j=15; p1=&i; //使指针变量指向 i ,对指针初始化p2=&j; //使指针变量指向 j ,对指针初始化P0= p1+ p2; // p1+ p2 相当于 i+j,所以 P0=25+15=40=0x28

//则 P0=0010 1000B,结果 P0.3、P0.5引脚 LED熄灭,其余点亮while(1)

; //无限循环,防止程序"跑飞"

}

// 实例 27:用指针数组控制 P0 口 8 位 LED 流水点亮

#include<reg51.h> / 函数功能:延时约 150ms (3 200 250=150 000μs=150ms

/ void delay150ms(void) {

unsigned char m,n; for(m=0;m<200;m++)

for(n=0;n<250;n++) ;

} / 函数功能:主函数

/ void main(void) {

unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char p[ ]={&Tab[0],&Tab[1],&Tab[2],&Tab[3],&Tab[4],&Tab[5],

&Tab[6],&Tab[7]};

unsigned char i; //定义无符号字符型数据while(1)

{ for(i=0;i<8;i++)

{ P0= p[i];

delay150ms(); }

} }

// 实例 28:用数组的指针控制 P0 口 8 位 LED 流水点亮

#include<reg51.h> / 函数功能:延时约 150ms (3 200 250=150 000μs=150ms

/ void delay150ms(void) {

unsigned char m,n; for(m=0;m<200;m++)

for(n=0;n<250;n++) ;

} / 函数功能:主函数

/ void main(void) {

unsigned char i; unsigned char Tab[ ]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,

0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE, 0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00, 0xE7,0xDB,0xBD,0x7E,0x3C,0x18,0x00,0x81, 0xC3,0xE7,0x7E,0xBD,0xDB,0xE7,0xBD,0xDB}; //流水灯控制码

unsigned char p; //定义无符号字符型指针p=Tab; // 将数组首地址存入指针 p while(1)

{ for(i=0;i<32;i++) //共 32个流水灯控制码

{ P0= (p+i); // (p+i)的值等于 a[i] delay150ms(); //调用 150ms延时函数

} }

}

// 实例 29:用 P0 、P1 口显示整型函数返回值

#include<reg51.h> / 函数功能:计算两个无符号整数的和

/ unsigned int sum(int a,int b) {

unsigned int s; s=a+b; return (s);

} / 函数功能:主函数

/ void main(void) {

unsigned z; z=sum(2008,2009); P1=z/256; //取得 z的高 8位P0=z%256; //取得 z的低 8位while(1)

; }

// 实例 30:用有参函数控制 P0 口 8 位 LED 流水速度

#include<reg51.h> / 函数功能:延时一段时间

/ void delay(unsigned char x) {

unsigned char m,n; for(m=0;m<x;m++)

for(n=0;n<200;n++) ;

} /

函数功能:主函数/

void main(void) {

unsigned char i; unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};

//流水灯控制码while(1)

{ //快速流水点亮 LED for(i=0;i<8;i++) //共 8个流水灯控制码

{ P0=Tab[i]; delay(100); //延时约 60ms, (3 100 200=60 000μs)

} //慢速流水点亮 LED for(i=0;i<8;i++) //共 8个流水灯控制码{

P0=Tab[i]; delay(250); //延时约 150ms, (3 250 200=150 000μs)

} }

}

// 实例 31:用数组作函数参数控制流水花样

#include<reg51.h> / 函数功能:延时约 150ms

/ void delay(void) {

unsigned char m,n; for(m=0;m<200;m++)

for(n=0;n<250;n++) ;

} / 函数功能:流水点亮 P0口 8位 LED

/ void led_flow(unsigned char a[8]) {

unsigned char i; for(i=0;i<8;i++)

{ P0=a[i]; delay();

} }

/ 函数功能:主函数

/ void main(void) {

unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水灯控制码

led_flow(Tab);

}

// 实例 32:用指针作函数参数控制 P0 口 8 位 LED 流水点亮

#include<reg51.h> / 函数功能:延时约 150ms

/ void delay(void) {

unsigned char m,n; for(m=0;m<200;m++)

for(n=0;n<250;n++) ;

} / 函数功能:流水点亮 P0口 8位 LED

/ void led_flow(unsigned char p) //形参为无符号字符型指针{

unsigned char i; while(1) {

i=0; //将 i置为 0,指向数组第一个元素while( (p+i)!='\0') // 只要没有指向数组的结束标志{

P0= (p+i);// 取的指针所指变量(数组元素)的值,送 P0口delay(); //调用延时函数i++; // 指向下一个数组元素

} }

}

/ 函数功能:主函数

/ void main(void) {

unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F, 0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,

0xFF,0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,

0x00,0xE7,0xDB,0xBD,0x7E,0xFF,0xFF,0x3C, 0x18,0x0,0x81,0xC3,0xE7,0xFF,

0xFF,0x7E}; //流水灯控制码

unsigned char pointer; pointer=Tab; led_flow(pointer);

}

// 实例 33:用函数型指针控制 P1 口灯花样

#include<reg51.h> //包含 51单片机寄存器定义的头文件unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水灯控制码,该数组被定义为全局变量/ 函数功能:延时约 150ms

/ void delay(void)

{

unsigned char m,n; for(m=0;m<200;m++) for(n=0;n<250;n++)

; }

/ 函数功能:流水灯左移

/ void led_flow(void) {

unsigned char i; for(i=0;i<8;i++) //8 位控制码

{ P0=Tab[i]; delay();

}

} / 函数功能:主函数

/ void main(void) {

void ( p)(void); //定义函数型指针,所指函数无参数,无返回值p=led_flow; //将函数的入口地址赋给函数型指针 p while(1) ( p)(); //通过函数的指针 p调用函数 led_flow()

}

// 实例 34:用指针数组作为函数的参数显示多个字符串

#include<reg51.h> //包含 51单片机寄存器定义的头文件unsigned char code str1[ ]="Temperature is tested by DS18B20";//C语言中,字符串是作为字符数组来处理的unsigned char code str2[ ]="Now temperature is:"; //所以,字符串的名字就是字符串的首地址

unsigned char code str3[ ]="The Systerm is designed by Zhang San"; unsigned char code str4[ ]="The date is 2008-9-30"; unsigned char p[ ]={str1,str2,str3,str4}; // 定义 p[4]为指向 4个字符串的字符型指针数组/

函数功能:延时约 150ms /

void delay(void) {

unsigned char m,n; for(m=0;m<200;m++) for(n=0;n<250;n++)

; }

/ 函数功能:流水点亮 P0口 8位 LED

/ void led_display(unsigned char x[ ]) //形参必须为指针数组{

unsigned char i,j; for(i=0;i<4;i++) //有 4个字符串要显示{

j=0; //指向待显字符串的第 0号元素while( (x[i]+j)!='\0') // 只要第 i个字符串的第 j 号元素不是结束标志

{ P0= (x[i]+j); //取得该元素值送到 P0口显示delay(); //调用延时函数

j++; //指向下一个元素}

} } / 函数功能:主函数

/ void main(void) {

unsigned char i; while(1)

{ for(i=0;i<4;i++)

led_display(p); //将指针数组名作实际参数传递}

}

// 实例 35:字符函数 ctype.h 应用举例

#include<reg51.h> //包含 51单片机寄存器定义的头文件

#include<ctype.h> void main(void) {

while(1) {

P3=isalpha('_')?0xf0:0x0f;//条件运算,若 '_'是英文字母, P3=0xf0 }

}

// 实例 36:内部函数 intrins.h 应用举例

#include<reg51.h> //包含 51单片机寄存器定义的头文件#include<intrins.h> // 包含函数 isalpha()声明的头文件/ 函数功能:延时约 150ms

/ void delay(void) {

unsigned char m,n; for(m=0;m<200;m++)

for(n=0;n<250;n++) ;

} / 函数功能:主函数

/ void main(void) {

P3=0xfe; //P3=1111 1110B while(1)

{ P3=_crol_(P3,1);// 将 P3的二进制位循环左移 1位后再赋给 P3 delay(); //调用延时函数

} }

// 实例 37:标准函数 stdlib.h 应用举例

#include<reg51.h> //包含 51单片机寄存器定义的头文件#include<stdlib.h> //包含函数 isalpha()声明的头文件/ 函数功能:延时约 150ms

/ void delay(void) {

unsigned char m,n; for(m=0;m<200;m++)

for(n=0;n<250;n++) ;

} / 函数功能:主函数

/ void main(void) { unsigned char i; while(1) {

for(i=0;i<10;i++) //产生 10个随机数{

P3=rand()/160; //将产生的随机数缩小 160倍后送 P3显示delay();

} }

}

// 实例 38:字符串函数 string.h 应用举例

#include<reg51.h> //包含 51单片机寄存器定义的头文件#include<string.h> //包含函数 isalpha()声明的头文件void main(void) { unsigned char str1[ ]="Now, The temperature is :"; unsigned char str2[ ]="Now, The temperature is 36 Centgrade:"; unsigned char i; i=strcmp(str1,str2); //比较两个字符串,并将结果存入 i if(i==0) //str1=str2

P3=0x00; else

if(i<0) //str1<str2 P3=0xf0;

else //str1>str2 P3=0x0f;

while(1) ; //防止程序"跑飞"

}

// 实例 39:宏定义应用举例 2

#include<reg51.h> //包含 51单片机寄存器定义的头文件# define F(a,b) (a)+(a) (b)/256+(b) //带参数的宏定义, a和 b为形参void main(void) {

unsigned char i,j,k; i=40; j=30; k=20; P3=F(i,j+k); //i 和 j+k分别为实参,宏展开时,实参将替代宏定义中的形

参while(1)

; }

// 实例 40:宏定义应用举例 2

#include<AT89X51.h> #include<ctype.h> void main(void) {

P3_0=0; //将 P3.0引脚置低电平, LED点亮P3_1=0; //将 P3.0引脚置低电平, LED点亮P3_2=0; //将 P3.0引脚置低电平, LED点亮P3_3=0; //将 P3.0引脚置低电平, LED点亮P3_4=1; //将 P3.4引脚置高电平, LED熄灭P3_5=1; //将 P3.5引脚置高电平, LED熄灭P3_6=1; //将 P3.7引脚置高电平, LED熄灭

P3_7=1; //将 P3.7引脚置高电平, LED熄灭while(1)

; }

// 实例 41:宏定义应用举例 3

#include<reg51.h> //包含 51单片机寄存器定义的头文件#define MAX 100 //将 MAX宏定义为字符串 100 void main(void) {

#if MAX>80 //如果字符串 100大于 80 P3=0xf0; //P3 口低四位 LED点亮

#else P3=0x0f; //否则,P3口高四位 LED点亮

#endif //结束本次编译

}

/

中断、定时器 中断、定时器

中断、定时器 中断、定时器

/

// 实例 42:用定时器 T0 查询方式 P2 口 8 位控制 LED 闪烁

#include<reg51.h> // 包含 51单片机寄存器定义的头文件/ 函数功能:主函数

/ void main(void)

{ // EA=1; // 开总中断

// ET0=1; // 定时器 T0中断允许TMOD=0x01; //使用定时器 T0的模式 1 TH0=(65536-46083)/256; //定时器 T0的高 8位赋初值TL0=(65536-46083)%256; //定时器 T0的高 8位赋初值TR0=1; // 启动定时器 T0 TF0=0; P2=0xff; while(1)// 无限循环等待查询{

while(TF0==0) ;

TF0=0; P2=~P2;

TH0=(65536-46083)/256; //定时器 T0的高 8位赋初值TL0=(65536-46083)%256; //定时器 T0的高 8位赋初值

} }

// 实例 43:用定时器 T1 查询方式控制单片机发出 1KHz 音频

#include<reg51.h> // 包含 51单片机寄存器定义的头文件sbit sound=P3^7; //将 sound位定义为 P3.7引脚/ 函数功能:主函数

/ void main(void) {

// EA=1; // 开总中断// ET0=1; //定时器 T0中断允许

TMOD=0x10; //使用定时器 T1的模式 1 TH1=(65536-921)/256; //定时器 T1的高 8位赋初值TL1=(65536-921)%256; //定时器 T1的高 8位赋初值TR1=1; // 启动定时器 T1 TF1=0; while(1)// 无限循环等待查询{

while(TF1==0) ;

TF1=0;

sound=~sound; //将 P3.7引脚输出电平取反TH1=(65536-921)/256; //定时器 T0的高 8位赋初值TL1=(65536-921)%256; //定时器 T0的高 8位赋初值

} }

// 实例 44:将计数器 T0 计数的结果送 P1 口 8 位 LED 显示

#include<reg51.h> // 包含 51单片机寄存器定义的头文件sbit S=P3^4; //将 S位定义为 P3.4引脚/ 函数功能:主函数

/ void main(void) {

// EA=1; // 开总中断// ET0=1; // 定时器 T0中断允许

TMOD=0x02; //使用定时器 T0的模式 2 TH0=256-156; //定时器 T0的高 8位赋初值TL0=256-156; //定时器 T0的高 8位赋初值TR0=1; // 启动定时器 T0 while(1)// 无限循环等待查询{

while(TF0==0) //如果未计满就等待{

if(S==0) //按键 S按下接地,电平为 0 P1=TL0; //计数器 TL0加 1后送 P1口显示

} TF0=0; //计数器溢出后,将 TF0清 0

} }

// 实例 45:用定时器 T0 的中断控制 1 位 LED 闪烁

#include<reg51.h> // 包含 51单片机寄存器定义的头文件sbit D1=P2^0; //将 D1位定义为 P2.0引脚/

函数功能:主函数/

void main(void) {

EA=1; // 开总中断ET0=1; // 定时器 T0中断允许TMOD=0x01; //使用定时器 T0的模式 2 TH0=(65536-46083)/256; //定时器 T0的高 8位赋初值TL0=(65536-46083)%256; //定时器 T0的高 8位赋初值TR0=1; // 启动定时器 T0 while(1)// 无限循环等待中断

; }

/ 函数功能:定时器 T0的中断服务程序

/ void Time0(void) interrupt 1 using 0 //"interrupt"声明函数为中断服务函数

//其后的 1为定时器 T0的中断编号; 0表示使用第 0组工作寄存器

{ D1=~D1; //按位取反操作,将 P2.0引脚输出电平取反TH0=(65536-46083)/256; //定时器 T0的高 8位重新赋初值TL0=(65536-46083)%256; //定时器 T0的高 8位重新赋初值

}

// 实例 46:用定时器 T0 的中断实现长时间定时

#include<reg51.h> // 包含 51单片机寄存器定义的头文件sbit D1=P2^0; //将 D1位定义为 P2.0引脚unsigned char Countor; //设置全局变量,储存定时器 T0中断次数/ 函数功能:主函数

/ void main(void) {

EA=1; // 开总中断ET0=1; // 定时器 T0中断允许TMOD=0x01; //使用定时器 T0的模式 2 TH0=(65536-46083)/256; //定时器 T0的高 8位赋初值TL0=(65536-46083)%256; //定时器 T0的高 8位赋初值TR0=1; // 启动定时器 T0

Countor=0; // 从 0开始累计中断次数while(1)// 无限循环等待中断

; }

/ 函数功能:定时器 T0的中断服务程序

/ void Time0(void) interrupt 1 using 0 //"interrupt"声明函数为中断服务函数

//其后的 1为定时器 T0的中断编号; 0表示使用第 0组工作寄存器{

Countor++; //中断次数自加 1 if(Countor==20) //若累计满 20次,即计时满 1s {

D1=~D1; //按位取反操作,将 P2.0引脚输出电平取反Countor=0; //将 Countor清 0,重新从 0开始计数

} TH0=(65536-46083)/256; //定时器 T0的高 8位重新赋初值TL0=(65536-46083)%256; //定时器 T0的高 8位重新赋初值

}

// 实例 47:用定时器 T1 中断控制两个 LED 以不同周期闪烁

#include<reg51.h> // 包含 51单片机寄存器定义的头文件sbit D1=P2^0; //将 D1位定义为 P2.0引脚sbit D2=P2^1; //将 D2位定义为 P2.1引脚unsigned char Countor1; //设置全局变量,储存定时器 T1中断次数unsigned char Countor2; //设置全局变量,储存定时器 T1中断次数/ 函数功能:主函数

/ void main(void) {

EA=1; // 开总中断ET1=1; // 定时器 T1中断允许TMOD=0x10; //使用定时器 T1的模式 1 TH1=(65536-46083)/256; //定时器 T1的高 8位赋初值TL1=(65536-46083)%256; //定时器 T1的高 8位赋初值TR1=1; // 启动定时器 T1 Countor1=0; //从 0开始累计中断次数Countor2=0; //从 0开始累计中断次数

while(1)// 无限循环等待中断;

} / 函数功能:定时器 T1的中断服务程序

/ void Time1(void) interrupt 3 using 0 //"interrupt"声明函数为中断服务函数

//其后的 3为定时器 T1的中断编号; 0表示使用第 0组工作寄存器{

Countor1++; //Countor1 自加 1 Countor2++; //Countor2 自加 1 if(Countor1==2) //若累计满 2次,即计时满 100ms

{ D1=~D1; //按位取反操作,将 P2.0引脚输出电平取反Countor1=0; //将 Countor1清 0,重新从 0开始计数

} if(Countor2==8) //若累计满 8次,即计时满 400ms

{ D2=~D2; //按位取反操作,将 P2.1引脚输出电平取反Countor2=0; //将 Countor1清 0,重新从 0开始计数

} TH1=(65536-46083)/256; //定时器 T1的高 8位重新赋初值TL1=(65536-46083)%256; //定时器 T1的高 8位重新赋初值

}

// 实例 48:用计数器 T1 的中断控制蜂鸣器发出 1KHz 音频

#include<reg51.h> // 包含 51单片机寄存器定义的头文件sbit sound=P3^7; // 将 sound位定义为 P3.7引脚/ 函数功能:主函数

/ void main(void) {

EA=1; // 开总中断ET1=1; // 定时器 T1中断允许TMOD=0x10; //TMOD=0001 000B,使用定时器 T1的模式 1 TH1=(65536-921)/256; //定时器 T1的高 8位赋初值TL1=(65536-921)%256; // 定时器 T1的高 8位赋初值TR1=1; // 启动定时器 T1

while(1)// 无限循环等待中断;

} / 函数功能:定时器 T1的中断服务程序

/ void Time1(void) interrupt 3 using 0 //"interrupt"声明函数为中断服务函数{

sound=~sound; TH1=(65536-921)/256; //定时器 T1的高 8位重新赋初值TL1=(65536-921)%256; // 定时器 T1的高 8位重新赋初值

}

// 实例 49:用定时器 T0 的中断实现 "渴望 "主题曲的播放

#include<reg51.h> //包含 51单片机寄存器定义的头文件sbit sound=P3^7; //将 sound位定义为 P3.7 unsigned int C; //储存定时器的定时常数//以下是 C调低音的音频宏定义#define l_dao 262 //将" l_dao"宏定义为低音" 1"的频率 262Hz #define l_re 286 //将" l_re"宏定义为低音" 2"的频率 286Hz #define l_mi 311 //将" l_mi"宏定义为低音" 3"的频率 311Hz #define l_fa 349 //将" l_fa"宏定义为低音" 4"的频率 349Hz #define l_sao 392 //将" l_sao"宏定义为低音" 5"的频率 392Hz #define l_la 440 //将" l_a"宏定义为低音" 6"的频率 440Hz #define l_xi 494 // 将" l_xi"宏定义为低音" 7"的频率 494Hz //以下是 C调中音的音频宏定义#define dao 523 //将"dao"宏定义为中音" 1"的频率 523Hz #define re 587 //将" re"宏定义为中音" 2"的频率 587Hz #define mi 659 //将"mi"宏定义为中音" 3"的频率 659Hz #define fa 698 // 将" fa"宏定义为中音" 4"的频率 698Hz #define sao 784 //将" sao"宏定义为中音" 5"的频率 784Hz #define la 880 //将" la"宏定义为中音" 6"的频率 880Hz #define xi 987 //将"xi"宏定义为中音" 7"的频率 523H //以下是 C调高音的音频宏定义#define h_dao 1046 // 将"h_dao"宏定义为高音" 1"的频率 1046Hz #define h_re 1174 //将"h_re"宏定义为高音" 2"的频率 1174Hz #define h_mi 1318 // 将"h_mi"宏定义为高音" 3"的频率 1318Hz #define h_fa 1396 //将"h_fa"宏定义为高音" 4"的频率 1396Hz #define h_sao 1567 //将"h_sao"宏定义为高音" 5"的频率 1567Hz #define h_la 1760 //将"h_la"宏定义为高音" 6"的频率 1760Hz

#define h_xi 1975 //将"h_xi"宏定义为高音" 7"的频率 1975Hz / 函数功能: 1个延时单位,延时 200ms

/ void delay()

{ unsigned char i,j; for(i=0;i<250;i++)

for(j=0;j<250;j++) ;

} / 函数功能:主函数

/ void main(void)

{ unsigned char i,j;

//以下是《渴望》片头曲的一段简谱unsigned int code f[]={re,mi,re,dao,l_la,dao,l_la, // 每行对应一小节音符

l_sao,l_mi,l_sao,l_la,dao, l_la,dao,sao,la,mi,sao, re, mi,re,mi,sao,mi, l_sao,l_mi,l_sao,l_la,dao,

l_la,l_la,dao,l_la,l_sao,l_re,l_mi, l_sao, re,re,sao,la,sao, fa,mi,sao,mi, la,sao,mi,re,mi,l_la,dao, re, mi,re,mi,sao,mi, l_sao,l_mi,l_sao,l_la,dao, l_la,dao,re,l_la,dao,re,mi, re, l_la,dao,re,l_la,dao,re,mi, re, 0xff}; // 以 0xff 作为音符的结束标志

//以下是简谱中每个音符的节拍//"4" 对应 4个延时单位, "2"对应 2个延时单位, "1"对应 1个延时单位unsigned char code JP[ ]={4,1,1,4,1,1,2,

2,2,2,2,8, 4,2,3,1,2,2, 10,

4,2,2,4,4, 2,2,2,2,4,

2,2,2,2,2,2,2, 10, 4,4,4,2,2, 4,2,4,4, 4,2,2,2,2,2,2, 10, 4,2,2,4,4, 2,2,2,2,6, 4,2,2,4,1,1,4, 10, 4,2,2,4,1,1,4, 10 };

EA=1; //开总中断ET0=1; //定时器 T0中断允许TMOD=0x00; // 使用定时器 T0的模式 1(13位计数器)while(1) // 无限循环

{ i=0; //从第 1个音符 f[0]开始播放

while(f[i]!=0xff) //只要没有读到结束标志就继续播放{ C=460830/f[i]; TH0=(8192-C)/32; //可证明这是 13位计数器 TH0高 8位的赋

初值方法

TL0=(8192-C)%32; //可证明这是 13位计数器 TL0低 5位的赋初值方法

TR0=1; //启动定时器 T0 for(j=0;j<JP[i];j++) //控制节拍数

delay(); // 延时 1个节拍单位TR0=0; //关闭定时器 T0

i++; //播放下一个音符}

} } / 函数功能:定时器 T0的中断服务子程序,使 P3.7引脚输出音频的方波

/ void Time0(void ) interrupt 1 using 1 {

sound=!sound; //将 P3.7引脚输出电平取反,形成方波TH0=(8192-C)/32; //可证明这是 13位计数器 TH0高 8位的赋初值方法TL0=(8192-C)%32; //可证明这是 13位计数器 TL0低 5位的赋初值方法

}

// 实例 50-1:输出 50 个矩形脉冲

#include<reg51.h> //包含 51单片机寄存器定义的头文件sbit u=P1^4; //将 u位定义为 P1.4 / 函数功能:延时约 30ms (3 100 100=30 000μs =30m

/ void 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)

; //无限循环,防止程序"跑飞"}

// 实例 50-2 :计数器 T0 统计外部脉冲数

#include<reg51.h> //包含 51单片机寄存器定义的头文件

/ 函数功能:主函数

/ void main(void)

{ TMOD=0x06; // TMOD=0000 0110B,使用计数器 T0的模式 2 EA=1; //开总中断ET0=0; //不使用定时器 T0的中断TR0=1; //启动 T0 TH0=0; //计数器 T0高 8位赋初值TL0=0; // 计数器 T0低 8位赋初值while(1) //无限循环,不停地将 TL0计数结果送 P1口P1=TL0;

}

// 实例 51-2 :定时器 T0 的模式 2 测量正脉冲宽度

#include<reg51.h> //包含 51单片机寄存器定义的头文件sbit ui=P3^2; // 将 ui位定义为 P3.0( INT0)引脚,表示输入电压/ 函数功能:主函数

/ void main(void)

{ TMOD=0x0a; // TMOD=0000 1010B,使用定时器 T0的模式 2,GATE置 1 EA=1; //开总中断ET0=0; //不使用定时器 T0的中断TR0=1; //启动 T0 TH0=0; //计数器 T0高 8位赋初值TL0=0; // 计数器 T0低 8位赋初值while(1) // 无限循环,不停地将 TL0计数结果送 P1口{

while(ui==0) //INT0 为低电平, T0不能启动;

TL0=0; //INT0 为高电平,启动 T0计时,所以将 TL0清 0 while(ui==1) //在 INT0高电平期间,等待,计时

; P1=TL0; //将计时结果送 P1口显示

} }

// 实例 52:用定时器 T0 控制输出高低宽度不同的矩形波

#include<reg51.h> //包含 51单片机寄存器定义的头文件sbit u=P3^0; //将 u 位定义为 P3.0,从该引脚输出矩形脉冲unsigned char Countor; //设置全局变量,储存负跳变累计数/ 函数功能:延时约 30ms (3 100 100=30 000μs =30ms)

/ void delay30ms(void) {

unsigned char m,n; for(m=0;m<100;m++)

for(n=0;n<100;n++) ;

}

/ 函数功能:主函数

/ void main(void)

{ unsigned char i; EA=1; //开放总中断EX0=1; //允许使用外中断IT0=1; //选择负跳变来触发外中断Countor=0; for(i=0;i<100;i++) //输出 100个负跳变{

u=1; delay30ms(); u=0; delay30ms();

} while(1)

; //无限循环, 防止程序跑飞}

/ 函数功能:外中断 T0的中断服务程序

/ void int0(void) interrupt 0 using 0 // 外中断 0的中断编号为 0 {

Countor++; P1=Countor;

}

// 实例 53:用外中断 0 的中断方式进行数据采集

#include<reg51.h> //包含 51单片机寄存器定义的头文件sbit S=P3^2; //将 S位定义为 P3.2,/ 函数功能:主函数

/ void main(void)

{ EA=1; //开放总中断EX0=1; //允许使用外中断IT0=1; //选择负跳变来触发外中断P1=0xff; while(1) ; //无限循环, 防止程序跑飞

} / 函数功能:外中断 T0的中断服务程序

/ void int0(void) interrupt 0 using 0 // 外中断 0的中断编号为 0 {

P1=~P1; //每产生一次中断请求, P1取反一次。

}

单片机入坑指南,包含9个实用案例推荐

刚入门单片机的时候很迷茫,不知道该从哪里开始学习,买哪些开发板比较好……

于是,我写了一篇《单片机入坑指南》。

新手看完一定会有实践的方向 ,学习起来也会轻松很多!

单片机入坑指南

大部分人都是从——“51单片机”开始入坑的。

而从入门到进阶,大概是这三个阶段—— "51单片机" 、“32系列单片机” 、 “物联网”。

你现在,是在哪个阶段呢?

ps:看完了我做的攻略,可别忘了实践哦~

一、51单片机类

① 51单片机DIY开发板(97%直插件)

这个开发板由山东交通学院解兆延老师 倾情设计,多年单片机课程教学经验只为做好一块开发板。

实物图

核心主控为单片机入门必备 的STC89C52RC,此块开发板基本都是直插类器件 !对新手小白非常友好。

它不仅能学习51的单片机入门开发,还能学习如何焊接

开发板资源分布图

开源资料下载入口: 51单片机DIY开发板(97%直插件) - 嘉立创EDA开源硬件平台

② STC8G-51单片机开发板

孟老师出品,必是精品!

这块开发板是基于STC8G2K64S4单片机制作的,精致小巧。

别看它小,入门学习的资源可是一个都不少 哦。

它包含: IO口、PWM、定时器、ADC模数转换、串口通信、I2C通信、SPI通信、并口通信、看门狗、低功耗电源管理等。

而且还有配套的例程和视频可学习!

开源资料下载入口: STC8G-51单片机开发板 - 嘉立创EDA开源硬件平台

非常喜欢孟老师的那句话:如果你要学车,你只看如何开车的视频教程,而不去亲自上车,那估计一万年也学不会。

③ STC32G12K128最小系统

此块开发板专门使用STC32设计的32位的 51单片机最小系统。

兼容STM32小蓝板设计。

比开发板简洁又不失精妙。

它适合用于高校教学应用: 学习微机原理与程序设计,使用该核心板完成课程设计项目。适合电子爱好者学习: 掌握单片机电路设计与程序开发能力,学习项目开发规范。适合电子工程师验证: 快速上手STC32单片机的学习,对所需的功能进行验证开发。适合电赛学习与训练: 可以在电赛中快速搭建所需电路。

它还有对应的软件和硬件视频教学哦。

开源资料下载入口: 【最小系统】STC32G12K128 - 嘉立创EDA开源硬件平台

二、32单片机类

51入门之后,大家肯定对32位的单片机也有所了解。

市面上32位的单片机开发板很多,资料也比较齐全。

所以我只推荐几个适合入门的 32“最小系统板”和“核心板”。

也比较适合拿去做项目、学习。

毕竟开发板都很大一块,上面的资源也比较固定,无法拆卸。所以核心板和最小系统就比较合适。

① STM32F103/205/407Vx小型开发板

这位作者对STM系列的单片机比较了解,制作的板子也非常美观实用。

它的核心板是基于STM32F205VE的最小系统板。

兼容STM32F103Vx和STM32F407Vx,板载ST-Link V2.1。

调试、串口、USB下载 与一体。

兼容芯片说明

开源资料下载入口: STM32F103/205/407Vx小型开发板 - 嘉立创EDA开源硬件平台

② 立创·梁山派

它是基于GD32F450ZGT6的开源开发板。

资源、接口丰富,拥有完善的视频教程、文档教程、实验案例。

它还提供在线编译器,10分钟快速入门!

开源资料下载入口: https://lckfb.com/project/detail/lckfb_lspi?param=baseInfo

③ 小汐 -> STM32 Mega Mini

这是一个基于 STM32F10xCxTx 系列单片机的 STM32 Mega Mini 开发板。

支持STM32F103系列的大部分芯片做替换。

开源资料下载入口: Arduino 1.3'' OLED Shield - 嘉立创EDA开源硬件平台

三、物联网类

学习了32,肯定要尝试一下最热门的物联网技术!

下面给大家推荐几个不错的物联网开发板工程。

① 物联网开发板-ESP8266

这块开发板是不是很眼熟?

此模块以 ESP8266 模组为核心:

配合稳压电路、USB-TTL 电路、串口下载电路,实现 ESP8266 的 SDK 开发,实现物联网功能 。配合 OLED、DHT11 模块,实现温度上报到云端、显示云端下发的消息 等功能。

开源资料下载入口: 物联网开发板-ESP8266 - 嘉立创EDA开源硬件平台

② 基于STM32和涂鸦智能平台开发的一款物联网开发板

基于“STM32”和“涂鸦智能平台”开发的一款物联网开发板。

也可以把他当成一个带有蓝牙和水墨屏的32开发板。

此块开发板的器件选型上比较有讲究。

考虑到了大家的经济实力,特意选了一款还没怎么涨价的相对便宜的型号 制作。

这块开发板的不仅可以学习STM32,还能顺便学习物联网设计 ,一举两得!

个人觉得性价比妥妥的

开源资料下载入口: 开源物联网项目ilabel-基于STM32和涂鸦智能平台 - 嘉立创EDA开源硬件平台

③ ESP32-IOT-KIT全开源物联网开发板

以ESP32模组为主控设计的开发板。

支持WIFI、蓝牙、以太网、RS485、CAN等通信方式。

软硬件全开源,配套Easyio驱动库、CSDN博文教程,方便大家从ESP-IDF入门物联网的学习与开发。

ESP8266的资源肯定满足不了大家了,不知这个咋样呢?

开源资料下载入口: ESP32开发板 ESP32-IOT-KIT全开源物联网开发板 - 嘉立创EDA开源硬件平台

汇总结束!基本学到这里,就可以放弃开发板了……

还用啥开发板呢,这时候已经完全有能力直接用嘉立创EDA软件设计电路啦,直接板载单片机!

ps:下次预估会发:FPGA、Linux、4G、LOT类型、嵌入式开发相关、开发板等类型的开源工程。

如果你有其他更好的推荐,也可以在评论区发表,我会安排的!

相关问答

51单片机 能DIY哪些小东西?

51单片机能DIY:多功能时钟,秒表,报警器,计数器,红外门禁检测,密码门;计算器,能想到的东西都可以啊,还有温湿度等付感器相关的;或者电压表,电流表,...51单...

咱们中国到底能不能用自己的设备造出 51单片机 ?哪位大神普及下?

国产设备造51一点问题没有。很多51都是上百nm的。ARM早期型号也不少是90nm的。近两年,中端都切40nm了。个别性能强的用的是28nm。国产的设备很快能覆盖28nm以...

51单片机 是谁发明的?

51单片机是在日本bijikon公司的嶋正利,美国inter公司的特德·hofu发明的4004单片机的基础上,由因特尔公司研发的兼容英特尔8051指令系统的单片机的统称。51...

新手用 51单片机 做什么好呢?

我认为作为新手用51单片机最好用PCB万能板焊接一个单片机实验板,一来这样能够提高自己的动手能力;二来可以锻炼自己的编程调试能力。同时我们在焊接时还要设计...

51单片机 编程程序怎么编?

51单片机编程程序怎么编?♣这种技术性问题在今日头条上,几乎没有一个高手给你一个答复。因为学习51单片机编程程序是需要长篇大论,并且用电脑操作截图来说明...

51单片机 如何实现多线程多任务?有哪些程序可以在“后台”自己运行?

1、51单片机无法实现多线程任务,只能实现单线程。这是由51单片机的硬件决定的,否则多线程芯片就没有必要设计出来了。2、51单片机的硬件资源,如:定时器、计...

自制 51单片机 编程器的方法?

STC的芯片的话,直接用MX232芯片加外围电路以及需要烧录芯片的最小系统即可。STC的芯片的话,直接用MX232芯片加外围电路以及需要烧录芯片的最小系统即可。

51单片机 如何把低电平转高电平汇编程序?

您好,在51单片机中,可以通过修改特定的IO口的输出寄存器来实现将低电平转为高电平的操作。以下是一个简单的示例汇编程序:```ORG0H;程序从地址0开始执行...

学习 51单片机 需要用哪些 开发 软件?

现在单片机开发,51或者大部分都是用keil或者IAR,语言是C语言,汇编也可以。也有小部分单片机使用专用ide,比如avr,就用avrstudio。对于51来说keil是最方便...

关于MCS- 51单片机 应用的国内外现状和发展趋势以及研究方向?

单片机也就那几个发展趋势:1,多功能2,高效率和高性能3,低电压和低功耗4,低价格我认为51也不例外的。单片机也就那几个发展趋势:1,多功能2,高效率和高...

猜你喜欢