单片机汇编语言经典一百例

合集下载

单片机编程100例

单片机编程100例

单片机编程实例100例大全单片机编程实例*实例1:使用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(); //调用延时函数} / /}*实例2:通过对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(); //调用延时函数}}*实例3:用不同数据类型控制灯闪烁时间#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(); //延时一段较长的时间 } } *实例4:用单片机控制第一个灯亮#include<reg51.h> //包含51单片机寄存器定义的头文件void main(void){P1=0xfe; //P1=1111 1110B,即P1.0输出低电平}*实例5:用单片机控制一个灯闪烁:认识单片机的工作频率#include<reg51.h> //包含单片机寄存器的头文件/函数功能:延时一段时间/void delay(void) //两个void意思分别为无需返回值,没有参数传递 {unsigned int i; //定义无符号整数,最大取值范围65535for(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(); //延时一段时间}}*实例6:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能#include<reg51.h> //包含单片机寄存器的头文件/ 函数功能:主函数(C语言规定必须有也只能有1个主函数) / void main(void){while(1) //无限循环{P1=0xff; // P1=1111 1111B,熄灭LEDP0=P1; // 将 P1口状态送入P0口P2=P1; // 将 P1口状态送入P2口P3=P1; // 将 P1口状态送入P3口}}*实例7:用P0口、P1 口分别显示加法和减法运算结果#include<reg51.h>void main(void){unsigned char m,n;m=43; //即十进制数2x16+11=43n=60; //即十进制数3x16+12=60P1=m+n; //P1=103=0110 0111B,结果P1.3、P1.4、P1.7 口的灯被点亮 P0=n-m; //P0=17=0001 0001B,结果P0.0、P0.4的灯被熄灭 } *实例8:用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=11000000B,P3.1,P3.6,P3.7口灭,其余亮}*实例9:用P1、P0口显示除法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P1=36/5; //求整数P0=((36%5) 10)/5; //求小数while(1); //无限循环防止程序“跑飞”}*实例10:用自增运算控制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(); //调用延时函数}}*实例11:用P0口显示逻辑"与"运算结果 #include<reg51.h> //包含单片机寄存器的头文件 void main(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1); //设置无限循环,防止程序“跑飞”}*实例12:用P0口显示条件运算结果#include<reg51.h> //包含单片机寄存器的头文件 voidmain(void){P0=(8>4)?8:4;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}*实例13:用P0口显示按位"异或"运算结果 #include<reg51.h> //包含单片机寄存器的头文件 void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}*实例16:用P0显示左移运算结果#include<reg51.h> //包含单片机寄存器的头文件 voidmain(void){P0=0x3b<<2;//将左移运算结果送P0口,P0=1110 1100B=0xec while(1); //无限循环,防止程序“跑飞”}*实例17:"万能逻辑电路"实验#include<reg51.h> //包含单片机寄存器的头文件sbit F=P1^4; //将F位定义为 P1.4sbit X=P1^5; //将X位定义为 P1.5sbit Y=P1^6; //将Y位定义为 P1.6sbit Z=P1^7; //将Z位定义为 P1.7void 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++)//设置循环次数为8P1=P1>>1; //每次循环P1的各二进位右移1位,高位补0 delay(); //调用延时函数}}}*实例19:用if语句控制P0口8位LED的流水方向#include<reg51.h> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为P1.4sbit 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初始化为0while(1){if(S1==0) //如果S1键按下{delay(); //延时一段时间if(S1==0) //如果再次检测到S1键按下i++; //i自增1if(i==9) //如果i=9,重新将其置为1i=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> //包含单片机寄存器的头文件 sbitsound=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初始化为0while(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 codeTab[ ]={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赋初值25j=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 codeTab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned charp[ ]={&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 charTab[ ]={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; //将数组首地址存入指针pwhile(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 codeTab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水灯控制码while(1){//快速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(100); //延时约60ms, (3 100 200=60 000μs) } //慢速流水点亮LEDfor(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 codeTab[ ]={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 codeTab[ ]={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 codeTab[]={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; //将函数的入口地址赋给函数型指针pwhile(1)( p)(); //通过函数的指针p调用函数led_flow()}*实例34:用指针数组作为函数的参数显示多个字符串#include<reg51.h> //包含51单片机寄存器定义的头文件unsigned char code str1[ ]="Temperature is tested byDS18B20";//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<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 1110Bwhile(1){P3=_crol_(P3,1);// 将P3的二进制位循环左移1位后再赋给P3 delay(); //调用延时函数}}*实例37:标准函数stdlib.h应用举例#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); //比较两个字符串,并将结果存入iif(i==0) //str1=str2P3=0x00;elseif(i<0) //str1<str2P3=0xf0;else //str1>str2P3=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宏定义为字符串100void main(void){#if MAX>80 //如果字符串100大于80P3=0xf0; //P3口低四位LED点亮#elseP3=0x0f; //否则,P3口高四位LED点亮#endif //结束本次编译}/ 中断、定时器中断、定时器中断、定时器中断、定时器 /*实例42:用定时器T0查询方式P2口8位控制LED闪烁#include<reg51.h> // 包含51单片机寄存器定义的头文件/函数功能:主函数/ void main(void)// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0TF0=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引脚/ 函数功能:主函数{// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1TF1=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引脚/ 函数功能:主函数{// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x02; //使用定时器T0的模式2TH0=256-156; //定时器T0的高8位赋初值TL0=256-156; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待查询{while(TF0==0) //如果未计满就等待{if(S==0) //按键S按下接地,电平为0P1=TL0; //计数器TL0加1后送P1口显示}TF0=0; //计数器溢出后,将TF0清0}}*实例45:用定时器T0的中断控制1位LED闪烁 #include<reg51.h> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为P2.0引脚/ 函数功能:主函数{EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(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的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0Countor=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/ 函数功能:定时器T0的中断服务程序/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{Countor++; //中断次数自加1if(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的模式1TH1=(65536-46083)/256; //定时器T1的高8位赋初值TL1=(65536-46083)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1Countor1=0; //从0开始累计中断次数Countor2=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/ 函数功能:定时器T1的中断服务程序/ void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数 //其后的3为定时器T1的中断编号;0表示使用第0组工作寄存器{Countor1++; //Countor1自加1Countor2++; //Countor2自加1if(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的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1while(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.7unsigned 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。

单片机编程100例

单片机编程100例

单片机编程100例(共140页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--单片机编程实例100例大全单片机编程实例*实例1:使用P3口流水点亮8位LED#include<> //包含单片机寄存器的头文件 / 函数功能:延时一段时间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(); //调用延时函数} / /}*实例2:通过对P3口地址的操作流水点亮8位LED#include<> //包含单片机寄存器的头文件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(); //调用延时函数}}*实例3:用不同数据类型控制灯闪烁时间#include<> //包含单片机寄存器的头文件/函数功能:用整形数据延时一段时间/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; //口的灯点亮int_delay(); //延时一段较长的时间P1=0xff; //熄灭int_delay(); //延时一段较长的时间}for(i=0;i<3;i++){P1=0xef; //口的灯点亮char_delay(); //延时一段较长的时间} P1=0xff; //熄灭 char_delay(); //延时一段较长的时间 } }*实例4:用单片机控制第一个灯亮#include<> //包含51单片机寄存器定义的头文件void main(void){P1=0xfe; //P1=1111 1110B,即输出低电平}*实例5:用单片机控制一个灯闪烁:认识单片机的工作频率#include<> //包含单片机寄存器的头文件/函数功能:延时一段时间/void delay(void) //两个void意思分别为无需返回值,没有参数传递{unsigned int i; //定义无符号整数,最大取值范围65535for(i=0;i<20000;i++) //做20000次空循环; //什么也不做,等待一个机器周期}/ 函数功能:主函数(C语言规定必须有也只能有1个主函数) / void main(void){while(1) //无限循环{P1=0xfe; //P1=1111 1110B,输出低电平delay(); //延时一段时间P1=0xff; //P1=1111 1111B,输出高电平delay(); //延时一段时间}}*实例6:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能#include<> //包含单片机寄存器的头文件/ 函数功能:主函数(C语言规定必须有也只能有1个主函数) / void main(void){while(1) //无限循环{P1=0xff; // P1=1111 1111B,熄灭LEDP0=P1; // 将 P1口状态送入P0口P2=P1; // 将 P1口状态送入P2口P3=P1; // 将 P1口状态送入P3口}}*实例7:用P0口、P1 口分别显示加法和减法运算结果 #include<> void main(void){unsigned char m,n;m=43; //即十进制数2x16+11=43n=60; //即十进制数3x16+12=60P1=m+n; //P1=103=0110 0111B,结果、、口的灯被点亮 P0=n-m;//P0=17=0001 0001B,结果、的灯被熄灭 }*实例8:用P0、P1口显示乘法运算结果#include<> //包含单片机寄存器的头文件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, 和口灭,其余亮P0=s%256; //低8位送P0口 , P3=192=c0H=1100 0000B,,,口灭,其余亮}*实例9:用P1、P0口显示除法运算结果#include<> //包含单片机寄存器的头文件void main(void){P1=36/5; //求整数P0=((36%5) 10)/5; //求小数while(1); //无限循环防止程序“跑飞”}*实例10:用自增运算控制P0口8位LED流水花样#include<> //包含单片机寄存器的头文件/函数功能:延时一段时间/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(); //调用延时函数}}*实例11:用P0口显示逻辑"与"运算结果 #include<> //包含单片机寄存器的头文件 void main(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1); //设置无限循环,防止程序“跑飞”}*实例12:用P0口显示条件运算结果#include<> //包含单片机寄存器的头文件 void main(void){P0=(8>4)8:4;//将条件运算结果送P0口,P0=8=0000 1000B while(1) ; //设置无限循环,防止程序“跑飞”}*实例13:用P0口显示按位"异或"运算结果 #include<> //包含单片机寄存器的头文件 void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=0000 1000B while(1) ; //设置无限循环,防止程序“跑飞”}*实例16:用P0显示左移运算结果#include<> //包含单片机寄存器的头文件 void main(void){P0=0x3b<<2;//将左移运算结果送P0口,P0=1110 1100B=0xec while(1); //无限循环,防止程序“跑飞”}*实例17:"万能逻辑电路"实验#include<> //包含单片机寄存器的头文件sbit F=P1^4; //将F位定义为sbit X=P1^5; //将X位定义为sbit Y=P1^6; //将Y位定义为sbit Z=P1^7; //将Z位定义为void main(void){while(1){F=((~X)&Y)|Z; //将逻辑运算结果赋给F;}}*实例18:用右移运算流水点亮P1口8位LED #include<> //包含单片机寄存器的头文件/函数功能:延时一段时间/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<> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为sbit S2=P1^5; //将S2位定义为/函数功能:主函数/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<> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为/函数功能:延时一段时间/void delay(void){unsigned int n;for(n=0;n<10000;n++);}/函数功能:主函数/void main(void){unsigned char i;i=0; //将i初始化为0while(1){if(S1==0) //如果S1键按下{delay(); //延时一段时间if(S1==0) //如果再次检测到S1键按下i++; //i自增1if(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<> //包含单片机寄存器的头文件 sbit sound=P3^7; //将sound位定义为 / 函数功能:延时形成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; //输出低电平 delay1600();sound=1; //输出高电平 delay1600();}for(i=0;i<200;i++){sound=0; //输出低电平 delay800();sound=1; //输出高电平 delay800();}}}*实例22:用while语句控制LED#include<> //包含单片机寄存器的头文件 / 函数功能:延时约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初始化为0while(i<0xff) //当i小于0xff(255)时执行循环体 { P0=i; //将i送P0口显示delay60ms(); //延时i++; //i自增1}}}*实例23:用do-while语句控制P0口8位LED流水点亮 #include<> //包含单片机寄存器的头文件/函数功能:延时约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<> //包含单片机寄存器的头文件/函数功能:延时约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<> //包含单片机寄存器的头文件/函数功能:延时约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<>void main(void){unsigned char p1, p2; //定义无符号字符型指针变量p1,p2 unsigned char i,j; //定义无符号字符型数据i=25; //给i赋初值25j=15;p1=&i; //使指针变量指向i ,对指针初始化p2=&j; //使指针变量指向j ,对指针初始化P0= p1+ p2; // p1+ p2相当于i+j,所以P0=25+15=40=0x28//则P0=0010 1000B,结果、引脚LED熄灭,其余点亮 while(1); //无限循环,防止程序“跑飞”}*实例27:用指针数组控制P0口8位LED流水点亮 #include<>/函数功能:延时约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 charp[ ]={&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<> /函数功能:延时约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; //将数组首地址存入指针pwhile(1){for(i=0;i<32;i++) //共32个流水灯控制码{P0= (p+i); // (p+i)的值等于a[i]}delay150ms(); //调用150ms延时函数 } }*实例29:用P0 、P1口显示整型函数返回值 #include<> / 函数功能:计算两个无符号整数的和/ 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<>/ 函数功能:延时一段时间/ 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){//快速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(100); //延时约60ms, (3 100 200=60 000μs) } //慢速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(250); //延时约150ms, (3 250 200=150 000μs) } }}*实例31:用数组作函数参数控制流水花样#include<>/函数功能:延时约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<>/函数功能:延时约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<> //包含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; //将函数的入口地址赋给函数型指针pwhile(1)( p)(); //通过函数的指针p调用函数led_flow()}*实例34:用指针数组作为函数的参数显示多个字符串 #include<> //包含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:字符函数应用举例#include<> //包含51单片机寄存器定义的头文件 #include<> void main(void){while(1){P3=isalpha('_')0xf0:0x0f;//条件运算,若'_'是英文字母,P3=0xf0 } }*实例36:内部函数应用举例#include<> //包含51单片机寄存器定义的头文件 #include<> //包含函数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 1110Bwhile(1){P3=_crol_(P3,1);// 将P3的二进制位循环左移1位后再赋给P3 delay(); //调用延时函数}}*实例37:标准函数应用举例#include<> //包含51单片机寄存器定义的头文件 #include<> //包含函数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:字符串函数应用举例#include<> //包含51单片机寄存器定义的头文件 #include<> //包含函数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); //比较两个字符串,并将结果存入iif(i==0) //str1=str2P3=0x00;elseif(i<0) //str1<str2P3=0xf0;else //str1>str2P3=0x0f;while(1); //防止程序“跑飞”}*实例39:宏定义应用举例2#include<> //包含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<>#include<>void main(void){P3_0=0; //将引脚置低电平,LED点亮P3_1=0; //将引脚置低电平,LED点亮P3_2=0; //将引脚置低电平,LED点亮P3_3=0; //将引脚置低电平,LED点亮P3_4=1; //将引脚置高电平,LED熄灭}P3_5=1; //将引脚置高电平,LED熄灭 P3_6=1; //将引脚置高电平,LED熄灭 P3_7=1; //将引脚置高电平,LED熄灭 while(1) ;*实例41:宏定义应用举例3#include<> //包含51单片机寄存器定义的头文件#define MAX 100 //将MAX宏定义为字符串100void main(void){#if MAX>80 //如果字符串100大于80P3=0xf0; //P3口低四位LED点亮#elseP3=0x0f; //否则,P3口高四位LED点亮#endif //结束本次编译}/ 中断、定时器中断、定时器中断、定时器中断、定时器 /*实例42:用定时器T0查询方式P2口8位控制LED闪烁#include<> // 包含51单片机寄存器定义的头文件/函数功能:主函数/ void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0TF0=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<> // 包含51单片机寄存器定义的头文件 sbit sound=P3^7; //将sound位定义为引脚/ 函数功能:主函数/ void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1TF1=0;while(1)//无限循环等待查询{while(TF1==0);TF1=0;sound=~sound; //将引脚输出电平取反TH1=(65536-921)/256; //定时器T0的高8位赋初值 TL1=(65536-921)%256; //定时器T0的高8位赋初值 }}*实例44:将计数器T0计数的结果送P1口8位LED显示#include<> // 包含51单片机寄存器定义的头文件 sbit S=P3^4; //将S 位定义为引脚/ 函数功能:主函数/ void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x02; //使用定时器T0的模式2TH0=256-156; //定时器T0的高8位赋初值TL0=256-156; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待查询{while(TF0==0) //如果未计满就等待{if(S==0) //按键S按下接地,电平为0P1=TL0; //计数器TL0加1后送P1口显示}TF0=0; //计数器溢出后,将TF0清0}}*实例45:用定时器T0的中断控制1位LED闪烁 #include<> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为引脚/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待中断;}/ 函数功能:定时器T0的中断服务程序/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数 //其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{D1=~D1; //按位取反操作,将引脚输出电平取反TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值}*实例46:用定时器T0的中断实现长时间定时#include<> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为引脚unsigned char Countor; //设置全局变量,储存定时器T0中断次数/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0Countor=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/ 函数功能:定时器T0的中断服务程序/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{Countor++; //中断次数自加1if(Countor==20) //若累计满20次,即计时满1s{D1=~D1; //按位取反操作,将引脚输出电平取反Countor=0; //将Countor清0,重新从0开始计数}TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值}*实例47:用定时器T1中断控制两个LED以不同周期闪烁#include<> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为引脚sbit D2=P2^1; //将D2位定义为引脚unsigned char Countor1; //设置全局变量,储存定时器T1中断次数unsigned char Countor2; //设置全局变量,储存定时器T1中断次数/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET1=1; //定时器T1中断允许TMOD=0x10; //使用定时器T1的模式1TH1=(65536-46083)/256; //定时器T1的高8位赋初值TL1=(65536-46083)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1Countor1=0; //从0开始累计中断次数Countor2=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/ 函数功能:定时器T1的中断服务程序/ void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数 //其后的3为定时器T1的中断编号;0表示使用第0组工作寄存器{Countor1++; //Countor1自加1Countor2++; //Countor2自加1if(Countor1==2) //若累计满2次,即计时满100ms{D1=~D1; //按位取反操作,将引脚输出电平取反 Countor1=0; //将Countor1清0,重新从0开始计数}if(Countor2==8) //若累计满8次,即计时满400ms{D2=~D2; //按位取反操作,将引脚输出电平取反 Countor2=0; //将Countor1清0,重新从0开始计数}TH1=(65536-46083)/256; //定时器T1的高8位重新赋初值TL1=(65536-46083)%256; //定时器T1的高8位重新赋初值}*实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频#include<> // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为引脚/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET1=1; //定时器T1中断允许TMOD=0x10; //TMOD=0001 000B,使用定时器T1的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1while(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<> //包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为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。

单片机汇编语言经典一百例

单片机汇编语言经典一百例

单片机汇编语言经典一百例汇编语言是一种底层的程序设计语言,是一种将汇编指令直接翻译成机器指令的语言。

在单片机编程中,掌握汇编语言是非常重要的,因为它可以充分发挥单片机的性能,并且提高程序的运行效率。

本文将介绍一百个经典的单片机汇编语言例子,帮助读者更好地理解汇编语言的使用。

1. 点亮LED灯```ORG 0x0000 ; 程序起始地址MOV P1, #0xAA ; P1口输出高电平,LED灯点亮END ; 程序结束```2. LED流水灯效果```ORG 0x0000 ; 程序起始地址MOV P1, #0x01 ; P1口输出低电平,第一个LED点亮CALL DELAY ; 调用延时函数MOV P1, #0x02 ; P1口输出低电平,第二个LED点亮CALL DELAY ; 调用延时函数MOV P1, #0x04 ; P1口输出低电平,第三个LED点亮CALL DELAY ; 调用延时函数MOV P1, #0x08 ; P1口输出低电平,第四个LED点亮CALL DELAY ; 调用延时函数…DELAY: ; 延时函数MOV R0, #100 ; 设置延时时间DELAY_LOOP:DJNZ R0, DELAY_LOOP ; 循环减一RET ; 返回END ; 程序结束```3. 数码管动态扫描显示```ORG 0x0000 ; 程序起始地址CLR P0.0 ; P0.0口输出低电平,选择第一个数码管MOV P2, #0x7E ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数CLR P0.1 ; P0.1口输出低电平,选择第二个数码管MOV P2, #0x30 ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数CLR P0.2 ; P0.2口输出低电平,选择第三个数码管MOV P2, #0x6D ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数CLR P0.3 ; P0.3口输出低电平,选择第四个数码管MOV P2, #0x79 ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数…DELAY: ; 延时函数MOV R0, #100 ; 设置延时时间DELAY_LOOP:DJNZ R0, DELAY_LOOP ; 循环减一RET ; 返回END ; 程序结束```...通过以上例子,我们可以看到单片机汇编语言的应用非常广泛,可以实现各种各样的功能。

单片机编程100例

单片机编程100例

单片机编程实例100例大全单片机编程实例*实例1:使用P3口流水点亮8位LED#include<> //包含单片机寄存器的头文件 / 函数功能:延时一段时间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(); //调用延时函数} / /}*实例2:通过对P3口地址的操作流水点亮8位LED#include<> //包含单片机寄存器的头文件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(); //调用延时函数}}*实例3:用不同数据类型控制灯闪烁时间#include<> //包含单片机寄存器的头文件/函数功能:用整形数据延时一段时间/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; //口的灯点亮int_delay(); //延时一段较长的时间P1=0xff; //熄灭int_delay(); //延时一段较长的时间}for(i=0;i<3;i++){P1=0xef; //口的灯点亮char_delay(); //延时一段较长的时间} P1=0xff; //熄灭 char_delay(); //延时一段较长的时间 } }*实例4:用单片机控制第一个灯亮#include<> //包含51单片机寄存器定义的头文件void main(void){P1=0xfe; //P1=1111 1110B,即输出低电平}*实例5:用单片机控制一个灯闪烁:认识单片机的工作频率#include<> //包含单片机寄存器的头文件/函数功能:延时一段时间/void delay(void) //两个void意思分别为无需返回值,没有参数传递 {unsigned int i; //定义无符号整数,最大取值范围65535for(i=0;i<20000;i++) //做20000次空循环; //什么也不做,等待一个机器周期}/ 函数功能:主函数(C语言规定必须有也只能有1个主函数) / void main(void){while(1) //无限循环{P1=0xfe; //P1=1111 1110B,输出低电平delay(); //延时一段时间P1=0xff; //P1=1111 1111B,输出高电平delay(); //延时一段时间}}*实例6:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能#include<> //包含单片机寄存器的头文件/ 函数功能:主函数(C语言规定必须有也只能有1个主函数) / void main(void){while(1) //无限循环{P1=0xff; // P1=1111 1111B,熄灭LEDP0=P1; // 将 P1口状态送入P0口P2=P1; // 将 P1口状态送入P2口P3=P1; // 将 P1口状态送入P3口}}*实例7:用P0口、P1 口分别显示加法和减法运算结果 #include<> void main(void){unsigned char m,n;m=43; //即十进制数2x16+11=43n=60; //即十进制数3x16+12=60P1=m+n; //P1=103=0110 0111B,结果、、口的灯被点亮 P0=n-m; //P0=17=0001 0001B,结果、的灯被熄灭 }*实例8:用P0、P1口显示乘法运算结果#include<> //包含单片机寄存器的头文件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, 和口灭,其余亮P0=s%256; //低8位送P0口 , P3=192=c0H=1100 0000B,,,口灭,其余亮}*实例9:用P1、P0口显示除法运算结果#include<> //包含单片机寄存器的头文件void main(void){P1=36/5; //求整数P0=((36%5) 10)/5; //求小数while(1); //无限循环防止程序“跑飞”}*实例10:用自增运算控制P0口8位LED流水花样#include<> //包含单片机寄存器的头文件/函数功能:延时一段时间/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(); //调用延时函数}}*实例11:用P0口显示逻辑"与"运算结果 #include<> //包含单片机寄存器的头文件 void main(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1); //设置无限循环,防止程序“跑飞”}*实例12:用P0口显示条件运算结果#include<> //包含单片机寄存器的头文件 void main(void){P0=(8>4)8:4;//将条件运算结果送P0口,P0=8=0000 1000B while(1) ; //设置无限循环,防止程序“跑飞”}*实例13:用P0口显示按位"异或"运算结果 #include<> //包含单片机寄存器的头文件 void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}*实例16:用P0显示左移运算结果#include<> //包含单片机寄存器的头文件 void main(void){P0=0x3b<<2;//将左移运算结果送P0口,P0=1110 1100B=0xec while(1); //无限循环,防止程序“跑飞”}*实例17:"万能逻辑电路"实验#include<> //包含单片机寄存器的头文件sbit F=P1^4; //将F位定义为sbit X=P1^5; //将X位定义为sbit Y=P1^6; //将Y位定义为sbit Z=P1^7; //将Z位定义为void main(void){while(1){F=((~X)&Y)|Z; //将逻辑运算结果赋给F;}}*实例18:用右移运算流水点亮P1口8位LED #include<> //包含单片机寄存器的头文件/函数功能:延时一段时间/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<> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为sbit S2=P1^5; //将S2位定义为/函数功能:主函数/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<> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为/函数功能:延时一段时间/void delay(void){unsigned int n;for(n=0;n<10000;n++);}/函数功能:主函数/void main(void){unsigned char i;i=0; //将i初始化为0while(1){if(S1==0) //如果S1键按下{delay(); //延时一段时间if(S1==0) //如果再次检测到S1键按下i++; //i自增1if(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<> //包含单片机寄存器的头文件 sbit sound=P3^7; //将sound位定义为 / 函数功能:延时形成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; //输出低电平 delay1600(); sound=1; //输出高电平 delay1600(); }for(i=0;i<200;i++){sound=0; //输出低电平 delay800(); sound=1; //输出高电平 delay800(); }}}*实例22:用while语句控制LED#include<> //包含单片机寄存器的头文件 / 函数功能:延时约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初始化为0while(i<0xff) //当i小于0xff(255)时执行循环体 {P0=i; //将i送P0口显示delay60ms(); //延时i++; //i自增1}}}*实例23:用do-while语句控制P0口8位LED流水点亮 #include<> //包含单片机寄存器的头文件/函数功能:延时约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<> //包含单片机寄存器的头文件/函数功能:延时约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 codeTab[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义无符号字符型数组while(1){for(i=0;i<8;i++){P0=Tab[i];//依次引用数组元素,并将其送P0口显示delay60ms();//调用延时函数}}}*实例25:用P0口显示字符串常量#include<> //包含单片机寄存器的头文件/函数功能:延时约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<>void main(void){unsigned char p1, p2; //定义无符号字符型指针变量p1,p2 unsigned char i,j; //定义无符号字符型数据i=25; //给i赋初值25j=15;p1=&i; //使指针变量指向i ,对指针初始化p2=&j; //使指针变量指向j ,对指针初始化P0= p1+ p2; // p1+ p2相当于i+j,所以P0=25+15=40=0x28//则P0=0010 1000B,结果、引脚LED熄灭,其余点亮 while(1) ; //无限循环,防止程序“跑飞”}*实例27:用指针数组控制P0口8位LED流水点亮 #include<> /函数功能:延时约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 codeTab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned charp[ ]={&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<> /函数功能:延时约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 charTab[ ]={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; //将数组首地址存入指针pwhile(1){for(i=0;i<32;i++) //共32个流水灯控制码{P0= (p+i); // (p+i)的值等于a[i]}delay150ms(); //调用150ms延时函数 } }*实例29:用P0 、P1口显示整型函数返回值 #include<>/ 函数功能:计算两个无符号整数的和/ 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<> / 函数功能:延时一段时间/ 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 codeTab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水灯控制码while(1){//快速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(100); //延时约60ms, (3 100 200=60 000μs) }//慢速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(250); //延时约150ms, (3 250 200=150 000μs) }}}*实例31:用数组作函数参数控制流水花样#include<>/函数功能:延时约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 codeTab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水灯控制码led_flow(Tab);}*实例32:用指针作函数参数控制P0口8位LED流水点亮 #include<> /函数功能:延时约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 codeTab[ ]={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<> //包含51单片机寄存器定义的头文件unsigned char codeTab[]={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; //将函数的入口地址赋给函数型指针pwhile(1)( p)(); //通过函数的指针p调用函数led_flow()}*实例34:用指针数组作为函数的参数显示多个字符串 #include<> //包含51单片机寄存器定义的头文件unsigned char code str1[ ]="Temperature is tested byDS18B20";//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:字符函数应用举例#include<> //包含51单片机寄存器定义的头文件 #include<> void main(void){while(1){P3=isalpha('_')0xf0:0x0f;//条件运算,若'_'是英文字母,P3=0xf0 }}*实例36:内部函数应用举例#include<> //包含51单片机寄存器定义的头文件 #include<> //包含函数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 1110Bwhile(1){P3=_crol_(P3,1);// 将P3的二进制位循环左移1位后再赋给P3 delay(); //调用延时函数}}*实例37:标准函数应用举例#include<> //包含51单片机寄存器定义的头文件 #include<> //包含函数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:字符串函数应用举例#include<> //包含51单片机寄存器定义的头文件 #include<> //包含函数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); //比较两个字符串,并将结果存入iif(i==0) //str1=str2P3=0x00;elseif(i<0) //str1<str2P3=0xf0;else //str1>str2P3=0x0f;while(1); //防止程序“跑飞”}*实例39:宏定义应用举例2#include<> //包含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<>#include<>void main(void){P3_0=0; //将引脚置低电平,LED点亮P3_1=0; //将引脚置低电平,LED点亮P3_2=0; //将引脚置低电平,LED点亮P3_3=0; //将引脚置低电平,LED点亮P3_4=1; //将引脚置高电平,LED熄灭}P3_5=1; //将引脚置高电平,LED熄灭 P3_6=1; //将引脚置高电平,LED熄灭 P3_7=1; //将引脚置高电平,LED熄灭 while(1) ;*实例41:宏定义应用举例3#include<> //包含51单片机寄存器定义的头文件#define MAX 100 //将MAX宏定义为字符串100void main(void){#if MAX>80 //如果字符串100大于80P3=0xf0; //P3口低四位LED点亮#elseP3=0x0f; //否则,P3口高四位LED点亮#endif //结束本次编译}/ 中断、定时器中断、定时器中断、定时器中断、定时器 /*实例42:用定时器T0查询方式P2口8位控制LED闪烁#include<> // 包含51单片机寄存器定义的头文件/函数功能:主函数/ void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0TF0=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<> // 包含51单片机寄存器定义的头文件 sbitsound=P3^7; //将sound位定义为引脚/ 函数功能:主函数/ void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1TF1=0;while(1)//无限循环等待查询{while(TF1==0);TF1=0;sound=~sound; //将引脚输出电平取反TH1=(65536-921)/256; //定时器T0的高8位赋初值TL1=(65536-921)%256; //定时器T0的高8位赋初值 }*实例44:将计数器T0计数的结果送P1口8位LED显示 #include<> // 包含51单片机寄存器定义的头文件 sbit S=P3^4; //将S位定义为引脚/ 函数功能:主函数/ void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x02; //使用定时器T0的模式2TH0=256-156; //定时器T0的高8位赋初值TL0=256-156; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待查询{while(TF0==0) //如果未计满就等待{if(S==0) //按键S按下接地,电平为0P1=TL0; //计数器TL0加1后送P1口显示}TF0=0; //计数器溢出后,将TF0清0}*实例45:用定时器T0的中断控制1位LED闪烁 #include<> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为引脚/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待中断;}/ 函数功能:定时器T0的中断服务程序/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数 //其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{D1=~D1; //按位取反操作,将引脚输出电平取反TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值}*实例46:用定时器T0的中断实现长时间定时#include<> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为引脚unsigned char Countor; //设置全局变量,储存定时器T0中断次数/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0Countor=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/ 函数功能:定时器T0的中断服务程序/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{Countor++; //中断次数自加1if(Countor==20) //若累计满20次,即计时满1s{D1=~D1; //按位取反操作,将引脚输出电平取反Countor=0; //将Countor清0,重新从0开始计数}TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值}*实例47:用定时器T1中断控制两个LED以不同周期闪烁#include<> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为引脚sbit D2=P2^1; //将D2位定义为引脚unsigned char Countor1; //设置全局变量,储存定时器T1中断次数unsigned char Countor2; //设置全局变量,储存定时器T1中断次数/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET1=1; //定时器T1中断允许TMOD=0x10; //使用定时器T1的模式1TH1=(65536-46083)/256; //定时器T1的高8位赋初值TL1=(65536-46083)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1Countor1=0; //从0开始累计中断次数Countor2=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/ 函数功能:定时器T1的中断服务程序/ void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数 //其后的3为定时器T1的中断编号;0表示使用第0组工作寄存器{Countor1++; //Countor1自加1Countor2++; //Countor2自加1if(Countor1==2) //若累计满2次,即计时满100ms{D1=~D1; //按位取反操作,将引脚输出电平取反 Countor1=0; //将Countor1清0,重新从0开始计数}if(Countor2==8) //若累计满8次,即计时满400ms{D2=~D2; //按位取反操作,将引脚输出电平取反 Countor2=0; //将Countor1清0,重新从0开始计数}TH1=(65536-46083)/256; //定时器T1的高8位重新赋初值TL1=(65536-46083)%256; //定时器T1的高8位重新赋初值}*实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频 #include<> // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为引脚/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET1=1; //定时器T1中断允许TMOD=0x10; //TMOD=0001 000B,使用定时器T1的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1while(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<> //包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为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()。

(完整版)单片机汇编语言经典一百例

(完整版)单片机汇编语言经典一百例

51单片机实用程序库4.1 流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮的效果。

实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。

程序实例(LAMP.ASM)ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOV P1,A ;灭所有的灯MOV A,#11111110BMAIN1:MOV P1,A ;开最左边的灯ACALL DELAY ;延时RL A ;将开的灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ 30H,D1RETEND4.2 方波输出程序介绍:P1.0 口输出高电平,延时后再输出低电平,循环输出产生方波。

实际应用中例如:波形发生器。

程序实例(FAN.ASM):ORG 0000HMAIN:;直接利用P1.0口产生高低电平地形成方波////////////// ACALL DELAYSETB P1.0ACALL DELAY10CLR P1.0AJMP MAIN;////////////////////////////////////////////////// DELAY:MOV R1,#0FFHDJNZ R1,$RETEND五、定时器功能实例5.1 定时1秒报警程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1 次,以达到定时报警的目的。

实际应用例如:定时报警器。

程序实例(DIN1.ASM):ORG 0000HAJMP MAINORG 000BHAJMP DIN0 ;定时器0入口MAIN:TFLA G EQU 34H ;时间秒标志,判是否到50个0.2秒,即50*0.2=1秒MOV TMOD,#00000001B;定时器0工作于方式1MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒11SETB EA ;开总中断SETB ET0 ;开定时器0中断允许SETB TR0 ;开定时0运行SETB P1.0LOOP: AJMP LOOPDIN0:;是否到一秒//////////////////////////////////////// INCC: INC TFLAGMOV A,TFLAGCJNE A,#20,REMOV TFLAG,#00HCPL P1.0;////////////////////////////////////////////////// RE:MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒RETIEND5.2 频率输出公式介绍:f=1/ts51 使用12M晶振,一个周期是1微秒使用定时器1工作于方式0,最大值为65535,以产生200HZ的频率为例:200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电12平或低电平的时间为2500 微秒。

51单片机C语言编程100例

51单片机C语言编程100例

51单片机C语言编程100例目录实例3:用单片机控制第一个灯亮 ...................................... 3 实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 ................ 3 实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能...... 4 实例6:使用P3口流水点亮8位LED.................................... 4 实例7:通过对P3口地址的操作流水点亮8位LED........................ 5 实例8:用不同数据类型控制灯闪烁时间 ................................ 6 实例9:用P0口、P1 口分别显示加法和减法运算结果 .. (8)实例10:用P0、P1口显示乘法运算结果 ................................ 8 实例11:用P1、P0口显示除法运算结果 ................................ 9 实例12:用自增运算控制P0口8位LED流水花样 ........................ 9 实例13:用P0口显示逻辑\与\运算结果 (10)实例14:用P0口显示条件运算结果 ................................... 10 实例15:用P0口显示按位\异或\运算结果 ............................. 10 实例16:用P0显示左移运算结果 ..................................... 10 实例17:\万能逻辑电路\实验 ........................................ 11 实例18:用右移运算流水点亮P1口8位LED............................ 11 实例19:用if语句控制P0口8位LED的流水方向 ...................... 12 实例20:用swtich语句的控制P0口8位LED的点亮状态 ................ 12 实例21:用for语句控制蜂鸣器鸣笛次数 .............................. 14 实例22:用while语句控制LED.......................................15 实例23:用do-while语句控制P0口8位LED流水点亮 .................. 16 实例24:用字符型数组控制P0口8位LED流水点亮 ..................... 16 实例25:用P0口显示字符串常量 .................................... 17 实例26:用P0 口显示指针运算结果................................... 18 实例27:用指针数组控制P0口8位LED流水点亮 ....................... 18 实例28:用数组的指针控制P0 口8 位LED流水点亮 .................... 19 实例29:用P0 、P1口显示整型函数返回值 ............................ 20 实例30:用有参函数控制P0口8位LED流水速度 ....................... 21 实例31:用数组作函数参数控制流水花样 .............................. 22 实例32:用指针作函数参数控制P0口8位LED流水点亮 ................. 23 实例33:用函数型指针控制P1口灯花样 ............................... 24 实例34:用指针数组作为函数的参数显示多个字符串 .................... 25 实例35:字符函数ctype.h应用举例 .................................. 26 实例36:内部函数intrins.h应用举例 ................................ 27 实例37:标准函数stdlib.h应用举例 (27)实例38:字符串函数string.h应用举例 ............................... 28 实例39:宏定义应用举例2........................................... 28 实例40:宏定义应用举例 2........................................... 29 实例41:宏定义应用举例3. (29)实例42:用定时器T0查询方式P2口8位控制LED闪烁 .................. 30 实例43:用定时器T1查询方式控制单片机发出1KHz音频 ................ 31 实例44:将计数器T0计数的结果送P1口8位LED显示 (31)实例45:用定时器T0的中断控制1位LED闪烁.........................32实例46:用定时器T0的中断实现长时间定时...........................33实例47:用定时器T1中断控制两个LED以不同周期闪烁.................34实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频..................35实例49:用定时器T0的中断实现\渴望\主题曲的播放...................35实例50-1:输出50个矩形脉冲.......................................38实例50-2:计数器T0统计外部脉冲数 (39)实例51-2:定时器T0的模式2测量正脉冲宽度.........................40实例52:用定时器T0控制输出高低宽度不同的矩形波...................40实例53:用外中断0的中断方式进行数据采集..........................41实例54-1:输出负脉宽为200微秒的方波..............................42实例54-2:测量负脉冲宽度..........................................43实例55:方式0控制流水灯循环点亮..................................44实例56-1:数据发送程序 (45)实例56-2:数据接收程序............................................46实例57-1:数据发送程序............................................47实例57-2:数据接收程序............................................48实例58:单片机向PC发送数据 (49)实例59:单片机接收PC发出的数据...................................50实例60:用LED数码显示数字5.......................................51实例61:用LED数码显示器循环显示数字0~9...........................51实例62:用数码管慢速动态扫描显示数字\........................52实例63:用LED数码显示器伪静态显示数字1234........................53实例64:用数码管显示动态检测结果. (54)实例65:数码秒表设计..............................................56实例66:数码时钟设计..............................................57实例67:用LED数码管显示计数器T0的计数值.........................61实例68:静态显示数字“59”........................................62实例69:无软件消抖的独立式键盘输入实验............................63实例70:软件消抖的独立式键盘输入实验..............................63实例71:CPU控制的独立式键盘扫描实验...............................64实例72:定时器中断控制的独立式键盘扫描实验........................67实例73:独立式键盘控制的4级变速流水灯............................70实例74:独立式键盘的按键功能扩展:\以一当四\......................72实例75:独立式键盘调时的数码时钟实验..............................74实例76:独立式键盘控制步进电机实验.. (78)实例77:矩阵式键盘按键值的数码管显示实验..........................81实例78:矩阵式键盘按键音..........................................84实例79:简易电子琴................................................85实例80:矩阵式键盘实现的电子密码锁................................91实例81:用LCD显示字符'A'.. (95)实例82:用LCD循环右移显示\......................98实例83:用LCD显示适时检测结果...................................102实例84:液晶时钟设计 (106)实例85:将数据\写入AT24C02再读出送P1口显示................112实例86:将按键次数写入AT24C02,再读出并用1602LCD显示............116实例87:对I2C总线上挂接多个AT24C02的读写操作...................124实例88:基于AT24C02的多机通信读取程序.........................129实例88:基于AT24C02的多机通信写入程序..........................133实例90:DS18B20温度检测及其液晶显示..............................144实例91:将数据\写入X5045再读出送P1口显示..................153实例92:将流水灯控制码写入X5045并读出送P1口显示................157实例93:对SPI总线上挂接多个X5045的读写操作.....................161实例94:基于ADC0832的数字电压表.................................165实例95:用DAC0832产生锯齿波电压.................................171实例96:用P1口显示红外遥控器的按键值............................172实例97:用红外遥控器控制继电器...................................174实例98:基于DS1302的日历时钟....................................177实例99:单片机数据发送程序.......................................186实例100:电机转速表设计..........................................187模拟霍尔脉冲......................................................192/某函数的使用和熟悉某///实例3:用单片机控制第一个灯亮#include //包含51单片机寄存器定义的头文件 void main(void) while(1) //无限循环P1=0某fe; //P1=1111 1110B,即P1.0输出低电平 }//实例4:用单片机控制一个灯闪烁:认识单片机的工作频率#include //包含单片机寄存器的头文件 /某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某函数功能:延时一段时间某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/void delay(void) //两个void意思分别为无需返回值,没有参数传递unsigned int i; //定义无符号整数,最大取值范围65535for(i=0;i<20000;i++) //做20000次空循环;//什么也不做,等待一个机器周期}/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某函数功能:主函数(C语言规定必须有也只能有1个主函数)某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/ voidmain(void)while(1) //无限循环P1=0某fe; //P1=1111 1110B, P1.0输出低电平 delay(; //延时一段时间P1=0某ff; //P1=1111 1111B, P1.0输出高电平 delay(; //延时一段时间 } }//实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能#include //包含单片机寄存器的头文件/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某函数功能:主函数(C语言规定必须有也只能有1个主函数)某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/void main(void)while(1) //无限循环P1=0某ff; // P1=1111 1111, 熄灭LED P0=P1; // 将 P1口状态送入P0口 P2=P1; // 将 P1口状态送入P2口 P3=P1; // 将 P1口状态送入P3口 } }//实例6:使用P3口流水点亮8位LED#include //包含单片机寄存器的头文件 /某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某函数功能:延时一段时间某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/void delay(void)unsigned char i,j; for(i=0;i<250;i++)for(j=0;j<250;j++) ; }/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某函数功能:主函数某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/ voidmain(void)while(1)P3=0某fe; //第一个灯亮 delay(; //调用延时函数 P3=0某fd; //第二个灯亮 delay(; //调用延时函数 P3=0某fb; //第三个灯亮 delay(; //调用延时函数 P3=0某f7; //第四个灯亮 delay(; //调用延时函数P3=0某ef; //第五个灯亮 delay(; //调用延时函数 P3=0某df; //第六个灯亮 delay(; //调用延时函数 P3=0某bf; //第七个灯亮 delay(; //调用延时函数 P3=0某7f; //第八个灯亮delay(; //调用延时函数 } }//实例7:通过对P3口地址的操作流水点亮8位LED#include //包含单片机寄存器的头文件sfr 某=0某b0; //P3口在存储器中的地址是b0H,通过sfr可定义8051内核单片机//的所有内部8位特殊功能寄存器,对地址某的操作也就是对P1口的操作/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某。

单片机编程100例

单片机编程100例

单片机编程实例100例大全单片机编程实例*实例1:使用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(); //调用延时函数} / /}*实例2:通过对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(); //调用延时函数}}*实例3:用不同数据类型控制灯闪烁时间#include〈reg51、h〉 //包含单片机寄存器得头文件/函数功能:用整形数据延时一段时间/void int_delay(void)//延时一段较长得时间{unsigned int m; //定义无符号整形变量,双字节数据,值域为0~65535 for(m=0;m〈36000;m++);//空操作}/函数功能:用字符型数据延时一段时间/void char_delay(void) //延时一段较短得时间{unsigned chari,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(); //延时一段较长得时间 } }*实例4:用单片机控制第一个灯亮#include<reg51、h> //包含51单片机寄存器定义得头文件void main(void){P1=0xfe; //P1=1111 1110B,即P1、0输出低电平}*实例5:用单片机控制一个灯闪烁:认识单片机得工作频率#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(); //延时一段时间}}*实例6:将 P1口状态分别送入P0、P2、P3口:认识I/O口得引脚功能#include〈reg51、h> //包含单片机寄存器得头文件/函数功能:主函数 (C语言规定必须有也只能有1个主函数) /voidmain(void){while(1) //无限循环{P1=0xff;// P1=1111 1111B,熄灭LEDP0=P1; //将 P1口状态送入P0口P2=P1; //将 P1口状态送入P2口P3=P1; // 将 P1口状态送入P3口}}*实例7:用P0口、P1口分别显示加法与减法运算结果 #include<reg51、h>voidmain(void){unsigned char m,n;m=43; //即十进制数2x16+11=43n=60; //即十进制数3x16+12=60P1=m+n; //P1=103=0110 0111B,结果P1、3、P1、4、P1、7 口得灯被点亮P0=n-m; //P0=17=0001 0001B,结果P0、0、P0、4得灯被熄灭 }*实例8:用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=00010001B, P1、0与P1、4口灭,其余亮P0=s%256; //低8位送P0口,P3=192=c0H=1100 0000B,P3、1,P3、6,P3、7口灭,其余亮}*实例9:用P1、P0口显示除法运算结果#include<reg51、h〉 //包含单片机寄存器得头文件void main(void){P1=36/5; //求整数P0=((36%5) 10)/5; //求小数while(1); //无限循环防止程序“跑飞”}*实例10:用自增运算控制P0口8位LED流水花样#include〈reg51、h〉//包含单片机寄存器得头文件/函数功能:延时一段时间/void delay(void){unsigned int i;for(i=0;i<20000;i++);}/函数功能?:主函数/ voidmain(void){unsigned char i;for(i=0;i〈255;i++) //注意i得值不能超过255 {P0=i; //将i得值送P0口delay(); //调用延时函数}}*实例11:用P0口显示逻辑”与”运算结果#include〈reg51、h〉//包含单片机寄存器得头文件void main(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1);//设置无限循环,防止程序“跑飞”}*实例12:用P0口显示条件运算结果#include〈reg51、h〉 //包含单片机寄存器得头文件 void m ain(void){P0=(8>4)?8:4;//将条件运算结果送P0口,P0=8=0000 1000Bwhile(1); //设置无限循环,防止程序“跑飞”}*实例13:用P0口显示按位”异或”运算结果 #include〈reg 51、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、4sbit X=P1^5; //将X位定义为P1、5sbit Y=P1^6;//将Y位定义为 P1、6sbit Z=P1^7; //将Z位定义为 P1、7void 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、4sbit 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得点亮状态 #in clude<reg51、h〉 //包含单片机寄存器得头文件sbit S1=P1^4; //将S1位定义为P1、4/函数功能:延时一段时间/voiddelay(void){unsigned int n;for(n=0;n<10000;n++);}/函数功能:主函数/void main(void){unsigned char i;i=0; //将i初始化为0while(1){if(S1==0) //如果S1键按下{delay(); //延时一段时间if(S1==0) //如果再次检测到S1键按下i++; //i自增1if(i==9) //如果i=9,重新将其置为1i=1;}switch(i) //使用多分支选择语句{}} case1: P0=0xfe;//第一个LED亮 break; case 2: P 0=0xfd; //第二个LED亮 break; case 3:P0=0xfb; //第三个LED亮 break;case 4:P0=0xf7; //第四个LED亮 br eak; case 5:P0=0xef; //第五个LED亮break; case6:P0=0xdf; //第六个LED亮 break;case 7:P0=0xbf; //第七个LED亮break;case 8:P0=0x7f; //第八个LED亮break; default: //缺省值,关闭所有LEDP0=0xff; }*实例21:用for语句控制蜂鸣器鸣笛次数#include<reg51、h〉 //包含单片机寄存器得头文件 sbit so und=P3^7;//将sound位定义为P3、7 / 函数功能:延时形成1600Hz音频/ void delay1600(void){unsigned char n;for(n=0;n<100;n++);}/函数功能:延时形成800Hz音频/ void delay800(void){unsignedchar 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 100200=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 chari;while(1) //无限循环{i=0;//将i初始化为0while(i〈0xff) //当i小于0xff(255)时执行循环体 {P0=i; //将i送P0口显示delay60ms();//延时i++; //i自增1}}}*实例23:用do-while语句控制P0口8位LED流水点亮 #inc lude<reg51、h〉//包含单片机寄存器得头文件/函数功能:延时约60ms (3 100 200=60000μs)/void delay60ms(void)unsignedcharm,n;for(m=0;m〈100;m++)for(n=0;n〈200;n++);}/函数功能:主函数/voidmain(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(); delay60m s(); P0=0xbf; //第七个LED亮 delay60ms();P0=0x7f; //第八个LED亮delay60ms(); }while(1); //无限循环,使8位LED循环流水点亮*实例24:用字符型数组控制P0口8位LED流水点亮 #include〈r eg51、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++);}/函数功能:主函数/voidmain(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〉voidmain(void){unsignedchar p1, p2; //定义无符号字符型指针变量p1,p2 unsigned char i,j; //定义无符号字符型数据i=25; //给i赋初值25j=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 /voiddelay150ms(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,0xf 7,0xef,0xdf,0xbf,0x7f};unsignedchar 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流水点亮#includ e〈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 chari;unsigned char Tab[ ]={0xFF,0xFE,0xFD,0xFB,0xF7,0xE F,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; //将数组首地址存入指针pwhile(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){unsignedcharm,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,0xE F,0xDF,0xBF,0x7F}; //流水灯控制码while(1){//快速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(100); //延时约60ms, (3 100200=60000μs)}//慢速流水点亮LEDfor(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 charm,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/函数功能:流水点亮P0口8位LED/void led_flow(unsigned chara[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,0x EF,0xDF,0xBF,0x7F}; //流水灯控制码led_flow(Tab);}*实例32:用指针作函数参数控制P0口8位LED流水点亮 #inclu de<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; //将函数得入口地址赋给函数型指针pwhile(1)( p)(); //通过函数得指针p调用函数led_flow()}*实例34:用指针数组作为函数得参数显示多个字符串#include〈reg51、h〉 //包含51单片机寄存器定义得头文件unsigned char codestr1[ ]=”Temperature is testedbyDS18B20”;//C语言中,字符串就是作为字符数组来处理得unsigned char code str2[ ]=”Now temperature is:”; //所以,字符串得名字就就是字符串得首地址unsigned char code str3[ ]="The Systerm is designed by Zhang Sa n”;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 charx[]) //形参必须为指针数组{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){unsignedchari;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单片机寄存器定义得头文件#inc lude<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 1110Bwhile(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 chari;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 temperatureis :”;unsigned charstr2[ ]=”Now,Thetemperature is 36 Centgrade:”; unsigned char i;i=strcmp(str1,str2); //比较两个字符串,并将结果存入iif(i==0) //str1=str2P3=0x00;elseif(i〈0)//str1〈str2P3=0xf0;else //str1〉str2P3=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宏定义为字符串100void main(void){#if MAX〉80 //如果字符串100大于80P3=0xf0; //P3口低四位LED点亮#elseP3=0x0f;//否则,P3口高四位LED点亮#endif //结束本次编译}/ 中断、定时器中断、定时器中断、定时器中断、定时器/*实例42:用定时器T0查询方式P2口8位控制LED闪烁#include<reg51、h> // 包含51单片机寄存器定义得头文件/函数功能:主函数/ void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0得模式1TH0=(65536-46083)/256; //定时器T0得高8位赋初值TL0=(65536-46083)%256; //定时器T0得高8位赋初值TR0=1;//启动定时器T0TF0=0;P2=0xff;while(1)//无限循环等待查询{;TF0=0;P2=~P2;TH0=(65536—46083)/256; //定时器T0得高8位赋初值TL 0=(65536-46083)%256; //定时器T0得高8位赋初值 }}*实例43:用定时器T1查询方式控制单片机发出1KHz音频 #include<reg51、h〉// 包含51单片机寄存器定义得头文件sb it sound=P3^7; //将sound位定义为P3、7引脚/ 函数功能:主函数/ void main(void){//EA=1; //开总中断// ET0=1;//定时器T0中断允许 TMOD=0x10; //使用定时器T1得模式1TH1=(65536—921)/256; //定时器T1得高8位赋初值TL1=(65536-921)%256; //定时器T1得高8位赋初值TR1=1; //启动定时器T1TF1=0;while(1)//无限循环等待查询{;TF1=0;sound=~sound; //将P3、7引脚输出电平取反TH1=(65536-921)/256; //定时器T0得高8位赋初值TL1=(65536-921)%256;//定时器T0得高8位赋初值}}*实例44:将计数器T0计数得结果送P1口8位LED显示#inc lude〈reg51、h> // 包含51单片机寄存器定义得头文件 sbitS=P3^4; //将S位定义为P3、4引脚/函数功能:主函数/ void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许TMOD=0x02; //使用定时器T0得模式2TH0=256-156;//定时器T0得高8位赋初值TL0=256—156; //定时器T0得高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待查询{while(TF0==0) //如果未计满就等待{if(S==0) //按键S按下接地,电平为0P1=TL0; //计数器TL0加1后送P1口显示}TF0=0; //计数器溢出后,将TF0清0}}*实例45:用定时器T0得中断控制1位LED闪烁 #include〈reg51、h> // 包含51单片机寄存器定义得头文件sbitD1=P2^0; //将D1位定义为P2、0引脚/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01;//使用定时器T0得模式2TH0=(65536—46083)/256; //定时器T0得高8位赋初值TL0=(65536—46083)%256; //定时器T0得高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待中断;}/函数功能:定时器T0得中断服务程序/ voidTime0(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单片机寄存器定义得头文件sbitD1=P2^0; //将D1位定义为P2、0引脚unsigned char Countor; //设置全局变量,储存定时器T0中断次数/函数功能:主函数/ void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0得模式2TH0=(65536—46083)/256; //定时器T0得高8位赋初值TL0=(65536-46083)%256;//定时器T0得高8位赋初值TR0=1; //启动定时器T0Countor=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/ 函数功能:定时器T0得中断服务程序/ void Time0(void) interrupt 1using 0//“inter rupt"声明函数为中断服务函数//其后得1为定时器T0得中断编号;0表示使用第0组工作寄存器{Countor++; //中断次数自加1if(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以不同周期闪烁#incl ude〈reg51、h〉// 包含51单片机寄存器定义得头文件sbit D1=P2^0; //将D1位定义为P2、0引脚sbit D2=P2^1;//将D2位定义为P2、1引脚unsignedchar Countor1; //设置全局变量,储存定时器T1中断次数unsignedchar Countor2; //设置全局变量,储存定时器T1中断次数/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET1=1; //定时器T1中断允许TMOD=0x10; //使用定时器T1得模式1TH1=(65536-46083)/256; //定时器T1得高8位赋初值TL1=(65536-46083)%256;//定时器T1得高8位赋初值TR1=1; //启动定时器T1Countor1=0; //从0开始累计中断次数Countor2=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/函数功能:定时器T1得中断服务程序/ void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数 //其后得3为定时器T1得中断编号;0表示使用第0组工作寄存器{Countor1++; //Countor1自加1Countor2++; //Countor2自加1if(Countor1==2) //若累计满2次,即计时满100ms{D1=~D1; //按位取反操作,将P2、0引脚输出电平取反 Countor 1=0; //将Countor1清0,重新从0开始计数}if(Countor2==8) //若累计满8次,即计时满400ms {D2=~D2; //按位取反操作,将P2、1引脚输出电平取反 Countor 2=0; //将Countor1清0,重新从0开始计数}TH1=(65536-46083)/256; //定时器T1得高8位重新赋初值TL1=(65536—46083)%256; //定时器T1得高8位重新赋初值}*实例48:用计数器T1得中断控制蜂鸣器发出1KHz音频 #inc lude<reg51、h> // 包含51单片机寄存器定义得头文件sbitsound=P3^7; //将sound位定义为P3、7引脚/函数功能:主函数/ void main(void){EA=1; //开总中断ET1=1; //定时器T1中断允许TMOD=0x10; //TMOD=0001 000B,使用定时器T1得模式1TH1=(65536-921)/256; //定时器T1得高8位赋初值TL1=(65536—921)%256; //定时器T1得高8位赋初值TR1=1;//启动定时器T1while(1)//无限循环等待中断;}/ 函数功能:定时器T1得中断服务程序/ voidTime1(void) interrupt 3 using0//“interrupt”声明函数为中断服务函数{sound=~sound;TH1=(65536—921)/256; //定时器T1得高8位重新赋初值TL1=(65536—921)%256;//定时器T1得高8位重新赋初值}。

经典单片机编程100例

经典单片机编程100例

经典单片机编程100例单片机是指具有微处理器内核、存储器和输入输出设备的集成电路芯片。

它广泛应用于各种电子设备中,例如家用电器、汽车电子、工业自动化等领域。

单片机编程是指通过给单片机内部写入特定的指令,使其按照程序逻辑完成特定的功能。

本文将介绍经典的单片机编程实例,帮助读者更好地理解和掌握单片机编程的基本原理和技巧。

1. LED闪烁程序在单片机编程中,最简单的实例之一就是控制LED灯的闪烁。

通过设置相应的IO口为输出模式,并在循环中对该IO口进行高低电平的切换,可以实现LED的闪烁效果。

以下是一个基本的LED闪烁程序示例:```c#include <reg51.h>sbit LED = P1^0;void delay(unsigned int t){while(t--);}void main(){while(1){LED = 0; // 点亮LEDdelay(50000);LED = 1; // 熄灭LEDdelay(50000);}}```上述代码中,通过设置P1口的第0位为1或者0,控制LED的亮灭状态,并在两个状态之间加入适当的延时,从而实现LED的闪烁。

2. 按键控制LED开关在单片机编程中,常常需要通过外部输入设备来控制其他设备的状态。

例如,通过按下按钮来控制LED的开关。

以下是一个简单的按键控制LED开关的程序示例:```c#include <reg51.h>sbit LED = P1^0;sbit Key = P0^0;void delay(unsigned int t){while(t--);}void main(){while(1){if(Key==0) // 如果按键被按下{LED = ~LED; // 取反LED的状态delay(50000); // 延时一段时间,防止按键抖动 while(Key==0); // 等待按键释放}}}```上述代码中,通过检测P0口的第0位,判断是否有按键按下。

51单片机C语言编程100例

51单片机C语言编程100例

目录实例3:用单片机控制第一个灯亮 (5)实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 (6)实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 (7)实例6:使用P3口流水点亮8位LED (8)实例7:通过对P3口地址的操作流水点亮8位LED (10)实例8:用不同数据类型控制灯闪烁时间 (12)实例9:用P0口、P1 口分别显示加法和减法运算结果 (14)实例10:用P0、P1口显示乘法运算结果 (15)实例11:用P1、P0口显示除法运算结果 (16)实例12:用自增运算控制P0口8位LED流水花样 (16)实例13:用P0口显示逻辑"与"运算结果 (18)实例14:用P0口显示条件运算结果 (18)实例15:用P0口显示按位"异或"运算结果 (19)实例16:用P0显示左移运算结果 (19)实例17:"万能逻辑电路"实验 (20)实例18:用右移运算流水点亮P1口8位LED (20)实例19:用if语句控制P0口8位LED的流水方向 (22)实例20:用swtich语句的控制P0口8位LED的点亮状态 (23)实例21:用for语句控制蜂鸣器鸣笛次数 (25)实例22:用while语句控制LED (27)实例23:用do-while语句控制P0口8位LED流水点亮 (29)实例24:用字符型数组控制P0口8位LED流水点亮 (31)实例25:用P0口显示字符串常量 (32)实例26:用P0 口显示指针运算结果 (34)实例27:用指针数组控制P0口8位LED流水点亮 (34)实例28:用数组的指针控制P0 口8 位LED流水点亮 (36)实例29:用P0 、P1口显示整型函数返回值 (38)实例30:用有参函数控制P0口8位LED流水速度 (39)实例31:用数组作函数参数控制流水花样 (41)实例32:用指针作函数参数控制P0口8位LED流水点亮 (42)实例33:用函数型指针控制P1口灯花样 (45)实例34:用指针数组作为函数的参数显示多个字符串 (47)实例35:字符函数ctype.h应用举例 (49)实例36:内部函数intrins.h应用举例 (50)实例37:标准函数stdlib.h应用举例 (51)实例38:字符串函数string.h应用举例 (52)实例39:宏定义应用举例2 (53)实例40:宏定义应用举例2 (54)实例41:宏定义应用举例3 (55)实例42:用定时器T0查询方式P2口8位控制LED闪烁 (56)实例43:用定时器T1查询方式控制单片机发出1KHz音频 (57)实例44:将计数器T0计数的结果送P1口8位LED显示 (58)实例45:用定时器T0的中断控制1位LED闪烁 (60)实例46:用定时器T0的中断实现长时间定时 (61)实例47:用定时器T1中断控制两个LED以不同周期闪烁 (63)实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频 (65)实例49:用定时器T0的中断实现"渴望"主题曲的播放 (66)实例50-1:输出50个矩形脉冲 (72)实例50-2:计数器T0统计外部脉冲数 (73)实例51-2:定时器T0的模式2测量正脉冲宽度 (74)实例52:用定时器T0控制输出高低宽度不同的矩形波 (76)实例53:用外中断0的中断方式进行数据采集 (78)实例54-1:输出负脉宽为200微秒的方波 (79)实例54-2:测量负脉冲宽度 (80)实例55:方式0控制流水灯循环点亮 (82)实例56-1:数据发送程序 (84)实例56-2:数据接收程序 (86)实例57-1:数据发送程序 (88)实例57-2:数据接收程序 (90)实例58:单片机向PC发送数据 (92)实例59:单片机接收PC发出的数据 (94)实例60:用LED数码显示数字5 (96)实例61:用LED数码显示器循环显示数字0~9 (96)实例62:用数码管慢速动态扫描显示数字"1234" (98)实例63:用LED数码显示器伪静态显示数字1234 (99)实例64:用数码管显示动态检测结果 (101)实例65:数码秒表设计 (105)实例66:数码时钟设计 (108)实例67:用LED数码管显示计数器T0的计数值 (115)实例68:静态显示数字“59” (118)实例69:无软件消抖的独立式键盘输入实验 (118)实例70:软件消抖的独立式键盘输入实验 (119)实例71:CPU控制的独立式键盘扫描实验 (121)实例72:定时器中断控制的独立式键盘扫描实验 (127)实例73:独立式键盘控制的4级变速流水灯 (134)实例74:独立式键盘的按键功能扩展:"以一当四" (138)实例75:独立式键盘调时的数码时钟实验 (141)实例76:独立式键盘控制步进电机实验 (149)实例77:矩阵式键盘按键值的数码管显示实验 (154)实例78:矩阵式键盘按键音 (160)实例79:简易电子琴 (163)实例80:矩阵式键盘实现的电子密码锁 (175)实例81:用LCD显示字符'A' (182)实例82:用LCD循环右移显示"Welcome to China" (188)实例83:用LCD显示适时检测结果 (195)实例84:液晶时钟设计 (203)实例85:将数据"0x0f"写入AT24C02再读出送P1口显示 (215)实例86:将按键次数写入AT24C02,再读出并用1602LCD显示 (224)实例87:对I2C总线上挂接多个AT24C02的读写操作 (239)实例88:基于AT24C02的多机通信读取程序 (250)实例88:基于AT24C02的多机通信写入程序 (258)实例90:DS18B20温度检测及其液晶显示 (280)实例91:将数据"0xaa"写入X5045再读出送P1口显示 (298)实例92:将流水灯控制码写入X5045并读出送P1口显示 (305)实例93:对SPI总线上挂接多个X5045的读写操作 (313)实例94:基于ADC0832的数字电压表 (321)实例95:用DAC0832产生锯齿波电压 (333)实例96:用P1口显示红外遥控器的按键值 (334)实例97:用红外遥控器控制继电器 (339)实例98:基于DS1302的日历时钟 (344)实例99:单片机数据发送程序 (362)实例100:电机转速表设计 (365)模拟霍尔脉冲 (375)/*函数的使用和熟悉*///实例3:用单片机控制第一个灯亮#include<reg51.h> //包含51单片机寄存器定义的头文件void main(void){while(1) //无限循环P1=0xfe; //P1=1111 1110B,即P1.0输出低电平}//实例4:用单片机控制一个灯闪烁:认识单片机的工作频率#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/void delay(void) //两个void意思分别为无需返回值,没有参数传递{unsigned int i; //定义无符号整数,最大取值范围65535for(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(); //延时一段时间}}//实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能#include<reg51.h> //包含单片机寄存器的头文件/*******************************************************函数功能:主函数(C语言规定必须有也只能有1个主函数)********************************************************/void main(void){while(1) //无限循环{P1=0xff; // P1=1111 1111, 熄灭LEDP0=P1; // 将 P1口状态送入P0口P2=P1; // 将 P1口状态送入P2口P3=P1; // 将 P1口状态送入P3口}}//实例6:使用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~255for(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=43n=60; //即十进制数3x16+12=60P1=m+n; //P1=103=0110 0111,结果P1.3、P1.4、P1.7 口的灯被点亮 P0=n-m; //P0=17=0001 0001,结果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 1000Bwhile(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.4sbit X=P1^5; //将X位定义为 P1.5sbit Y=P1^6; //将Y位定义为 P1.6sbit Z=P1^7; //将Z位定义为 P1.7void 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.4sbit 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初始化为0while(1){if(S1==0) //如果S1键按下{delay(); //延时一段时间if(S1==0) //如果再次检测到S1键按下i++; //i自增1if(i==9) //如果i=9,重新将其置为1i=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: //缺省值,关闭所有LEDP0=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初始化为0while(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,p2unsigned char i,j; //定义无符号字符型数据i=25; //给i赋初值25j=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; //将数组首地址存入指针pwhile(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 codeTab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码while(1){//快速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(100); //延时约60ms, (3*100*200=60 000μs) }//慢速流水点亮LEDfor(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 codeTab[ ]={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; //将函数的入口地址赋给函数型指针pwhile(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 1110Bwhile(1)。

51单片机C语言编程100例单片机c语言编程

51单片机C语言编程100例单片机c语言编程

51单片机C语言编程100例单片机c语言编程单片机是一种常用于嵌入式系统的微型计算机,可以根据预设的程序来执行指令。

而C语言是一种高级编程语言,具有较强的可读性和可移植性。

在单片机编程中,C语言是常用的编程语言之一。

本文将介绍51单片机C语言编程中的100个实例,帮助读者了解单片机编程的基本概念和技巧。

1. LED灯闪烁这是一个简单的实例,用于让LED灯交替闪烁。

在C语言中,可以使用宏定义和循环语句来实现:```c#include <reg52.h>#define LED P1void delay(unsigned int t) //延时函数{unsigned int i, j;for (i = t; i > 0; i--)for (j = 110; j > 0; j--);}void main(){while (1) //循环执行{LED = 0xFF; //LED灯亮delay(1000); //延时1秒LED = 0x00; //LED灯灭delay(1000); //延时1秒}}```2. 数码管显示这个实例演示了如何使用数码管进行数字显示。

在C语言中,可以通过控制IO口状态来实现:```c#include <reg52.h>#define LED P0unsigned char code digit[] ={ //数码管显示值表0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; void delay(unsigned int t) //延时函数{unsigned int i, j;for (i = t; i > 0; i--)for (j = 110; j > 0; j--);}void main(){unsigned int i;while (1) //循环执行{for(i=0;i<10;i++){LED = digit[i]; //显示数字delay(1000); //延时1秒}}```3. 蜂鸣器发声这个实例展示了如何使用蜂鸣器进行声音发声。

单片机编程100例

单片机编程100例

单片机编程实例100例大全单片机编程实例*实例1:使用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(); //调用延时函数} / /}*实例2:通过对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(); //调用延时函数}}*实例3:用不同数据类型控制灯闪烁时间#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(); //延时一段较长的时间 } } *实例4:用单片机控制第一个灯亮#include<reg51.h> //包含51单片机寄存器定义的头文件void main(void){P1=0xfe; //P1=1111 1110B,即P1.0输出低电平}*实例5:用单片机控制一个灯闪烁:认识单片机的工作频率#include<reg51.h> //包含单片机寄存器的头文件/函数功能:延时一段时间/void delay(void) //两个void意思分别为无需返回值,没有参数传递 {unsigned int i; //定义无符号整数,最大取值范围65535for(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(); //延时一段时间}}*实例6:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能#include<reg51.h> //包含单片机寄存器的头文件/ 函数功能:主函数(C语言规定必须有也只能有1个主函数) / void main(void){while(1) //无限循环{P1=0xff; // P1=1111 1111B,熄灭LEDP0=P1; // 将 P1口状态送入P0口P2=P1; // 将 P1口状态送入P2口P3=P1; // 将 P1口状态送入P3口}}*实例7:用P0口、P1 口分别显示加法和减法运算结果#include<reg51.h>void main(void){unsigned char m,n;m=43; //即十进制数2x16+11=43n=60; //即十进制数3x16+12=60P1=m+n; //P1=103=0110 0111B,结果P1.3、P1.4、P1.7 口的灯被点亮 P0=n-m; //P0=17=0001 0001B,结果P0.0、P0.4的灯被熄灭 } *实例8:用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=11000000B,P3.1,P3.6,P3.7口灭,其余亮}*实例9:用P1、P0口显示除法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P1=36/5; //求整数P0=((36%5) 10)/5; //求小数while(1); //无限循环防止程序“跑飞”}*实例10:用自增运算控制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(); //调用延时函数}}*实例11:用P0口显示逻辑"与"运算结果 #include<reg51.h> //包含单片机寄存器的头文件 void main(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1); //设置无限循环,防止程序“跑飞”}*实例12:用P0口显示条件运算结果#include<reg51.h> //包含单片机寄存器的头文件 voidmain(void){P0=(8>4)?8:4;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}*实例13:用P0口显示按位"异或"运算结果 #include<reg51.h> //包含单片机寄存器的头文件 void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}*实例16:用P0显示左移运算结果#include<reg51.h> //包含单片机寄存器的头文件 voidmain(void){P0=0x3b<<2;//将左移运算结果送P0口,P0=1110 1100B=0xec while(1); //无限循环,防止程序“跑飞”}*实例17:"万能逻辑电路"实验#include<reg51.h> //包含单片机寄存器的头文件sbit F=P1^4; //将F位定义为 P1.4sbit X=P1^5; //将X位定义为 P1.5sbit Y=P1^6; //将Y位定义为 P1.6sbit Z=P1^7; //将Z位定义为 P1.7void 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++)//设置循环次数为8P1=P1>>1; //每次循环P1的各二进位右移1位,高位补0 delay(); //调用延时函数}}}*实例19:用if语句控制P0口8位LED的流水方向#include<reg51.h> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为P1.4sbit 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初始化为0while(1){if(S1==0) //如果S1键按下{delay(); //延时一段时间if(S1==0) //如果再次检测到S1键按下i++; //i自增1if(i==9) //如果i=9,重新将其置为1i=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> //包含单片机寄存器的头文件 sbitsound=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初始化为0while(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 codeTab[ ]={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赋初值25j=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 codeTab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned charp[ ]={&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 charTab[ ]={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; //将数组首地址存入指针pwhile(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 codeTab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水灯控制码while(1){//快速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(100); //延时约60ms, (3 100 200=60 000μs) } //慢速流水点亮LEDfor(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 codeTab[ ]={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 codeTab[ ]={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 codeTab[]={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; //将函数的入口地址赋给函数型指针pwhile(1)( p)(); //通过函数的指针p调用函数led_flow()}*实例34:用指针数组作为函数的参数显示多个字符串#include<reg51.h> //包含51单片机寄存器定义的头文件unsigned char code str1[ ]="Temperature is tested byDS18B20";//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<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 1110Bwhile(1){P3=_crol_(P3,1);// 将P3的二进制位循环左移1位后再赋给P3 delay(); //调用延时函数}}*实例37:标准函数stdlib.h应用举例#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); //比较两个字符串,并将结果存入iif(i==0) //str1=str2P3=0x00;elseif(i<0) //str1<str2P3=0xf0;else //str1>str2P3=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宏定义为字符串100void main(void){#if MAX>80 //如果字符串100大于80P3=0xf0; //P3口低四位LED点亮#elseP3=0x0f; //否则,P3口高四位LED点亮#endif //结束本次编译}/ 中断、定时器中断、定时器中断、定时器中断、定时器 /*实例42:用定时器T0查询方式P2口8位控制LED闪烁#include<reg51.h> // 包含51单片机寄存器定义的头文件/函数功能:主函数/ void main(void)// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0TF0=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引脚/ 函数功能:主函数{// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1TF1=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引脚/ 函数功能:主函数{// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x02; //使用定时器T0的模式2TH0=256-156; //定时器T0的高8位赋初值TL0=256-156; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待查询{while(TF0==0) //如果未计满就等待{if(S==0) //按键S按下接地,电平为0P1=TL0; //计数器TL0加1后送P1口显示}TF0=0; //计数器溢出后,将TF0清0}}*实例45:用定时器T0的中断控制1位LED闪烁 #include<reg51.h> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为P2.0引脚/ 函数功能:主函数{EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(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的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0Countor=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/ 函数功能:定时器T0的中断服务程序/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{Countor++; //中断次数自加1if(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的模式1TH1=(65536-46083)/256; //定时器T1的高8位赋初值TL1=(65536-46083)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1Countor1=0; //从0开始累计中断次数Countor2=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/ 函数功能:定时器T1的中断服务程序/ void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数 //其后的3为定时器T1的中断编号;0表示使用第0组工作寄存器{Countor1++; //Countor1自加1Countor2++; //Countor2自加1if(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的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1while(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.7unsigned 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。

(完整word版)51单片机C语言编程100例

(完整word版)51单片机C语言编程100例

目录实例3:用单片机控制第一个灯亮 (5)实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 (6)实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 (7)实例6:使用P3口流水点亮8位LED (8)实例7:通过对P3口地址的操作流水点亮8位LED (10)实例8:用不同数据类型控制灯闪烁时间 (12)实例9:用P0口、P1 口分别显示加法和减法运算结果 (14)实例10:用P0、P1口显示乘法运算结果 (15)实例11:用P1、P0口显示除法运算结果 (16)实例12:用自增运算控制P0口8位LED流水花样 (16)实例13:用P0口显示逻辑"与"运算结果 (18)实例14:用P0口显示条件运算结果 (18)实例15:用P0口显示按位"异或"运算结果 (19)实例16:用P0显示左移运算结果 (19)实例17:"万能逻辑电路"实验 (20)实例18:用右移运算流水点亮P1口8位LED (20)实例19:用if语句控制P0口8位LED的流水方向 (22)实例20:用swtich语句的控制P0口8位LED的点亮状态 (23)实例21:用for语句控制蜂鸣器鸣笛次数 (25)实例22:用while语句控制LED (27)实例23:用do-while语句控制P0口8位LED流水点亮 (29)实例24:用字符型数组控制P0口8位LED流水点亮 (31)实例25:用P0口显示字符串常量 (32)实例26:用P0 口显示指针运算结果 (34)实例27:用指针数组控制P0口8位LED流水点亮 (34)实例28:用数组的指针控制P0 口8 位LED流水点亮 (36)实例29:用P0 、P1口显示整型函数返回值 (38)实例30:用有参函数控制P0口8位LED流水速度 (39)实例31:用数组作函数参数控制流水花样 (41)实例32:用指针作函数参数控制P0口8位LED流水点亮 (42)实例33:用函数型指针控制P1口灯花样 (45)实例34:用指针数组作为函数的参数显示多个字符串 (47)实例35:字符函数ctype.h应用举例 (49)实例36:内部函数intrins.h应用举例 (50)实例37:标准函数stdlib.h应用举例 (51)实例38:字符串函数string.h应用举例 (52)实例39:宏定义应用举例2 (53)实例40:宏定义应用举例2 (54)实例41:宏定义应用举例3 (55)实例42:用定时器T0查询方式P2口8位控制LED闪烁 (56)实例43:用定时器T1查询方式控制单片机发出1KHz音频 (57)实例44:将计数器T0计数的结果送P1口8位LED显示 (58)实例45:用定时器T0的中断控制1位LED闪烁 (60)实例46:用定时器T0的中断实现长时间定时 (61)实例47:用定时器T1中断控制两个LED以不同周期闪烁 (63)实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频 (65)实例49:用定时器T0的中断实现"渴望"主题曲的播放 (66)实例50-1:输出50个矩形脉冲 (72)实例50-2:计数器T0统计外部脉冲数 (73)实例51-2:定时器T0的模式2测量正脉冲宽度 (74)实例52:用定时器T0控制输出高低宽度不同的矩形波 (76)实例53:用外中断0的中断方式进行数据采集 (78)实例54-1:输出负脉宽为200微秒的方波 (79)实例54-2:测量负脉冲宽度 (80)实例55:方式0控制流水灯循环点亮 (82)实例56-1:数据发送程序 (84)实例56-2:数据接收程序 (86)实例57-1:数据发送程序 (88)实例57-2:数据接收程序 (90)实例58:单片机向PC发送数据 (92)实例59:单片机接收PC发出的数据 (94)实例60:用LED数码显示数字5 (96)实例61:用LED数码显示器循环显示数字0~9 (96)实例62:用数码管慢速动态扫描显示数字"1234" (98)实例63:用LED数码显示器伪静态显示数字1234 (99)实例64:用数码管显示动态检测结果 (101)实例65:数码秒表设计 (105)实例66:数码时钟设计 (108)实例67:用LED数码管显示计数器T0的计数值 (115)实例68:静态显示数字“59” (118)实例69:无软件消抖的独立式键盘输入实验 (118)实例70:软件消抖的独立式键盘输入实验 (119)实例71:CPU控制的独立式键盘扫描实验 (121)实例72:定时器中断控制的独立式键盘扫描实验 (127)实例73:独立式键盘控制的4级变速流水灯 (134)实例74:独立式键盘的按键功能扩展:"以一当四" (138)实例75:独立式键盘调时的数码时钟实验 (141)实例76:独立式键盘控制步进电机实验 (149)实例77:矩阵式键盘按键值的数码管显示实验 (154)实例78:矩阵式键盘按键音 (160)实例79:简易电子琴 (163)实例80:矩阵式键盘实现的电子密码锁 (175)实例81:用LCD显示字符'A' (182)实例82:用LCD循环右移显示"Welcome to China" (188)实例83:用LCD显示适时检测结果 (195)实例84:液晶时钟设计 (203)实例85:将数据"0x0f"写入AT24C02再读出送P1口显示 (215)实例86:将按键次数写入AT24C02,再读出并用1602LCD显示 (224)实例87:对I2C总线上挂接多个AT24C02的读写操作 (239)实例88:基于AT24C02的多机通信读取程序 (250)实例88:基于AT24C02的多机通信写入程序 (258)实例90:DS18B20温度检测及其液晶显示 (280)实例91:将数据"0xaa"写入X5045再读出送P1口显示 (298)实例92:将流水灯控制码写入X5045并读出送P1口显示 (305)实例93:对SPI总线上挂接多个X5045的读写操作 (313)实例94:基于ADC0832的数字电压表 (321)实例95:用DAC0832产生锯齿波电压 (333)实例96:用P1口显示红外遥控器的按键值 (334)实例97:用红外遥控器控制继电器 (339)实例98:基于DS1302的日历时钟 (344)实例99:单片机数据发送程序 (362)实例100:电机转速表设计 (365)模拟霍尔脉冲 (375)/*函数的使用和熟悉*///实例3:用单片机控制第一个灯亮#include<reg51.h> //包含51单片机寄存器定义的头文件void main(void){while(1) //无限循环P1=0xfe; //P1=1111 1110B,即P1.0输出低电平}//实例4:用单片机控制一个灯闪烁:认识单片机的工作频率#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/void delay(void) //两个void意思分别为无需返回值,没有参数传递{unsigned int i; //定义无符号整数,最大取值范围65535for(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(); //延时一段时间}}//实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能#include<reg51.h> //包含单片机寄存器的头文件/*******************************************************函数功能:主函数(C语言规定必须有也只能有1个主函数)********************************************************/void main(void){while(1) //无限循环{P1=0xff; // P1=1111 1111, 熄灭LEDP0=P1; // 将 P1口状态送入P0口P2=P1; // 将 P1口状态送入P2口P3=P1; // 将 P1口状态送入P3口}}//实例6:使用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~255for(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=43n=60; //即十进制数3x16+12=60P1=m+n; //P1=103=0110 0111,结果P1.3、P1.4、P1.7 口的灯被点亮 P0=n-m; //P0=17=0001 0001,结果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 1000Bwhile(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.4sbit X=P1^5; //将X位定义为 P1.5sbit Y=P1^6; //将Y位定义为 P1.6sbit Z=P1^7; //将Z位定义为 P1.7void 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.4sbit 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初始化为0while(1){if(S1==0) //如果S1键按下{delay(); //延时一段时间if(S1==0) //如果再次检测到S1键按下i++; //i自增1if(i==9) //如果i=9,重新将其置为1i=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: //缺省值,关闭所有LEDP0=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初始化为0while(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,p2unsigned char i,j; //定义无符号字符型数据i=25; //给i赋初值25j=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; //将数组首地址存入指针pwhile(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 codeTab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码while(1){//快速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(100); //延时约60ms, (3*100*200=60 000μs) }//慢速流水点亮LEDfor(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 codeTab[ ]={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; //将函数的入口地址赋给函数型指针pwhile(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 1110Bwhile(1)。

单片机编程100例.doc

单片机编程100例.doc

单片机编程实例100例大全单片机编程实例*实例1:使用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(); //调用延时函数} / /}*实例2:通过对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(); //调用延时函数}}*实例3:用不同数据类型控制灯闪烁时间#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(); //延时一段较长的时间 } } *实例4:用单片机控制第一个灯亮#include<reg51.h> //包含51单片机寄存器定义的头文件void main(void){P1=0xfe; //P1=1111 1110B,即P1.0输出低电平}*实例5:用单片机控制一个灯闪烁:认识单片机的工作频率#include<reg51.h> //包含单片机寄存器的头文件/函数功能:延时一段时间/void delay(void) //两个void意思分别为无需返回值,没有参数传递 {unsigned int i; //定义无符号整数,最大取值范围65535for(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(); //延时一段时间}}*实例6:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能#include<reg51.h> //包含单片机寄存器的头文件/ 函数功能:主函数(C语言规定必须有也只能有1个主函数) / void main(void){while(1) //无限循环{P1=0xff; // P1=1111 1111B,熄灭LEDP0=P1; // 将 P1口状态送入P0口P2=P1; // 将 P1口状态送入P2口P3=P1; // 将 P1口状态送入P3口}}*实例7:用P0口、P1 口分别显示加法和减法运算结果#include<reg51.h>void main(void){unsigned char m,n;m=43; //即十进制数2x16+11=43n=60; //即十进制数3x16+12=60P1=m+n; //P1=103=0110 0111B,结果P1.3、P1.4、P1.7 口的灯被点亮 P0=n-m; //P0=17=0001 0001B,结果P0.0、P0.4的灯被熄灭 } *实例8:用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=11000000B,P3.1,P3.6,P3.7口灭,其余亮}*实例9:用P1、P0口显示除法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P1=36/5; //求整数P0=((36%5) 10)/5; //求小数while(1); //无限循环防止程序“跑飞”}*实例10:用自增运算控制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(); //调用延时函数}}*实例11:用P0口显示逻辑"与"运算结果 #include<reg51.h> //包含单片机寄存器的头文件 void main(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1); //设置无限循环,防止程序“跑飞”}*实例12:用P0口显示条件运算结果#include<reg51.h> //包含单片机寄存器的头文件 voidmain(void){P0=(8>4)?8:4;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}*实例13:用P0口显示按位"异或"运算结果 #include<reg51.h> //包含单片机寄存器的头文件 void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}*实例16:用P0显示左移运算结果#include<reg51.h> //包含单片机寄存器的头文件 voidmain(void){P0=0x3b<<2;//将左移运算结果送P0口,P0=1110 1100B=0xec while(1); //无限循环,防止程序“跑飞”}*实例17:"万能逻辑电路"实验#include<reg51.h> //包含单片机寄存器的头文件sbit F=P1^4; //将F位定义为 P1.4sbit X=P1^5; //将X位定义为 P1.5sbit Y=P1^6; //将Y位定义为 P1.6sbit Z=P1^7; //将Z位定义为 P1.7void 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++)//设置循环次数为8P1=P1>>1; //每次循环P1的各二进位右移1位,高位补0 delay(); //调用延时函数}}}*实例19:用if语句控制P0口8位LED的流水方向#include<reg51.h> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为P1.4sbit 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初始化为0while(1){if(S1==0) //如果S1键按下{delay(); //延时一段时间if(S1==0) //如果再次检测到S1键按下i++; //i自增1if(i==9) //如果i=9,重新将其置为1i=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> //包含单片机寄存器的头文件 sbitsound=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初始化为0while(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 codeTab[ ]={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赋初值25j=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 codeTab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned charp[ ]={&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 charTab[ ]={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; //将数组首地址存入指针pwhile(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 codeTab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水灯控制码while(1){//快速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(100); //延时约60ms, (3 100 200=60 000μs) } //慢速流水点亮LEDfor(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 codeTab[ ]={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 codeTab[ ]={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 codeTab[]={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; //将函数的入口地址赋给函数型指针pwhile(1)( p)(); //通过函数的指针p调用函数led_flow()}*实例34:用指针数组作为函数的参数显示多个字符串#include<reg51.h> //包含51单片机寄存器定义的头文件unsigned char code str1[ ]="Temperature is tested byDS18B20";//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<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 1110Bwhile(1){P3=_crol_(P3,1);// 将P3的二进制位循环左移1位后再赋给P3 delay(); //调用延时函数}}*实例37:标准函数stdlib.h应用举例#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); //比较两个字符串,并将结果存入iif(i==0) //str1=str2P3=0x00;elseif(i<0) //str1<str2P3=0xf0;else //str1>str2P3=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宏定义为字符串100void main(void){#if MAX>80 //如果字符串100大于80P3=0xf0; //P3口低四位LED点亮#elseP3=0x0f; //否则,P3口高四位LED点亮#endif //结束本次编译}/ 中断、定时器中断、定时器中断、定时器中断、定时器 /*实例42:用定时器T0查询方式P2口8位控制LED闪烁#include<reg51.h> // 包含51单片机寄存器定义的头文件/函数功能:主函数/ void main(void)// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0TF0=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引脚/ 函数功能:主函数{// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1TF1=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引脚/ 函数功能:主函数{// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x02; //使用定时器T0的模式2TH0=256-156; //定时器T0的高8位赋初值TL0=256-156; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待查询{while(TF0==0) //如果未计满就等待{if(S==0) //按键S按下接地,电平为0P1=TL0; //计数器TL0加1后送P1口显示}TF0=0; //计数器溢出后,将TF0清0}}*实例45:用定时器T0的中断控制1位LED闪烁 #include<reg51.h> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为P2.0引脚/ 函数功能:主函数{EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(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的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0Countor=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/ 函数功能:定时器T0的中断服务程序/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{Countor++; //中断次数自加1if(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的模式1TH1=(65536-46083)/256; //定时器T1的高8位赋初值TL1=(65536-46083)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1Countor1=0; //从0开始累计中断次数Countor2=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/ 函数功能:定时器T1的中断服务程序/ void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数 //其后的3为定时器T1的中断编号;0表示使用第0组工作寄存器{Countor1++; //Countor1自加1Countor2++; //Countor2自加1if(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的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1while(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.7unsigned 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。

单片机编程100例

单片机编程100例

单片机编程实例100例大全单片机编程实例*实例1:使用P3口流水点亮8位LED#include<> //包含单片机寄存器的头文件 / 函数功能:延时一段时间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(); //调用延时函数} / /}*实例2:通过对P3口地址的操作流水点亮8位LED#include<> //包含单片机寄存器的头文件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(); //调用延时函数}}*实例3:用不同数据类型控制灯闪烁时间#include<> //包含单片机寄存器的头文件/函数功能:用整形数据延时一段时间/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; //口的灯点亮int_delay(); //延时一段较长的时间P1=0xff; //熄灭int_delay(); //延时一段较长的时间}for(i=0;i<3;i++){P1=0xef; //口的灯点亮char_delay(); //延时一段较长的时间} P1=0xff; //熄灭 char_delay(); //延时一段较长的时间 } } *实例4:用单片机控制第一个灯亮#include<> //包含51单片机寄存器定义的头文件void main(void){P1=0xfe; //P1=1111 1110B,即输出低电平}*实例5:用单片机控制一个灯闪烁:认识单片机的工作频率#include<> //包含单片机寄存器的头文件/函数功能:延时一段时间/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,输出低电平delay(); //延时一段时间P1=0xff; //P1=1111 1111B,输出高电平delay(); //延时一段时间}}*实例6:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能#include<> //包含单片机寄存器的头文件/ 函数功能:主函数(C语言规定必须有也只能有1个主函数) / void main(void){while(1) //无限循环{P1=0xff; // P1=1111 1111B,熄灭LEDP0=P1; // 将 P1口状态送入P0口P2=P1; // 将 P1口状态送入P2口P3=P1; // 将 P1口状态送入P3口}}*实例7:用P0口、P1 口分别显示加法和减法运算结果 #include<> void main(void){unsigned char m,n;m=43; //即十进制数2x16+11=43n=60; //即十进制数3x16+12=60P1=m+n; //P1=103=0110 0111B,结果、、口的灯被点亮 P0=n-m; //P0=17=0001 0001B,结果、的灯被熄灭 }*实例8:用P0、P1口显示乘法运算结果#include<> //包含单片机寄存器的头文件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, 和口灭,其余亮P0=s%256; //低8位送P0口 , P3=192=c0H=1100 0000B,,,口灭,其余亮}*实例9:用P1、P0口显示除法运算结果#include<> //包含单片机寄存器的头文件void main(void){P1=36/5; //求整数P0=((36%5) 10)/5; //求小数while(1); //无限循环防止程序“跑飞”}*实例10:用自增运算控制P0口8位LED流水花样#include<> //包含单片机寄存器的头文件/函数功能:延时一段时间/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(); //调用延时函数}}*实例11:用P0口显示逻辑"与"运算结果 #include<> //包含单片机寄存器的头文件 void main(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1); //设置无限循环,防止程序“跑飞”}*实例12:用P0口显示条件运算结果#include<> //包含单片机寄存器的头文件 void main(void){P0=(8>4)8:4;//将条件运算结果送P0口,P0=8=0000 1000B while(1) ; //设置无限循环,防止程序“跑飞”}*实例13:用P0口显示按位"异或"运算结果 #include<> //包含单片机寄存器的头文件 void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}*实例16:用P0显示左移运算结果#include<> //包含单片机寄存器的头文件 void main(void){P0=0x3b<<2;//将左移运算结果送P0口,P0=1110 1100B=0xec while(1); //无限循环,防止程序“跑飞”}*实例17:"万能逻辑电路"实验#include<> //包含单片机寄存器的头文件sbit F=P1^4; //将F位定义为sbit X=P1^5; //将X位定义为sbit Y=P1^6; //将Y位定义为sbit Z=P1^7; //将Z位定义为void main(void){while(1){F=((~X)&Y)|Z; //将逻辑运算结果赋给F;}}*实例18:用右移运算流水点亮P1口8位LED #include<> //包含单片机寄存器的头文件/函数功能:延时一段时间/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++)//设置循环次数为8P1=P1>>1; //每次循环P1的各二进位右移1位,高位补0 delay(); //调用延时函数}}}*实例19:用if语句控制P0口8位LED的流水方向 #include<> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为sbit S2=P1^5; //将S2位定义为/函数功能:主函数/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<> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为/函数功能:延时一段时间/void delay(void){unsigned int n;for(n=0;n<10000;n++);}/函数功能:主函数/void main(void){unsigned char i;i=0; //将i初始化为0while(1){if(S1==0) //如果S1键按下{delay(); //延时一段时间if(S1==0) //如果再次检测到S1键按下i++; //i自增1if(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<> //包含单片机寄存器的头文件 sbit sound=P3^7; //将sound位定义为 / 函数功能:延时形成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; //输出低电平 delay1600();sound=1; //输出高电平 delay1600();}for(i=0;i<200;i++){sound=0; //输出低电平 delay800();sound=1; //输出高电平 delay800();}}}*实例22:用while语句控制LED#include<> //包含单片机寄存器的头文件 / 函数功能:延时约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初始化为0while(i<0xff) //当i小于0xff(255)时执行循环体 {P0=i; //将i送P0口显示delay60ms(); //延时i++; //i自增1}}}*实例23:用do-while语句控制P0口8位LED流水点亮 #include<> //包含单片机寄存器的头文件/函数功能:延时约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<> //包含单片机寄存器的头文件/函数功能:延时约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<> //包含单片机寄存器的头文件/函数功能:延时约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<>void main(void){unsigned char p1, p2; //定义无符号字符型指针变量p1,p2 unsigned char i,j; //定义无符号字符型数据i=25; //给i赋初值25j=15;p1=&i; //使指针变量指向i ,对指针初始化p2=&j; //使指针变量指向j ,对指针初始化P0= p1+ p2; // p1+ p2相当于i+j,所以P0=25+15=40=0x28//则P0=0010 1000B,结果、引脚LED熄灭,其余点亮 while(1); //无限循环,防止程序“跑飞”}*实例27:用指针数组控制P0口8位LED流水点亮 #include<>/函数功能:延时约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<> /函数功能:延时约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; //将数组首地址存入指针pwhile(1){for(i=0;i<32;i++) //共32个流水灯控制码{P0= (p+i); // (p+i)的值等于a[i]}delay150ms(); //调用150ms延时函数 } }*实例29:用P0 、P1口显示整型函数返回值 #include<>/ 函数功能:计算两个无符号整数的和/ 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<> / 函数功能:延时一段时间/ 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){//快速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(100); //延时约60ms, (3 100 200=60 000μs) }//慢速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(250); //延时约150ms, (3 250 200=150 000μs) }}}*实例31:用数组作函数参数控制流水花样#include<>/函数功能:延时约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<> /函数功能:延时约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<> //包含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; //将函数的入口地址赋给函数型指针pwhile(1)( p)(); //通过函数的指针p调用函数led_flow()}*实例34:用指针数组作为函数的参数显示多个字符串 #include<> //包含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:字符函数应用举例#include<> //包含51单片机寄存器定义的头文件 #include<> void main(void)while(1){P3=isalpha('_')0xf0:0x0f;//条件运算,若'_'是英文字母,P3=0xf0 }}*实例36:内部函数应用举例#include<> //包含51单片机寄存器定义的头文件 #include<> //包含函数isalpha()声明的头文件 / 函数功能:延时约150ms/ void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}。

单片机C语言代码手册 含100多个经典C程序

单片机C语言代码手册 含100多个经典C程序

单片机C语言代码手册1.LED灯点亮一个LED#include<reg51.h>void main(){while(1){P0=0x01;P2=0x7d;}}流水灯闪烁#include<reg52.h>sbit LED=P0^0;void delay(unsigned int i){unsigned int j;for(i;i>0;i--)for(j=110;j>0;j--);}void main(){LED=0;delay(60);LED=1;delay(10);}流水灯_左移#include<reg52.h>#include<intrins.h>unsigned char aa;void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){aa=0xfe;while(1){P0=aa;delay(1000);aa=_crol_(aa,1);}}跑马灯#include<reg51.h>#include <intrins.h>void delayms(unsigned char ms){unsigned char i;while(ms--){for(i = 0; i < 120; i++);}}void main(){unsigned char LED;LED = 0xfe; //11111110P2 = LED;while(1){delayms(250);LED = _crol_(LED,1); //循环右移1位,点亮下一个LED P2 = LED;}}用循环移位指令实现LED流水灯效果#include <reg51.h>#include <intrins.h>void delayms(unsigned char i) //延时子程序{unsigned char j;while(i--){for(j=0;j<120;j++);}}void main(){unsigned char LED;LED = 0xfe; //0xfe = 1111 1110while(1){P2 = LED;delayms(250);LED = LED << 1; / /循环右移1位,点亮下一个LED "<<"为左移位if(LED == 0x00 ){LED = 0xfe; // 0xfe = 1111 1110}}}左右跑马灯#include <reg52.h>void delay(unsigned int i){unsigned char j;for(i; i > 0; i--)for(j = 255; j > 0; j--);}char LED;void main(){unsigned char i;while (1){LED = 0xfe;for (i = 0 ;i < 8 ; i++){P2 = LED;delay(500);LED = LED << 1; //左移LED = LED | 0x01; //移位后,后面的位为高电平if(LED == 0x7f)break; //提前退出FOR 循环}for (i = 0 ;i < 8 ; i++){P2 = LED;delay(500);LED = LED >> 1; // 右移LED = LED | 0x80; // 移位后,后面的位为高电平}}}LED作二进制加法#include <reg52.h>void delay(unsigned int i){unsigned char j;for(i; i > 0; i--)for(j = 255; j > 0; j--);}void main(){unsigned char Num = 0xff;while (1){P2 = Num;delay(1000);Num--;}}LED闪烁-定时器#include<reg52.h>#include<intrins.h>unsigned char num,aa=0xfe;void main(){TMOD=0x01;TH0=(65536-45872)/256;TL0=(65536-45872)%256;EA=1;ET0=1;TR0=1;while(1){if(num==1){num=0;P2=aa;aa=_crol_(aa,1);}}}void T0_time()interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;num++;}2.数码管0-9显示#include<reg51.h>void delay2ms(unsigned int delaytime){unsigned int cnt;for(cnt=0;cnt<delaytime*50;cnt++);}unsigned char num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void main(){int cnt=0;while(1){P0=0x02;P2=num[cnt];if(++cnt>9)cnt=0;delay2ms(2500);}}95显示#include<reg51.h>void delay2ms(unsigned int delaytime){unsigned int cnt;for(cnt=0;cnt<delaytime*50;cnt++);}unsigned char s[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};main(){unsigned char num=95;unsigned char cnt=0;while(1){switch(++cnt%2){case 0:P0=0x02;P2=s[num%10];break;case 1:P0=0x04;P2=s[num/10];break;}delay2ms(1);}}138片选实现动态显示#include <reg51.h>#include <intrins.h>sbit LS138A = P2^2; //定义LS138译码器的输入A脚由P2.2控制sbit LS138B = P2^3; //定义LS138译码器的输入B脚由P2.3控制sbit LS138C = P2^4; //定义LS138译码器的输入C脚由P2.4控制void delay(unsigned int i); //函数声名char cnt;unsigned char code Disp_Tab[] = //共阴数码管0-9{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};void main(){unsigned int i,j=1 ;unsigned int led[10];cnt=0;while(1) //进入循环状态{if(++cnt>=50){cnt=0; //延时计数每扫描一次加一次++j; //每隔50个扫描周期加一次}led[0]=Disp_Tab[j%10000/1000]|0x80;led[1]=Disp_Tab[j%1000/100]|0x80;led[2]=Disp_Tab[j%100/10]|0x80;led[3]=Disp_Tab[j%10]|0x80;led[4]=Disp_Tab[j%10000/1000]; //千位led[5]=Disp_Tab[j%1000/100]; //百位带小数点led[6]=Disp_Tab[j%100/10]; //十位led[7]=Disp_Tab[j%10]; //个位for( i=0; i<9; i++) //实现8位动态扫描循环{P0 = led[i]; //将字模送到P0口显示switch(i) //使用switch 语句控制位选{case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}单片机直接片选实现动态显示#include <reg51.h>#include <intrins.h>void delay(unsigned int i); //函数声名char DelayCNT; //定义变量unsigned char code Disp_Tab[] = //共阴数码管0-9{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40 };//段码控制unsigned char code dispbit[8]= //共阴数码管1-8个{0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制查表法void main(){unsigned int i,LedNumV al=1 ; //变量定义unsigned int LedOut[10]; //变量定义DelayCNT=0;while(1){if(++DelayCNT>=20) //控制数字变化速度{DelayCNT=0; //20个扫描周期清零一次++LedNumV al; //每隔20个扫描周期加一次}LedOut[0]=Disp_Tab[LedNumV al%10000/1000];LedOut[1]=Disp_Tab[LedNumV al%1000/100]|0x80;LedOut[2]=Disp_Tab[LedNumV al%100/10];LedOut[3]=Disp_Tab[LedNumV al%10];LedOut[4]=Disp_Tab[LedNumV al%10000/1000]; //千位LedOut[5]=Disp_Tab[LedNumV al%1000/100]|0x80; //百位小数LedOut[6]=Disp_Tab[LedNumV al%100/10]; //十位LedOut[7]=Disp_Tab[LedNumV al%10]; //个位for( i=0; i<9; i++){P0 = LedOut[i];P1 = dispbit[i]; //使用查表法进行位选switch(i) //使用switch 语句控制位选{case 0:P1 = 0x7F; break;case 1:P1 = 0xbF; break;case 2:P1 = 0xdF; break;case 3:P1 = 0xeF; break;case 4:P1 = 0xf7; break;case 5:P1 = 0xfb; break;case 6:P1 = 0xfd; break;case 7:P1 = 0xfe; break;}delay(150); //扫描间隔时太长会数码管会有闪烁感}}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}动态-静态LED#include <reg51.h>#include <intrins.h>sbit LED8_1=P1^1; //J14接在P1.1上void delay(unsigned int i); //函数声名char DelayCNT;char LED;void main(){LED = 0x01;DelayCNT=0;while(1){if(++DelayCNT>=10) //点亮动静LED灯速度控制{DelayCNT=0;LED = LED << 1; //左移if(LED==0) LED = 1; //移位后,后面的位为高电平}P0 =LED;LED8_1=0;delay(1000); //调用延时程序}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}数码管_138动态显示#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;uchar code led[8];void delay(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}uchar code table[]={0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void main(){while(1) //进入循环状态{uint cnt,j;LS138A=1;LS138B=1;LS138C=1;if(++cnt>=50){cnt=0; //延时计数每扫描一次加一次++j; //每隔50个扫描周期加一次}led[0]=table[j%10000/1000];led[1]=table[j%1000/100];led[2]=table[j%100/10];led[3]=table[j%10];led[4]=table[j%10000/1000]; //千位led[5]=table[j%1000/100]; //百位带小数点led[6]=table[j%100/10]; //十位led[7]=table[j%10]; //个位}}数码管_依次显示0-F#include<reg52.h>unsigned char code table[]= //共阳数码管{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F, ~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71}; void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){unsigned char cnt;while(1)for(cnt=0;cnt<16;cnt++){P0= table[cnt];delay(100);}}数码管_直选动态显示#include<reg52.h>unsigned char code dispiaybit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code table[]={0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){unsigned char m;while(1){for(m=0;m<8;m++){P0=table[m];P1=dispiaybit[m];delay(1);}}}数码管秒表#include<reg52.h>void delay(int xms){unsigned int cnt;for(cnt=0;cnt<xms*50;cnt++);}unsigned char s[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void main(){unsigned char num=0;unsigned char cnt=0;unsigned char hour=0;while(1){switch(++cnt%2){case 0:P0=0x02;P2=s[num%10];break;case 1:P0=0x04;P2=s[num/10];break;}delay(4);if(cnt>=250){num++;cnt=0;}}}一位静态显示#include <reg51.h>#include <intrins.h>#define NOP() _nop_() //定义空指令void delay(unsigned int i); //函数声名unsigned char code LED7Code[] = //共阳极{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F, ~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};void main(){unsigned int LedNumV al=1 ,C ; //定义变量while(1){if (++C>= 300){LedNumV al++ ; //每隔300个扫描周期加一次C =0; //每隔300个扫描清零} //将字模送到P0口显示P0 = LED7Code[LedNumV al%10]&0x7f;//LED7 0x7f为小数点共阴和共阳此处不一样;delay(150); //调用延时程序}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}3.蜂鸣器嘀嘀#include <reg52.h>sbit buzz = P3^4;main(){TMOD = 0x01;TH0 = -(1000/256);TL0 =- (1000%256);EA = 1;ET0 = 1;TR0 = 1;for(;;){} }void T0_irq(void) interrupt 1 using 1{TH0 = -(300/256);TL0 =- (300%256);buzz = ~buzz;}PZ_蜂鸣器#include<reg52.h>sbit beep=P1^5;void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){beep=1;delay(1);beep=0;delay(1);}八月桂花本例采用89C52, 晶振为11.0592MHZ关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍; #include <REG52.H>#include <INTRINS.H>sbit Beep = P1^5 ;unsigned char n=0; //n为节拍常数变量unsigned char code music_tab[] = //格式为: 频率常数, 节拍常数,频率常数, 节拍常数, {0x18, 0x30, 0x1C , 0x10,0x20, 0x40, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x10,0x1C, 0x10, 0x18 , 0x40,0x1C, 0x20, 0x20 , 0x20,0x1C, 0x20, 0x18 , 0x20,0x20, 0x80, 0xFF , 0x20,0x30, 0x1C, 0x10 , 0x18,0x20, 0x15, 0x20 , 0x1C,0x20, 0x20, 0x20 , 0x26,0x40, 0x20, 0x20 , 0x2B,0x20, 0x26, 0x20 , 0x20,0x20, 0x30, 0x80 , 0xFF,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x80,0x20, 0x30, 0x1C , 0x10,0x20, 0x10, 0x1C , 0x10,0x20, 0x20, 0x26 , 0x20,0x2B, 0x20, 0x30 , 0x20,0x2B, 0x40, 0x20 , 0x15,0x1F, 0x05, 0x20 , 0x10,0x1C, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x30,0x20, 0x30, 0x1C , 0x10,0x18, 0x40, 0x1C , 0x20,0x20, 0x20, 0x26 , 0x40,0x13, 0x60, 0x18 , 0x20,0x15, 0x40, 0x13 , 0x40,0x18, 0x80, 0x00};void int0() interrupt 1 //采用中断0 控制节拍{ TH0=0xd8;TL0=0xef;n--;}void delay (unsigned char m) //控制频率延时{unsigned i=3*m;while(--i);}void delayms(unsigned char a) //豪秒延时子程序{while(--a); //采用while(--a) 不要采用while(a--);各位可编译一下看看汇编结果就知道了!}void main(){ unsigned char p,m; //m为频率常数变量unsigned char i=0;TMOD&=0x0f;TMOD|=0x01;TH0=0xd8;TL0=0xef;IE=0x82;play:while(1){a: p=music_tab[i];if(p==0x00){ i=0, delayms(1000); goto play;} //如果碰到结束符,延时1秒,回到开始再来一遍else if(p==0xff){ i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延时100ms,继续取下一音符else{m=music_tab[i++], n=music_tab[i++];} //取频率常数和节拍常数TR0=1; //开定时器1while(n!=0)Beep=~Beep,delay(m); //等待节拍完成,通过P1口输出音频(可多声道哦!)TR0=0; //关定时器1}}5.继电器按键控制继电器#include <reg51.h>sbit RELAY = P1^4; //定义继电器对应单片机管脚sbit K1 = P2^7; //定义按钮对应单片机管脚void main(){if (!K1)RELAY = 0; //按钮按下开启继电器else RELAY = 1; //按钮松开关闭继电器}4.按键模拟开关#include <reg52.H>sbit K1=P3^0;sbit L1=P2^0;void delay(unsigned int i){unsigned int j;for(i;i>0;i--)for(j=110;j>0;j--);}void main(){while(1){if(K1==0){delay(100);if(K1==0){L1=~L1;while(!K1);}}}}按键键状态显示#include <reg51.h>#include <intrins.h>sbit BEEP = P1^5;sbit RELAY= P1^4;sbit K1 = P0^0;sbit K2 = P0^1;sbit K3 = P0^2;sbit K4 = P0^3;sbit K5 = P0^4;sbit K6 = P0^5;void beep();main(){while(1){P2 = 0xff;if(K1==0)P2 = 0xfe;if(K2 == 0)P2 = 0xfd;if(!K3)P2 = 0xfb;if(!K4)P2 = 0xf7;if(!K5 )beep(); //喇叭发声RELAY = 1;if (!K6 )RELAY = 0; //通过了反相器}}void beep(){unsigned char i , j;for (i=0;i<100;i++){BEEP=!BEEP; //BEEP取反for (j = 0 ; j<250 ; j++) //需要产生方波_nop_();}BEEP=1; //关闭蜂鸣器}按键移位#include <reg51.h>#include <intrins.h>void delayms(unsigned char ms);void proc_key(unsigned char key_v);void delayms(unsigned char ms){unsigned char i;while(ms--){for(i = 0; i < 120; i++);}}sbit K1 = P0^0; //对应按钮K1sbit K2 = P0^1; //对应按钮K2void main(){unsigned char key_s,key_v;key_v = 0x03;P2 = 0xfe;while(1){key_s = scan_key();if(key_s != key_v){delayms(10);key_s = scan_key();if(key_s != key_v){key_v = key_s;proc_key(key_v);}}}}unsigned char scan_key(){unsigned char key_s;key_s = 0x00;key_s |= K2;key_s <<= 1;key_s |= K1;return key_s;}void proc_key(unsigned char key_v){if((key_v & 0x01) == 0){P2 = _cror_(P2,1);}else if((key_v & 0x02) == 0){P2 = _crol_(P2, 1);}}6.定时器/中断蜂铃器_timer1#include < reg51.h >#include <intrins.h>sbit Beep = P1^5;unsigned int USE_C ;void main(){TMOD=0x10; //定时/计数器1工作于方式1TH0=0x4C;TL0=0x00; //50ms定时常数EA=1; //开总中断ET1=1; //允许定时/计数器1 中断TR1=1; //启动定时/计数器1 中断while(1);}void Time1(void) interrupt 3{TH1=0x4c; //50ms定时TL1=0x00;if (++USE_C == 20) //每隔1秒发声{ Beep = ~Beep;USE_C = 0;}}中断0计数_1位数码管显示#include < reg51.h >#include <intrins.h>unsigned int LedNumV al;// 此表为LED 的字模/ 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)unsigned char code Disp_Tab[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83, 0xC6,0xA1,0x86,0xbf,0xc7,0x8c,0xc1, 0xff, 0xf7 };void main(void){// IT0=0; //低电平触发IT0=1; //下降沿触发EA=1;EX0=1;while(1){P0=Disp_Tab[LedNumV al%10];}}INT0中断函数void counter(void) interrupt 0{EX0=0;LedNumV al++; //中断计数EX0=1;}中断0计数_4位数码管显示试验4位数码管上显示外部中断计数#include < reg51.h >#include <intrins.h>sbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;unsigned int LedNumV al = 0 ,LedOut[8];// 此表为LED 的字模// 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)unsigned char code Disp_Tab[] ={ ~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x9 0,~0x88,~0x83,~0xC6,~0xA1,~0x86,~0xbf,~0xc7,~0x8c,~0xc1, ~0xff, ~0xf7 };void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}display(){ unsigned char i;LedOut[0]=Disp_Tab[LedNumV al%10000/1000];LedOut[1]=Disp_Tab[LedNumV al%1000/100]&0x7f;LedOut[2]=Disp_Tab[LedNumV al%100/10];LedOut[3]=Disp_Tab[LedNumV al%10];for( i=0; i<8; i++){ P0 = LedOut[i];switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}void main(void){P0=0xff;P1=0xff;P2=0xff;// IT0=0; //低电平触发IT0=1; //下降沿触发EA=1;EX0=1;while(1){display();}}INT0中断函数void counter(void) interrupt 0{EX0=0;LedNumV al++; //中断计数EX0=1;}INT0+INT1#include < reg51.h >#include <intrins.h>sbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;unsigned int LedNumV al_1,LedNumV al_2,LedOut[8]; unsigned char code Disp_Tab[] =/ /共阴数码管0-9{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}void main(void){ unsigned char i;P0=0xff;P1=0xff;P2=0xff;// IT0=0; //低电平触发IT0=1; //下降沿触发EX0=1;// IT1=0; //低电平触发IT1=1; //下降沿触发EX1=1;EA=1;while(1){LedOut[0]=Disp_Tab[LedNumV al_1%10000/1000];LedOut[1]=Disp_Tab[LedNumV al_1%1000/100]|0x80;//0x7f小数点LedOut[2]=Disp_Tab[LedNumV al_1%100/10];LedOut[3]=Disp_Tab[LedNumV al_1%10];LedOut[4]=Disp_Tab[LedNumV al_2%10000/1000];LedOut[5]=Disp_Tab[LedNumV al_2%1000/100];LedOut[6]=Disp_Tab[LedNumV al_2%100/10];LedOut[7]=Disp_Tab[LedNumV al_2%10];for( i=0; i<8; i++){ P0 = LedOut[i];switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}}INT0中断函数void counter0(void) interrupt 0{EX0=0;delay(100);LedNumV al_1++;EX0=1;}INT1中断函数void counter1(void) interrupt 2{EX1=0;delay(100);LedNumV al_2++;EX1=1;}T0_数码管#include<reg51.h>char num;unsigned char Led [10] ={0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void main(){TMOD=0x01;EA=1;ET0=1;TR0=1;TH0=(65536-45872)/256;TL0=(65536-45872)%256;while(1);}void T0_time() interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;num++;if(num==200){num=0;P0 = 0x1e;P2 = Led[1];}}TIMEER0试验数码管上显示定时器中断计数#include < reg51.h >#include <intrins.h>sbit LS138A=P2^2; //定义138管脚sbit LS138B=P2^3;sbit LS138C=P2^4;unsigned int LedNumV al,LedOut[8];// 此表为LED 的字模// 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)unsigned char code Disp_Tab[] ={ ~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x9 0,~0x88,~0x83,~0xC6,~0xA1,~0x86,~0xbf,~0xc7,~0x8c,~0xc1, ~0xff, ~0xf7 };系统初始化void system_Ini(){TMOD|= 0x11;TH1=0x1C; //12.000MTL1=0x18;IE = 0x8A;TR1 = 1;}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}void main(){system_Ini() ;while(1){ unsigned char i;LedOut[0]=Disp_Tab[LedNumV al%10000/1000];LedOut[1]=Disp_Tab[LedNumV al%1000/100]&0x7f;LedOut[2]=Disp_Tab[LedNumVal%100/10];LedOut[3]=Disp_Tab[LedNumV al%10];for( i=0; i<8; i++){P0 = LedOut[i];switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}}[ t1 (1ms)中断] 中断void T1zd(void) interrupt 3 //3定时器1的中断号{TH1 = 0x1c; //12.000TL1 = 0x18;LedNumV al++;}定时器#include"reg51.h"bit SecFlag = 0;code unsigned char LedSeg[10] = //数组{0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char Sec = 0,Min = 0;void Time0() interrupt 1 //中断1 //硬件延时{static unsigned int IntCnt,Counter = 0;TH0= 0xf8; //中断返回TL0 = 0xcd;if(++IntCnt > 500) //计数500次{IntCnt = 0;SecFlag = 1;}switch(++Counter%5){case 1:P0 = 0x02; // 0000 0010P2 = LedSeg[Sec % 10];break;case 2:P0 = 0x04; // 0000 0100P2 = LedSeg[Sec / 10];break;case 3:P0 = 0x08; // 0000 1000P2 = LedSeg[Min % 10];break;case 4:P0 = 0x10; // 0001 0000P2 = LedSeg[Min / 10];break;}}void InitTime() //中断定时初始化{TMOD = 0x01; // GATE C/T M1 M0 GA TE C/T M1 M0//设置为定时器0的工作方式1// 0 0 0 0 0 0 0 1 TH0 = 0xf8; //装载初值TL0 = 0xcd;TCON = 0x10; // TF1 TR1 TF0 TR0 0000//控制启停// 0 0 0 1IE = 0x82; // EA 00 ES ET1 EX1 ET0 EX0//中断允许控制E:enable// 1 00 0 0 0 1 0}void main(){unsigned int Counter = 0;bit StopFlag = 0; //0: Time Run 1:Time StopInitTime(); //初始化单片机内部的定时器,以中断方式工作在16位模式while(1){if(StopFlag == 0) //走时{ if(SecFlag) //计时程序{SecFlag = 0;if(++Sec > 59){Sec = 0;if(++Min > 59){Min = 0;}}}}}}定时器_按键#include"reg51.h"bit SecFlag = 0;sbit TIMESTOP_K = P1^0;void Delay2ms(unsigned int DelayTime) //软件延时{unsigned int Count;for(Count = 0;Count < DelayTime*50;Count++);}code unsigned char LedSeg[10] = //数组{0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char Sec = 0,Min = 0;void Time0() interrupt 1 //中断1 //硬件延时{static unsigned int IntCnt,Counter = 0;TH0 = 0xf8;TL0 = 0xcd;if(++IntCnt > 500) //计数500次{IntCnt = 0;SecFlag = 1;}switch(++Counter%5){case 1:P0 = 0x02; // 0000 0010P2 = LedSeg[Sec % 10];break;case 2:P0 = 0x04; // 0000 0100P2 = LedSeg[Sec / 10];break;case 3:P0 = 0x08; // 0000 1000P2 = LedSeg[Min % 10];break;case 4:P0 = 0x10; // 0001 0000P2 = LedSeg[Min / 10];break;}}void InitTime() //硬件延时{TMOD = 0x01; // GATE C/T M1 M0 GA TE C/T M1 M0//设置为定时器0的工作方式1// 0 0 0 0 0 0 0 1 TH0 = 0xf8; //装载初值TL0 = 0xcd;TCON = 0x10; // TF1 TR1 TF0 TR0 0000//控制启停// 0 0 0 1IE = 0x82; // EA 00 ES ET1 EX1 ET0 EX0E:enable //中断允许控制// 1 00 0 0 0 1 0 }void main(){unsigned int Counter = 0;bit StopFlag = 0; //0: Time Run 1:Time StopInitTime(); //初始化单片机内部的定时器,以中断方式工作在16位模式while(1){if(StopFlag == 0) //走时{ if(SecFlag) // 计时程序{SecFlag = 0;if(++Sec > 59){Sec = 0;if(++Min > 59){Min = 0;}}}}//按键工作,让走时停止,StopFlag = 1if(TIMESTOP_K == 0){Delay2ms(5);while(TIMESTOP_K == 0);StopFlag = ~ StopFlag;}}}7.LED点阵显示数字LED点阵实验(流动显示1 2 3 4 5 6 7 8 9)#include<reg51.h>unsigned char code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code digittab[18][8]={{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, //0{0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00}, //1{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, //2{0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, //3{0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, //4{0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, //5{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //6{0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, //7{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, //8{0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00}, //9{0x00,0x00,0x7F,0x48,0x48,0x30,0x00,0x00}, //P{0x00,0x00,0x7F,0x48,0x4C,0x73,0x00,0x00}, //R{0x00,0x00,0x7F,0x49,0x49,0x49,0x00,0x00}, //E{0x00,0x00,0x3E,0x41,0x41,0x62,0x00,0x00}, //C{0x00,0x00,0x7F,0x08,0x08,0x7F,0x00,0x00}, //H{0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00}, //I{0x00,0x7F,0x10,0x08,0x04,0x7F,0x00,0x00}, //N{0x7C,0x48,0x48,0xFF,0x48,0x48,0x7C,0x00} //中};unsigned int timecount;unsigned char cnta;unsigned char cntb;void main(void){TMOD=0x01;TH0=(65536-3000)/256;TL0=(65536-3000)%256;TR0=1; //开启定时0ET0=1;EA=1; //开启中断cntb=0;while(1){ ;}}void t0(void) interrupt 1 using 0{TH0=(65536-3000)/256; //定时器高位装载数据TL0=(65536-3000)%256; //定时器低位装载数据if(cntb<18) //红色{P1=0xFF;P2=tab[cnta];P0=digittab[cntb][cnta];}else //绿色{P2=0xFF;P1=tab[cnta];P0=digittab[cntb-18][cnta];}if(++cnta>=8) cnta=0;if(++timecount>=333){timecount=0;if(++cntb>=36)cntb=0;}}滚动LED点阵实验(左右上下流动显示)#include <REG51.H>unsigned char code taba[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code tabb[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};void delay1(void){unsigned char i,j,k;for(k=10;k>0;k--)for(i=20;i>0;i--)for(j=248;j>0;j--);}void main(void){unsigned char i,j;while(1){for(j=0;j<3;j++) //from left to right 3 time{for(i=0;i<8;i++){P2=taba[i];P0=0xff;delay1();}}for(j=0;j<3;j++) //from right to left 3 time{for(i=0;i<8;i++){P2=taba[7-i];P0=0xff;delay1();}}for(j=0;j<3;j++) //from top to bottom 3 time{for(i=0;i<8;i++){P2=0x00;P0=tabb[7-i];delay1();}}for(j=0;j<3;j++) //from bottom to top 3 time{for(i=0;i<8;i++){P2=0x00;P0=tabb[i];delay1();}}}}8.1602液晶静态显示#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table1[]="LIJUNLIN1988"; //12 uchar code table2[]="TEL 134********"; //15 sbit E=P2^7;sbit RS=P2^6;sbit R=P2^5;uchar num;void delay(uint x){uint y;for(x;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) //写指令{RS=0;P0=com;delay(5);E=1;delay(5);E=0;}void write_data(uchar date) //写数据{RS=1;P0=date;delay(5);E=1;delay(5);E=0;}void init() //初始化{E=0;write_com(0x38);write_com(0x0e);write_com(0x06);write_com(0x01);write_com(0x80);}void main(){R=0;init();for(num=0;num<12;num++){write_data(table1[num]);delay(20);}write_com(0x80+0x40);for(num=0;num<15;num++){write_data(table2[num]);delay(20);}while(1);}动态显示#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table1[]="LIJUNLIN"; //8 uchar code table2[]="134********"; //11 sbit E=P2^7;sbit RS=P2^6;sbit R=P2^5;uchar num;void delay(uint x){uint y;for(x;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) //写指令{RS=0;P0=com;delay(5);E=1;delay(5);E=0;}void write_data(uchar date) //写数据{RS=1;P0=date;delay(5);E=1;delay(5);E=0;}void init() //初始化{E=0;write_com(0x38);write_com(0x0e);write_com(0x06);write_com(0x01);write_com(0x80+0x10);}void main(){R=0;init();for(num=0;num<8;num++){write_data(table1[num]);delay(20);}write_com(0x80+0x53);for(num=0;num<11;num++){write_data(table2[num]);delay(20);}for(num=0;num<16;num++){write_com(0x18);delay(20);}while(1);}滚动显示1、从左到右逐字显示,闪动二次,清屏。

单片机编程100例

单片机编程100例

单片机编程实例100例大全单片机编程实例目录*实例1:使用P3口流水点亮8位LED (3)*实例2:通过对P3口地址的操作流水点亮8位LED (4)*实例3:用不同数据类型控制灯闪烁时间 (6)*实例4:用单片机控制第一个灯亮 (8)*实例5:用单片机控制一个灯闪烁:认识单片机的工作频率 (8)*实例6:将P1口状态分别送入P0、P2、P3口:认识I/O口 (10)的引脚功能 (10)*实例7:用P0口、P1 口分别显示加法和减法运算结果 (10)*实例8:用P0、P1口显示乘法运算结果 (11)*实例9:用P1、P0口显示除法运算结果 (12)*实例10:用自增运算控制P0口8位LED流水花样 (12)*实例11:用P0口显示逻辑"与"运算结果 (14)*实例12:用P0口显示条件运算结果 (14)*实例13:用P0口显示按位"异或"运算结果 (15)*实例16:用P0显示左移运算结果 (15)*实例17:"万能逻辑电路"实验 (15)*实例18:用右移运算流水点亮P1口8位LED (16)*实例19:用if语句控制P0口8位LED的流水方向 (18)*实例20:用swtich语句的控制P0口8位LED的点亮状态 (18)*实例21:用for语句控制蜂鸣器鸣笛次数 (20)*实例22:用while语句控制LED (22)*实例23:用do-while语句控制P0口8位LED流水点亮 (23)*实例24:用字符型数组控制P0口8位LED流水点亮 (24)*实例25:用P0口显示字符串常量 (26)*实例26:用P0 口显示指针运算结果 (27)*实例27:用指针数组控制P0口8位LED流水点亮 (28)*实例28:用数组的指针控制P0 口8 位LED流水点亮 (29)*实例29:用P0 、P1口显示整型函数返回值 (31)*实例30:用有参函数控制P0口8位LED流水速度 (32)*实例31:用数组作函数参数控制流水花样 (33)*实例32:用指针作函数参数控制P0口8位LED流水点亮 (35)*实例33:用函数型指针控制P1口灯花样 (37)*实例34:用指针数组作为函数的参数显示多个字符串 (38)*实例35:字符函数ctype.h应用举例 (40)*实例36:内部函数intrins.h应用举例 (41)*实例37:标准函数stdlib.h应用举例 (42)*实例38:字符串函数string.h应用举例 (43)*实例39:宏定义应用举例2 (44)*实例40:宏定义应用举例2 (45)*实例41:宏定义应用举例3 (45)*实例42:用定时器T0查询方式P2口8位控制LED闪烁 (46)*实例43:用定时器T1查询方式控制单片机发出1KHz音频 (47)*实例44:将计数器T0计数的结果送P1口8位LED显示 (48)*实例45:用定时器T0的中断控制1位LED闪烁 (49)*实例46:用定时器T0的中断实现长时间定时 (50)*实例47:用定时器T1中断控制两个LED以不同周期闪烁 (52)*实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频 (54)*实例49:用定时器T0的中断实现"渴望"主题曲的播放 (55)*实例50-1:输出50个矩形脉冲 (60)*实例50-2:计数器T0统计外部脉冲数 (61)*实例51-2:定时器T0的模式2测量正脉冲宽度 (62)*实例52:用定时器T0控制输出高低宽度不同的矩形波 (63)*实例53:用外中断0的中断方式进行数据采集 (65)*实例54-1:输出负脉宽为200微秒的方波 (66)*实例54-2:测量负脉冲宽度 (67)*实例55:方式0控制流水灯循环点亮 (69)*实例56-1:数据发送程序 (71)*实例56-2:数据接收程序 (72)*实例57-1:数据发送程序 (74)*实例57-2:数据接收程序 (76)*实例58:单片机向PC发送数据 (77)*实例59:单片机接收PC发出的数据 (79)*实例60:用LED数码显示数字5 (81)*实例61:用LED数码显示器循环显示数字0~9 (81)*实例62:用数码管慢速动态扫描显示数字"1234" (83)*实例63:用LED数码显示器伪静态显示数字1234 (84)*实例64:用数码管显示动态检测结果 (86)*实例65:数码秒表设计 (89)*实例66:数码时钟设计 (92)*实例67:用LED数码管显示计数器T0的计数值 (97)*实例68:静态显示数字“59” (99)*实例69:无软件消抖的独立式键盘输入实验 (99)*实例70:软件消抖的独立式键盘输入实验 (100)*实例71:CPU控制的独立式键盘扫描实验 (101)*实例72:定时器中断控制的独立式键盘扫描实验 (106)*实例73:独立式键盘控制的4级变速流水灯度 (111)*实例74:独立式键盘的按键功能扩展: (115)*实例75:独立式键盘调时的数码时钟实验 (117)*实例76:独立式键盘控制步进电机实验 (123)*实例77:矩阵式键盘按键值的数码管显示实验 (128)*实例78:矩阵式键盘按键音 (134)*实例79:简易电子琴 (136)*实例80:矩阵式键盘实现的电子密码锁 (144)*实例1:使用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(); //调用延时函数} / /}*实例2:通过对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(); //调用延时函数}}*实例3:用不同数据类型控制灯闪烁时间#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(); //延时一段较长的时间 } } *实例4:用单片机控制第一个灯亮#include<reg51.h> //包含51单片机寄存器定义的头文件void main(void){P1=0xfe; //P1=1111 1110B,即P1.0输出低电平}*实例5:用单片机控制一个灯闪烁:认识单片机的工作频率#include<reg51.h> //包含单片机寄存器的头文件/函数功能:延时一段时间/void delay(void) //两个void意思分别为无需返回值,没有参数传递 {unsigned int i; //定义无符号整数,最大取值范围65535for(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(); //延时一段时间}}*实例6:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能#include<reg51.h> //包含单片机寄存器的头文件/ 函数功能:主函数(C语言规定必须有也只能有1个主函数) / void main(void){while(1) //无限循环{P1=0xff; // P1=1111 1111B,熄灭LEDP0=P1; // 将 P1口状态送入P0口P2=P1; // 将 P1口状态送入P2口P3=P1; // 将 P1口状态送入P3口}}*实例7:用P0口、P1 口分别显示加法和减法运算结果#include<reg51.h>void main(void){unsigned char m,n;m=43; //即十进制数2x16+11=43n=60; //即十进制数3x16+12=60P1=m+n; //P1=103=0110 0111B,结果P1.3、P1.4、P1.7 口的灯被点亮 P0=n-m; //P0=17=0001 0001B,结果P0.0、P0.4的灯被熄灭 } *实例8:用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=11000000B,P3.1,P3.6,P3.7口灭,其余亮}*实例9:用P1、P0口显示除法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P1=36/5; //求整数P0=((36%5) 10)/5; //求小数while(1); //无限循环防止程序“跑飞”}*实例10:用自增运算控制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(); //调用延时函数}}*实例11:用P0口显示逻辑"与"运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1); //设置无限循环,防止程序“跑飞”}*实例12:用P0口显示条件运算结果#include<reg51.h> //包含单片机寄存器的头文件 voidmain(void){P0=(8>4)?8:4;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}*实例13:用P0口显示按位"异或"运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}*实例16:用P0显示左移运算结果#include<reg51.h> //包含单片机寄存器的头文件 voidmain(void){P0=0x3b<<2;//将左移运算结果送P0口,P0=1110 1100B=0xec while(1); //无限循环,防止程序“跑飞”}*实例17:"万能逻辑电路"实验#include<reg51.h> //包含单片机寄存器的头文件sbit F=P1^4; //将F位定义为 P1.4sbit X=P1^5; //将X位定义为 P1.5sbit Y=P1^6; //将Y位定义为 P1.6sbit Z=P1^7; //将Z位定义为 P1.7void 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.4sbit 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初始化为0while(1){if(S1==0) //如果S1键按下{delay(); //延时一段时间if(S1==0) //如果再次检测到S1键按下i++; //i自增1if(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> //包含单片机寄存器的头文件 sbitsound=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初始化为0while(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 codeTab[ ]={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赋初值25j=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){Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned charp[ ]={&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){for(m=0;m<200;m++)for(n=0;n<250;n++);}/函数功能:主函数/void main(void){unsigned char i;unsigned charTab[ ]={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; //将数组首地址存入指针pwhile(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 codeTab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水灯控制码while(1){//快速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(100); //延时约60ms, (3 100 200=60 000μs) }//慢速流水点亮LEDfor(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){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) //形参为无符号字符型指针{while(1){i=0; //将i置为0,指向数组第一个元素while( (p+i)!='\0') //只要没有指向数组的结束标志{P0= (p+i);// 取的指针所指变量(数组元素)的值,送P0口 delay(); //调用延时函数i++; //指向下一个数组元素}}}/函数功能:主函数/void main(void){unsigned char codeTab[ ]={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 codeTab[]={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; //将函数的入口地址赋给函数型指针pwhile(1)( p)(); //通过函数的指针p调用函数led_flow()}*实例34:用指针数组作为函数的参数显示多个字符串#include<reg51.h> //包含51单片机寄存器定义的头文件unsigned char code str1[ ]="Temperature is tested byDS18B20";//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 1110Bwhile(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); //比较两个字符串,并将结果存入iif(i==0) //str1=str2P3=0x00;elseif(i<0) //str1<str2P3=0xf0;else //str1>str2P3=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宏定义为字符串100void main(void){#if MAX>80 //如果字符串100大于80P3=0xf0; //P3口低四位LED点亮#elseP3=0x0f; //否则,P3口高四位LED点亮#endif //结束本次编译}/ 中断、定时器中断、定时器中断、定时器中断、定时器 /*实例42:用定时器T0查询方式P2口8位控制LED闪烁#include<reg51.h> // 包含51单片机寄存器定义的头文件/函数功能:主函数/ void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0TF0=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的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1TF1=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的模式2TH0=256-156; //定时器T0的高8位赋初值TL0=256-156; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待查询{while(TF0==0) //如果未计满就等待{if(S==0) //按键S按下接地,电平为0P1=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的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(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中断次数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51单片机实用程序库流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮的效果。

实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。

程序实例()ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOV P1,A ;灭所有的灯MOV A,#BMAIN1:MOV P1,A ;开最左边的灯ACALL DELAY ;延时RL A ;将开的灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ 30H,D1RETEND方波输出程序介绍:口输出高电平,延时后再输出低电平,循环输出产生方波。

实际应用中例如:波形发生器。

程序实例():ORG 0000HMAIN:;直接利用口产生高低电平地形成方波步移位;显示个,十,百,千算机的内部计算都是二进制,而二进制每除一个2,实际上是向右移一次。

所以为了计算方便,我们选择取6个数,最后在算除法的时候,只需要用单片机自带的右移位命令移2次就行了。

27十六进制六位数加法(数码显示)程序实例:ORG 0000HMAIN:ADNUMBER EQU 30H ;AD转换值ADDNUMBER EQU 31H ;加数值1ADL EQU 32H ;//ADH EQU 33H ;ADL转换高低位值DISL EQU 34H ;//DISH EQU 35H ;显示高低位值ADDTOTAL EQU 36H ;第一次AD转换值ADDJW EQU 37H ;加法进位数ADDHOLD EQU 38HADDFLAG EQU 39H ;加标志ENDFLAG EQU 40H;赋初值//////////////////////////////////////////// MOV ADDHOLD,#00HMOV ADDNUMBER,#00HMOV ADL,#00HMOV ADH,#00HMOV DISL,#00HMOV DISH,#00HMOV ADDJW,#00HMOV ADDFLAG,#00HMOV ENDFLAG,#00HMOV ADDTOTAL,#00H;////////////////////////////////////////////////// MAIN1:28;显示AD值////////////////////////////////////////// ACALL DELAYACALL DELAYACALL ADMAIN3:ACALL CAIFENACALL DISPLAY;//////////////////////////////////////////////////;加这次的AD值,并判是否加了六次,是的话就进入死循环ACALL DELAYACALL ADD1ACALL DISPLAYINC ADDFLAGMOV A,ADDFLAGCJNE A,#06H,MAIN2LOOP: AJMP LOOP;//////////////////////////////////////////////////;没有加到六次,继续取值加,如果没有来新AD值,还是去显示上次加的值,有新AD值来了,显示这次AD值,并加上上次AD值,显示///////////////////////////////////////MAIN2: ACALL DELAYACALL ADMOV A,ADNUMBERCJN A,ADDTOTAL,MAIN3AJM MAIN2;////////////////////////////////////////////////// ;////////////////////////////////////////////AD转换AD:29MOV DPTR,#7F00H ;指向转换地址MOV A,#03H ;指向转换口MOVX @DPTR,A ;转换MOV R1,#64HD1: DJNZ R1,D1 ;等100微秒转换完MOVX A,@DPTR ;转换后的值给AMOV ADNUMBER,A ;转换的值给30HRET;//////////////////////////////////////////////////;拆分AD值程序////////////////////////////////////// CAIFEN:MOV A,ADNUMBERANL A,#0FHMOV ADL,A ;取低位MOV A,ADNUMBERANL A,#0F0HSWAP AMOV ADH,A ;取高位MOV DISL,ADLMOV DISH,ADH ;给显示值RET;//////////////////////////////////////////////////;显示//////////////////////////////////////////////DISPLAY:MOV A,DISLMOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,A30D3: JNB TI,D3CLR TIMOV A,DISHMOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,AD4: JNB TI,D4CLR TIMOV A,ADDJWMOV DPTR,#SETTABMOVC A,@A+DPTRMOV SBUF,AD5: JNB TI,D5CLR TIMOV SBUF,#00HD6: JNB TI,D6CLR TIRET;////////////////////////////////////////////////// ;加法程序////////////////////////////////////////// ADD1:CLR CMOV ADDTOTAL,ADNUMBERMOV A,ADNUMBERADDC A,ADDHOLDMOV ADDHOLD,AJNC ADDJW1INC ADDJW31ADDJW1: ANL A,#0FHMOV DISL,A ;加值取低位MOV A,ADDHOLDANL A,#0F0HSWAP AMOV DISH,A ;加值取高位RET;/////////////////////////////////////////////// DELAY: ;延时MOV R3,#0AHDD1: MOV R1,#0FFHD2 : MOV R2,#0FFHDJNZ R2,$DJNZ R1,D2DJNZ R3,DD1RETSETTAB:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H, 0FEH,0F6HDB 0EEH,3EH,9CH,7AH,9EH,8EHEND求六位和中的最大值和最小值(数码显示)程序实例():ORG 0000HMAIN:ADNUMBER EQU 30H ;AD转换值ADL EQU 32H ;//32ADH EQU 33H ;ADL转换高低位值DISL EQU 34H ;//DISH EQU 35H ;显示高低位值ADDTOTAL EQU 36H ;第一次AD转换值ADDJW EQU 37H ;加法进位数ADDHOLD EQU 38HADDFLAG EQU 39H ;加标志ENDFLAG EQU 40HADH1 EQU 41H ;AD中最大的值ADL1 EQU 42H ;AD中最小的值ADHOLDH EQU 43HADHOLDL EQU 44H ;求AD最大值与最小值时AD的比较值,即以此两个值为比较中转FOUR EQU 45HSUB EQU 46H ;减去高低位后的值JWHOLD EQU 47H ;保存进位值;赋初值//////////////////////////////////////////// MOV ADDHOLD,#00HMOV ADL,#00HMOV ADH,#00HMOV DISL,#00HMOV DISH,#00HMOV ADDJW,#00HMOV ADDFLAG,#00HMOV ENDFLAG,#00HMOV ADDTOTAL,#00HMOV ADH1,#00HMOV ADL1,#00H33MOV ADHOLDH,#00HMOV FOUR,#00HMOV ADHOLDL,#00HMOV JWHOLD,#00HMOV SUB,#00H;////////////////////////////////////////////////// MAIN1:ACALL DELAYACALL DELAYACALL AD ;取AD值MAIN3: ACALL CAIFENACALL DISPLAY ;显示ACALL DELAYACALL DELAY;算最大值和最小值////////////////////////////////// ACALL ADDHACALL ADDL;//////////////////////////////////////////////////;加和值显示/////////////////////////////////////// ACALL ADD1ACALL DISPLAY;//////////////////////////////////////////////////;判是否加到了6次/////////////////////////////////// INC ADDFLAGMOV A,ADDFLAGCJNE A,#06H,MAIN2;///////////////////////////////////////////////// ACALL DELAY34ACALL DELAYACALL DELAYACALL DELAYACALL DELAYACALL DELAYACALL CAIFEN1 ;拆最小值ACALL CAIFEN2 ;拆最大值ACALL DISPLAY ;显示最大值最小值LOOP: AJMP LOOP;判有没有来新AD值,没有显示以前,有显示现在的/////// MAIN2:ACALL DELAYACALL ADMOV A,ADNUMBERCJNE A,ADDTOTAL,MAIN3AJMP MAIN2;//////////////////////////////////////////////////;AD转换//////////////////////////////////////////// AD: MOV DPTR,#7F00H ;指向转换地址MOV A,#03H ;指向转换口MOVX @DPTR,A ;转换MOV R1,#64HD1: DJNZ R1,D1 ;等100微秒转换完MOVX A,@DPTR ;转换后的值给AMOV ADNUMBER,A ;转换的值给30HRET;//////////////////////////////////////////////////;拆分AD值程序////////////////////////////////////// 35CAIFEN:MOV A,ADNUMBERANL A,#0FHMOV ADL,A ;取低位MOV A,ADNUMBERANL A,#0F0HSWAP AMOV ADH,A ;取高位MOV DISL,ADLMOV DISH,ADH ;给显示值RET;////////////////////////////////////////////////// ;显示////////////////////////////////////////////// DISPLAY:MOV A,DISLMOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,AD3: JNB TI,D3CLR TIMOV A,DISHMOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,AD4: JNB TI,D4CLR TIMOV A,ADDJW MOV DPTR,#SETTAB 36MOVC A,@A+DPTRMOV SBUF,AD5: JNB TI,D5CLR TIMOV A,FOURMOV DPTR,#SETTABMOVC A,@A+DPTRMOV SBUF,AD6: JNB TI,D6CLR TIRET;//////////////////////////////////////////////// ;加法程序//////////////////////////////////////// ADD1:CLR CMOV ADDTOTAL,ADNUMBERMOV A,ADNUMBERADDC A,ADDHOLDMOV ADDHOLD,AJNC ADDJW1INC ADDJWADDJW1: ANL A,#0FHMOV DISL,A ;加值取低位MOV A,ADDHOLDANL A,#0F0HSWAP AMOV DISH,A ;加值取高位RET37;//////////////////////////////////////////////////;AD值中的最大值////////////////////////////////////ADDH:MOV A,ADH1CJNE A,#00H,ADDH1MOV ADH1,ADNUMBERAJMP READDH1: MOV A,ADNUMBERCLR CSUBB A,ADH1JC REMOV ADH1,ADNUMBERRE: RET;//////////////////////////////////////////////////;AD值中的最小值//////////////////////////////////// ADDL:MOV A,ADL1CJNE A,#00H,ADDL1MOV ADL1,ADNUMBERAJMP RE1ADDL1: MOV A,ADNUMBERCLR CSUBB A,ADL1JNC RE1MOV ADL1,ADNUMBERRE1: RET;//////////////////////////////////////////////////;分解AD最小值的个,十位//////////////////////////// 38CAIFEN1:MOV A,ADL1ANL A,#0FHMOV ADL,A ;取低位MOV A,ADL1ANL A,#0F0HSWAP AMOV ADH,A ;取高位MOV DISL,ADLMOV DISH,ADH ;给显示值RET;/////////////////////////////////////////////;分解AD最大值的个,十位/////////////////////// CAIFEN2:MOV A,ADH1ANL A,#0FHMOV ADL,A ;取低位MOV A,ADH1ANL A,#0F0HSWAP AMOV ADH,A ;取高位MOV JWHOLD,ADDJWMOV ADDJW,ADLMOV FOUR,ADH ;给显示值RET;////////////////////////////////////////////////// DELAY: ;延时MOV R3,#0AH39DD1: MOV R1,#0FFHD2 : MOV R2,#0FFHDJNZ R2,$DJNZ R1,D2DJNZ R3,DD1RET;////////////////////////////////////////////////// SETTAB:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H, 0FEH,0F6HDB 0EEH,3EH,9CH,7AH,9EH,8EHEND求减去最大和最小值后的值(数码显示)程序实例()ORG 0000HMAIN:ADNUMBER EQU 30H ;AD转换值ADL EQU 32H ;//ADH EQU 33H ;ADL转换高低位值DISL EQU 34H ;//DISH EQU 35H ;显示高低位值ADDTOTAL EQU 36H ;第一次AD转换值ADDJW EQU 37H ;加法进位数ADDHOLD EQU 38HADDFLAG EQU 39H ;加标志ENDFLAG EQU 40HADH1 EQU 41H ;AD中最大的值40ADL1 EQU 42H ;AD中最小的值ADHOLDH EQU 43HADHOLDL EQU 44H ;求AD最大值与最小值时AD的比较值,即以此两个值为比较中转FOUR EQU 45HSUB EQU 46H ;减去高低位后的值JWHOLD EQU 47H ;保存进位值;赋初值/////////////////////////////////////////// MOV ADDHOLD,#00HMOV ADL,#00HMOV ADH,#00HMOV DISL,#00HMOV DISH,#00HMOV ADDJW,#00HMOV ADDFLAG,#00HMOV ENDFLAG,#00HMOV ADDTOTAL,#00HMOV ADH1,#00HMOV ADL1,#00HMOV ADHOLDH,#00HMOV FOUR,#00HMOV ADHOLDL,#00HMOV JWHOLD,#00HMOV SUB,#00H;////////////////////////////////////////////////// MAIN1:ACALL DELAYACALL DELAY41ACALL AD ;取AD值MAIN3: ACALL CAIFENACALL DISPLAY ;显示ACALL DELAYACALL DELAY;算最大值和最小值////////////////////////////////// ACALL ADDH;//////////////////////////////////////////////////;加和值显示/////////////////////////////////////// ACALL ADD1ACALL DISPLAY;/////////////////////////////////////////////////;判是否加到了6次////////////////////////////////// INC ADDFLAGMOV A,ADDFLAGCJNE A,#06H,MAIN2;////////////////////////////////////////////////// ACALL DELAYACALL DELAYACALL DELAYACALL DELAYACALL DELAYACALL CAIFEN1 ;拆最小值ACALL CAIFEN2 ;拆最大值ACALL DISPLAY ;显示最大值最小值ACALL DELAY42ACALL DELAYACALL JIAN1 ;呼叫减最大值最小值程序ACALL CAIFEN3 ;拆分ACALL DISPLAY ;显示减去最大值最小值后的值ACALL DELAYACALL DELAYLOOP: AJMP LOOP;判有没有来新AD值,没有显示以前,有显示现在的/// MAIN2:ACALL DELAYACALL ADMOV A,ADNUMBERCJNE A,ADDTOTAL,MAIN3AJMP MAIN2;/////////////////////////////////////////////////;AD转换///////////////////////////////////////////AD:MOV DPTR,#7F00H ;指向转换地址MOV A,#03H ;指向转换口MOVX @DPTR,A ;转换MOV R1,#64HD1: DJNZ R1,D1 ;等100微秒转换完MOVX A,@DPTR ;转换后的值给AMOV ADNUMBER,A ;转换的值给30HRET43;//////////////////////////////////////////////////;拆分AD值程序////////////////////////////////////// CAIFEN:MOV A,ADNUMBERANL A,#0FHMOV ADL,A ;取低位MOV A,ADNUMBERANL A,#0F0HSWAP AMOV ADH,A ;取高位MOV DISL,ADLMOV DISH,ADH ;给显示值RET;////////////////////////////////////////////////// ;显示////////////////////////////////////////////// DISPLAY:MOV A,DISLMOV DPTR,#SETTABMOVC A,@A+DPTRMOV SBUF,AD3: JNB TI,D3CLR TIMOV A,DISHMOV DPTR,#SETTABMOVC A,@A+DPTR MOV SBUF,AD4: JNB TI,D4CLR TI44MOV A,ADDJW MOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,AD5: JNB TI,D5CLR TIMOV A,FOUR MOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,AD6: JNB TI,D6CLR TIRET;///////////////////////////////////////////// ;加法程序///////////////////////////////////// ADD1:CLR CMOV ADDTOTAL,ADNUMBERMOV A,ADNUMBERADDC A,ADDHOLDMOV ADDHOLD,AJNC ADDJW1INC ADDJWADDJW1:ANL A,#0FHMOV DISL,A ;加值取低位MOV A,ADDHOLDANL A,#0F0H45SWAP AMOV DISH,A ;加值取高位RET;/////////////////////////////////////////////////;AD值中的最大值/////////////////////////////////// ADDH:MOV A,ADH1CJNE A,#00H,ADDH1MOV ADH1,ADNUMBERAJMP READDH1: MOV A,ADNUMBERSUBB A,ADH1JC REMOV ADH1,ADNUMBERRE: RET;//////////////////////////////////////////////////;AD值中的最小值//////////////////////////////////// ADDL:MOV A,ADL1CJNE A,#00H,ADDL1MOV ADL1,ADNUMBERAJMP RE1ADDL1: MOV A,ADNUMBERCLR CSUBB A,ADL1MOV ADL1,ADNUMBER46RE1: RET;//////////////////////////////////////////////////;分解AD最小值的个,十位//////////////////////////// CAIFEN1:MOV A,ADL1ANL A,#0FHMOV ADL,A ;取低位MOV A,ADL1ANL A,#0F0HSWAP AMOV ADH,A ;取高位MOV DISL,ADLMOV DISH,ADH ;给显示值RET;/////////////////////////////////////////////////;分解AD最大值的个,十位/////////////////////////// CAIFEN2:MOV A,ADH1ANL A,#0FHMOV ADL,A ;取低位MOV A,ADH1ANL A,#0F0HSWAP AMOV ADH,A ;取高位MOV JWHOLD,ADDJWMOV ADDJW,ADLMOV FOUR,ADH ;给显示值RET47;//////////////////////////////////////////////////;分解减去最高位和最低位的数//////////////////////// CAIFEN3:MOV A,SUBANL A,#0FHMOV ADL,AMOV A,SUBANL A,#0F0HSWAP AMOV ADH,AMOV DISL,ADLMOV DISH,ADHRET;//////////////////////////////////////////////////;减去最高位和最低位//////////////////////////////// JIAN1:MOV FOUR,#00HMOV ADDJW,JWHOLDMOV A,ADDHOLD ;取和值CLR CSUBB A,ADH1 ;减最高位JNC JIAN2DEC ADDJW ;有进位,高位减一JIAN2:CLR CSUBB A,ADL1 ;减低位JNC TUI ;无进位出去,有进位高位减一48DEC ADDJWTUI: MOV SUB,A ;取减的值给SUBRET;////////////////////////////////////////////////// ;滤波////////////////////////////////////////////// DELAY: ;延时MOV R3,#0AHDD1: MOV R1,#0FFHD2 : MOV R2,#0FFHDJNZ R2,$DJNZ R1,D2DJNZ R3,DD1RET;//////////////////////////////////////////////////SETTAB:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H, 0FEH,0F6HDB 0EEH,3EH,9CH,7AH,9EH,8EHEND除4所得软件滤波值(数码显示)程序实例():ORG 0000HMAIN:ADNUMBER EQU 30H ;AD转换值ADL EQU 32H ;//ADH EQU 33H ;ADL转换高低位值DISL EQU 34H ;//49DISH EQU 35H ;显示高低位值ADDTOTAL EQU 36H ;第一次AD转换值ADDJW EQU 37H ;加法进位数ADDHOLD EQU 38HADDFLAG EQU 39H ;加标志ENDFLAG EQU 40HADH1 EQU 41H ;AD中最大的值ADL1 EQU 42H ;AD中最小的值ADHOLDH EQU 43HADHOLDL EQU 44H ;求AD最大值与最小值时AD的比较值,即以此两个值为比较中转FOUR EQU 45HSUB EQU 46H ;减去高低位后的值JWHOLD EQU 47H ;保存进位值;赋初值////////////////////////////////////////// MOV ADDHOLD,#00HMOV ADH,#00H MOV DISL,#00H MOV DISH,#00H MOV ADDJW,#00H MOV ADDFLAG,#00H MOV ENDFLAG,#00H MOV ADDTOTAL,#00H MOV ADH1,#00H MOV ADL1,#00H MOV ADHOLDH,#00H MOV FOUR,#00H50MOV ADHOLDL,#00H MOV JWHOLD,#00H;////////////////////////////////////////////////// MAIN1:ACALL DELAYACALL DELAYACALL AD ;取AD值MAIN3: ACALL CAIFENACALL DISPLAY ;显示ACALL DELAYACALL DELAY;算最大值和最小值//////////////////////////////// ACALL ADDHACALL ADDL;////////////////////////////////////////////////// ;加和值显示////////////////////////////////////////ACALL ADD1ACALL DISPLAY;//////////////////////////////////////////////////;判是否加到了6次/////////////////////////////////// INC ADDFLAGMOV A,ADDFLAGCJNE A,#06H,MAIN2;///////////////////////////////////////////////// ACALL DELAYACALL DELAYACALL DELAY51ACALL DELAYACALL DELAYACALL DELAYACALL CAIFEN1 ;拆最小值ACALL CAIFEN2 ;拆最大值ACALL DISPLAY ;显示最大值最小值ACALL DELAYACALL DELAYACALL JIAN1 ;呼叫减最大值最小值程序ACALL CAIFEN3 ;拆分ACALL DISPLAY ;显示减去最大值最小值后的值ACALL DELAYACALL DELAYACALL DELAYACALL LUBO ;滤波程序ACALL DELAYACALL CAIFEN3。

相关文档
最新文档