单片机程序清单
51单片机常见程序,附带注释
51单片机常见程序,附带注释51 单片机常见程序附带注释三位数分离成3个一位数,截取bai=num/100;//输出百位数shi=num%100/10;//输出十位数ge=num/10;//输出个位数#include //跑马灯程序。
当时间约为20ms,形成动态扫描,看上去全亮。
#include#define uint unsigned int //无符号整型,占16位数,表示围0~65536#define uchar unsigned char //无符号字符型占八位数,表示围0~255void delayms(uint);uchar aa; //定义变量void main(){aa=0xfe;while(1){P2=aa; //控制单片机接口p2,循环亮delayms(500); //当500换成5,看起来全亮,实际上灯一直亮灭,原因是视觉延迟aa=_crol_(aa, 1);}}void delayms(uint xms) //子程序,延时,通过数数{uint i, j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}#include //跑马灯程序。
现在时间较长,多以是亮灭的流动,当时间约为20ms,形成动态扫描,看上去全亮。
#include#define uint unsigned int //无符号整型,占16位数,表示围0~65536#define uchar unsigned char //无符号字符型占八位数,表示围0~255void delayms(uint);uchar aa; //定义变量void main(){aa=0xfe;while(1){P2=aa; //控制单片机接口p2,循环亮delayms(500); //当500换成5,看起来全亮,实际上灯一直亮灭,原因是视觉延迟aa=_crol_(aa, 1);}}void delayms(uint xms) //子程序,延时,通过数数{uint i, j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}#include //52系列单片机头文件(目标:用单片机和两个共阴极数码管:使用单片机的引脚1和2,控制两个数码管静态显示00到59)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P0^7; //申明U1锁存器锁存端段选uchar num,num1;uchar code table[]={ //共阴极数码管0123456789abcdef0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delayms(uint) ;void main (){while(1){for(num1=0;num1<=5;num1++){for(num=0;num<=9;num++){dula2=1; //打开U1锁存端P1=table[num]; //送入位选信号dula2=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3sdula1=1; //打开U1锁存端P2=table[num1]; //送入位选信号dula1=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3s}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=200;y>0;y--);}#include //52系列单片机头文件(目标:用单片机和两个共阴极数码管)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P2^7; //申明U1锁存器锁存端段选uchar num,num1;uchar code table[]={ //共阴极数码管0123456789abcdef0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delayms(uint) ;void main (){while(1){for(num1=0;num1<=9;num1++){dula1=1; //打开U1锁存端P1=table[num1]; //送入位选信号dula1=0; //关闭U1锁存器delayms(1000); //延时500毫秒约0.3sfor(num=0;num<=9;num++){dula2=1; //打开U1锁存端P1=table[num]; //送入位选信号dula2=0; //关闭U1锁存器delayms(1000); //延时500毫秒约0.3s}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=200;y>0;y--);}有语法错误#include //52系列单片机头文件#define uchar unsigned char //无符号字符型占八位数,表示围0~255#define uint unsigned int //无符号整型,占16位数,表示围sbit dula1=P1^6; //申明U1锁存器锁存端段选sbit dula2=P0^7; //申明U1锁存器锁存端段选uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void display(uchar,uchar) ;uchar num,num2,shi,ge;void main (){TMOD=0x11;//设置定时器0和1为工作方式1(M1M0为01,0001 00TH0= (65535-50000)/256;//装初值12.00M晶振定时50s数为50000TL0= (65535-50000)%256;TH1= (65535-50000)/256;//装初值12.00M晶振定时50s数为50000TL1= (65535-50000)%256;EA=1;// 开总中断ET0=1; // 开定时器0中断ET1=1; // 开定时器1中断TR0=1;// 启动定时器0TR1=1;// 启动定时器1while(1)// 程序停止在这里不停的对数码管动态扫描同时等待中断的发生 {display(shi,ge);dula2=1; //打开U1锁存端P1=table[shi]; //送入位选信号dula2=0; //关闭U1锁存器delayms(1175); //延时0.1毫秒}}void delayms(uint xms) //延时子程序{uint i,j;for (i=xms;i>0;i--) //i=xms即延时约为xms毫秒for (j=110;j>0;j--);}void T1_time()interrupt 1{TH1= (65536-50000)/256; //重装初值TL1= (65536-50000)%256;num2++; //num每加1次判断一次是否到20次if(num2==20){num2=0; //然后把num2清0重新再计数20次num++;if (num==60) //这个数用来送数码管显示,到60后归0num=0;shi=num/10; //把一个2位数分离后分别送数码管显示,十位数ge=num%10; //个位数}#include //52系列单片机头文件(目标:控制时间24小时一循环)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P0^7; //申明U1锁存器锁存端段选uchar num,num1,num2,num3,num4;uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void main (){while(1){for(num3=0;num3<=23;num3++) //每天24小时进位一{for(num2=0;num2<=59;num2++) //每60分进位一{for(num1=0;num1<=5;num1++) //每6*10s进位一{dula2=1; //打开U1锁存端P1=table[num1]; //送入位选信号dula2=0; //关闭U1锁存器delayms(1175); //延时0.1毫秒for(num=0;num<=9;num++) //每1s进位一{dula2=1; //打开U1锁存端P1=table[num]; //送入位选信号dula2=0;//关闭U1锁存器delayms(1000);//延时0.1毫秒}}}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=110;y>0;y--);}#include //52系列单片机头文件(目标:控制时间24小时一循环,蜂鸣器每过一段时间响一次)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P2^7; //申明U1锁存器锁存端段选sbit f=P0; //声明单片机 P0口的第一位,也就是三极管基级的位置单片机第39接口uchar num,num1,num2,num3,num4;uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void main (){while(1){for(num3=0;num3<=23;num3++) //每天进位一{for(num2=0;num2<=59;num2++) //每60分进位一{for(num4=0;num2<=59;num4++) //每60s 进位一{f=0; //控制蜂鸣器的不响for(num=0;num<=9;num++) //每1ms进位一{dula2=1; //打开U1锁存端P2=table[num]; //送入位选信号dula2=0; //关闭U1锁存器delayms(1074);//延时0.1毫秒}f=1; //控制蜂鸣器的响delayms(1000);}}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=10;y>0;y--);}#include //52系列单片机头文件(目标:用单片机和两个共阳极数码管,控制依次显示0到59,然后循环,有合适的时间间隔,程序停止)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P2^7; //申明U1锁存器锁存端段选uchar num,num1;uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg 0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void main (){while(1){for(num1=0;num1<6;num1++){dula1=1; //打开U1锁存端P1=table[num1]; //送入位选信号dula1=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3sfor(num=0;num<=9;num++){dula2=1; //打开U1锁存端P2=table[num]; //送入位选信号dula2=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3s}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=200;y>0;y--);#include //52系列单片机头文件(目标:用单片机和两个共阳极数码管,控制依次显示0到59,时间间隔约0.5,程序停止)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P2^7; //申明U1锁存器锁存端段选uchar num,num1;uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void main (){while(1){for(num=0;num1<6;num1++){dula1=1; //打开U1锁存端P1=table[num1]; //送入位选信号dula1=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3sfor(num=0;num<=9;num++){dula2=1; //打开U1锁存端P2=table[num]; //送入位选信号dula2=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3s}}}void delayms (uint xms)//延时子程序{uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=300;y>0;y--);}#include //52系列单片机头文件(目标:用单片机和两个共阳极数码管,控制依次显示0到59,时间间隔约0.5,程序停止)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P2^7; //申明U2锁存器锁存端段选uchar num,num1;uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void main (){while(1){for(num=0;num1<6;num1++){dula1=1; //打开U1锁存端P1=table[num1]; //送入位选信号dula1=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3sfor(num=0;num<=9;num++){dula2=1; //打开U2锁存端P2=table[num]; //送入位选信号dula2=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3s}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=300;y>0;y--);}#include //52系列单片机头文件(目标:用单片机和共阳极数码管,控制依次显示0到9,时间间隔约0.5s;)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P2^7; //申明U2锁存器锁存端段选uchar num;uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void main (){while(1){for(num=0;num<10;num++){dula1=1; //打开U1锁存端P1=table[num]; //送入位选信号dula1=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3秒dula2=1; //打开U2锁存端P2=table[num]; //送入位选信号dula2=0; //关闭U2锁存器delayms(100); //延时500毫秒约0.3秒}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=300;y>0;y--);}#include //52系列单片机头文件(目标:用定时器0的方式1实现第一个灯管以200ms闪烁;用定时器1的方式1实现数码管前两位59s循环计时)#define uchar unsigned char //无符号字符型占八位数,表示围0~255#define uint unsigned int //无符号整型,占16位数,表示围sbit dula=P2^6; //申明U1锁存器锁存端段选sbit wela=P2^7; // 申明U2锁存器锁存位选sbit led1=P1^0; //申明灯1点0uchar code table[]={ //共阴极数码管0123456789abcdef0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delayms(uint) ;。
51单片机汇编程序集
1、片内RAM初始化子程序2、片外RAM初始化子程序3、片外RAM初始化子程序(双字节个单元)4、内部RAM数据复制程序5、外部RAM数据复制程序6、外部RAM数据复制程序7、外部RAM数据复制到内部RAM程序8、限幅滤波程序9、中位值滤波程序10、N点算术平均滤波11、N点加权平均滤波12、一阶加权滞后滤波程序13、双字节取补程序14、N节取补程序15、双字节无符号数加法程序16、N字节无符号数加法程序17、双字节无符号数减法程序18、N字节无符号数减法程序19、单字节无符号数乘法程序20、单字节无符号数乘法程序21、单字节无符号数乘法程序22、双字节无符号数乘法程序23、双字节无符号数乘法程序24、N字节无符号数乘法程序25、单字节无符号除法程序26、单字节无符号除法程序27、双字节无符号除法程序28、N字节无符号除法程序(组合)29、N字节无符号除法程序30、N字节数据左移程序31、原码有符号双字节减法程序32、原码有符号双字节加法程序33、原码有符号双字节乘法程序34、原码有符号双字节除法程序35、单字节顺序查找程序36、单字节顺序查找程序37、双字节字符串顺序查找程序38、双字节字符串顺序查找程序39、N字节字符串顺序查找程序40、单字节最值查找程序41、浮点数顺序查找程序42、浮点数最值查找程序43、单字节折半查找程序1.片内RAM初始化子程序IBCLR:MOV A,R0MOV R1,ACLR AIBC1:MOV@R1,AINC R1DJNZ R7,IBC1RET2.片外RAM初始化子程序EBCLR1:MOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,ACLR CEBC11:MOVX@DPTR,AINC DPTRDJNZ R7,EBC11RET3.片外RAM初始化子程序(双字节个单元) EBCLR2:MOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,AMOV A,R7JZ EBC21INC R6EBC21:CLR AMOVX@DPTR,AINC DPTRDJNZ R7,EBC21DJNZ R6,EBC21RET4.内部RAM数据复制程序;入口:R0,R7;占用资源:A;堆栈需求:2字节;出口:R1IBMOV:MOV A,R0ADD A,R7MOV R0,AMOV A,R1ADD A,R7MOV R1,AIBM1:DEC R0DEC R1MOV A,@R0MOV@R1,ADJNZ R7,IBM1RET5.外部RAM数据复制程序;入口:ADDPH,ADDPL,R7;占用资源:ACC;堆栈需求:2字节;出口:R0,R1EBMOV1:MOV A,ADDPLADD A,R7MOV DPL,ACLR AADDC A,ADDPHMOV DPH,AMOV A,R7ADD A,R1XCH A,R0ADDC A,#00HMOV P2,AEBM11:DEC R0CJNE R0,#0FFH,EBM12DEC P2EBM12:DEC DPLMOV A,DPLCJNE A,#0FFH,EBM13DEC DPHEBM13:MOVX A,@R0MOVX@DPTR,ADJNZ R7,EBM11RET6.外部RAM数据复制程序;入口:ADDPH,ADDPL,R6,R7 ;占用资源:ACC;堆栈需求:2字节;出口:R0,R1EBMOV2:MOV A,ADDPLADD A,R7MOV DPL,AMOV A,R6ADDC A,ADDPHMOV DPH,AMOV A,R7ADD A,R1XCH A,R0ADDC A,R6MOV P2,AMOV A,R7JZ EBM21INC R6EBM21:DEC R0CJNE R0,#0FFH,EBM22DEC P2EBM22:DEC DPLMOV A,DPLCJNE A,#0FFH,EBM23DEC DPHEBM23:MOVX A,@R0MOVX@DPTR,ADJNZ R7,EBM21DJNZ R6,EBM21RET7.外部RAM数据复制到内部RAM程序;入口:ADDPH,ADDPL,R7;占用资源:ACC;堆栈需求:2字节;出口:R0ITEMOV:MOV A,ADDPLADD A,R7MOV DPL,AMOV A,ADDPHADDC A,#00HMOV DPH,AMOV A,R0ADD A,R7MOV R0,AITEM1:DEC R0DEC DPLMOV A,DPLCJNE A,#0FFH,ITEM2DEC DPHITEM2:MOVX A,@DPTRMOV@R0,ADJNZ R7,ITEM1RET8.限幅滤波程序;入口:A,SDAT,DELTY;占用资源:B;堆栈需求:2字节;出口:AJUGFILT:MOV B,ACLR CSUBB A,SDATJNC JUGFT1CPL AINC AJUGFT1:SETB ASUBB A,#DELTYJNC JUGFT3MOV A,SDATRETJUGFT3:MOV A,BMOV SDAT,ARET9.中位值滤波程序;入口:ADDPH,ADDPL,N;占用资源:ESELSORT;堆栈需求:4字节;出口:AMEDFILT:LCALL ESELSORT MOV A,NCLR CRRC AADD A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,AJNC MEDFT1INC DPHMEDFT1:MOVX A,@DPTR RET10.N点算术平均滤波;入口:ADDPH,ADDPL,N;占用资源:B,R3,R4;堆栈需求:2字节;出口:AAVFILT:MOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,ACLR AMOV R3,AMOV R4,AMOV R7,NAVFT1:MOVX A,@DPTRINC DPTRADD A,R4MOV R4,AJNC AVFT2INC R3AVFT2:DJNZ R7,AVFT1MOV R7,NMOV R2,#00HLCALL NDIV31MOV A,R4RET11.N点加权平均滤波;入口:ADDPH,ADDPL,N;占用资源:B,R3,R4;堆栈需求:2字节;出口:AQAVFILT:CLR AMOV R3,AMOV R4,AMOV R7,NMOV P2,ADDPHMOV R1,ADDPLMOV DPTR,#QAVTAB QAVFT1:MOVC A,@A+DPTR MOV B,AMOVX A,@R1INC DPTRINC R1MUL ABADD A,R4MOV R4,AMOV A,BADDC A,R3MOV R3,ADJNZ R7,QAVFT1MOV A,R4JNB ACC.7,QAVFT2INC R3QAVFT2:MOV A,R3RETQAVTAB:DB12.一阶加权滞后滤波程序;入口:A,DELTY;占用资源:B,R3,R4;堆栈需求:2字节;出口:ABQFILT:MOV B,ACLR AMOV DPTR,#ABTABMOVC A,@A+DPTRMUL ABMOV R4,AMOV R3,BMOV A,#01HMOVC A,@A+DPTRMOV B,DELTYMUL ABADD A,R4MOV R4,AMOV A,BADDC A,R3MOV R3,AMOV A,R4JNB ACC.7,FT1INC R3FT1:MOV A,R3MOV DELTY,ARETBQTAB:DB80H,80H13.双字节取补程序/(R3R4)=(R3R4);入口:R3,R4;占用资源:ACC;堆栈需求:2字节;出口:R3,R4CMPT:MOV A,R4CPL AADD A,#01HMOV R4,AMOV A,R3CPL AADDC A,#00HMOV R3,ARET14.N节取补程序/([R0])=([R0]);入口:R0,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R0NCMPTN:MOV B,R0SETB CNCPT1:MOV A,@R0CPL AADDC A,#00HMOV@R0,AINC R0DJNZ R7,NCPT1MOV R0,BRET15.双字节无符号数加法程序(R3R4+R6R7)=(R3R4) ;入口:R3,R4,R6,R7;占用资源:ACC;堆栈需求:2字节;出口:R3,R4,CFNADD:MOV A,R4ADD A,R7MOV R4,AMOV A,R3ADDC A,R6MOV R3,ARET16.N字节无符号数加法程序([R0]+[R1])=([R0]);入口:R0,R1,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R0,CFNADDN:MOV B,R0CLR CNADN1:MOV A,@R0ADDC A,@R1MOV@R0,AINC R0INC R1DJNZ R7,NADN1MOV R0,BRET17.双字节无符号数减法程序(R3R4-R6R7)=(R3R4) ;入口:R3,R4,R6,R7;占用资源:ACC;堆栈需求:2字节;出口:R3,R4NSUB:MOV A,R4CLR CSUBB A,R7MOV R4,AMOV A,R3SUBB A,R6MOV R3,ARET18.N字节无符号数减法程序([R0]-[R1])=([R0]);入口:R0,R1,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R0,CFNSUBN:MOV B,R0MOV R7,NCLR CNSUBN1:MOV A,@R0SUBB A,@R1MOV@R0,AINC R0INC R1DJNZ R7,NSUBN1MOV R0,BRET19.单字节无符号数乘法程序(R3R4*R7)=(R2R3R4);入口:R3,R4,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R2,R3,R4NMUL21:MOV A,R4MOV B,R7MUL ABMOV R4,AMOV A,BXCH A,R3MOV B,R7MUL ABADD A,R3MOV R3,ACLR AADDC A,BMOV R2,ACLR OVRET20.单字节无符号数乘法程序(R2R3R4*R7)=(R5R2R3R4) ;入口:R2,R3,R4,R6,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R5,R2,R3,R4NMUL31:MOV A,R4MOV B,R7MOV R4,AMOV A,BXCH A,R3MOV B,R7MUL ABADD A,R3MOV R3,ACLR AADDC A,BXCH A,R2MOV B,R7MUL ABADD A,R2MOV R2,ACLR AADDC A,BMOV R5,ACLR OVRET21.单字节无符号数乘法程序(R5R2R3R4*R7)=(R7R5R2R3R4) ;入口:R5,R2,R3,R4,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R7,R5,R2,R3,R4NMUL41:MOV A,R4MOV B,R7MUL ABMOV R4,AMOV A,BXCH A,R3MOV B,R7MUL ABADD A,R3MOV R3,ACLR AADDC A,BMOV B,R7MUL ABADD A,R2MOV R2,ACLR AADDC A,BXCH A,R5MOV B,R7MUL ABADD A,R5MOV R5,ACLR AADDC A,BMOV R7,ACLR OVRET22.双字节无符号数乘法程序(R3R4*R6R7)=(R5R2R3R4) ;入口:R3,R4,R6,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R5,R2,R3,R4NMUL22:MOV A,R4MOV B,R7MUL ABXCH A,R4MOV R5,BMOV B,R6MUL ABADD A,R5MOV R5,ACLR AADDC A,BMOV R2,AMOV A,R3MOV B,R7MUL ABMOV R5,AMOV A,BADDC A,R2MOV R2,ACLR AADDC A,#00HXCH A,R3MOV B,R6MUL ABADD A,R2MOV R2,AMOV A,BADDC A,R3XCH A,R5MOV R3,ACLR OVRET23.双字节无符号数乘法程序(R2R3R4*R6R7)=(R1R5R2R3R4) ;入口:R2,R3,R4,R6,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R1,R5,R2,R3,R4NMUL32:MOV A,R4MOV B,R7MUL ABXCH A,R4MOV R5,BMOV B,R6MUL ABADD A,R5MOV R5,ACLR AADDC A,BMOV R1,AMOV A,R3MOV B,R7ADD A,R5 MOV R5,A MOV A,B ADDC A,R1 MOV R1,A CLR A ADDC A,#00H XCH A,R3 MOV B,R6 MUL AB ADD A,R1 MOV R1,A MOV A,B ADDC A,R3 XCH A,R5 MOV R3,A MOV A,R2 MOV B,R7 MUL AB ADD A,R1 MOV R1,A MOV A,B ADDC A,R5 MOV R5,A CLR A ADDC A,#00H XCH A,R2 MOV B,R6 MUL AB ADD A,R5 MOV R5,A MOV A,B ADDC A,R2 XCH A,R1 MOV R2,A CLR OVRET24.N字节无符号数乘法程序([R0]*[R1])=([R0]) ;入口:R0,R1,M,N;占用资源:ACC,B,R2,R5,R6,R7,NCNT;堆栈需求:2字节;出口:R0NMULMN:MOV A,MADD A,R0MOV R5,AXCH A,R1XCH A,R5ADD A,NXCH A,R0MOV R6,AMOV B,MMOV NCNT,BNMLMN1:DEC R0DEC R1CLR AXCH A,@R1MOV@R0,ADJNZ NCNT,NMLMN1MOV NCNT,BNMLMN2:CLR AXCH A,@R0MOV R2,AMOV A,R6MOV R0,AMOV A,R5MOV R1,AMOV R7,NCLR CNMLMN3:MOV A,R2MOV B,@R1INC R1MUL ABADDC A,@R0MOV@R0,AINC R0MOV A,BADDC A,@R0MOV@R0,ADJNZ R7,NMLMN3INC R0INC R6DJNZ NCNT,NMLMN2MOV A,R0CLR CSUBB A,MSUBB A,NMOV R0,ARET25.单字节无符号除法程序(R2R3R4/R7)=(R2)R3R4余数R7 ;入口:R2,R3,R4,R7;占用资源:ACC,B,F0;堆栈需求:3字节;出口:(R2),R3,R4,R7,OVNDIV31:MOV A,R2MOV B,R7DIV ABPUSH AMOV R2,BMOV B,#10HNDV311:CLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV F0,CCLR CSUBB A,R7JB F0,NDV312JC NDV313NDV312:MOV R2,AINC R4NDV313:DJNZ B,NDV311POP ACLR OVJZ NDV314SETB OVNDV314:XCH A,R2MOV R7,ARET26.单字节无符号除法程序(R5R2R3R4/R7)=(R5)R2R3R4余数R7 ;入口:R2,R3,R4,R7;占用资源:ACC,B,F0;堆栈需求:3字节;出口:(R5),R2,R3,R4,R7,OVNDIV41:MOV A,R5MOV B,R7DIV ABPUSH AMOV R5,BMOV B,#18HNDV411:CLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV A,R5RLC AMOV R5,AMOV F0,CCLR CSUBB A,R7JB F0,NDV412JC NDV413NDV412:MOV R5,AINC R4NDV413:DJNZ B,NDV411POP ACLR OVJZ NDV414SETB OVNDV414:XCH A,R5MOV R7,ARET27.双字节无符号除法程序(R5R2R3R4/R6R7)=(R2)R3R4余数R6R7 ;入口:R5,R2,R3,R4,R6,R7;占用资源:ACC,B,F0;堆栈需求:4字节;出口:(R2),R3,R4,R6,R7,OVNDIV42:MOV A,R1PUSH AMOV B,#00HNDV421:MOV A,R2CLR CSUBB A,R7MOV R1,AMOV A,R5SUBB A,R6JC NDV422MOV R5,AMOV A,R1MOV R2,AINC BSJMP NDV421NDV422:PUSH BMOV B,#10HNDV423:CLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AXCH A,R5RLC AXCH A,R5MOV F0,CCLR CSUBB A,R7MOV R1,AMOV A,R5SUBB A,R6JB F0,NCV424JC NDV425NCV424:MOV R5,AMOV A,R1MOV R2,AINC R4NDV425:DJNZ B,NDV423 POP ACLR OVJNZ NDV426SETB OVNDV426:XCH A,R2MOV R7,AMOV A,R5MOV R6,APOP AMOV R1,ARET28.N字节无符号除法程序(组合)([R0]/[R1])=([R0]);入口:R0,R1,M,N;占用资源:ACC,R2,R3,R4,R5,R7,NCNT,F0,NADDN,NSUBBN,NRLCN ;堆栈需求:4字节;出口:R0;NDIVMN:MOV A,MCLR CSUBB A,NMOV NCNT,AADD A,R0MOV R4,AXCH A,R0MOV R3,AMOV A,R1MOV R5,AMOV R2,#00HNDVMN1:MOV R7,NLCALL NSUBNMOV A,R5MOV R1,AJC NDVMN2INC R2SJMP NDVMN1NDVMN2:MOV R7,NLCALL NADDNMOV A,NCNTSWAP ARR AMOV NCNT,ANDVMN3:MOV A,R3MOV R0,AMOV R7,MLCALL NRLCNMOV F0,CMOV A,R4MOV R0,AMOV A,R5MOV R1,AMOV R7,NLCALL NSUBNJB F0,NDVMN4JC NDVMN5NDVMN4:MOV A,R3MOV R0,AINC@R0SJMP NDVMN6NDVMN5:MOV A,R5MOV R1,AMOV R7,NLCALL NADDNNDVMN6:DJNZ NCNT,NDVMN3MOV A,R4MOV R1,AMOV A,R2MOV@R1,AMOV A,R3MOV R0,ARET29.N字节无符号除法程序(集成)([R0]/R[1])=([R0]) ;入口:R0,R1,M,N;占用资源:ACC,R2,R3,R4,R5,R7,F0;堆栈需求:2字节;出口:R0NDIVMN:MOV A,MCLR CSUBB A,NMOV B,AADD A,R0MOV R4,AXCH A,R0MOV R3,AMOV A,R1MOV R5,AMOV R2,#00H NDVMN1:MOV R7,NCLR CNDVMN2:MOV A,@R0 SUBB A,@R1MOV@R0,AINC R0INC R1DJNZ R7,NDVMN2MOV A,R4MOV R0,AMOV A,R5MOV R1,AJC NDVMN3INC R2SJMP NDVMN1 NDVMN3:MOV R7,NCLR CNDVMN4:MOV A,@R0 ADDC A,@R1MOV@R0,AINC R0INC R1DJNZ R7,NDVMN4MOV A,#08HMUL ABMOV B,A NDVMN5:MOV A,R3MOV R0,AMOV R7,MCLR CNDVMN6:MOV A,@R0 RLC AMOV@R0,AINC R0DJNZ R7,NDVMN6MOV F0,CMOV R0,AMOV A,R5MOV R1,AMOV R7,NCLR CNDVMN7:MOV A,@R0SUBB A,@R1MOV@R0,AINC R0INC R1DJNZ R7,NDVMN7JB F0,NDVMNBJC NDVMN8 NDVMNB:MOV A,R3MOV R0,AINC@R0SJMP NDVMNA NDVMN8:MOV R7,NMOV A,R4MOV R0,AMOV A,R5MOV R1,ACLR CNDVMN9:MOV A,@R0ADDC A,@R1MOV@R0,AINC R0INC R1DJNZ R7,NDVMN9 NDVMNA:DJNZ B,NDVMN5 MOV A,MCLR CSUBB A,NADD A,R3MOV R1,AMOV A,R2MOV A,R3MOV R0,ARET30.N字节数据左移程序RLC([R0])=(CF[R0]);入口:R0,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R0,CFNRLCN:MOV B,R0CLR CNRLN1:MOV A,@R0RLC AMOV@R0,AINC R0DJNZ R7,NRLN1MOV R0,BRET31.原码有符号双字节减法程序(R3R4-R6R7)=R3R4 ;入口:R3,R4,R6,R7;占用资源:ACC,DADD;堆栈需求:6字节;出口:R3,R4,OVDSUB:MOV A,R6CPL ACC.7MOV R6,ALCALL DADDRET32.原码有符号双字节加法程序(R3R4+R6R7)=R3R4 ;入口:R3,R4,R6,R7;占用资源:ACC,SR0,NADD,NSUB,CMPT;堆栈需求:4字节;出口:R3,R4,OVDADD:MOV A,R3MOV C,ACC.7MOV SR0,CXRL A,R6MOV A,R3CLR ACC.7MOV R3,AMOV A,R6CLR ACC.7MOV R6,AJC DAB2LCALL NADDMOV A,R3JB ACC.7,DABEDAB1:MOV C,SR0MOV ACC.7,CMOV R3,ACLR OVRETDABE:SETB OVRETDAB2:LCALL NSUBMOV A,R3JNB ACC.7,DAB1LCALL CMPTCPL SR0SJMP DAB133.原码有符号双字节乘法程序(R3R4*R6R7)=(R5R2R3R4) ;入口:R3,R4,R6,R7;占用资源:ACC,SR0,NMUL22;堆栈需求:4字节;出口:R5,R2,R3,R4IMUL:MOV A,R3XRL A,R6MOV C,ACC.7MOV SR0,CMOV A,R3CLR ACC.7MOV R3,AMOV A,R6MOV R6,ALCALL NMUL22MOV A,R5MOV C,SR0MOV ACC.7,CMOV R5,ARET34.原码有符号双字节除法程序(R5R2R3R4/R6R7)=(R3R4)余数(R6R7) ;入口:R5,R2,R3,R4;占用资源:ACC,SR0,NDIV42;堆栈需求:6字节;出口:R3,R4,R6,R7,OVIDIV:MOV A,R5XRL A,R6MOV C,ACC.7MOV SR0,CMOV A,R5CLR ACC.7MOV R5,AMOV A,R6CLR ACC.7MOV R6,ALCALL NDIV42MOV A,R3JB ACC.7,IDIVEJB OV,IDIVEMOV C,SR0MOV ACC.7,CMOV R3,ARETIDIVE:SETB OVRET35.单字节顺序查找程序;入口:R0,R1,A,R7;占用资源:B;堆栈需求:2字节;出口:R0,R1,AFINDB1:MOV B,AMOV DPL,R1MOV DPH,R0FINDB11:MOVX A,@DPTR CJNE A,B,FINDB12MOV R1,DPLMOV R0,DPHCLR ARETFINDB12:INC DPTRDJNZ R7,FINDB11MOV A,#0FFHRET36.单字节顺序查找程序;入口:R0,R1,A,R6,R7;占用资源:B;堆栈需求:2字节;出口:R0,R1,AFINDB2:MOV B,AMOV DPL,R1MOV DPH,R0MOV A,R7JZ FINDB21INC R6FINDB21:MOVX A,@DPTR CJNE A,B,FINDB22MOV R1,DPLMOV R0,DPHCLR ARETFINDB22:INC DPTRDJNZ R7,FINDB21DJNZ R6,FINDB21MOV A,#0FFHRET37.双字节字符串顺序查找程序;入口:R0,R1,R3,R4,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R0,R1,AFINDS1:MOV DPL,R1MOV DPH,R0FINDS11:MOVX A,@DPTRINC DPTRCLR CSUBB A,R4JNZ FINDS12MOVX A,@DPTRSUBB A,R3JNZ FINDS12MOV A,DPLCLR CSUBB A,#01HMOV R1,AMOV A,DPHSUBB A,#00HMOV R0,ACLR ARETFINDS12:DJNZ R7,FINDS11MOV A,#0FFHRET38.双字节字符串顺序查找程序;入口:R0,R1,R3,R4,R6,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R0,R1,AFINDS2:MOV DPL,R1MOV DPH,R0MOV A,R7JZ FINDS21INC R6FINDS21:MOVX A,@DPTRINC DPTRCLR CSUBB A,R4JNZ FINDS22MOVX A,@DPTRSUBB A,R3JNZ FINDS22MOV A,DPLCLR CSUBB A,#01HMOV R1,AMOV A,DPHSUBB A,#00HMOV R0,ACLR ARETFINDS22:DJNZ R7,FINDS21DJNZ R6,FINDS21MOV A,#0FFHRET39.N字节字符串顺序查找程序;入口:ADDPH,ADDPL,R0,R6,R7,N ;占用资源:ACC,B,R2,NCNT;堆栈需求:2字节;出口:ADDPH,ADDPL,A FINDN:MOV A,R0MOV R2,AMOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,AMOV A,R7JZ FINDN1INC R6FINDN1:MOV A,R2MOV R0,AMOV NCNT,AFINDN2:MOVX A,@DPTRCLR CSUBB A,@R0JNZ FINDN3INC DPTRINC R0DJNZ NCNT,FINDN2MOV A,DPLCLR CSUBB A,NMOV ADDPL,AMOV A,DPHSUBB A,#00HMOV ADDPH,ACLR ARETFINDN3:CLR CMOV A,R0SUBB A,R2JNZ FINDN4INC DPTRFINDN4:DJNZ R7,FINDN1DJNZ R6,FINDN1MOV A,#0FFHRET40.单字节最值查找程序;入口:R0,R1,R6,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R0(最大值),R1(最小值),R2,R3,R4,R5 FMAMIB:MOV DPL,R1MOV DPH,R0MOVX A,@DPTRMOV R0,AMOV R1,AMOV R3,AMOV R5,AMOV A,DPHMOV R2,AMOV R4,AMOV A,R7JZ FMMB1INC R6FMMB1:MOVX A,@DPTR MOV B,ASETB CSUBB A,R0JC FMMB2MOV R0,BMOV R3,DPLMOV R2,DPHSJMP FMMB3FMMB2:MOV A,BCLR CSUBB A,R1JNC FMMB3MOV R1,BMOV R5,DPLMOV R4,DPHFMMB3:INC DPTRDJNZ R7,FMMB1DJNZ R6,FMMB1RET41.浮点数顺序查找程序;入口:R0,R1,R2,R3,R4,R6,R7 ;占用资源:B,NCNT,FCMP;堆栈需求:2字节;出口:R0,R1,AFINDF:MOV DPL,R1MOV DPH,R0MOV A,R7MOV NCNT,R6JZ FINDF1INC NCNTFINDF1:MOVX A,@DPTRINC DPTRMOV R5,AMOVX A,@DPTRINC DPTRMOV R6,AMOVX A,@DPTRINC DPTRMOV R7,ALCALL FCMPJNZ FINDF2MOV A,DPLCLR CSUBB A,#03HMOV R1,AMOV A,DPHSUBB A,#00HMOV R0,ACLR ARETFINDF2:DJNZ B,FINDF1DJNZ NCNT,FINDF1MOV A,#0FFHRET42.浮点数最值查找程序;入口:ADDPH,ADDPL,R6,R7;占用资源:ACC,B,NCNT,ITEMOV,EBMOV,MOVB,MOVR1,FCMP ;堆栈需求:5字节;出口:[R0](最大值),[R1](最小值),R2,R3,R4,R5FMAMIF:MOV A,ADDPLMOV R3,AMOV R5,AMOV DPL,AMOV A,ADDPHMOV R2,AMOV R4,AMOV DPH,AMOV B,R7MOV R7,#03HLCALL ITEMOVMOV R7,#03HLCALL IBMOVMOV A,BJZ FMMF1INC NCNT FMMF1:PUSH BMOVX A,@DPTRINC DPTRMOV R2,AMOVX A,@DPTRINC DPTRMOV R3,AMOVX A,@DPTRINC DPTRMOV R4,ALCALL MOVR1LCALL FCMPJNC FMMF2MOV A,R0XCH A,R1MOV R0,ALCALL MOVBMOV R5,DPLMOV R4,DPHMOV A,R0XCH A,R1MOV R0,ASJMP FMMF3 FMMF2:MOV A,R0XCH A,R1MOV R0,ALCALL MOVR1LCALL FCMPMOV A,R0XCH A,R1MOV R0,AJZ FMMF3JC FMMF3LCALL MOVBMOV R3,DPLMOV R2,DPH FMMF3:POP BDJNZ B,FMMF1DJNZ NCNT,FMMF1RET43.单字节折半查找程序;入口:A,R0,R1,R6,R7;占用资源:B,R2;堆栈需求:2字节;出口:R0,R1 SEARCHB:MOV B,AMOV A,R1ADD A,R7MOV R7,AMOV A,R0ADDC A,R6MOV R6,AMOV A,R7SUBB A,#01HMOV R7,AJNC SECH1DEC R6SECH1:MOV A,R7CLR CSUBB A,R1MOV A,R6SUBB A,R0JNC SECH2MOV A,#0FFHRETSECH2:MOV A,R7ADD A,R1MOV R2,AMOV A,R6ADDC A,R0RRC AMOV DPH,AMOV A,R2RRC AMOV DPL,AMOVX A,@DPTRCLR CSUBB A,BJNC SECH3INC DPTRMOV R0,DPHMOV R1,DPLSJMP SECH1 SECH3:JZ SECH5MOV A,DPLSUBB A,#01HMOV R7,AJNC SECH4MOV R6,DPHDEC R6SECH4:SJMP SECH1 SECH5:MOV R0,DPH MOV R1,DPLCLR ARET。
[知识]单片机程序清单
单片机程序清单数码管"hello "循环程序清单:循环hello程序清单:ORG 0000HSS2: MOV R5,#13MOV R3,#0SS1: MOV R4,#20START:MOV R2,#06H ;循环次数,等于数码管位数MOV R1,#0FEH ;初始位选信号MOV A,R3MOV R0,A ;初始偏移地址DISPLOOP:MOV P0,#0H ;熄灭数码管MOV P1,R1 ;送位选信号MOV DPTR,#TABMOV A,R0MOVC A,@A+DPTRMOV P0,A ;送段选信号ACALL DELAYINC R0MOV A,R1RL AMOV R1,A ;将下一位的选通信号送至R1DJNZ R2,DISPLOOPDJNZ R4,STARTINC R3DJNZ R5,SS1AJMP SS2DELAY: MOV R7,#04HDL0: MOV R6,#10HDL1: NOPDJNZ R6,DL1DJNZ R7,DL0RETTAB: DB 00H,00H,00H,00H,00H,00H,76H DB 79H,38H,38H,3FH,00H,00H,00H,00H,00H,00H,00HEND频率计数器程序清单:org 0000hljmp mainorg 000bhljmp tt0org 0030hmain:mov tmod,#01010001bmov tl0,#0b0hmov th0,#3chsetb ea ;开中断setb et0setb tr0setb tr1loop:lcall holdlcall displayajmp loopdisplay: mov r7,#3mov r6,#01hmov r5,#0mov r0,#30h mov dptr,#tab loop1:mov a,@r0movc a,@a+dptr mov p0,amov p2,r6lcall delayinc r0mov a,r6rl amov r6,amov p2,#0djnz r7,loop1retdelay:mov r4,#50hdjnz r4,$rettt0:mov tl0,#0b0hmov th0,#3chinc 20hretihold:mov a,20hcjne a,#20,ss1mov 20h,#0mov 21h,tl1mov tl1,#0ss1:mov a,21hmov b,#100div abmov 30h,amov a,bmov b,#10div abmov 31h,amov 32h,brettab:db 0c0h,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H end数码管循环99-0的程序清单:org 0000hajmp mainorg 000bajmp tt0org 0030hmain:mov tmod,#01hmov th0,#3chmov tl0,#0b0hsetb ea ;开中断setb et0setb tr0mov 20h,#0 ;计数器mov 21h,#99 ;一秒个数mov 30h,#0 ;缓冲数据mov 31h,#0 缓冲数据loop:lcall h;old ;数据转换入口lcall displayajmp loopdisplay:mov r7,#2mov p3,#01hmov a,31hmov dptr,#tabmovc a,@a+dptrmov p2,alcall delaymov p3,#02hmov a,30hmov dptr,#tabmovc a,@a+dptrmov p2,alcall delaymov p3,#0retdelay:mov r5,#50hdjnz r5,$rettt0:mov tl0,#0b0hmov th0,#3chinc 20hretihold:mov a,20hcjne a,#20,lldec 21hmov 20h,#0ll:mov a,21hcjne a,#100,mmmov 21h,#0mm:mov b,#10mov a,21hdiv abmov 31h,amov 30h,brettab:db 0c0h,0f9 h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90hend加两个控制键(一个按下停止,一个按下请零)程序清单在loop处加:loop:jnb p0.0,l1jnb p0.1,l2ajmp l3l1:jnb p0.0,$cpl tr0ajmp l3l2:jnb p0.1,$mov 21h,#0l3:lcall holdlcall displayajmp loop ORG 0000H采用扩展接口,一组二极管由高位到低位依次电亮,另一组由低位到高位依次加一点亮start:mov r7,#08h 代表8个灯mov r6,#01h 第一组的第一个灯亮mov r5,#01h 第二组的第一个灯亮clr p2.0 清零setb p2.1loop:mov p0,r6setb p2.0clr p2.0mov p0,r5clr p2.1lcall delaymov a,r6rl amov r6,amov a,r5rl ainc amov r5,asetb p2.1clr adjnz r7,loopajmp startdelay:mov r4,#250d1:mov r3,#250djnz r3,$djnz r4,d1retend数码管循环显示0到F的数字org 0000hajmp mainorg 000bhajmp tt0org 0030hMAIN:MOV R7,#0Hmov r6,#0mov dptr,#0000hloop:mov a,r6movx @dptr,ainc r6mov r6,acjne a,#16,ll1mov r6,#0ll1:inc dptrdjnz r7,loopmov tmod,#01hmov tl0,#0b0hmov th0,#3chsetb easetb et0setb tr0start:mov r5,#0mov r4,#0moV dptr,#0000hloop1:movx A,@DPTRLCALL DELAYINC DPTRDJNZ R4,LOOP1AJMP STARTDISPLAY:PUSH DPHPUSH DPLMOV DPTR,#TABMOV P1,ALCALL DELAYPOP DPLPOP DPHDELAY:MOV A,R5CJNE A,#20H,DELAYMOV R5,#0RETtt0:mov tl0,#0b0hmov th0,#3chinc r5TAB:DB 03FH,06H,05BH,04FH,066H,06DH,07DH,007HDB 07FH,06FH,077H,07CH,039H,05EH,079H,071HEND串行口扩展键盘显示器按键识别采用扫描法,当检测到有按键按下时显示该键编号清单程序:ORG 0000HAJMP LOOPORG 0100HLOOP:CLR P3.2 ;关闭显示输出MOV A,#0CLR TI ;清零中断标志MOV SBUF,A ;扫描键盘,使所有列线为0JNB TI,$ ;串行输出未完等待JB P3.3,LOOP ;无键闭合返回LCALL DELAY ;有键闭合消抖JB P3.3,LOOP ;抖动返回MOV R0,#8 ;判别是哪一个键按下,共8列MOV R2,#0 ;初始键号为0MOV R1,#0FEHLOOP1:CLR TIMOV SBUF,R1JNB TI,$ ;串行输出未完等待JB P3.3,SS1 ;无键按下转SS1MOV 20H,R2 ;键号送20HLCALL DISP ;显示键号JNB P3.3,$ ;等待键释放SS1: INC R2 ;键号加1MOV A,R1RL AMOV R1,ADJNZ R0,LOOP1 ;8列未扫完,扫描下一列AJMP LOOP ;8列扫完,重新扫描DISP: SETB P3.2 ;开放显示输出MOV A,20H ;取出待显示的数MOV DPTR,#TABMOVC A,@A+DPTR ;查段码表TAB,取出段选码数据CLR TIMOV SBUF,A ;输出段选码JNB TI,$CLR P3.2 ;关显示输出RETDELAY:MOV R4,#0DJNZ R4,$RETTAB: DB 0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H;1~8 END。
单片机常见程序
org 00hmain: mov P0, #0ffh ;向P0端口锁存器写0FFH,准备输入mov a, P0 ;从P0口输入数据mov P1, a ;将数据传至P1口sjmp mainend2 单片机IO-2程序org 00hmov a, #1loop: mov P1, a ;将a的内容通过P1口输出call delay ;调延时子程序rl a ; a左移一位sjmp loopdelay: mov r0, #80h ;延时子程序delay1: mov r1, #00hdelay2: djnz r1, delay2djnz r0, delay1retend3 单片机LED点阵程序ORG 0HSTART: MOV P2,#0FFH ;阳极全部加高电平MOV A,#80H ;A初值为80H,为最左一列(第7列)阴极输出低电平准备? LOOP: MOV P1,A ;使一列阴极为低电平CALL DELAY ;延时RRC A ;A右移一位,为下一列阴极输出低电平作准备JNC LOOP ;八列未完转移?CLR CMOV P1,#0FFH ;阴极全部加低电平mov a,#80h ;为最上面一行输出高电平准备LOOP1: MOV P2,A ;使一行阳极极为高电平CALL DELAY ; 延时RRC A ; A右移一位,为下一行阳极输出高电平作准备JNC LOOP1 ; 八行未完转移?CLR CAJMP STARTDELAY: MOV R1,#0C8H ;延时子程序DEY0: MOV R0,#0HDEY1: DJNZ R0,DEY1DJNZ R1,DEY0RETEndORG 0H ;显示'年?START:MOV DPTR,#DA TA1 ;指向点阵代码首址MOV R2,#80H ;80H使第7列(最左一列)阴极为低电平??CLR CDISP: MOV A,#0MOVC A,@A+DPTR ;取一列代码MOV P2,A ;加至阳极MOV P1,R2 ;使一列阴极为低电平CALL DELAY ;延时INC DPTR ;指向下一列代码?MOV A,R2 ;R2右移一位,为下一列阴极输出低电平作准备RRC A ;MOV R2,A ;JNC DISP ;8列未完,转AJMP STARTDELAY: MOV R1,#0 ;延时子程序DELY0: DJNZ R1,DEL Y0RETDA TA1: DB 24H,44H,0DCH,54H,7FH,54H,54H,44H;年的点阵代码END5 报警程序ORG 0000HLJMP MAINORG 1BHJMP T1INT ;定时器1中断入口地址ORG 0100HMAIN: MOV SP,#60HANL TMOD,#0FH ;定时器1置为方式1ORL TMOD,#10HORL IE,#88H ;允许定时器1中断MAIN1: MOV DPTR,#TONE ;置TONE表首地址MOV A,#00H ;TONE表偏移量LOOP: MOVC A,@A+DPTR ;读TONE表中的TH1值JZ MAIN1 ;为0则转MAIN1,进入下一周期MOV TH1,A ;TONE表中的高字节送TH1和R5MOV R5,AINC DPTR ;从TONE表中读出TL1的值MOV A,#00HMOVC A,@A+DPTRMOV TL1,A ;TONE表中的低字节值送TL1和R6MOV R6,ASETB TR1 ;启动定时器1INC DPTRMOV A,#00HMOVC A,@A+DPTR ;从TONE表中取出音的时间MOV R2,ALOOP1: M OV R3,#80H ;延时LOOP2: M OV R4,#0FFHDJNZ R4,$DJNZ R3,LOOP2DJNZ R2,LOOP1INC DPTR ;TONE表地址加1,指向下一个音调MOV A,#00HJMP LOOPT1INT: CPL P1.2 ;取反得到一定频率的方波,使喇叭;发出一定音高的音调CLR TR1 ;停止定时器1计数MOV TH1,R5 ;重置定时器1时间常数MOV TL1,R6SETB TR1 ;恢复定时器1计数RETITONE: DB 0FCH,46H,04H,0FCH,0AEH,04H ;音调表DB 0FDH,0BH,04H,0FDH,34H,04HDB 0FDH,83H,04H,0FDH,0C8H,04HDB 0FEH,06H,04H,0FEH,22H,04HDB 0FEH,22H,04H,0FEH,06H,04HDB 0FDH,0C8H,04H,0FDH,83H,04HDB 0FDH,34H,04H,0FDH,0BH,04HDB 0FCH,0AEH,04H,0FCH,46H,0CHDB 00H,00H,00HEND6 查询式键盘0525ORG 0000HSTART: mov P1,#0FFH ;P1端口全部置01111 1111 MOV P2,#00HMOV A,P1jnb acc.7,START ;有无键按下,直接寻址为为零则转移ANL A,#3FH ;立即数与到累加器;0011 1111CJNE A,#3FH,S1 ;比较立即数和A,不等则转移到S1 AJMP STARTS1: call delay ;延时去抖动MOV A,P1jnb acc.7,STARTANL A,#3FHcjne A,#3Eh,S2 ;0键按下0011 1110mov A,#01H ;0000 0001mov P2,Acall delay1AJMP STARTS2: cjne A,#3DH,S3 ;1键按下0011 1101 mov A,#02H ;0000 0010mov P2,Acall delay1AJMP STARTS3: cjne A,#3BH,S4 ;2键按下0011 1011 mov A,#04H ;0000 0100mov P2,Acall delay1AJMP STARTS4: cjne A,#37H,S5 ;3键按下0011 0111 mov A,#08H ;0000 1000mov P2,Acall delay1AJMP STARTS5: cjne A,#2FH,S6 ;4键按下0010 1111 mov A,#10H ;0001 0000mov P2,Acall delay1AJMP STARTS6: cjne A,#1FH,S7 ;5键按下0001 1111 mov A,#20H ;0010 0000mov P2,Acall delay1S7: AJMP STARTDELAY: MOV R6,#10H;30H ;延时子程序DE0: mov R7,#10H;30HDE1: DJNZ R7,DE1DJNZ R6,DE0RETDELAY1: MOV R4,#0FFH ;延时子程序DE2: mov R5,#0FFHDE3: DJNZ R5,DE3DJNZ R4,DE2RETEND7 电子琴KEYBUF EQU 30HSTH0 EQU 31HSTL0 EQU 32HTEMP EQU 33HORG 00HLJMP STARTORG 0BHLJMP INT_T0START: MOV TMOD,#01HSETB ET0SETB EAWAIT:MOV P3,#0FFHCLR P3.4MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1LCALL DELY10MS MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1MOV A,P3ANL A,#0FHCJNE A,#0EH,NK1 MOV KEYBUF,#0 LJMP DK1NK1: CJNE A,#0DH,NK2 MOV KEYBUF,#1 LJMP DK1NK2: CJNE A,#0BH,NK3 MOV KEYBUF,#2 LJMP DK1NK3: CJNE A,#07H,NK4 MOV KEYBUF,#3 LJMP DK1NK4: NOPDK1:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,AMOV A,KEYBUFMOV B,#2MUL ABMOV TEMP,AMOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,AMOV TH0,AINC TEMPMOV A,TEMPMOVC A,@A+DPTR MOV STL0,AMOV TL0,ASETB TR0DK1A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK1ACLR TR0NOKEY1:MOV P3,#0FFHCLR P3.5MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2LCALL DELY10MS MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2MOV A,P3ANL A,#0FHCJNE A,#0EH,NK5 MOV KEYBUF,#4 LJMP DK2NK5: CJNE A,#0DH,NK6 MOV KEYBUF,#5 LJMP DK2NK6: CJNE A,#0BH,NK7 MOV KEYBUF,#6 LJMP DK2NK7: CJNE A,#07H,NK8 MOV KEYBUF,#7 LJMP DK2NK8: NOPDK2:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,AMOV A,KEYBUFMOV B,#2MUL ABMOV TEMP,AMOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,AMOV TH0,AINC TEMPMOV A,TEMPMOVC A,@A+DPTR MOV STL0,AMOV TL0,ASETB TR0DK2A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK2ACLR TR0NOKEY2:MOV P3,#0FFHCLR P3.6ANL A,#0FHXRL A,#0FHJZ NOKEY3LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY3MOV A,P3ANL A,#0FHCJNE A,#0EH,NK9MOV KEYBUF,#8LJMP DK3NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#9LJMP DK3NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10LJMP DK3NK11: CJNE A,#07H,NK12 MOV KEYBUF,#11LJMP DK3NK12: NOPDK3:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,AMOV A,KEYBUFMOV B,#2MUL ABMOV TEMP,AMOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,AMOV TH0,AINC TEMPMOV A,TEMPMOVC A,@A+DPTR MOV STL0,AMOV TL0,ASETB TR0DK3A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK3ACLR TR0NOKEY3:MOV P3,#0FFHCLR P3.7MOV A,P3ANL A,#0FHJZ NOKEY4LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY4MOV A,P3ANL A,#0FHCJNE A,#0EH,NK13MOV KEYBUF,#12LJMP DK4NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#13LJMP DK4NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#14LJMP DK4NK15: CJNE A,#07H,NK16 MOV KEYBUF,#15LJMP DK4NK16: NOPDK4:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,AMOV A,KEYBUFMOV B,#2MUL ABMOV TEMP,AMOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,AMOV TH0,AINC TEMPMOV A,TEMPMOVC A,@A+DPTR MOV STL0,AMOV TL0,ASETB TR0DK4A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK4ACLR TR0NOKEY4:LJMP W AITDELY10MS:MOV R6,#10D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETINT_T0:MOV TH0,STH0MOV TL0,STL0CPL P1.0RETITABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71HTABLE1: DW 64021,64103,64260,64400DW 64524,64580,64684,64777DW 64820,64898,64968,65030DW 65058,65110,65157,65178END8 键盘ORG 0H ;翻转法键盘扫描显示?KB1: MOV P1,#0F0H ;列线输出低电平MOV A,P1 ;输入行线值CJNE A,#0F0H,KB2 ;若有键按下, 转KB2?AJMP KB1 ;若无键按下,转KB1KB2: MOV B,A ;保存键码的高四位ORL A,#0FH ;A高四位不变,低四位置1?MOV P1,A ;键码的高四位通过行线输出?MOV A,P1 ;输入列线值ANL A,#0FH ;屏蔽高四位ORL B,A ;键码的高四位与低四位合并MOV DPTR,#TAB ;DPTR 指向键码表首地址?MOV R3,#0 ;R3?作为键号计数器KB3: MOV A,R3MOVC A,@A+DPTR ;取键码CJNE A,B,NEXT ;所取键码与当前按键的键码不等转移?CALL DELAY ;延时20msCALL DISPLAY ;显示键号WAIT0: MOV P1,#0F0H ;以下3条指令为等待按键释放MOV A,P1CJNE A,#0F0H,W AIT0CALL DELAYAJMP KB1NEXT: INC R3 ;键号计数器加1AJMP KB3DELAY: MOV R0,#32H ;延时20msDELAY0: MOV R1,0C8HDELAY1: DJNZ R1,DELAY1DJNZ R0,DELAY0RET;显示子程序DISPLAY:MOV DPTR,#TAB1 ;DPTR指向段码表首址MOV A,R3MOVC A,@A+DPTR ;查段码表MOV SBUF,A ;输出段码RETTAB: DB 77H,7BH,7DH,7EH,0B7H,0BBH,0BDH,0BEH,0D7H DB 0DBH,0DDH,0DEH,0E7H,0EBH,0EDH,0EEH ;0~F键码tab1: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;0~9 DB 88H,83H,0C6H,0A1H,86H,8EH ;a~f段码END9 交通灯制作SR EQU P1.0 ;南北红灯SY EQU P1.1 ;南北黄灯SG EQU P1.2 ;南北绿灯ER EQU P1.3 ;东西红灯EY EQU P1.4 ;东西黄灯EG EQU P1.5 ;东西绿灯ORG 00hST1: SETB SG ;南北方向绿灯亮CLR SYCLR SRCLR EGCLR EYSETB ER ;东西方向红灯亮MOV R3, #20 ;长延时CALL DELAYMOV R4, #8 ;南北方向绿灯闪4次ST2: CPL SG ;MOV R3, #2 ;短延时CALL DELAYDJNZ R4, ST2CLR SG ;南北方向绿灯灭SETB SY ;南北方向黄灯亮MOV R3, #20 ;延时CALL DELAYST3: CLR SY ;南北方向黄灯灭SETB SR ;南北方向红灯亮CLR ER ;东西方向红灯灭SETB EG ;东西方向绿灯亮MOV R3, #20 ;长延时CALL DELAYST4: MOV R4, #8 ;东西方向绿灯闪4次LP: CPL EGMOV R3, #2 ;短延时CALL DELAYDJNZ R4, LPCLR EG ;东西方向绿灯灭SETB EY ;东西方向黄灯亮MOV R3, #20 ;延时CALL DELAYSJMP ST1 ;转ST1DELAY: MOV R1, #0 ;延时子程序DELAY1: MOV R0, #0DELAY2: DJNZ R0, DELAY2DJNZ R1, DELAY1DJNZ R3, DELAYRETend10 矩阵键盘0518ORG 00H ;扫描法键盘扫描显示?CLR P3.3CLR P3.4KB1: MOV P2,#0FH ;行线输出低电平MOV A,P2 ;输入列线值CJNE A,#0FH,KB2 ;若有键按下,转KB2行扫??AJMP KB1 ;若无键按下,转KB1KB2: MOV B,#7FHKB22: MOV P2,BMOV A,P2ANL A,#0FHCJNE A,#0FH,KB3 ;此行有键按下, 转KB3MOV A,BRR AMOV B,AAJMP KB22KB3: ANL B,#0F0HORL B,AMOV R3,#0HMOV DPTR,#TABKB4: MOV A,R3MOVC A,@A+DPTR ;取键码CJNE A,B,NEXT ;所取键码与当前按键的键码不等转移?CALL DELAY ;延时20msCALL DISPLAY ;显示键号WAIT: MOV P2,#0F0H ;以下3条指令为等待按键释放MOV A,P2CJNE A,#0F0H,W AITCALL DELAYAJMP KB1NEXT: INC R3 ;键号计数器加1AJMP KB4DELAY: MOV R0,#05H ;延时20msDELAY0: MOV R1,0C8HDELAY1: DJNZ R1,DELAY1DJNZ R0,DELAY0RET;显示子程序DISPLAY:MOV DPTR,#TAB1 ;DPTR指向段码表首址MOV A,R3MOVC A,@A+DPTR ;查段码表SETB p3.3SETB p3.4MOV P1, A ;将段码送出RETTAB: DB 77H,7BH,7DH,7EH,0B7H,0BBH,0BDH,0BEH,0D7H DB 0DBH,0DDH,0DEH,0E7H,0EBH,0EDH,0EEH ;0~F键码tab1: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0~9 DB 77H,7CH,39H,5EH,79H,71H ;a~f段码END11 按键控制ORG 0000HSTART: MOV P1, #0FFHMOV P2, #00HMOV A, P1JNB ACC.7, STARTANL A, #3FHCJNE A, #3FH,S1AJMP STARTS1: CALL DELAYMOV A, P1JNB ACC.7, STARTANL A, #3FHCJNE A, #3FH,S2MOV A, #01HMOV P2, ACALL DELAY1AJMP STARTS2: CJNE A, #3DH,S3MOV A, #02HMOV P2,ACALL DELAY1AJMP STARTS3: CJNE A, #3BH,S4MOV A, #04HMOV P2, ACALL DELAY1AJMP STARTS4: CJNE A, #37H,S5MOV A, #08HMOV P2, ACALL DELAY1AJMP STARTS5: CJNE A, #2FH,S6MOV A,#10HMOV P2, ACALL DELAY1AJMP STARTS6: CJNE A, #1FH,S7MOV A, #20HMOV P2, ACALL DELAY1S7: AJMP STARTDELAY: MOV R6,#10H;30H DE0: MOV R7,#1OH;30HDE1: DJNZ R7,DE1DJNZ R6,DE0RETDELAY1: MOV R4,#0FFH DE2: MOV R5,#0FFHDE3: DJNZ R5,DE3DJNZ R4,DE2RETEND。
单片机常用子程序
// P3.4~P3.7,第1~4行
// 0 1 2 3
// 4 5 6 7
// 8 9 10 11
// 12 13 14 15
//****************************************************
void delay(unsigned int t)
while(P3!=0xf0);//等待按键弹出
//beep();
return(key);
}
void main()
{
while(1)
{
unsigned char key;
key=ScanKey44();
switch(key)
{
case 0x11:key=0; break; //0
case 0x24:key=6; break; //6
case 0x28:key=7; break; //7
case 0x41:key=8; break; //8
case 0x42:key=9; break; //9
case 0x44:key=10; break; //10
key=P3&0x3c;
while((P3&0x3c)!=0x3c); //等待弹出
//beep();
return(key);
}
#define S1 0x0e
#define S2 0x0d
#define S3 0x0b
#define S4 0x07
//4个简单按键扫描子程序
case 0x12:key=1; break; //1
单片机实验程序及流程图
《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义三.程序清单及程序流程框图ORG 0000H Array LJMP MAINMAIN: MOV R0,#30HMOV R2,#10HCLR AA1: MOV @R0,AINC R0INC ADJNZ R2,A1MOV R0,#30HMOV R1,#40HMOV R2,#10HA2: MOV A, @R0MOV @R1,AINC R0INC R1DJNZ R2, A2MOV R1,#40HMOV DPTR ,#4800HMOV R2, #10HA3: MOV A,@R1MOVX @DPTR ,AINC R1INC DPTRDJNZ R2,A3MOV SP,#60HMOV R2,#10HMOV DPTR ,#4800HPUSH DPLPUSH DPHMOV DPTR,#5800HMOV R3,DPLMOV R4,DPHA4: POP DPHPOP DPLMOVX A,@DPTRINC DPTRPUSH DPLPUSH DPHMOV DPL,R3MOV DPH,R4 MOVX @DPTR,A INC DPTRMOV R3,DPLMOV R4,DPHDJNZ R2,A4MOV R0,#50HMOV DPTR,#5800H MOV R2,#10HA5: MOVX A,@DPTR MOV @R0,AINC R0 INC DPTR DJNZ R2,A5POP DPH POP DPL HERE: LJMP HEREEND《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义三.实验电路四.程序清单及流程图程序一ORG 0000HLJMP MAIN ORG 000BH LJMP IPTO MAIN: MOV SP, #30H MOV TMOD, #01HCLR 00H SETB EA SETB ET0 MOV TH0, #3CH MOV TL0, #0B0H MOV R1, #14H SETB TR0 MOV A, #0feH MOV P1, A NT: JNB 00H, NT RL A MOV P1, ACLR 00H LJMP NT IPTO: MOV TH0,#3CH MOV TL0,#0B0HDJNZ R1, TIOMOV R1, #14HSETB 00HTIO: RETIEND程序二只需将程序一中“RL A”改为“RR A”即可实现其功能。
单片机程序大全
第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。
单片机程序大全
单片机程序大全(以下是一个以“单片机程序大全”为题目的文章范例,依据题目性质并非一个合同或作文的格式。
请注意,这个范例只是为了明示写作格式的变化,并非提供一个实际的单片机程序大全。
)单片机程序大全本文将为大家提供一个全面的单片机程序大全,涵盖了各种常见的单片机应用。
希望本文能够对单片机程序的学习和实践有所帮助。
一、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页)
单片机程序大全(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`变量中。
单片机的40个程序
名称:定时器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的调制频率码,由一体化接收并解码由发光管显示。
单片机典型实用程序
单片机典型实用程序一、灯类程序1. P1.7端口上的发光二极管不停闪烁程序完整的源程序如下:;******** 下面是主程序 ********MAIN: CLR P1.7 ; 主程序开始,P1.7输出低电平"0",让点亮发光二极管 ACALL DELAY; 调用延时子程序延时一段时间,让发光二极管亮一段时间 SETB P1.7; P1.7输出高电平"1",熄灭发光二极管ACALL DELAY; 调用延时子程序延时一段时间,让发光二极管熄灭一段时间 AJMP MAIN; 跳转到程序开头重复执行;******** 下面是延时子程序 ********DELAY: MOV R7,#255Y1: MOV R6,#255DJNZ R6,$DJNZ R7,Y1RET ;延时子程序返回END ;程序结束.流程图2. P1端口上的发光二极管左移或右移程序;----- 主程序开始 -----START: MOV ACC,#0FEH ;ACC 中先装入LED1亮的数据(二进制的11111110) MOV P1,ACC ;将ACC 的数据送P1口MOV R0,#7 ;将数据再移动7次就完成一个8位流水过程LOOP: RL A ;将ACC中的数据左移一位MOV P1,A ;把ACC移动过的数据送p1口显示ACALL DELAY ;调用延时子程序DJNZ R0,LOOP ;没有移动够7次继续移动AJMP START ;移动完7次后跳到开始重来,以达到循环流动效果;----- 延时子程序 -----DELAY: MOV R0,#255 ;延时一段时间D1: MOV R1,#255DJNZ R1,$DJNZ R0,D1RET ;子程序返回END ;程序结束3. P1端口上的发光二极管实用的查表方式多功能流水灯程序;----- 主程序开始 -----ORG 0000H ;上电复位,程序从0000H开始执行START: MOV SP,#60H ;堆栈初始化为60HMOV DPTR,#LIU_TAB ;流水花样表首地址送DPTRLOOP: CLR AMOVC A,@A+DPTRCJNE A,#0FFH,SHOW ;检查流水结束标志AJMP START ;所有花样流完,则从头开始重复流SHOW: MOV P1,A ;将数据送到P1口ACALL DELAYINC DPTRAJMP LOOP;----- 延时子程序 -----DELAY: MOV R0,#255 ;延时一段时间D1: MOV R1,#255DJNZ R1,$DJNZ R0,D1RET ;子程序返回;----- 下面是流水花样数据表 -----LIU_TAB:DB 01111111B ;二进制表示的流水花样数据DB 10111111BDB 11011111BDB 11101111BDB 11110111BDB 11111011BDB 11111101BDB 11111110BDB 11111110BDB 11111101BDB 11111011BDB 11110111BDB 11101111BDB 11011111BDB 10111111BDB 01111111BDB 0FFH ;流水花样结束标志0FFHEND ;程序结束4交通红绿灯控制程序ORG 0000HAJMP STARTSTART: MOV SP,#60HMOV P0,#0FFHMOV P1,#0FFHMOV P2,#0FFHMOV P3,#0FFHMAIN: MOV P1,#10111101B ;主线亮绿灯10S,支线亮红灯10SLCALL YS10S ;延时10SMOV R2,#6 ;主线黄灯每秒闪烁1次,共闪6次,支线红灯依然亮AXHS: MOV P1,#10111011BLCALL YS500MXRL P1,#00000100BLCALL YS500MDJNZ R2,AXHSMOV P1,#11100111B ;支线亮绿灯10S,主线亮红灯10SLCALL YS10SMOV R2,#6 ;支线黄灯每秒闪烁1次,共闪6次,主线红灯依然亮BXHS: MOV P1,#11010111BLCALL YS500MXRL P1,#00100000BLCALL YS500MDJNZ R2,BXHSAJMP MAIN ;跳转到开始循环;******** 延时子程序 ********YS500M: MOV R3,#200 ;延时500MSY5_1: MOV R4,#10 ;[1]延时5MSY5_2: MOV R5,#228 ;[1]DJNZ R5,$ ;[2]DJNZ R4,Y5_2 ;[2]DJNZ R3,Y5_1 ;[2]RET ;[1]YS10S: MOV R7,#20 ;延时10SYS10_1: CALL YS500MDJNZ R7,YS10_1RETEND5. P3口两个输入开关来控制对应的P1口的8个LED的显示方式P3.5 P3.4 显示方式•0 0 全亮•0 1 交叉亮• 1 0 低4位连接的灯亮高4位灭• 1 1 低4位连接的灯灭高4位亮ORG 0000H•M OV P3, #00110000B ;使P3口锁存器相应位置位•M OV A, P3 ;读P3口相应引脚线信号•A NL A, #00110000B “逻辑与”操作…屏蔽掉无关位SWAP A;将相应位移位到低位•R L A ;循环左移一位,A*2→A•M OV DPTR, #TABLE ;转移指令表的基地址送数•据指针DPTR•J MP @A+DPTR ;散转指令ONE: MOV P1, #00H;第一种显示方式,S0接地,S1接地SJMP $TWO: MOV P1,#55H;第二种显示方式S0接+5 VS1接地SJMP $THREE:MOV P1,#0FH ;第三种显示方式,S0接地,S1接+5 VSJMP $FOUR:MOV P1,#0F0H;第四种显示方式S0接+5 V,S1接地SJMP $TABLE: AJMP ONE ;转移指令表AJMP TWO Array AJMP THREEA JMP FOUREND二、键盘控制类程序1.P3口按钮控制P1口灯亮MAIN: MOV P3,#0FFHLOOP: MOV A,P3MOV P1,ALJMP LOOPEND2. P3口按钮控制P1.0上的LED亮灭当K1按下开关时指示灯亮,再次按下时指示灯灭。
南昌大学单片机课程设计程序清单
南昌大学单片机课程设计(部分任务)程序清单ORG 0000H ;主程序入口LJMP STARTORG 000BH ;定时器T0中断入口LJMP SUB1ORG 0013H ;外部中断1(按键中断)入口LJMP SUB2ORG 0030HSTART:MOV SP,#30H ;主程序赋值开始,CLR P1.0CLR P1.1CLR P1.7 ;关闭蜂鸣器,防止其在没有按键按下时响起MOV R7,#30 ;长按键1.5秒初值MOV IE,#84H ;开外部中断1MOV TMOD,#01H ;设置定时器T0用方式1定时MOV SCON,#00H ;设置串行口为方式0,开始学号显示程序MOV DPTR,#TAB1 ;将表1的首地址赋给DPTRMOV R0,#5 ; 发送5行数据L3:MOV R1,#5 ;每行发送5个数据L2:CLR AMOVC A,@A+DPTR ;查表指令MOV SBUF,A ;发送数据L1:JNB TI,L1CLR TIINC DPTRDJNZ R1,L2LCALL YANSHI1S ;每行发生送完便延时1秒再发送下一行DJNZ R0,L3TAB1:DB 06H,00H,00H,00H,00H ;表1,学号输出,显示如下X X X X 1 步骤1 DB 06H,06H,00H,00H,00H ; 从右进入X X X 1 1 步骤2 DB 3FH,06H,06H,00H,00H ; X X 1 1 0 步骤3 DB 4FH,3FH,06H,06H,00H ; X 1 1 0 3 步骤4 DB 07H,4FH,3FH,06H,06H ; 1 1 0 3 7 步骤5SUB2:CLR EX0 ;关外部中断0的源允许,防止其优先于外部中断1发生PUSH PSW ;压栈LCALL YANSHI10ms ;调用10ms延时去抖动CLR P1.0CLR P1.1JB P3.3,L5 ;判断外部中断1是否触发,若已触发则执行键号判断显示程序LJMP L6L5:POP ACCPOP PSW ;先入后出原则出栈RETIL6:CLR P1.5 ;开始键号判断显示程序SETB P1.6JB P1.0,L7CLR P1.6 ;1号键,标记为1SETB TR0MOV R5,#1MOV R6,#01HLCALL SAJHLCALL FMQXLJMP L5L7:JB P1.1,L8CLR P1.6MOV R5,#3 ;3号键,标记为3SETB TR0MOV R6,#03HLCALL FMQXLCALL SAJHLJMP L5L8:CLR P1.6SETB P1.5JB P1.0,L9CLR P1.5SETB TR0MOV R5,#0 ;0号键,标记为0MOV R6,#00HLCALL FMQXLCALL SAJHLJMP L5L9:JB P1.1,L6CLR P1.5SETB TR0MOV R5,#2 ;2号键,标记为2MOV R6,#02HLCALL FMQXLJMP L5SHIBO:JNB P3.3,$ ;功能键显示倒锯齿波程序CLR P1.5CLR P1.6CLR P1.7 ;关掉蜂鸣器MOV DPTR,#7FFH ;输出倒锯齿波程序开始,置DAC0809入口地址MOV A,#0FFHLP:MOVX @DPTR,A ;指令执行周期2us ;共延时16us,故输出波的周期约为T=256X16=4000us=4msDEC A ; 1us ,则其频率为250HZMOV R1,#5 ; 1usLOOP1:DJNZ R1,LOOP1 ; 5x2us=10usSJMP LP ; 2usRETSUB1:MOV TH0,#03CH ;定时器T0中断子程序MOV TL0,#0B0H ;赋定时初值JB P3.3,OUT1 ;判断按键是否弹起DJNZ R7,OUT2 ;判断按键被按下是否大于1.5秒,否则跳出CLR TR0 ;关闭定时器T0CLR TF0 ;重赋初值,为下次按键中断计时1.5秒做准备MOV R7,#30 ;判断是否为2号键按下CJNE R5,#2,PR1LJMP SHIBO ;转到显示到锯齿形波程序PR1:CJNE R5,#3,OUT2 ;判断是否为3号键按下LJMP START ;转到显示学号程序RETIOUT1:CLR TR0OUT2:RETYANSHI1S:MOV R2,#64H ;延时一秒子程序DELL:MOV TH0,#0D8HMOV TL0,#0F0HSETB TR0DEL:JBC TF0,REPSJMP DELREP:DJNZ R2,DELLRETFMQX:CLR P1.7 ;蜂鸣器响子程序L4:JB P3.3,L4 ;判断外部中断1(按键中断)输入SETB P1.7RETYANSHI10ms:MOV R4,#10 ;延时十毫秒子程序DL2:MOV R1,#0FAHDL1:NOPNOPDJNZ R1,DL1DJNZ R4,DL2RETSAJH:MOV R7,#05H ;输出按键号子程序DL5:MOV A,R6MOV DPTR,#TAB2MOVC A,@A+DPTRMOV SBUF,ADL4:JNB TI,DL4CLR TIDJNZ R7,DL5RETTAB2:DB 03FH,006H,05BH,04FH ;表2,按键0~3字型码,采用共阴极数码管END。
单片机汇编程序清单
;============================================================; 数字量输入输出文件名: DigitIO.ASM; 功能说明: 数字量输入输出实验, P1口高4位输入, 低4位输出;============================================================ ORG 0000HLJMP STARTORG 0100HSTART: ORL P1, #0F0H ;P1口高四位为输入MOV A, P1 ;读P1口的值SWAP A ;A中高,低4位交换MOV P1, A ;输出到P1口SJMP STARTEND;================================================================ ; 定时器中断文件名: INT1.ASM; 功能说明: 采用定时器的中断, 在P1.0与P1.1引脚上输出周期波形.;================================================================ ORG 0000HLJMP STARTORG 000BHLJMP TIMER0ORG 001BHLJMP TIMER1ORG 0100HSTART: MOV P1, #0FFHMOV TH0, #0F8H ;初始化定时器0计数初值MOV TL0, #00HMOV TH1, #0F8H ;初始化定时器1计数初值MOV TL1, #00HMOV TMOD, #11H ;设置定时器工作模式为方式1MOV TCON, #50H ;启动定时器MOV IE, #8AH ;使能中断SJMP $TIMER0: CPL P1.0 ;定时器0中断服务程序, 对P1.0引脚取反MOV TH0, #0F8H ;重新装入计数初值MOV TL0, #00HRETI ;中断返回TIMER1: CPL P1.1 ;定时器1中断服务程序MOV TH1, #0F8HMOV TL1, #00HRETIEND; 外部中断文件名: INT2.ASM; 功能说明: 外部中断INT0, INT1操作.; 外部中断0: 使发光二极管闪烁4次.; 外部中断1: 使发光二极管由右向左流水显示, 一次亮两个LED.;===================================================================== ORG 0000HLJMP STARTORG 0003HLJMP EINT0ORG 0013HLJMP EINT1START: MOV P1, #00HSETB IT0 ;定义外部中断0为边沿触发SETB EX0 ;使能外部中断0SETB IT1 ;定义外部中断1为边沿触发SETB EX1 ;使能外部中断1SETB EA ;使能总中断SJMP $EINT0: MOV R7, #04H ;外部中断0中断服务程序ELP0: MOV P1, #0FFHACALL DELAY ;调用延时程序MOV P1, #00HACALL DELAYDJNZ R7, ELP0RETIEINT1: MOV A, #03H ;外部中断1中断服务程序MOV R7, #10HILP1: MOV P1, ARL ARL AACALL DELAYDJNZ R7, ILP1RETIDELAY: MOV R6, #0FFH ;延时子程序DLP1: MOV R5, #0FFHDLP2: DJNZ R5, DLP2DJNZ R6, DLP1RETEND; 定时器文件名称: Timer.ASM; 功能说明: 使用定时器0和定时器1在P1.0与P1.1引脚上输出方波.;===================================================================== ORG 0000HLJMP STARTORG 0100HSTART: MOV TMOD, #11H ;设置定时器工作方式为方式1MOV TH0, #0F8H ;装入定时器0的计数初值MOV TL0, #00HMOV TH1, #0F8H ;装入定时器1的计数初值MOV TL0, #00HSETB TR0 ;启动定时器SETB TR1MLP1: JNB TF0, MLP2 ;判定时器0溢出标志MOV TH0, #0F8H ;重装定时器0的计数初值MOV TL0, #00HCPL P1.0CLR TF0 ;清溢出标志MLP2: JNB TF1, MLP1 ;判定时器1溢出标志MOV TH1, #0F8HMOV TL1, #00HCPL P1.1CLR TF1AJMP MLP1END;===================================================================== ; 计数器文件名称: COUNT.ASM; 功能描述: 利用计数器1, 在计数10次后对P1.0引脚取反一次;===================================================================== ORG 0000HAJMP STARTORG 0100HSTART: MOV TMOD, #60H ;设置定时器/计数器1为计数器方式, 且为方式2 MOV TH1, #0F6H ;装入计数初值MOV TL1, #0F6HSETB TR1 ;启动计数MLP1: JNB TF1, MLP1 ;判溢出标志CPL P1.0 ;取反P1.0CLR TF1 ;清溢出标志AJMP MLP1END; 可编程时钟输出文件名称: ClkOut.ASM; 功能描述: 使用定时器2作为时钟发生器, 测量P1.0引脚输出, 测量周期.;===================================================================== T2CON EQU 0C8H ;定义特殊功能寄存器T2MOD EQU 0C9HRCAP2L EQU 0CAHRCAP2H EQU 0CBHORG 0000HAJMP STARTORG 0100HSTART: MOV RCAP2H, #0FFH ;改变RCAP2H,RCAP2L中的值可以改变时钟频率MOV RCAP2L, #00HMOV T2MOD, #02H ;设置T2工作于时钟输出模式下MOV T2CON, #04H ;启动定时器T2SJMP $END;===================================================================== ; 串口通讯实验文件名称: Serial.ASM; 功能说明: 串口输出实验, 定时向串口发送数据"Xi'an Tangdu Corp.".; 在串口观察窗1中可以观察数据.;===================================================================== ORG 0000HLJMP STARTORG 0100HSTART: LCALL INITCOM ;初始化串口MLP1: MOV DPTR, #SENDDA TA ;数据起始地址MLP2: MOV A, #00HMOVC A, @A+DPTRCJNE A, #00H, MLP3AJMP MLP5MLP3: MOV SBUF, A ;发送数据到串口MLP4: JNB TI, MLP4 ;判发送结束否?CLR TI ;清发送标志INC DPLAJMP MLP2MLP5: LCALL DELAYAJMP MLP1; X i ' a n T a n g d uSENDDATA: DB 58H,69H,60H,61H,6EH,20H,54H,61H,6EH,67H,64H,75H DB 20H,43H,6FH,72H,70H,2EH,0DH,0AH,00H; C o r p .INITCOM:MOV SCON, #50H ;串口初始化MOV TMOD, #20H ;波特率设置为19200bpsMOV PCON, #80HMOV TH1, #0FDHSETB TR1CLR ES ;不启动串口中断RETDELAY: MOV R7, #0FFHDLP1: MOV R6, #0FFHDLP2: NOPNOPNOPDJNZ R6, DLP2DJNZ R7, DLP1RETEND;============================================================== ; 键盘扫描及显示设计实验文件名称: KeyScan.Asm; 功能描述: 8255扩展IO, 完成键盘及数码管显示实验.; 按下按键, 数码管显示相应键值.;============================================================== A_8255 EQU 7F00H ;8255端口定义B_8255 EQU 7F01HC_8255 EQU 7F02HCON_8255 EQU 7F03HORG 0000HLJMP MAINORG 0100HMAIN: MOV 50H,#00H ;键值缓冲清0MOV 51H,#00HMOV 52H,#00HMOV 53H,#00HMOV 54H,#00HMOV 55H,#00HMOV R5, #55HMOV A, #81HMOV DPTR, #CON_8255 ;8255控制端口MOVX @DPTR, A ;写入控制字BEGIN: LCALL DIS ;调用显示子程序LCALL CLEAR ;清屏LCALL CCSCAN ;调用键扫子程序JNZ INK1 ;判是否有键按下LJMP BEGININK1: LCALL DISLCALL DL1MS ;消除按键抖动LCALL DL1MSLCALL CLEARLCALL CCSCANJNZ INK2AJMP BEGININK2: MOV R2,#0FEHMOV R4,#00H ;从第0列开始扫描COLUM: MOV DPTR,#A_8255MOV A,R2MOVX @DPTR,A ;写入列扫描值MOV DPTR, #C_8255MOVX A,@DPTRJB ACC.0,LINE1 ;判第0行的值MOV A,#00H ;第0行AJMP KCODELINE1: JB ACC.1,LINE2MOV A,#04H ;第1行AJMP KCODELINE2: JB ACC.2,LINE3MOV A,#08H ;第2行AJMP KCODELINE3: JB ACC.3,NEXTMOV A, #0CH ;第3行KCODE: ADD A,R4 ;得到键值ACALL PUTBUFPUSH ACCKON: ACALL DISACALL CLEARACALL CCSCANJNZ KONPOP ACCNEXT: INC R4MOV A,R2JNB ACC.4,KERRRL AMOV R2,AAJMP COLUMKERR: AJMP BEGINCCSCAN: MOV DPTR,#A_8255 ;按键扫描MOV A,#00HMOVX @DPTR,AMOV DPTR,#C_8255MOVX A,@DPTRCPL A ;取反ANL A,#0FHRETCLEAR: MOV DPTR, #B_8255 ;清屏MOV A,#00HMOVX @DPTR,ARETDIS: PUSH ACC ;显示子程序PUSH 00HPUSH 03HMOV R0,#50H ;显示缓冲首地址MOV R3,#0DFH ;显示扫描值AGAIN: MOV A,#0FFH ;关闭显示MOV DPTR,#A_8255MOVX @DPTR,AMOV A,@R0MOV DPTR,#DSEGS ;数码管段表地址MOVC A,@A+DPTR ;查表MOV DPTR,#B_8255 ;送段显示MOVX @DPTR,AMOV A,R3MOV DPTR,#A_8255MOVX @DPTR,AACALL DL1MSINC R0 ;显示缓冲加1MOV A,R3JNB ACC.0,OUT ;扫描结束否RR A ;向右移一位MOV R3,AAJMP AGAINOUT: POP 03HPOP 00HPOP ACCRET;数码管段显示值DSEGS: DB 03FH, 06H,05BH,04FH,066H,06DH,07DH, 07H DB 07FH,06FH,077H,07CH,039H,05EH,079H,071HDL1MS: MOV R7,#01HDL0: MOV R6,#080HDL1: DJNZ R6,DL1DJNZ R7,DL0RETPUTBUF: PUSH 00H ;保存键值到缓冲RAM中PUSH ACCMOV A,R5MOV R0,APOP ACCMOV @R0,ADEC R5CJNE R5,#04FH,GOBACKMOV R5,#55H ;重置缓冲地址GOBACK: POP 00HRETEND;=============================================================== ; 点阵LED显示设计实验文件名称: LED16.ASM; 功能描述: 滚动显示"西安唐都科教仪器公司";===============================================================ROW1 EQU 0EF00HROW2 EQU 0DF00HCOL1 EQU 0BF00HCOL2 EQU 07F00HAUXR1 EQU 0A2HORG 0000HLJMP MAINORG 0100HMAIN: MOV A, #00H ;清屏MOV DPTR, #ROW1MOVX @DPTR, AMOV DPTR, #ROW2MOVX @DPTR, AMOV A, #0FFHMOV DPTR, #COL1MOVX @DPTR, AMOV DPTR, #COL2MOVX @DPTR, ABG1: MOV R2, #144 ;所有汉字显示一遍计数MOV DPTR, #HZDOT ;汉字字库首地址BG2: CALL DISP ;调用显示子程序INC DPTRINC DPTRDEC R2CJNE R2, #00, BG2AJMP BG1;======显示子程序======DISP: MOV R6, #0FHDPL0: MOV R7, #08H ;8行MOV R5, #01H ;按行扫描DPL1: MOV A, #00H ;扫描显示0--7行MOVC A, @A+DPTR ;查表取数CPL AMOV R3, A ;COL1INC DPTRMOV A, #00HMOVC A, @A+DPTRCPL AMOV R4, A ;COL2INC DPTRINC AUXR1 ;转换到数据指针2MOV DPTR, #ROW1MOV A, #00HMOVX @DPTR, AMOV DPTR, #COL1MOV A, R3MOVX @DPTR, AMOV DPTR, #COL2MOV A, R4MOVX @DPTR, AMOV DPTR, #ROW1MOV A, R5MOVX @DPTR, ARL AMOV R5, AINC AUXR1 ;切换到数据指针1CALL DELAYDJNZ R7, DPL1INC AUXR1MOV DPTR, #ROW1MOV A, #00HMOVX @DPTR, AINC AUXR1MOV R7, #08HDPL2: MOV A, #00H ;扫描显示8--15行MOVC A, @A+DPTRCPL AMOV R3, A ;COL1INC DPTRMOV A, #00HMOVC A, @A+DPTRCPL AMOV R4, A ;COL2INC DPTRINC AUXR1MOV DPTR, #ROW2MOV A, #00HMOVX @DPTR, AMOV DPTR, #COL1MOV A, R3MOVX @DPTR, AMOV DPTR, #COL2MOV A, R4MOVX @DPTR, AMOV DPTR, #ROW2MOV A, R5MOVX @DPTR, ARL AMOV R5, AINC AUXR1CALL DELAYDJNZ R7, DPL2INC AUXR1MOV DPTR, #ROW2MOV A, #00HMOVX @DPTR, AINC AUXR1CLR CMOV A, DPLSUBB A, #32MOV DPL, AMOV A, DPHSUBB A, #00MOV DPH, ADJNZ R6, DPL0RET;======延时子程序====== DELAY: MOV A, R7PUSH ACCMOV R7, #0FFHDY1: NOPNOPDJNZ R7, DY1POP ACCMOV R7, ARET$INCLUDE(HZDOT.ASM);HZDOT:;唐CCCC6;DB 080H,000H,000H,001H,0FCH,03FH,004H,001H ;DB 0F4H,00FH,004H,009H,0FCH,03FH,004H,009H ;DB 0F4H,00FH,004H,001H,0F4H,00FH,014H,008H ;DB 012H,008H,0F2H,00FH,011H,008H,000H,000HEND; 静态存储器扩展实验文件名称: SRAM.ASM; 功能描述: 存储器扩展. 将单片机内部30H~3FH单元写入初值00H~0FH,; 然后将这些数从单片机内部传送到外部存储器中, 再由外; 部存储器传送到单片机内部40H~4FH单元中.;=============================================================== AUXR DATA 8EH ;辅助寄存器ORG 0000HLJMP STARTORG 0100HSTART: MOV AUXR, #02H ;使用外部存储器MOV R0, #30H ;内部RAM起始地址MOV A, #00HMOV R4, #10H ;赋值个数MLP1: MOV @R0, A ;赋值INC AINC R0DJNZ R4, MLP1NOP ;运行至此, 观察RAM中的值MOV R4, #10HMOV DPTR, #0000H ;外部RAM起始地址MOV R0, #30HMLP2: MOV A, @R0MOVX @DPTR, A ;写外部RAMINC R0INC DPLDJNZ R4, MLP2NOP ;运行至此, 观察外部RAM中数据MOV R4, #10HMOV DPTR, #0000HMOV R0, #40HMLP3: MOVX A, @DPTR ;读外部RAMMOV @R0, AINC DPLINC R0DJNZ R4, MLP3NOP ;运行至此, 观察内部RAM 40H起始地址中的数据SJMP $END; FLASH存储器扩展实验文件名称: Flash.ASM; 功能描述: 读/写Flash, 了解Flash的保护, 擦除特性.; 带保护写入0~127共128个数, 不带保护写入128个55H.;=============================================================== START_ADDR EQU 0000HADDR_UNLOCK1 EQU 5555HADDR_UNLOCK2 EQU 2AAAHAUXR DATA 8EHORG 0000H ;实验说明:LJMP START ;分别运行程序到NOP, 观察存储区ORG 0100H ; X:0000H中的内容START: MOV AUXR, #02H ;使能外部RAM访问LCALL PWRITE ;带保护写LCALL DELAY ;延时NOPLCALL UPWRITE ;不带保护写LCALL DELAYNOPLCALL UPROT ;去除保护LCALL UPWRITE ;不带保护写LCALL DELAYNOPLCALL ERASE ;芯片擦除NOPSJMP $;======带保护写(写入0~127)======PWRITE:MOV DPTR, #ADDR_UNLOCK1MOV A, #0AAHMOVX @DPTR, AMOV DPTR, #ADDR_UNLOCK2MOV A, #55HMOVX @DPTR, AMOV DPTR, #ADDR_UNLOCK1MOV A, #0A0HMOVX @DPTR, AMOV DPTR, #START_ADDRMOV R4, #80H ;128MOV A, #00HPWLP1: MOVX @DPTR, AINC DPLINC ADJNZ R4, PWLP1RET;======不带保护写, 写入128字节的55H====== UPWRITE:MOV DPTR, #START_ADDRMOV R4, #80HMOV A, #55HUWLP1: MOVX @DPTR, AINC DPLDJNZ R4, UWLP1RET;======去除保护特性======UPROT: MOV DPTR, #ADDR_UNLOCK1MOV A, #0AAHMOVX @DPTR, AMOV DPTR, #ADDR_UNLOCK2MOV A, #55HMOVX @DPTR, AMOV DPTR, #ADDR_UNLOCK1MOV A, #80HMOVX @DPTR, AMOV DPTR, #ADDR_UNLOCK1MOV A, #0AAHMOVX @DPTR, AMOV DPTR, #ADDR_UNLOCK2MOV A, #55HMOVX @DPTR, AMOV DPTR, #ADDR_UNLOCK1MOV A, #20HMOVX @DPTR, ARET;======芯片擦除, 擦除后全为FF====== ERASE: MOV DPTR, #ADDR_UNLOCK1MOV A, #0AAHMOVX @DPTR, AMOV DPTR, #ADDR_UNLOCK2MOV A, #55HMOVX @DPTR, AMOV DPTR, #ADDR_UNLOCK1MOV A, #80HMOVX @DPTR, AMOV DPTR, #ADDR_UNLOCK1MOV A, #0AAHMOVX @DPTR, AMOV DPTR, #ADDR_UNLOCK2MOV A, #55HMOVX @DPTR, AMOV DPTR, #ADDR_UNLOCK1MOV A, #10HMOVX @DPTR, ARETDELAY: MOV R7, #50HDLP1: MOV R6, #0F0HDLP2: NOPDJNZ R6, DLP2DJNZ R7, DLP1RETEND。
单片机技能训练7的程序清单
技能训练7的程序清单;------------------------------头文件----------------------------------SW1 EQU P1.0 ;定义SW1SW2 EQU P1.1 ;定义SW2;-----------------------系统复位程序---------------------------------ORG 0000HLJMP MAIN;-------------------------------主程序----------------------------------------------ORG 0030HMAIN: MOV SP ,#60HMOV SCON , #00H ;选择串行口工作方式0MOV DPTR , #255L: LCALL DISP ;显示JB SW1,L2 ;判断SW1是否被按下L1: LCALL DISP ;显示JNB SW1 , L1 ;等待SW1释放,并刷新显示器INC DPTR ;计数器加1LCALL DISP ;显示L2: JB SW2 , L ;判断SW1是否按下L3: LCALL DISP ;显示JNB SW2 , L3 ;等待SW2释放,并刷新显示器MOV DPTR , #0 ;清零SJMP L ;继续检查按键的状态;---------------------------------显示子程序-------------------------------------- DISP: MOV R6,DPHMOV R7,DPLLCALL H_BCD2 ;十六进制数转换到BCD码LCALL SETBUFFER ;调用设置显示缓冲区程序MOV R0 , #10H ;显存中数据低位的首址MOV R1 , #6 ;显示器位数LCALL DISP1 ;调用显示程序RETDISP1: CLR P2.0MOV A , @R0 ;取待显示数字ADD A , #19 ;偏移量调整MOVC A , @A+PC ;取字型码MOV SBUF , A ;通过串行口发送到显示器JNB TI , $ ;等待一个字节是否发送完成CLR TI ;清发送完成标志INC R0 ;指向下一个显存DJNZ R1 , DISP1 ;判断显示器是否显示一遍SETB P2.0NOPNOPCLR P2.0NOPNOPRETTABLE: DB 3FH, 06H, 5BH , 4FH ;“0”,“1”,“2”,“3”DB 66H ,6DH , 7DH ,07H ;“4”,“5”,“6”,“7”DB 7FH , 6FH , 77H, 7CH ;“8”,“9”,“A”,“B”DB 39H , 5EH , 79H, 71H ;“C”,“D”,“E”,“F”;---------------------二进制转换成BCD码子程序H_BCD2------------------;入口参数:双字节二进制数存在R6(高位)、R7(低位)中;出口参数:转换后的BCD码的存在R3(高位)、R4、R5中H_BCD2: CLR AMOV R3,AMOV R4,AMOV R5,AMOV R2,#10H ;转换双字节二进制数HB3: MOV A,R7 ;从高端移出待转换数的一位送给Cy RLC AMOV R7,AMOV A,R6RLC AMOV R6,AMOV A,R5 ;BCD码带进位自身相加,相当于乘2;操作ADDC A,R5DA A ;十进制调整MOV R5,AMOV A,R4ADDC A,R4DA AMOV R4,AMOV A,R3ADDC A,R3MOV R3,A ;双字节二进制数的万位不超过6不;需调整DJNZ R2,HB3RET;-----------------------------显示缓冲区设置程序--------------------------------------;将要显示的数据以分离BCD码格式存放在显示缓冲区10H~15H(最低位)中SETBUFFER: MOV R0, #15H ;取显示缓冲区低地址MOV A , R5 ;取压缩BCD码的低位LCALL SPLIT ;调用拆分程序MOV A , R4 ;取待拆分压缩BCD码LCALL SPLIT ;调用拆分程序MOV A , R3 ;取压缩BCD码的高位LCALL SPLIT ;调用拆分程序RETSPLIT: MOV R1,A ;取要拆分的压缩BCD码LCALL S1MOV A,R1SWAP AS1: ANL A,#0FH ;取压缩BCD码的低位MOV @R0,A ;分离后的BCD码存入指定单元中DEC R0RETDELAY: MOV R2,#80DLY: LCALL DLDJNZ R2,DLYRETDL: MOV R6,#50HDL1: MOV R7,#0FFHDL2: DJNZ R7,DL2DJNZ R6,DL1。
13个简单的单片机程序
/************************************************************************ * LED闪烁的简单试验 * * * 连接方法: JP11(P2)和JP1用8PIN排线连接起 来 * * * ************************************************************************ #include <reg51.h> //此文件中定义了51的一些特殊功能寄存器
TH0=(65536-3000)/256; TL0=(65536-3000)%256; TR0=1; ET0=1; EA=1; cntb=0; while(1) {; } } //开启定时0 //开启中断
/************************************************* * * 定时中断 ********************************************************/ 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]; }
void delay(unsigned int i); //声明延时函数 main() { P2 = 0x00; //置P0口为低电平 delay(600); // 延时 P2 = 0xff; //置P0口为高电平 delay(600); // 延时
C51单片机C语言程序100例-Keil
C51单片机C语言程序100例-Keil目录目录1函数的使用和熟悉********************************/.4实例3:用单片机控制第一个灯亮.4实例4:用单片机控制一个灯闪烁:认识单片机的工作频率.4实例5:将P1口状态分别送入P0、P2、P3口:认识I/O 口的引脚功能5实例6:使用P3口流水点亮8位LED.5实例7:通过对P3口地址的操作流水点亮8位LED.6实例8:用不同数据类型控制灯闪烁时间.7实例9:用P0口、P1口分别显示加法和减法运算结果.8实例10:用P0、P1口显示乘法运算结果9实例11:用P1、P0口显示除法运算结果9实例12:用自增运算控制P0口8位LED流水花样10实例13:用P0口显示逻辑“与“运算结果.10实例14:用P0口显示条件运算结果.11实例15:用P0口显示按位“异或“运算结果.11实例16:用P0显示左移运算结果.11实例17:“万能逻辑电路“实验.11实例18:用右移运算流水点亮P1口8位LED.12实例19:用if语句控制P0口8位LED的流水方向13实例20:用swtich语句的控制P0口8位LED 的点亮状态13实例21:用for语句控制蜂鸣器鸣笛次数14实例22:用while语句控制LED.16实例23:用do-while语句控制P0口8位LED流水点亮16实例24:用字符型数组控制P0口8位LED流水点亮17实例25:用P0口显示字符串常量.18实例26:用P0口显示指针运算结果19实例27:用指针数组控制P0口8位LED流水点亮19实例28:用数组的指针控制P0口8位LED流水点亮20实例29:用P0、P1口显示整型函数返回值21实例30:用有参函数控制P0口8位LED流水速度22实例31:用数组作函数参数控制流水花样.23实例32:用指针作函数参数控制P0口8位LED流水点亮23实例33:用函数型指针控制P1口灯花样.25实例34:用指针数组作为函数的参数显示多个字符串.26实例35:字符函数ctype.h应用举例.27实例36:内部函数intrins.h 应用举例.27实例37:标准函数stdlib.h应用举例.28实例38:字符串函数string.h应用举例29实例39:宏定义应用举例2291/192实例40:宏定义应用举例230实例41:宏定义应用举例330中断、定时器************************************************.31实例42:用定时器T0查询方式P2口8位控制LED闪烁31实例43:用定时器T1查询方式控制单片机发出1KHz音频.31实例44:将计数器T0计数的结果送P1口8位LED显示32实例45:用定时器T0的中断控制1位LED闪烁.33实例46:用定时器T0的中断实现长时间定时.34实例47:用定时器T1中断控制两个LED以不同周期闪烁.34实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频.36实例49:用定时器T0的中断实现“渴望“主题曲的播放.36实例50-1:输出50个矩形脉冲.39实例50-2:计数器T0统计外部脉冲数.40实例51-2:定时器T0的模式2测量正脉冲宽度.40实例52:用定时器T0控制输出高低宽度不同的矩形波.41实例53:用外中断0的中断方式进行数据采集.42实例54-1:输出负脉宽为200微秒的方波.43实例54-2:测量负脉冲宽度.43实例55:方式0控制流水灯循环点亮.44实例56-1:数据发送程序.45实例56-2:数据接收程序.47实例57-1:数据发送程序.47实例57-2:数据接收程序.49实例58:单片机向PC发送数据50实例59:单片机接收PC发出的数据51*********************************数码管显示.52实例60:用LED数码显示数字552实例61:用LED数码显示器循环显示数字0~952实例62:用数码管慢速动态扫描显示数字“1234“.53实例63:用LED数码显示器伪静态显示数字1234.54实例64:用数码管显示动态检测结果.54实例65:数码秒表设计.56实例66:数码时钟设计.58实例67:用LED数码管显示计数器T0的计数值.62实例68:静态显示数字“59”.63*****************************键盘控制2/192**************************************************** */.63实例69:无软件消抖的独立式键盘输入实验.64实例70:软件消抖的独立式键盘输入实验.64实例71:CPU控制的独立式键盘扫描实验.65实例72:定时器中断控制的独立式键盘扫描实验.68实例73:独立式键盘控制的4级变速流水灯.71实例74:独立式键盘的按键功能扩展:“以一当四“.73实例75:独立式键盘调时的数码时钟实验.75实例76:独立式键盘控制步进电机实验.79实例77:矩阵式键盘按键值的数码管显示实验.82//实例78:矩阵式键盘按键音85实例79:简易电子琴.86实例80:矩阵式键盘实现的电子密码锁.92************************************************** ************************液晶显示LCD*********液晶显示LCD*****液晶显示LCD*************************************************** *********************/.95实例81:用LCD显示字符A96实例82:用LCD循环右移显示“WelcometoChina“.99实例83:用LCD显示适时检测结果102实例84:液晶时钟设计.106******************************************一些芯片的使用*****24c02DS18B20X5045ADC0832DAC0832DS1302红外遥控**********************************************/112实例85:将数据“0x0f“写入AT24C02再读出送P1口显示112实例86:将按键次数写入AT24C02,再读出并用1602LCD显示.117实例87:对I2C总线上挂接多个AT24C02的读写操作.124实例88:基于AT24C02的多机通信读取程序129实例88:基于AT24C02的多机通信写入程序133实例90:DS18B20温度检测及其液晶显示.144实例91:将数据“0xaa“写入X5045再读出送P1口显示153实例92:将流水灯控制码写入X5045并读出送P1口显示157实例93:对SPI总线上挂接多个X5045的读写操作161实例94:基于ADC0832的数字电压表165实例95:用DAC0832产生锯齿波电压171实例96:用P1口显示红外遥控器的按键值.171实例97:用红外遥控器控制继电器.174实例98:基于DS1302的日历时钟177实例99:单片机数据发送程序.185实例100:电机转速表设计.186模拟霍尔脉冲1923/192/*************************************************** *********函数的使用和熟悉******************************************************* ********///实例3:用单片机控制第一个灯亮#include//包含51单片机寄存器定义的头文件voidmain(void){P1=0xfe;//P1=11111110B,即P1.0输出低电平}//4//实例4:用单片机控制一个灯闪烁:认识单片机的工作频率#include//包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/voiddelay(void)/ /两个void意思分别为无需返回值,没有参数传递{unsignedinti;//定义无符号整数,最大取值范围65535for(i=0;i<20000;i++)//做20000次空循环;//什么也不做,等待一个机器周期}/*************************************************** ****函数功能:主函数(C语言规定必须有也只能有1个主函数)******************************************************* */voidmain(void){while(1)//无限循环{P1=0xfe;//P1=11111110B,P1.0输出低电平delay();//延时一段时间P1=0xff;//P1=11111111B,P1.0输出高电平delay();//延时一段时间}}4/192//5I/O//实例5:将#includeP1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能//包含单片机寄存器的头文件/****************************************************** *函数功能:主函数(C语言规定必须有也只能有1个主函数)******************************************************* */voidmain(void){while(1)//无限循环{P1=0xff;//P1=11111111B,熄灭LEDP0=P1;//将P1口状态送入P0口P2=P1;//将P1口状态送入P2口P3=P1;//将P1口状态送入P3口}}//实例6:使用P3口流水点亮8位LED#include//包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/voiddelay(void){ unsignedchari,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}/********** *********************************************函数功能:主函数******************************************************* */voidmain(void){5/192while(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//包含单片机寄存器的头文件sfrx=0xb0;//P3口在存储器中的地址是b0H,通过sfr可定义8051内核单片机//的所有内部8位特殊功能寄存器,对地址x的操作也就是对P1口的操作/****************************************函数功能:延时一段时间*****************************************/voiddelay(void){ unsignedchari,j;for(i=0;i<250;i++)for(j=0;j<250;j++);//利用循环等待若干机器周期,从而延时一段时间}/*****************************************函数功能:主函数6/192******************************************/voidmain( 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//包含单片机寄存器的头文件/******************************************************函数功能:用整形数据延时一段时间******************************************************/ voidint_delay(void)//延时一段较长的时间{unsignedintm;//定义无符号整形变量,双字节数据,值域为0~65535for(m=0;m<36000;m++);//空操作}/*************************************************** ***函数功能:用字符型数据延时一段时间******************************************************/ 7/192voidchar_delay(void)//延时一段较短的时间{unsignedchari,j;//定义无符号字符型变量,单字节数据,值域0~255for(i=0;i<200;i++)for(j=0;j<180;j++);//空操作}/*************************************************** ***函数功能:主函数******************************************************/ voidmain(void){unsignedchari;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#includevoidmain(void){unsignedcharm,n;口分别显示加法和减法运算结果m=43;//即十进制数2x16+11=438/192n=60;P1=m+n;//即十进制数3x16+12=60//P1=103=01100111B,结果P1.3、P1.4、P1.7口的灯被点亮}P0=n-m;//P0=17=00010001B,结果P0.0、P0.4的灯被熄灭//实例10:用P0、P1口显示乘法运算结果#include//包含单片机寄存器的头文件voidmain(void){unsignedcharm,n;unsignedints;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;//高。
ZY15MCU12BC2单片机实验平台程序清单表
ZY15MCU12BC2单片机实验平台源程序路径:C:\Keil\sample
序号
实验名称
源程序文件名
1
定时器实验
ZYT0.ASM
2
电子钟实验
ZYCLOC.ASM
3
数码转换实验
ZYBTD.ASM
4
数据排序实验
ZYORDER.ASM
5
多字节十六进制乘法实验
14
键盘应用实验
ZY8279.ASMZY879.ASM
15
步进电机实验验
ZYMOT8.ASM
17
压力测量实验
ZYTP.ASM
18
温度测量实验
ZYWD.ASM
19
电压测量实验
ZYDY.ASM
20
顺序控制实验
ZYCON.ASM
21
I2CRAM总线实验
ZYSRAM.ASM
ZYMUL.ASM
6
查表实验
ZYTAB.ASM
7
两个四位十进制数乘法实验
ZYBCDMUL.ASM
8
阶乘实验
ZYFAC.ASM
9
两个四位十六进制数除法实验
ZYDIV.ASM
10
广告灯实验
ZYADV.ASM
11
P1口应用实验
ZYP1.ASM
12
响铃实验
ZYRING.ASM
13
数据传送和存储器检测实验
ZYCRAM.ASM
22
PWM脉宽调制实验
ZYPWM.ASM
23
串转并应用实验
ZYSERIAL.ASM
24
LCD液晶显示器实验
基于单片机的数码管显示程序清单
#include <intrins.h>#include <reg51.h>unsigned int time=0;unsigned int timer=0;// unsigned int yanshi=0;unsigned int i=0;unsigned long S=0;sbit CS=P3^0;sbit CF=P3^1;unsigned int flag=0;unsigned char const shuzi0_9[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //共阳极段码unsigned char const weima[4]={ 0xfb,0xef,0xbf,0x7f};//位码unsigned char disbuff[4]={1,2,3,0};void xianshi(void ) //扫描数码管{ while(1){P1=weima[i]; //取位码P2=shuzi0_9[disbuff[i]]; //取显示数据,段码{int a=0;int b=1;for(;b>0;b--)for(a=0;a<125;a++);}//扫描间隙延时,时间太长会闪烁,太短会造成重影??????????//i++;if(4==i) //检测4位扫描完全结束?如扫描完成则从第一个开始再次扫描4位{i=0; }}}void Conut(void){time=TH0*256+TL0;TH0=0;TL0=0;S=(time*0.17); //算出来是CMif((S>=7000)||flag==1) //超出测量范围显示"-"{flag=0;//flag_beep=0;disbuff[0]=10; //"-"disbuff[1]=10; //"-"disbuff[2]=10; //"-"disbuff[3]=10; //"-"//BEEP=1;}else{disbuff[0]=S/1000; //千位disbuff[1]=S/100%10;// 百位disbuff[2]=S/10%10; // 十位disbuff[3]=S%10; // 个位}}void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围{flag=1; //中断溢出标志}void zd3() interrupt 3 //T1中断用来扫描数码管和计800 ms启动模块{TH1=0xf8;TL1=0x30;//Xianshi();//DIDI();timer++;if(timer>=400){timer=0;CF=1; //800 ms 启动一次模块_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();CF=0;}}void main( void ){TMOD=0x11; //设T0为方式1,GA TE=0;TH0=0;TL0=0;TH1=0xf8; //2 MS定时TL1=0x30;ET0=1; //允许T0中断ET1=1; //允许T1中断TR1=1; //开启定时器EA=1;//开启总中断while(1){//while(!CS); //当RX为零时等待//TR0=1; //开启计数//while(CS); //当RX为1计数并等待//TR0=0; //关闭计数//Conut();//扫描数码管xianshi( );}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MOV SP,#50H ;设置堆栈初值
SETB IT1 ;外部中断1设置为边沿触发方式
SETB IT0 ;外部中断0设置为边沿触发方式
C1: LCALL NUM ;调用学号显示子程序
MOV R0,#70H
LOOP: MOV A,@R0 ;数码管显示子程序
MOV SBUF,A
JNB TI,$ ;等待数据全部发送完
CLR TI
INC R0
DJNZ R3,LOOP
RET ;返回
DELAY_1: MOV R7 ,#10 ;延时1s子程序
MOV 75H,#00H
LCALL DISP ;数码管显示 10927
LCALL DELAY_1 ;延时1s
MOV 70H,#06H
MOV 71H,#3FH
MOV 72H,#6FH
MOV 73H,#5BH
MOV 74H,#07H
MOV 75H,#6FH
CLR P1.2
SETB P1.0
JNB P1.4,L2 ;判断是否为2键按下,按下则跳转
JNB P1.5,L3 ;判断是否为3键按下,按下则跳转
L0: MOV R2,#3FH ;显示6个0
AJMP L4
AJMP L5
L1:MOV R2,#06H ;显示6个1
RETI
TAB3:DB 3FH,06H,5BH,4FH,66H;0,1,2,3,4
DB 6FH,7DH,07H,7FH,6FH;9,6,7,8,9
DB 80H;小数点
END
CLR TI
DJNZ R6,L4
L5: MOV R6,#06H ;再赋初值
CLR P1.0
CLR P1.2
LK4:JNB P1.4,$ ;判断是否按键弹起
JNB P1.5,$
LCALL DELAY_2 ;去抖动
JNB P1.4,LK4 ;判断是否真的弹起
MOV 74H,#00H
MOV 75H,#00H
LCALL DISP ;数码管显示 1092
LCALL DELAY_1 ;延时1s
MOV 70H,#06H
MOV 71H,#3FH
MOV 72H,#6FH
MOV 73H,#5BH
MOV 74H,#07H
LCALL ADC ;启动A/D功能
K6: CJNE R2,#5BH,K7 ;判断是否为2号键
LCALL DAC ;启动D/A功能
K7: CJNE R2,#4FH,K8 ;判断是否为3号键
LCALL NUM ;调用显示学号子程序
GL0:MOV A,@R0;取出数据作为查表偏移量
MOV DPTR,#TAB3;取出字型码数据列表首地址
MOVC A,@A+DPTR;查找字型码
MOV SBUF,A;发送显示
GL1:JNB TI,GL1;判断有没有发送完
CLR TI;清除中断标志位,准备下次发送
DEC R0
DJNZ R2,GL0;判断数据有没有全部显示
ORG 0013H ;外部中断1入口地址
LJMP INT_INT1 ;外部中断1服务程序
ORG 001BH ;定时器T1中断入口程序
LJMP INT_T1 ;定时器T1中断服务程序
ORG 0030H
D4:MOV R6 ,#200
D3:MOV R5 ,#250
DJNZ R5 ,$
DJNZ R6 ,D3
DJNZ R7 ,D4
DELAY_2: MOV R0,#0AH ;延时10ms
DL2: MOV R1,#7DH
DL1: NOP
NOP
DJNZ R1,DL1
DJNZ R0,DL2
K8: MOV R5,#40 ;赋初值
RETI ;返回
NUM: SETB RS0 ;学号子程序(使用第一组工作寄存器)
PUSH ACC ;保护现场
PUSH DPH
PUSH DPL
MOV 70H,#06H
MOV 71H,#00H
MOV 72H,#00H
MOV 73H,#00H
MOV 74H,#00H
MOV 75H,#00H
LCALL DISP ;数码管显示 1
LCALL DELAY_1 ;延时1s
MOV 70H,#06H
MOV 71H,#3FH
MAIN: CLR P1.3 ;关闭蜂鸣
MOV R5,#40 ;初始化
MOV TMOD,#11H
MOV TH0,#3CH
MOV TL0,#0B0H
MOV TH1,#0FFH
MOV TL1,#0D9H
MOV IE,#8FH ;打开中断允许位
JNB P1.5,LK2
RETI
LK2: SETB P1.3 ;蜂鸣启动
SETB P1.2
SETB TR0 ;启动定时器T0
JNB P1.4,L0 ;判断是否为0键按下,按下则跳转
JNB P1.5,L1 ;判断是否为1键按下,按下则跳转
ORG 0000H
LJMP MAIN ;进入主程序
ORG 0003H ;外部中断0入口地址
LJMP INT_INT0 ;外部中断0服务程序
ORG 000BH ;定时器T0中断入口程序
LJMP INT_T0 ;定时器T0中断服务程序
SJMP C1
INT_INT1: MOV R6,#06H ;赋初值
CLR P1.0
CLR P1.2
LK3: JNB P1.4,LK1 ;判断是否有键按下
JNB P1.5,LK1
RETI
LK1: LCALL DELAY_2 ;去抖动
JNB P1.4,LK2 ;是否真的有键按下
RET ;返回
INT_T0: MOV TH0,#3CH ;赋初值
MOV TL0,#0B0H
DJNZ R5,LP
LP: RETI
DAC:MOV DPTR,#3FFFH ;D/A功能子程序
MOV A,#0FFH
SETB TR1
RET
INT_T1: MOV DPTR,#3FFFH
LCALL DISP ;数码管显示109279
LCALL DELAY_1 ;延时1s
CLR RS0
POP DPL
POP DPH
POP ACC ;恢复现场
RET ;返回
DISP: MOV R3,#06H
AJMP L4
AJMP L5
L2:MOV R2,#5BH ;显示6个2
AJMP L4
AJMP L5
L3:MOV R2,#4FH ;显示6个3
AJMP L4
AJMP L5
L4: MOV SBUF,R2 ;显示6个相同数的子程序
JNB TI,$ ;等待数据全部发送完
MOVX @DPTR,A ;定时器T1中断入口程序
DEC A
MOV TH1,#0FFH ;再重新赋初值
MOV TL1,#0D9H
RETI
ADC: MOV DPTR,#0BFFBH ;A/D功能子程序
MOVX @DPTR,A
RET
INT0: PUSH ACC
JNB P1.5,LK4
CLR P1.3 ;关蜂鸣
CLR TR0 ;关定时器T0
MOV TH0,#3CH ;赋初值
MOV TL0,#0B0H
CJNE R5,#00H,K8 ;判断按键是否达到2s
CJNE R2,#06H,K6 ;判断是否为1号键
INC R0;更新暂存单元
MOV A,B;余数部分存入累加器A
MOV B,#5
DIV AB;求出小数部分第一位
MOV @R0,A;将小数第一位存入数据暂存区
INC R0;更新存储单元
MOV A,#10
MUL AB
MOV B,#5
DIV AB;求出小数部分第二位
MOV @R0,A;将小数部分第二位存入数据暂存区
SETB RS1
CLR RS0
MOV 10H,#40H;
MOV R2,#4
MOV DPTR,#0BFFBH
MOV除求出整数部分
MOV @R0,A;将整数部分存入数据暂存区
INC R0;更新暂存单元
MOV @R0,#0BH;将小数点偏移量存入数据暂存区
MOV 72H,#00H
MOV 73H,#00H
MOV 74H,#00H
MOV 75H,#00H
LCALL DISP ;数码管显示 10
LCALL DELAY_1 ;延时1s
MOV 70H,#06H
MOV 71H,#3FH
MOV 72H,#6FH
MOV 73H,#00H
MOV 74H,#00H
MOV 75H,#00H
LCALL DISP ;数码管显示 109
LCALL DELAY_1 ;延时1s
MOV 70H,#06H
MOV 71H,#3FH
MOV 72H,#6FH
MOV 73H,#5BH