快捷搜索:  汽车  科技

51单片机简单程序实例,51单片机编程实例大全

51单片机简单程序实例,51单片机编程实例大全unsigned int i; // 定义无符号整数,最大取值范围 65535 for(i=0;i<20000;i ) // 做 20000次空循环/ void delay(void) //两个 void 意思分别为无需返回值,没有参数传递{}// 实例 2:用单片机控制一个灯闪烁:认识单片机的工作频率#include<reg51.h> //包含单片机寄存器的头文件/ 函数功能:延时一段时间

学习单片机

51单片机简单程序实例,51单片机编程实例大全(1)

// 实例 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%6; //低 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%6; //取得 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)%6; //定时器 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)%6; //定时器 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)%6; //定时器 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)%6; //定时器 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)%6; //定时器 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)%6; //定时器 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)%6; //定时器 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)%6; //定时器 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)%6; //定时器 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)%6; //定时器 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)%6; // 定时器 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)%6; // 定时器 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)2; //可证明这是 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)2; //可证明这是 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取反一次。

}

猜您喜欢: