单片机程序大全
- 格式:pdf
- 大小:406.74 KB
- 文档页数:29
单片机c语言实例程序300篇单片机C语言【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。
组成所有的排列后再去掉不满足条件的排列。
2.程序源代码:main(){inti,j,k;printf("\n");for(i=1;i<5;i++)/某以下为三重循环某/for(j=1;j<5;j++)for(k=1;k<5;k++){if(i!=k&&i!=j&&j!=k)/某确保i、j、k三位互不相同某/printf("%d,%d,%d\n",i,j,k);}}==============================================================【程序2】题目:企业发放的奖金根据利润提成。
利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.程序分析:请利用数轴来分界,定位。
注意定义时需把奖金定义成长整型。
2.程序源代码:main()单片机C语言{longinti;intbonu1,bonu2,bonu4,bonu6,bonu10,bonu;canf("%ld",&i);bonu1=100000某0.1;bonu2=bonu1+100000某0.75;bonu4=bonu2+200000某0.5;bonu6=bonu4+200000某0.3;bonu10=bonu6+400000某0.15;if(i<=100000)bonu=i某0.1;eleif(i<=200000)bonu=bonu1+(i-100000)某0.075;eleif(i<=400000)bonu=bonu2+(i-200000)某0.05;eleif(i<=600000)bonu=bonu4+(i-400000)某0.03;eleif(i<=1000000)bonu=bonu6+(i-600000)某0.015;elebonu=bonu10+(i-1000000)某0.01;printf("bonu=%d",bonu);}============================================================ ==【程序3】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。
1流水灯原理图程序1#include<reg52.h> void delay(int);void main(){while(1){P0=0xfe;delay(1000);P0=0xfd;delay(1000);P0=0xfb;delay(1000);P0=0xf7;delay(1000);P0=0xef;delay(1000);P0=0xdf;delay(1000);P0=0xbf;delay(1000);P0=0x7f;delay(1000);}}void delay(int z){int i,j;for(i=z;i>0;i--)for(j=100;j>0;j--);}程序2(库函数)#include<reg51.h>#include<intrins.h>#define N 400void delay(int);void main (){char a;a=0xfe;while(1){P0=a;delay(N);a=_crol_(a,1);delay(N);}}void delay(int c){int i,j;for(i=c;i>0;i--)for(j=100;j>0;j--);}程序3(数组)#include<reg52.h>void delay(int);int a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void main (){while(1){int m;for(m=0;m<8;m++){P0=a[m];delay(500);}}}void delay(int z){int i,j;for(i=z;i>0;i--)for(j=100;j>0;j--);}程序4(位移)include<reg51.h>#include<intrins.h>void delay(int);void main (){int m;while(1){char a=0xfe;P2=a;delay(400);a=a<<1;a=a+1;if(i++>6){a=0xfe;i=0;}}}void delay(int c){int i,j;for(i=c;i>0;i--)for(j=200;j>0;j--);程序5(前4亮后4灭)#include <reg51.h>#define SetTimeValue 500void DelayTime(int DelayValue) {int a,b;for(a=0;a<DelayValue;a++)for(b=0;b<1827;b++);}void main(){while(1){P0=0x0f;DelayTime(SetTimeValue);P0=0xf0;DelayTime(SetTimeValue);}2按键自加自减#include<reg51.h>int a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};sbit key01=P3^4;sbit key02=P3^5;sbit wela=P2^7;sbit dula=P2^6;void delay(int z);void main(){ int i=0;while(1){P0=0;wela=1;wela=0;P0=a[i];dula=1;dula=0;if(i>9)i=0;if(key01==0){delay(5);if(key01==0)i++;while(key01==0);}if(key02==0){delay(5);if(key02==0){i--;if(i<0)i=9;}while(key02==0);}}}void delay(int z){int i,j;for(i=z;i>0;i--)for(j=100;j>0;j--);}3按键显示器void Display(int DisplayNumber) {P0=0;Seg_Position=1;Seg_Position=0;P0=Table[DisplayNumber];Seg_Code=1;Seg_Code=0;}void main(){int KeyValue=0;while(1){Display(KeyValue);if(key==0){DelayTime_10ms(2);if(key==0){KeyValue++;}while(key==0);}}}4矩阵按键#include <reg51.h>sbit Seg_Position=P2^7;sbit Seg_Code=P2^6;sbit key=P3^4;void DelayTime_10ms(unsigned int DelayValue) {unsigned int a,b;for(a=0;a<DelayValue;a++)for(b=0;b<1827;b++);}unsigned Table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d}; void Display(int DisplayNumber){P0=0;Seg_Position=1;Seg_Position=0;P0=Table[DisplayNumber];Seg_Code=1;Seg_Code=0;}void main(){int KeyValue=5;unsigned char Temp=0;while(1){P3=0xfe;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){DelayTime_10ms(2);P3=0xfe;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){switch(Temp){case 0xe0:KeyValue=0;break;case 0xd0:KeyValue=1;break;}}}Display(KeyValue);}}5 6位数码管显示1-6#include <reg52.h> sbit dula=P2^6; sbit wela=P2^7; void delay(int); void main(){while(1){P0=0xfe;wela=1;wela=0;P0=0x06;dula=1;dula=0;delay(5);P0=0xfd;wela=1;wela=0;P0=0x5b;dula=1;dula=0;delay(5);P0=0xfb;wela=1;wela=0;P0=0x4f;dula=1;dula=0;delay(5);P0=0xf7;wela=1;wela=0;P0=0x66;dula=1;dula=0;delay(5);P0=0xef;wela=1;wela=0;P0=0x6d;dula=1;dula=0;delay(5);P0=0xdf;wela=1;wela=0;P0=0x7d;dula=1;dula=0;delay(5);}}void delay(int z) {int i,j;for(i=z;i>0;i--)for(j=100;j>0;j--);}6,16键盘显示#include <reg51.h>sbit Seg_Position=P2^7;sbit Seg_Code=P2^6;sbit key=P3^4;void DelayTime_10ms(unsigned int DelayValue){unsigned int a,b;for(a=0;a<DelayValue;a++)for(b=0;b<1827;b++);}unsignedTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71} ;void Display(int DisplayNumber){P0=0;Seg_Position=1;Seg_Position=0;P0=Table[DisplayNumber];Seg_Code=1;Seg_Code=0;}void main(){int KeyValue=15;unsigned char Temp=0;while(1){P3=0xfe;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){DelayTime_10ms(2);P3=0xfe;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){switch(Temp){case 0xe0:KeyValue=0;break;case 0xd0:KeyValue=1;break;case 0xb0:KeyValue=2;break;}}}Display(KeyValue);P3=0xfd;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){DelayTime_10ms(2);P3=0xfd;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){switch(Temp){case 0xe0:KeyValue=4;break;case 0xd0:KeyValue=5;break;case 0xb0:KeyValue=6;break;case 0x70:KeyValue=7;break;}}}Display(KeyValue);P3=0xfb;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){DelayTime_10ms(2);P3=0xfb;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){switch(Temp){case 0xd0:KeyValue=9;break;case 0xb0:KeyValue=10;break;case 0x70:KeyValue=11;break;}}}Display(KeyValue);P3=0xf7;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){DelayTime_10ms(2);P3=0xf7;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){switch(Temp){case 0xe0:KeyValue=12;break;case 0xd0:KeyValue=13;break;case 0xb0:KeyValue=14;break;case 0x70:KeyValue=15;break;}}}Display(KeyValue);}}7,共阳数码管1位#include<reg52.h>void delay(int);int a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; void main(){int m;while(1){for(m=0;m<16;m++){P0=a[m];delay(500);}}}void delay(int z){int i,j;for(i=z;i>0;i--)for(j=100;j>0;j--);}8,共阳数码管2位#include<reg52.h>void delay(int);int a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; int b[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void main(){int m,n;while(1){for(n=0;n<10;n++){P0=a[n];for(m=0;m<10;m++){P3=b[m];delay(500);}}}}void delay(int z){int i,j;for(i=z;i>0;i--)for(j=100;j>0;j--);}9,定时器控制闪烁灯#include<reg52.h>void main(){TMOD=0x01;ET0=1;EA=1;TR0=1;TH0=65286/256;TL0=65286%256;while(1){;}}void INT() interrupt 1{TH0=65286/256;TL0=65286%256;P0=!P0;}10,计数器控制按键加1显示#include<reg52.h>int a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; sbit key01=P2^7;sbit key02=P2^6;sbit key=P3^4;int n=0;void main(){TMOD=0x05;ET0=1;EA=1;TR0=1;TH0=65535/256;TL0=65535%256;while(1){void Int1();P0=0;key01=1;key01=0;P0=a[n];key02=1;}}void INT() interrupt 1 {TH0=65535/256;TL0=65535%256;n++;}11,延时的闪烁灯#include<reg51.h>#include<intrins.h>#define N 400void delay(int);void main (){char a;a=0xfe;while(1){P0=a;delay(N);a=_crol_(a,1);delay(N);}}void delay(int c){int i,j;for(i=c;i>0;i--)for(j=100;j>0;j--);}12,脉冲4下灯亮#include<reg51.h>sbit led0=P0^0;void main(){TMOD=0x06;TH0=0;TL0=0;TR0=1;EA=1;ET0=1;while(1){led0=0;}}void Count_Timer0() interrupt 1 {led0=0;}13,用中断控制流水灯#include<reg51.h>#include<intrins.h>int num,aa;void main(){ TMOD=0X01;TH0=(65536-45872)/256;TL0=(65536-45872)%256;EA=1;ET0=1;TR0=1;aa=0xfe;P0=aa;while(1);}void t0_time() interrupt 1{ TH0=(65536-45872)/256;TL0=(65536-45872)%256;num++;if(num==20){num=0;aa=_crol_(aa,1);P0=aa;}}14,倒计时5分钟#include <reg51.h>sbit Seg_Position_Select=P2^7;sbit Seg_Code_Select=P2^6;unsigned char Display_One=0;unsigned char Display_Ten=0;unsigned char Second=0;unsigned char Minute=5;unsigned char Table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71} ;void DelayTime_10ms(unsigned int DelayValue){unsigned int a,b;for(a=0;a<DelayValue;a++)for(b=0;b<182;b++);}void Display( ){unsigned char Dis_Second_High=0;unsigned char Dis_Second_Low=0 ;unsigned char Dis_Minute_High=0;unsigned char Dis_Minute_Low=0 ;Dis_Minute_High=Minute/10;Dis_Minute_Low=Minute%10;Dis_Second_Low=Second%10;Dis_Second_High=Second/10; P0=0xfe;Seg_Position_Select=1;Seg_Position_Select=0;P0=Table[Dis_Minute_High]; Seg_Code_Select=1;Seg_Code_Select=0; DelayTime_10ms(1);P0=0xfd;Seg_Position_Select=1;Seg_Position_Select=0;P0=Table[Dis_Minute_Low]; Seg_Code_Select=1;Seg_Code_Select=0; DelayTime_10ms(1);P0=0xFb;Seg_Position_Select=1;Seg_Position_Select=0;P0=0X40;Seg_Code_Select=1;Seg_Code_Select=0; DelayTime_10ms(1);//////////////////////////////////P0=0xf7;Seg_Position_Select=1;Seg_Position_Select=0;P0=0X40;Seg_Code_Select=1;Seg_Code_Select=0; DelayTime_10ms(1);P0=0xef;Seg_Position_Select=1;Seg_Position_Select=0;P0=Table[Dis_Second_High]; Seg_Code_Select=1;Seg_Code_Select=0; DelayTime_10ms(1);P0=0xdf;Seg_Position_Select=1;Seg_Position_Select=0;P0=Table[Dis_Second_Low]; Seg_Code_Select=1;Seg_Code_Select=0;DelayTime_10ms(1);}int Count=0;void main(){int i=0;TMOD=0x10;TH1=0x3c;TL1=0xb0;TR1=1;EA=1;ET1=1;while(1){Display();}}void Timer1_Irq() interrupt 3 {TH1=0x3c;TL1=0xb0;Count++;if(Count==20){Second--;if(Second==0xff){Second=59;if(Minute--==0){Second=Minute=0;}}Count=0;}}。
100例程序设计范例汇总第一章 (4)【实例1】使用累加器进行简单加法运算: (4)【实例2】使用B寄存器进行简单乘法运算: (4)【实例3】通过设置RS1,RS0选择工作寄存器区1: (4)【实例4】使用数据指针DPTR访问外部数据数据存储器: (4)【实例5】使用程序计数器PC查表: (4)【实例6】IF语句实例: (4)【实例7】SWITCH-CASE语句实例: (4)【实例8】FOR语句实例: (4)【实例9】WHILE语句实例: (5)【实例10】DO...WHILE语句实例: . (5)【实例11】语句形式调用实例: (5)【实例12】表达式形式调用实例: (5)【实例13】以函数的参数形式调用实例: (5)【实例14】函数的声明实例: (5)【实例15】函数递归调用的简单实例: (5)【实例16】数组的实例: (6)【实例17】指针的实例: (6)【实例18】数组与指针实例: (6)【实例19】P1口控制直流电动机实例 (6)第二章 (8)【实例20】用74LS165实现串口扩展并行输入口 (8)【实例21】用74LS164实现串口扩展并行输出口 (10)【实例22】P0I/O扩展并行输入口 (12)【实例23】P0I/O扩展并行输出口 (12)【实例24】用8243扩展I/O端口 (12)【实例25】用8255A扩展I/O口 (14)【实例26】用8155扩展I/O口 (19)第三章 (26)【实例29】与AT24系列EEPROM接口及驱动程序 (26)【实例30】EEPROM(X5045)接口及驱动程序 (30)【实例31】与铁电存储器接口及驱动程序 (33)【实例32】与双口RAM存储器接口及应用实例 (35)【实例33】与NANDFLASH(K9F5608)接口及驱动程序 (35)第四章 (43)【实例34】独立键盘控制 (43)【实例35】矩阵式键盘控制 (44)【实例36】改进型I/O端口键盘 (46)【实例37】PS/2键盘的控制 (49)【实例39】段数码管(HD7929)显示实例 (54)【实例40】16×2字符型液晶显示实例 (55)【实例41】点阵型液晶显示实例 (61)【实例42】LCD显示图片实例 (63)第五章 (70)【实例43】简易电子琴的设计 (70)【实例44】基于MCS-51单片机的四路抢答器 (71)【实例45】电子调光灯的制作 (76)【实例46】数码管时钟的制作 (81)【实例47】LCD时钟的制作 (96)【实例48】数字化语音存储与回放 (103)【实例49】电子标签设计 (112)第六章 (120)【实例50】指纹识别模块 (121)【实例51】数字温度传感器 (121)第七章 (124)【实例53】超声波测距 (124)【实例54】数字气压计 (125)【实例55】基于单片机的电压表设计 (132)【实例56】基于单片机的称重显示仪表设计 (133)【实例57】基于单片机的车轮测速系统 (136)第八章 (138)【实例58】电源切换控制 (138)【实例59】步进电机控制 (140)【实例60】单片机控制自动门系统 (141)【实例61】控制微型打印机 (144)【实例62】单片机控制的EPSON微型打印头 (144)【实例63】简易智能电动车 (145)【实例64】洗衣机控制器 (149)第九章 (152)【实例65】串行A/D转换 (152)【实例66】并行A/D转换 (153)【实例67】模拟比较器实现A/D转换 (154)【实例68】串行D/A转换 (155)【实例69】并行电压型D/A转换 (156)【实例70】并行电流型D/A转换 (156)【实例71】2I C接口的A/D转换 (157)【实例72】2I C接口的D/A转换 (161)【实例73】单片机间双机通信 (164)【实例74】单片机间多机通信方法之一 (166)【实例75】单片机间多机通信方法之二 (171)【实例76】PC与单片机通信 (176)【实例77】红外通信接口 (178)第十一章 (180)【实例79】单片机实现PWM信号输出 (180)【实例80】实现基于单片机的低频信号发生器 (182)【实例81】软件滤波方法 (183)【实例82】FSK信号解码接收 (186)【实例83】单片机浮点数运算实现 (187)【实例84】神经网络在单片机中的实现 (192)【实例85】信号数据的FFT变换 (194)第十二章 (198)【实例86】2I C总线接口的软件实现 (198)【实例87】SPI总线接口的软件实现 (200)【实例88】1-WIRE总线接口的软件实现 (205)【实例89】单片机外挂CAN总线接口 (207)【实例90】单片机外挂USB总线接口 (210)【实例91】单片机实现以太网接口 (214)【实例92】单片机控制GPRS传输 (221)【实例93】单片机实现TCP/IP协议 (223)第十三章 (229)【实例94】读写U盘 (229)【实例95】非接触IC卡读写 (234)【实例96】SD卡读写 (238)【实例97】高精度实时时钟芯片的应用 (242)第十四章 (247)【实例98】智能手机充电器设计 (247)【实例99】单片机控制门禁系统 (248)第一章【实例1】使用累加器进行简单加法运算:MOV A,#02H ;A←2ADD A,#06H ;A←A+06H【实例2】使用B寄存器进行简单乘法运算:MOV A,#02H ; A←2MOV B,#06H ; B←6MUL AB ; BA←A*B=6*2【实例3】通过设置RS1,RS0选择工作寄存器区1:CLR PSW.4 ; PSW.4←0SETB PSW.5 ; PSW.5←1【实例4】使用数据指针DPTR访问外部数据数据存储器:MOV DPTR, #data16 ; DPTR←data16MOVX A, @ DPTR ; A←((DPTR))MOVX @ DPTR, A ; (DPTR)←A【实例5】使用程序计数器PC查表:MOV A, #data ;A←dataMOVC A, @ A+DPTR ; PC←(PC)+1 ,A←((A)+(PC)) 【实例6】if语句实例:void main(){ int a,b,c,min;printf("\n please input three number:");scanf("%d%d%d ",&a,&b,&c);if(a<b&&a<c) printf("min=%d\n",a );else if(b<a&&b<c) printf("min=%d\n",b);else if(c<a&&c<c) printf("min=%d\n",c);else printf("There at least two numbers are equal\n");}【实例7】switch-case语句实例:void main(){ int num; printf("input one number:");scanf("%d",& num);switch(num){ case 1: printf("num =%d\n", num);break;case 2: printf("num =%d\n", num);break;case 3: printf("num =%d\n", num);break;case 4: printf("num =%d\n", num);break;default: printf("The number is out of the range\n", num);}}【实例8】for语句实例:void main(){ for(int a=10;n>0;a --)printf("%d",a);}【实例9】while语句实例:void main(){ int i=0;while(i<=10) i++;}【实例10】do…while语句实例:void main(){ int i=0;do{ i++;}while(i<=10);}【实例11】语句形式调用实例:void main(){ int i=0; while(i<=10) i++; ……Sum(); /*函数调用*/}【实例12】表达式形式调用实例:void main(){ int a,b,i=0; while(i<=10) i++; ……i=4*Sum(a,b); /*函数调用*/}【实例13】以函数的参数形式调用实例:void main(){ int a,b,c,i=0; while(i<=10) i++; ……i= max(c,Sum(a,b)); /*函数调用*/ }【实例14】函数的声明实例:void main(){ int max(int x,int y); /*函数的声明*/ int a,b,c,i=0; while(i<=10) i++; ……i= max(c,Sum(a,b)); /*函数调用*/ }【实例15】函数递归调用的简单实例:void fun(){ int a=1, result,i;for(i=0;i<10;){ i=a+I;result = fun(); /*函数调用*/}return result;}【实例16】数组的实例:void main(){ char num[3] [3]={{ '','#',''},{'#','','#'},{'','#',''}}; /*定义多维数组*/ int i=0,j=0;for(;i<3;i++){ for(;j<3;j++) printf(“%c”,num[i][j]);printf(“/n”);}【实例17】指针的实例:void main(){ int a=3,*p;p=&a; /*将变量a的地址赋值给指针变量p*/printf(“%d,%d”,a,*p); /*输出二者的数值进行对比*/}【实例18】数组与指针实例:void main(){ int i=3,num[3]={1,2,3},*p;p=num; /*将数组num[]的地址赋值给指针变量p*/result =max(p,3); /*函数调用,计算数组的最大值*/}【实例19】P1口控制直流电动机实例sfr p1=0x90;sbit p10=p1^0;sbit p11=p1^1;void main (){int i, m;int j=100;int k=20;// 正快转for (i=0; i<100; i++){P10=1;for (j=0; j<50; j++){m=0;}}P10=0;for (j=0; j<10; j++){m=0}//正慢转for (i=0; i<100; i++) {P10=1;for (j=0; j<10; j++) {m=0}}p10=0;for (j=0; j<50; j++) {m=0}// 负快转for (i=0; i<100; i++) {p11=1;for (j=0; j<50; j++) {m=0;}}p11=0;for (j=0; j<10; j++) {m=0;}// 负慢转for (i=0; i<100; i++) {p11=1;for (j=0;j<10;j++) {m=0;}}p11=0for (j=0; j<50; j++) {m=0;}}第二章【实例20】用74LS165实现串口扩展并行输入口(1)函数声明管脚定义//---------------------------------------库函数声明,管脚定义------------------------------------------ #include<reg52.h>sbit LOAD=P1^7;//用P1^7控制SH/ 管脚(2)串口初始化函数UART_init()//-------------------------------------------------------------------------------------------------------------- // 函数名称:UART_init()// 功能说明:串口初始化,设定串口工作在方式0//-------------------------------------------------------------------------------------------------------------- void UART_init(void){SCON=0x10;//设串行口方式0,允许接收,启动接收过程ES=0;//禁止串口中断}(3)数据接收函数PA()//-------------------------------------------------------------------------------------------------------------- // 函数名称:PA()// 输入参数:无// 输出参数:返回由并口输入的数据// 功能说明:接收八位串行数据//-------------------------------------------------------------------------------------------------------------- unsigned char PA(void){unsigned char PA_data;LOAD=0;//当P1.7输出低电平,74LS165将并行数据装入寄存器//当中LOAD=1;//当P1.7输出高电平,74LS165在时钟信号下进行移位UART_init();//74LS165工作在时钟控制下的串行移位状态while(RI==0);//循环等待RI=0;PA_data=SBUF;return PA_data;//返回并行输入的数据}(1)函数声明管脚定义//---------------------------------------库函数声明,管脚定义------------------------------------------ #include<reg52.h>sbit a7=ACC^7;sbit simuseri_CLK=P1^6;//用P1^6模拟串口时钟sbit simuseri_DATA=P1^5;//用P1^5模拟串口数据sbit drive74165_LD=P1^7;//用P1^7控制SH/ 管脚(2)数据输入函数in_simuseri()//-------------------------------------------------------------------------------------------------------------- // 函数名称:in_simuseri()// 输入参数:无// 输出参数:data_buf// 功能说明:8位同位移位寄存器,将simuseri_DATA串行输入的数据按从低位到// 高位// 保存到data_buf//-------------------------------------------------------------------------------------------------------------- unsigned char in_simuseri(void){unsigned char i;unsigned char data_buf;i=8;do{ACC=ACC>>1;for(;simuseri_CLK==0;);a7= simuseri_DA TA;for(;simuseri_CLK==1;);}while(--i!=0);simuseri_CLK=0;data_buf=ACC;return(data_buf);}(3)数据输出函数PAs()//-------------------------------------------------------------------------------------------------------------- // 函数名称:PAs()// 输入参数:无// 输出参数:PAs _buf,返回并行输入74LS165的数据// 功能说明:直接调用,即可读取并行输入74LS165的数据,不需要考虑74LS165的// 工作原理//--------------------------------------------------------------------------------------------------------------unsigned char PAs(void){unsigned char PAs_buf;drive74165_LD=0;drive74165_LD=1;PAs_buf= in_simuseri();return(PAs_buf);}【实例21】用74LS164实现串口扩展并行输出口单片机串口驱动74LS164的程序主要包括函数声明管脚定义部分、串口初始化函数以及数据发送函数。
第1题:i/o口,int0外部中断,停止继续ORG 0000HLJMP S TARTORG 0003HLJMP P INT0ORG 001BHLJMP P TI1START: MOV TMOD,#10HMOV SCON,#00HMOV TH1,#03CHMOV TL1,#0B0HMOV R4,#00HMOV R5,#10MOV DPTR,#TABSETB E ASETB E X0SETB I T0SETB E T1SETB T R1DISP: MOV A,R4MOV B,#10DIV ABMOVC A,@A+DPTRMOV SBUF,ALCALL DELAYJNB TI,$CLR TISETB P1.0CLR P1.1MOV A,BMOVC A,@A+DPTRMOV SBUF,ALCALL DELAYJNB TI,$CLR TISETB P1.1CLR P1.0LJMP D ISPPTI1: DJNZ R5,JIXUMOV R5,#10INC R4CJNE R4,#61,JIXUMOV R4,#0JIXU: MOV TH1,#03CHMOV TL1,#0B0HRETIPINT0:CPL TR1RETIDELAY:MOV R1,#200DJNZ R1,$RETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H, 7FH,6FHEND外驱第2题:i/o口,延时0.5秒,0—ff Int0外部中断,停止继续ORG 0000HLJMP STARTORG 0003HLJMP INTV1ORG 001BHLJMP TIME1START:MOV TMOD,#10HMOV SCON,#00HSETB EX0SETB IT0SETB EAMOV TH1,#3CHMOV TL1,#0B0HSETB ET1SETB TR1SETB EAMOV R4,#0MOV R5,#10CLR P1.0CLR P1.1BBB:SETB P1.0MOV DPTR,#TABMOV A,R4ANL A,#0FHMOVC A,@A+DPTRMOV SBUF,ALCALL DELAYCLR P1.0SETB P1.1MOV A,R4SWAP AANL A,#0FHMOVC A,@A+DPTRMOV SBUF,ALCALL DELAYCLR P1.1SJMP BBBDELAY:MOV R3,#200DJNZ R3,$RET TIME1:DJNZ R5,AAAMOV R5,#10INC R4CJNE R4,#0FFH,AAAMOV R4,#00HAAA: MOV TH1,#3CHMOV TL1,#0B0HSETB TR1RETIINTV1:CPL TR1RETITAB:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71HEND外驱第4题:定时器Ti工作在技术方式。
独立按键#include<reg52。
h>#define uchar unsigned char#define uint unsigned intsbit P27=P2^7;sbit K5=P1^4;sbit fmq=P3^6;uchar num;unsigned char code s8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};void delay1ms(uint i){uchar j;while(i—-){for(j=0;j<115;j++) //1ms基准延时程序{;}}}void beep() //产生1KHZ频率声音的函数{fmq=0;delay500us();fmq=1;delay500us();}void delay500us(){unsigned char j;for(j=0;j<57;j++) //500us基准延时程序 {;}}void main(){ uchar t;P27=0;while(1){if(K5==0){delay1ms(15);if(K5==0){for(t=0;t〈100;t++){ beep();}num=num+1;if(num==16){num=0;}while(!K5);//等待按键释放}}P0=s8[num];}}#include<reg52.h>#define uchar unsigned char //数据类型的宏定义#define uint unsigned int //数据类型的宏定义sbit P27=P2^7;unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF};//共阳数码管显示字型码数组 1011 1111 "—”void delay1ms(uint i){uchar j;while(i--){for(j=0;j<115;j++); //1ms基准延时程序}}void display(unsigned char i){P27=0; //选通最有端的数码管显示P0=table[i]; //显示i参数传来的字型码}void main(void){unsigned char temp;display(16); //初始显示 "-"while(1){P1=0xff; //先向P1口写1;端口读状态P1=0xf0;temp=P1;if(temp!=0xf0){delay1ms(15);if(temp!=0xf0){P1=0xfe;temp=P1;switch(temp){case(0xee):display(0);break;case(0xde):display(1);break;case(0xbe):display(2);break;case(0x7e):display(3);break;}P1=0xfd;temp=P1;switch(temp){case(0xed):display(4);break;case(0xdd):display(5);break;case(0xbd):display(6);break;case(0x7d):display(7);break;}P1=0xfb;temp=P1;switch(temp){case(0xeb):display(8);break;case(0xdb):display(9);break;case(0xbb):display(10);break;case(0x7b):display(11);break;}P1=0xf7;temp=P1;switch(temp){case(0xe7):display(12);break;case(0xd7):display(13);break;case(0xb7):display(14);break;case(0x77):display(15);break;}}}}}/*行线接P1.0-P1。
1.用C51实现片内RAM的30H和31H地址单元中的数据相加,保存到32H单元中。
#include <absacc.h>#define a DBYTE[0x30]#define b DBYTE[0x31]#define c DBYTE[0x32]void main( ){c=a+b;}2.用C51语言实现给片内RAM的30H地址单元赋值为CDH(内存赋值)。
#include <absacc.h>#define a DBYTE[0x30]void main( ){a=0xCD;}3.编写程序,将单片机片外2000H为首地址的连续10个单元的内容,读入到片内RAM的40H~49H单元中。
#include <absacc.h>.void main( ){unsigned char i;for(i=0;1<10;i++){XBYTE[0x2000+i]=i;DBYTE[0x40+i]=XBYTE[0x2000+i];}}4.有符号数比较大小假设在片内RAM的30H单元中,储存的有符号数据是m,在片内RAM的30H 中存储的有符号数是n,比较这两个数的大小,并将较大的数保存在片内RAM的30H单元中,较小的数保存在片内RAM的31H单元中。
#incliude <absacc.h>#define m DBYTE[0x30]#define n DBYTE[0x31]#define a DBYTE[0x32]void main( ){m=-6;n=-5;if(m<n){a=m;m=n;n=a;}5.比较大小将片内RAM的30H~39H单元中的数据分别赋值成0~9,然后对其进行比较,将最大值存入片内3AH的单元中。
#include <absacc.h>void main( ){unsigned char i;for(i=0;i<10;i++)DBYTE[0x30+i]=i;DBYTE[0x3a]= DBYTE[0x30];for(i=0;i<10;i++)if(DBYTE[0x3a]<DBYTE[0x30+i])DBYTE[0x3a]=DBYTE[0x30+i];}6.ASCII码16进制数若一个十六进制数的ASCII码,存于片内RAM的30H单元,请把该ASCII码对应十六进制数,存于片内RAM的31H单元中。
单片机复习程序1、从左到右的流水灯/* 名称:从左到右的流水灯说明:接在P0 口的8 个LED从左到右循环依次点亮,产生走马灯效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){P0=0xfe;while(1){P0=_crol_(P0,1); //P0 的值向左循环移动DelayMS(150);}}2、交通灯/* 名称:LED 模拟交通灯说明:东西向绿灯亮若干秒,黄灯闪烁5 次后红灯亮,红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5 此后变红灯,东西向变绿灯,如此重复。
*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit RED_A=P0^0; //东西向灯sbit YELLOW_A=P0^1;sbit GREEN_A=P0^2;sbit RED_B=P0^3; //南北向灯sbit YELLOW_B=P0^4;sbit GREEN_B=P0^5;uchar Flash_Count=0,Operation_Type=1; //闪烁次数,操作类型变量//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}//交通灯切换void Traffic_Light(){switch(Operation_Type){case 1: //东西向绿灯与南北向红灯亮RED_A=1;YELLOW_A=1;GREEN_A=0;RED_B=0;YELLOW_B=1;GREEN_B=1;DelayMS(2000);Operation_Type=2;break;case 2: //东西向黄灯闪烁,绿灯关闭DelayMS(300);YELLOW_A=~YELLOW_A;GREEN_A=1; if(++Flash_Count!=10) return; //闪烁5 次Flash_Count=0;Operation_Type=3;break;case 3: //东西向红灯,南北向绿灯亮RED_A=0;YELLOW_A=1;GREEN_A=1; RED_B=1;YELLOW_B=1;GREEN_B=0; DelayMS(2000);Operation_Type=4;break;case 4: //南北向黄灯闪烁5 次DelayMS(300);YELLOW_B=~YELLOW_B;GREEN_B=1; if(++Flash_Count!=10) return;Flash_Count=0;Operation_Type=1;}}//主程序void main(){while(1) Traffic_Light();}3、定时器控制交通指示灯/* 名称:定时器控制交通指示灯说明:东西向绿灯亮5s 后,黄灯闪烁,闪烁5 次亮红灯,红灯亮后,南北向由红灯变成绿灯,5s 后南北向黄灯闪烁,闪烁5 次后亮红灯,东西向绿灯亮,如此往复。
单片机程序大全(以下是一个以“单片机程序大全”为题目的文章范例,依据题目性质并非一个合同或作文的格式。
请注意,这个范例只是为了明示写作格式的变化,并非提供一个实际的单片机程序大全。
)单片机程序大全本文将为大家提供一个全面的单片机程序大全,涵盖了各种常见的单片机应用。
希望本文能够对单片机程序的学习和实践有所帮助。
一、LED灯程序LED灯是一个常见的单片机实验项目。
以下是一个基本的LED灯闪烁程序的代码,使用C语言编写:```c#include <reg51.h>#define LED P0void delay(int time) {int i, j;for (i = 0; i < time; i++) {for (j = 0; j < 10000; j++) {; // 空循环,用于延时}}}void main() {while (1) {LED = 0xFF; // 所有LED灯亮delay(1000); // 延时1秒LED = 0x00; // 所有LED灯灭delay(1000); // 延时1秒}}```二、温度监测程序单片机可以用于温度监测,以下是一个简单的温度监测程序的代码示例,使用C语言编写:```c#include <reg51.h>#define TEMP P1void delay(int time) {int i, j;for (i = 0; i < time; i++) {for (j = 0; j < 10000; j++) {; // 空循环,用于延时}}}void main() {while (1) {if (TEMP > 30) {P0 = 0x01; // 温度过高,亮起警示灯 } else {P0 = 0x00; // 温度正常,灭掉警示灯 }delay(100); // 延时0.1秒}}```三、电机控制程序单片机常用于电机控制,以下是一个电机正反转控制程序的代码示例,使用C语言编写:```c#include <reg51.h>#define MOTOR P2void delay(int time) {int i, j;for (i = 0; i < time; i++) {for (j = 0; j < 10000; j++) {; // 空循环,用于延时}}}void main() {while (1) {MOTOR = 0x01; // 电机正转delay(1000); // 延时1秒MOTOR = 0x02; // 电机反转delay(1000); // 延时1秒}}```以上仅是三个简单的单片机程序示例,单片机的应用非常广泛,包括但不限于LED灯闪烁、温度监测、电机控制等。
单片机程序大全(29页)在单片机程序设计领域,有许多常用的程序,可以用于各种不同的应用。
本文将为您介绍一些常见的单片机程序,并提供相应的代码示例。
这些程序将涵盖从基本的输入/输出操作到复杂的控制算法。
无论您是初学者还是有一定经验的开发人员,我们相信本文都会对您有所帮助。
I. LED控制程序LED控制程序是单片机程序设计的基础,也是许多初学者的入门项目。
下面是一个简单的LED控制程序示例:```c#include <reg51.h>void delay(unsigned int milliseconds) {unsigned int i, j;for(i = 0; i < milliseconds; i++) {for(j = 0; j < 1000; j++);}}void main() {while(1) {P1 = 0xFF; // 将P1口的所有引脚设置为高电平(点亮LED)delay(1000); // 延时1秒P1 = 0x00; // 将P1口的所有引脚设置为低电平(熄灭LED)delay(1000); // 延时1秒}}```上述程序通过控制单片机的I/O口,实现了LED的闪烁效果。
其中,`delay`函数用于延时一定的时间,通过循环等待的方式实现。
II. 温度传感器数据采集程序许多实际应用中,我们需要使用温度传感器来采集环境温度数据。
下面是一个简单的温度传感器数据采集程序示例:```c#include <reg51.h>unsigned char readTemperature() {unsigned char temperature;// 温度传感器数据采集代码...// 在此省略实际的数据采集操作,以及与温度传感器通信的代码 // 假设最终采集到的温度数据存储在temperature变量中return temperature;}void main() {unsigned char temperature;while(1) {temperature = readTemperature();// 对温度数据进行处理和显示的代码...// 在此省略实际的数据处理和显示操作,以及与显示设备通信的代码}}```上述程序通过`readTemperature`函数模拟温度传感器的数据采集,并将采集到的温度数据存储在`temperature`变量中。
名称:定时器0#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED=P1^2; //定义LED端口/*-----------------------定时器初始化子程序------------*/void Init_Timer0(void){TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TH0=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出TL0=0x00;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}/*--------主程序-----------*/main(){Init_Timer0();while(1);}/*--------- 定时器中断子程序--------*/void Timer0_isr(void) interrupt 1 using 1{TH0=0x00; //重新赋值TL0=0x00;LED=~LED; //指示灯反相,可以看到闪烁}/*---------- 名称:定时器1----*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED=P1^2; //定义LED端口/*---定时器初始化子程序----*/void TIM2Inital(void){RCAP2H = (65536-60000)/256;//晶振12M 10ms 16bit 自动重载RCAP2L = (65536-60000)%256;ET2=1; //打开定时器中断EA=1; //打开总中断TR2=1; //打开定时器开关}/*-----主程序---*/main(){TIM2Inital();while(1);}/*--------定时器中断子程序-----*/void TIM2(void) interrupt 5 using 1//定时器2中断{TF2=0;LED=~LED; //指示灯反相}名称:外部中断0电平触发#include<reg52.h>/*------主程序-*/main(){P1=0x55; //P1口初始值EA=1; //全局中断开EX0=1; //外部中断0开IT0=0; //电平触发while(1){//在此添加其他程序}}/*---------外部中断程序--------*/void ISR_Key(void) interrupt 0 using 1{P1=~P1;}名称:外部中断1#include<reg52.h>main(){P1=0x55; //P1口初始值EA=1; //全局中断开EX1=1; //外部中断0开IT1=1; //边沿触发,IT1=0表示电平触发while(1){//在此添加其他程序}}/*-------外部中断程序-*/void ISR_Key(void) interrupt 2 using 1{//在此处可以添加去抖动程序,防止按键抖动造成错误P1=~P1;}名称:遥控器红外解码LCD1602液晶显示#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的#include<stdio.h>#include<intrins.h>#define TURE 1#define FALSE 0sbit IR=P3^2; //红外接口标志sbit RS = P2^4;//Pin4sbit RW = P2^5;//Pin5sbit E = P2^6;//Pin6#define Data P0//数据端口unsigned int hour,minute,second,count;char code Tab[16]="0123456789ABCDEF";char data TimeNum[]=" ";char data Test1[]=" ";/* 变量声明*/unsigned char irtime;//红外用全局变量bit irpro_ok,irok;unsigned char IRcord[4]; //处理后的红外码,分别是客户码,客户码,数据码,数据码反码unsigned char irdata[33]; //33个高低电平的时间数据/* 函数声明*/void Ir_work(void);void Ircordpro(void);void ShowString (unsigned char line,char *ptr);/* 定时器0中断服务函数*/void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数{irtime++; //用于计数2个下降沿之间的时间}/* 外部中断0函数*/void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数{static unsigned char i; //接收红外信号处理static bit startflag; //是否开始处理标志位if(startflag){if(irtime<63&&irtime>=33)//引导码TC9012的头码,9ms+4.5msi=0;irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1irtime=0;i++;if(i==33){irok=1;i=0;}}else{irtime=0;startflag=1;}}/* 定时器0初始化*/void TIM0init(void)//定时器0初始化{TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //重载值TL0=0x00; //初始化值ET0=1; //开中断TR0=1;}/* 外部中断初始化*/void EX0init(void){IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)EX0 = 1; //使能外部中断EA = 1; //开总中断}/* 红外键值处理*/void Ir_work(void) //红外键值散转程序{TimeNum[5] = Tab[IRcord[0]/16]; //处理客户码并显示TimeNum[6] = Tab[IRcord[0]%16];TimeNum[8] = Tab[IRcord[1]/16]; //处理客户码并显示TimeNum[9] = Tab[IRcord[1]%16];TimeNum[11] = Tab[IRcord[2]/16]; //处理数据码并显示TimeNum[12] = Tab[IRcord[2]%16];TimeNum[14] = Tab[IRcord[3]/16]; //处理数据反码并显示TimeNum[15] = Tab[IRcord[3]%16];ShowString(1,TimeNum);//显示处理过后的码值irpro_ok=0; //处理完成后清楚标志位}/* 红外解码函数处理*/void Ircordpro(void)//红外码值处理函数{unsigned char i, j, k;unsigned char cord,value;k=1;for(i=0;i<4;i++) //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k];if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差{value=value|0x80;}else{value=value;}if(j<8){value=value>>1;}k++;}IRcord[i]=value;value=0;} irpro_ok=1;//处理完毕标志位置1}/* 微秒延时函数*/void DelayUs(unsigned char us)//delay us{unsigned char uscnt;uscnt=us>>1;/* Crystal frequency in 12MHz*/while(--uscnt);}/* 毫秒函数声明*/void DelayMs(unsigned char ms)//delay Ms{while(--ms){DelayUs(250);DelayUs(250);DelayUs(250);DelayUs(250);}}/* 写入命令函数*/void WriteCommand(unsigned char c){DelayMs(5);//操作前短暂延时,保证信号稳定E=0;RS=0;RW=0;_nop_();E=1;Data=c;E=0;}/*写入数据函数*/void WriteData(unsigned char c){DelayMs(5); //操作前短暂延时,保证信号稳定E=0;RS=1;RW=0;_nop_();E=1;Data=c;E=0;RS=0;}/*写入字节函数*/void ShowChar(unsigned char pos,unsigned char c) {unsigned char p;if (pos>=0x10)p=pos+0xb0; //是第二行则命令代码高4位为0xc elsep=pos+0x80; //是第二行则命令代码高4位为0x8 WriteCommand (p);//写命令WriteData (c); //写数据}/*写入字符串函数*/void ShowString (unsigned char line,char *ptr){unsigned char l,i;l=line<<4;for (i=0;i<16;i++)ShowChar (l++,*(ptr+i));//循环显示16个字符}/* 初始化函数*/void InitLcd(){DelayMs(15);WriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x06); //显示光标移动位置WriteCommand(0x0c); //显示开及光标设置WriteCommand(0x01); //显示清屏}/*主函数*/void main(void){EX0init(); //初始化外部中断TIM0init();//初始化定时器InitLcd(); //初始化液晶DelayMs(15);sprintf(Test1," "); //显示第一行固定信息ShowString(0,Test1);sprintf(TimeNum,"Code ");//显示第二行固定信息ShowString(1,TimeNum);while(1)//主循环{if(irok) //如果接收好了进行红外处理{Ircordpro();irok=0;}if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键显示对应的数字等{Ir_work();}}}/*-----------------------------------------------名称:遥控器红外解码数码管显示#include<reg52.h>#include<stdio.h>#include<intrins.h>#define TURE 1#define FALSE 0sbit IR=P3^2; //红外接口标志unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*变量声明*/unsigned char irtime;//红外用全局变量bit irpro_ok,irok;unsigned char IRcord[4];unsigned char irdata[33];/* 函数声明*/void Delay(unsigned char mS);void Ir_work(void);void Ircordpro(void);/*定时器0中断服务函数*/void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数{irtime++; //用于计数2个下降沿之间的时间}/*外部中断0函数*/void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数{static unsigned char i; //接收红外信号处理static bit startflag; //是否开始处理标志位if(startflag){if(irtime<63&&irtime>=33)//引导码TC9012的头码,9ms+4.5msi=0;irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1irtime=0;i++;if(i==33){irok=1;i=0;}}else{irtime=0;startflag=1;}}/* 定时器0初始化*/void TIM0init(void)//定时器0初始化{TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //重载值TL0=0x00; //初始化值ET0=1; //开中断TR0=1;}/*外部中断初始化*/void EX0init(void){IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)EX0 = 1; //使能外部中断EA = 1; //开总中断}/*红外键值处理*/void Ir_work(void)//红外键值散转程序{switch(IRcord[2])//判断第三个数码值{case 0:P0=dofly[1];break;//1 显示相应的按键值case 1:P0=dofly[2];break;//2case 2:P0=dofly[3];break;//3case 3:P0=dofly[4];break;//4case 4:P0=dofly[5];break;//5case 5:P0=dofly[6];break;//6case 6:P0=dofly[7];break;//7case 7:P0=dofly[8];break;//8case 8:P0=dofly[9];break;//9}irpro_ok=0;//处理完成标志}/* 红外解码函数处理*/void Ircordpro(void)//红外码值处理函数{unsigned char i, j, k;unsigned char cord,value;k=1;for(i=0;i<4;i++) //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k];if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差{value=value|0x80;}else{value=value;}if(j<8){value=value>>1;}k++;}IRcord[i]=value;value=0;} irpro_ok=1;//处理完毕标志位置1}void main(void){EX0init(); //初始化外部中断TIM0init();//初始化定时器P2=0x00;//1位数码管全部显示while(1)//主循环{if(irok) //如果接收好了进行红外处理{Ircordpro();irok=0;}if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等{Ir_work();}}}名称:与电脑串口通信内容:连接好串口或者usb转串口至电脑,下载该程序,打开电源打开串口调试程序,将波特率设置为9600,无奇偶校验晶振11.0592MHz,发送和接收使用的格式相同,如都使用字符型格式,在发送框输入hello,I Love MCU ,在接收框中同样可以看到相同字符,说明设置和通信正确#include<reg52.h> /void main (void){SCON = 0x50; /* SCON: 模式1, 8-bit UART, 使能接收*/ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */TH1 = 0xFD; /* TH1: reload value for 9600 baud @ 11.0592MHz */ TR1 = 1; /* TR1: timer 1 run */ EA = 1; /*打开总中断*/ES = 1; /*打开串口中断*/while (1) /*主循环不做任何动作*/{}}*/串口中断程序*/void UART_SER (void) interrupt 4 //串行中断服务程序{unsigned char Temp; //定义临时变量if(RI) //判断是接收中断产生{RI=0; //标志位清零Temp=SBUF; //读入缓冲区的值P1=Temp; //把值输出到P1口,用于观察SBUF=Temp; //把接收到的值再发回电脑端}if(TI) //如果是发送标志位,清零TI=0;}/*-----------------------------------------------名称:红外收发内容:*红外测试程序,用单片机通过发射管发射38K的调制频率码,由一体化接收并解码由发光管显示。