51单片机程序全集(二)

合集下载

51单片机常见程序,附带注释

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单片机入门程序

51单片机入门程序

1点亮LED灯#include "reg52.h"sbit led1=P1^0;void main(void){while(1){led1=0;}}2延时函数#include "reg52.h"sbit led1=P1^0;void delay_ms(int z){int a;for( ;z>0;z--)for(a=110;a>0;a--); }void main(void){while(1){led1=0;delay_ms(500);led1=1;delay_ms(500);}}3按键控制LED灯#include "reg52.h"sbit led1=P1^0;void delay_ms(int z){int a;for( ;z>0;z--)for(a=110;a>0;a--);}void main(void){while(1){led1=0;delay_ms(500);led1=1;delay_ms(500);}}4PWM控制LED灯#include"reg52.h"sbit led1=P1^0;sbit led2=P1^7;void delay_us(int a){for( ;a>0;a--);}void main(){ int p=0,l=300;led2=0;while(1){led1=0;delay_us(p);led1=1;delay_us(l);p++;if(p==300){p=300;}l--;if(l<0){l=0;}// delay_us(300);}}5库函数流水灯#include "reg52.h"#include "intrins.h"void delay_ms(int z){int a;for( ;z>0;z--)for(a=110;a>0;a--);}void main(void){unsigned char a,s;while(1){a=0x7f;for(s=0;s<8;s++) //循环8次{ P1=a;delay_ms(100); //延时一下每个灯亮300msa=_cror_(a,1);}a=0xfe;for(s=0;s<8;s++) //循环8次{ P1=a;delay_ms(100); //延时一下每个灯亮300msa=_crol_(a,1);}}}6流水灯左右移动#include "reg52.h"void delay_ms(int d) //延时函数原理就是让单片机不停地作加减法运算{int v;for( ;d>0;d--)for(v=110;v>0;v--);}void main(){int a;while(1){for(a=0;a<8;a++) //循环8次{P1=~(0x01<<a); //依次点亮leddelay_ms(300); //延时一下每个灯亮300ms }for(a=0;a<8;a++) //循环8次{P1=~(0x80>>a); //依次点亮leddelay_ms(300); //延时一下每个灯亮300ms }}}7外部中断#include"reg52.h"sbit led1=P1^0;void delay_ms(int z){int a;for( ;z>0;z--)for(a=110;a>0;a--);}void main(void){ EA = 1; // 打开总中断EX0 = 1; // 打开中断0IT0 = 0; // 触发方式=1高电平触发=0低电平触发EX1 = 1; // 打开中断1IT1 = 0; //while(1){led1=0;delay_ms(200);led1=1;delay_ms(200);}}void int0() interrupt 0{led1=0;}void int1() interrupt 2{led1=0;delay_ms(500);led1=1;delay_ms(500);}8单个数码管#include "reg52.h"sbit w1=P2^4;sbit w2=P2^5;sbit w3=P2^6;sbit w4=P2^7;unsigned char smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9数组void delay_ms(int z) //延时函数{int a;for( ;z>0;z--)for(a=110;a>0;a--);}/*主函数*/void main(void){w1=0; //打开第一位数码管控制正极的三极管while(1){P0=smg[]; //显示下标为k的数scankey(); //扫描按键状态}}9两位数码管#include "reg52.h"sbit w1=P2^4;sbit w2=P2^5;unsigned char smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9数组291625334void delay_ms(int z) //延时函数{int a;for( ;z>0;z--)for(a=110;a>0;a--);}/*主函数*/void main(void){ int s=39;while(1){w1=0; //打开第一位数码管的正极P0=smg[s/10]; //送入要显示的数据到数码管delay_ms(2);//延时一会P0=0xff; //w1=1; //第一位数码管的正极也就失去了正极w2=0; //打开第二位数码管的正极P0=smg[s%10];//送入要显示的数据到数码管delay_ms(2); //延时一会P0=0xff;w2=1;}}10按键控制四位数码管#include "reg52.h"sbit w1=P2^4;sbit w2=P2^5;sbit w3=P2^6;sbit w4=P2^7;sbit k1=P3^2;sbit k2=P3^3;unsigned char smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9数组291625334int k=0;void delay_ms(int z) //延时函数{int a;for( ;z>0;z--)for(a=110;a>0;a--);}void display(unsigned int s){w1=0; //打开第一位数码管的正极P0=smg[s/1000]; //送入要显示的数据到数码管delay_ms(2);//延时一会P0=0xff; //w1=1; //第一位数码管的正极也就失去了正极w2=0; //打开第二位数码管的正极P0=smg[s%1000/100];//送入要显示的数据到数码管delay_ms(2); //延时一会P0=0xff;w2=1;w3=0; //打开第一位数码管的正极P0=smg[s%1000%100/10]; //送入要显示的数据到数码管delay_ms(2);//延时一会P0=0xff; //w3=1; //第一位数码管的正极也就失去了正极w4=0; //打开第二位数码管的正极P0=smg[s%1000%100%10];//送入要显示的数据到数码管delay_ms(2); //延时一会P0=0xff;w4=1;}/*主函数*/void main(void){while(1){ if(k1==0){delay_ms(5);if(k1==0){k=k+50;if(k>2000) k=0;while(k1==0) display(k);}}if(k2==0){delay_ms(5);if(k2==0){k=k-50;if(k<0)k=2000;while(k2==0) display(k);}}display(k);}}11定时器#include "reg52.h"sbit w1=P2^4;sbit w2=P2^5;sbit w3=P2^6;sbit w4=P2^7;unsigned char smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9数组291625334int m,c,f;void delay_ms(int z) //延时函数{int a;for( ;z>0;z--)for(a=110;a>0;a--);}void display(unsigned int s,l){w1=0; //打开第一位数码管的正极P0=smg[s/10]; //送入要显示的数据到数码管delay_ms(2);//延时一会P0=0xff; //w1=1; //第一位数码管的正极也就失去了正极w2=0; //打开第二位数码管的正极P0=smg[s%10];//送入要显示的数据到数码管delay_ms(2); //延时一会P0=0xff;w2=1;w3=0; //打开第一位数码管的正极P0=smg[l/10]; //送入要显示的数据到数码管delay_ms(2);//延时一会P0=0xff; //w3=1; //第一位数码管的正极也就失去了正极w4=0; //打开第二位数码管的正极P0=smg[l%10];//送入要显示的数据到数码管delay_ms(2); //延时一会P0=0xff;w4=1;}/*主函数*/void main(void){TMOD=0x01; //设置定时器模式TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;while(1){display(f,m);}}void miaodata() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;c++;if(c==20){c=0;m++;if(m==60){m=0;f++;if(f==60){f=0;}}}}12串口通信#include<reg52.h>#define uchar unsigned char#define baud9600 9600UL#define baud19200 19200UL#define fosc 11059200UL//其中,UL代表unsigned long #define baud_9600 1sbit dj=P1^0;sbit m0=P1^1;sbit m1=P1^2;int fx; //初始化舵机在中间void delay(int a){for(a=110;a>0;a--);}void stop(){m0=0;m1=0;}void up(){m0=0;m1=1;}void dn(){m0=1;m1=0;}void serial_init(void){TMOD=0x21;//T1工作在方式2SCON=0x50;//SM1=1串口通信在模式1,REN=1并启动串口。

51单片机汇编程序 (2)

51单片机汇编程序 (2)

知识创造未来
51单片机汇编程序
抱歉,我不提供编写汇编程序的服务。

但是,您可以在互联网上找到关于51单片机的汇编程序示例。

思路如下:
1. 确定程序的功能和需求。

2. 编写源代码,使用51单片机的汇编指令集来实现功能。

3. 将源代码汇编成机器码,生成可执行文件。

4. 使用相应的编程器将可执行文件烧录到51单片机。

5. 测试程序,确保功能正常。

需要注意的是,51单片机的汇编语言和汇编器可能有所不同,具体编写和调试过程可能会因此而异。

建议参考相关文档和教程以获取更详细的信息。

1。

51单片机汇编程序2

51单片机汇编程序2

51单片机汇编程序2§2.3.2软件结构及程序设计一、主程序及其说明ORG 0000HAJMP MAIN ;主程序ORG 0003HAJMP X0S ;外部中断入口ORG 000BHLJMP T0S ;定时器T0中断入口ORG 001BHAJMP T1S ;定时器T1中断入口ORG 0023HLJMP SSV ;串行中断入口ORG 0030HMAIN: CLR EAMOV SP, #50HMOV A, 48H ;48H、49H单元为冷热启动标志单元CJNE A, #0AAH, LRE ;如等于0AAH、55H,则说明为热启动MOV A, 49H ;否则,为冷启动,则进行自检CJNE A, #55H, LRESJMP HRELRE: LCALL ZJ ;冷启动,则自检SETD: MOV 48H,#0AAH ;自检完后,设置为热启动标志字节MOV 49H,#55HHRE: MOV A, P1 ;读判采样周期档位ANL A, #0FHXRL A, #09HJZ M17 ;数据掉电保护故不进行采样,分析原数据 SJMP M18 M17: CLR P3.5AJMP M19M18: MOV R7, #00H ;非掉电保护方式,则将所有采样数据单元 MOV DPTR,#8020H ;清0MOV R6, #00HMOV A, R6M20: MOVX @DPTR,AINC R7INC DPTRCJNE R7,#00H, M20M21: MOV R7,#19HMOV DPTR, #8000HMOV A, #14HM1: MOVX @DPTR, AINC DPTRDJNZ R7,M1SETB IT0CLR P3.5MOV TMOD,#11HM0: MOV A, P1ANL A, #0FHJNZ M2MOV TH0,#0FFH ;由T0设置采样周期MOV TL0,#0F6HMOV 3EH,#02HAJMP M10M2: JB ACC.3,M10JB ACC.2,M8JB ACC.1,M7MOV TH0,#0FFHMOV TL0,#0CEHMOV 3EH,#00HM8: JB ACC.1,M6 JB ACC.0,M5 MOV TH0,#0FCH MOV TL0,#18H MOV 3EH,#10H AJMP M9M7: JB ACC.0,M4 MOV TH0,#0FFH MOV TL0,#9CH MOV 3EH,#01H AJMP M9M6: JB ACC.0,M3 MOV TH0,#0ECH MOV TL0,#78H MOV 3EH,#13H AJMP M9M5: MOV TH0,#0F8H MOV TL0,#30H MOV 3EH,#12H SJMP M9M4: MOV TH0,#0FEH MOV TL0,#0CH MOV 3EH,#03H SJMP M9M3: MOV TH0,#0D8H MOV TL0,#0F0H MOV 3EH,#11H SJMP M9M10: LCALL ERRM9: MOV 3CH,TL0MOV 3DH,TH0MOV A, 3EHMOV DPTR,#8019HMOVX @DPTR,AMOV IE, #8BHMOV IP, #02HCLR 00H ;等待INT0采样中断M11: JNB 00H,M11MOV IE, #88HM23: MOV DPTR,#0E000HMOVX A, @DPTRMOV A, P1ANL A, #0F0HMOV DPTR,#801AHMOVX @DPTR,AM19: MOV IE, #88HACALL ST2 ;建立TB2显示内容表ACALL CALS ;计算信号峰值、均值、脉宽 LCALL TRS ;工程量转换M12: MOV DPTR,#0F000HMOVX A, @DPTRMOV A, P1 ;读显示方式开关JB ACC.4, M13ACALL SD ;固定显示SJMP M12M13: JB ACC.5, M14LCALL XPD ;分页显示SJMP M12M14: JB ACC.6, M15LCALL SLD ;滑移显示SJMP M12M15: JB ACC.7, M16ACALL DCH ;字符显示,将分析结果显示在示波器上SJMP M12M16: JB P3.4, M12 ;是否通信?=0,说明要通信JB P3.3, M16 ;开始通信?=0,说明开始通信;数据通信,以便在上位机上进行数据硬拷贝、FFT分析等LCALL SENT ;数据向上位机发送通信SJMP M12外部中断INT0中断服务程序清单如下:X0S: MOV DPTR, #2000H ;启动A/D转换MOVX @DPTR, ASETB TR0 ;启动T0定时MOV 3AH, #20H ;存储区首地址0020HMOV 3BH, #00HMOV R7, #00H ;存储计数器送初值1024MOV R6, #04HCLR 70H ;系统自检标志清除,即为正常的工作程序而非自检X0S0: CLR 01HX0S1: JNB 01H, X0S1 ;等待T0定时中断CJNE R6, #00H, X0S0 ;1024个数据全部采样完成?CJNE R7, #00H, X0S0 ;否,则继续采集CLR TR0 ;是,则停T0CLR EX0 ;关外中断INT0SETB 00HRETI定时器TIMER0中断服务程序清单如下:T0S: JNB 70H, T0S1 ;判是否为系统自检(其中的中断系统)CLR 70H ;是,则清标志后直接返回RETIT0S1: SETB 01HCLR TR0 ;停止T0MOV TH0, 3DH ;送T0原时间常数MOV TL0, 3CHSETB TR0 ;启动T0定时MOVX A, @DPTR ;读入A/D结果MOV DPH, 3BH ;按指针存储MOV DPL, 3AHMOVX @DPTR, AINC DPTR ;指向下一个单元MOV 3BH, DPH ;指针保护MOV 3AH, DPLMOV DPTR, #2000H ;指向A/D接口DEC R7 ;存储计数器减1CJNE R7, #0FFH, T0S2DEC R6T0S2: RETI2.显示字符与汉字的程序实现;******************************************************************* **** ;显示字符示例子程序,程序中的TB1、TB2、TB3三表分别为;TB1:各字符的显示点阵在字库中的首地址表,在内部EEPROM中;TB2:各字符的代码表,在外部RAM中,由子程序建立,例如:0AH代表“峰”;TB3:各字符的位置坐标,在内部EEPROM中;******************************************************************* **** DCH: MOV R0, #00H ;当前显示字符序号指针DCH1: MOV DPTR, #0000H ;查TB2表得当前显示字符的代码MOV A, DPLADD A, R0MOV DPL,AJNC DCH2INC DPHDCH2: MOVX A, @DPTR ;送存30H单元MOV 30H,ACJNE A, #14H, DCH3 ;非空格码转DCH3AJMP DCH7 ;是空格码转DCH7DCH3: MOV A, R0 ;查TB3表得显示字符的位置坐标ADD A, 0E0HPUSH ACCMOV DPTR, #0630HMOVC A, @A+DPTRMOV 31H,A ;位置X坐标送存31HPOP ACCMOVC A, @A+DPTRMOV 32H,A ;位置Y坐标送存32HMOV A, 30H ;查TB1表得字符点阵在字库中的地址ADD A, 30HPUSH ACCMOV DPTR, #0600HMOVC A, @A+DPTRMOV 33H,A ;地址高字节送33HPOP ACCINC ACCMOVC A, @A+DPTRMOV 34H,A ;地址低字节送34HMOV DPH,33H ;取本字符光点数送R1MOV DPL,34HMOV A, #00HMOVC A, @A+DPTRMOV R1, ADCH4: INC DPTR ;取光点坐标数据MOV A, #00HMOVC A, @A+DPTR ;光点X坐标送R7ANL A, #0F0HSW AP AADD A, 31HMOV R7, AMOV A, #00H ;光点Y坐标送R6MOVC A, @A+DPTRANL A, #0FHADD A, 32HMOV R6, APUSH DPLMOV DPTR, #4000H ;输出光点X坐标MOV A, R7MOVX @DPTR,AMOV DPTR, #6000H ;输出光点Y坐标MOV A, R6MOVX @DPTR,AMOV DPTR, #8000H ;X、Y同时输出至CRTMOVX @DPTR, ADEC R1 ;光点计数器减1CJNE R1, #00H, DCH5 ;本字符显示完未成,转显示下个点SJMP DCH6DCH5: POP DPLPOP DPHAJMP DCH4DCH6: POP DPL ;恢复指针POP DPHDCH7: INC R0 ;序号指针增1CJNE R0, #19H, DCH8 ;一帧未完成转显示下个字符RET ;一帧完成,则返回DCH8: AJMP DCH15.程序设计示例;******************************************************************* ****** ;滑移显示子程序,具有暂停功能,在CRT右上角显示对应页号.;******************************************************************* ****** SLD:MOV DPTR,#0020H ;数据指针初值0020HMOV TH1, #0FFH ;送T1时间常数,每点50usMOV TL1, #0EEHMOV 46H, #0FFHMOV 45H, #0EEHSETB ET1 ;开放T1中断SLD0:MOV R7,#00H ;每帧点数计数器清零PUSH DPH ;保护数据指针PUSH DPLSETB TR1 ;启动T1SLD1:CLR 02HSLD2:JNB 02H,SLD2 ;等待T1中断MOVX A,@DPTR ;按指针取数PUSH DPHPUSH DPLMOV DPTR,#6000H ;向Y轴输出MOVX @DPTR, AMOV A, R7MOV DPTR, #4000H ;向X轴输出MOVX @DPTR, AMOV DPTR, #8000H ;同时联合输出到CRTMOVX @DPTR, APOP DPLPOP DPHINC DPTR ;指向下个数据INC DPTR ;计数器减1INC R7CJNE R7, #00H, SLD1 ;本帧(256个数据)未完成则循环SLD3: POP DPL ;恢复数据指针POP DPHMOV A, DPL ;判是否已到数据末地址(即最后一个数据)CJNE A, #20H, SLD4 ;未到,修改数据指针初值转显示下帧MOV A, DPHCJNE A, #04H, SLD4CLR ET1 ;滑移显示完成,关T1LR TR1RETSLD4: JNB P3.0, SLD0 ;是暂停?是则转SLD0INC DPTR ;否则继续滑移显示SJMP SLD0串行通信中断服务子程序清单及其说明如下:SSV: CLR TI ;清发送中断标志DEC R7 ;计数器减1CJNE R7, #0FFH, SSV1DEC R6SSV1: CJNE R6, #00H, SSV2 ;计数器非0,则转SSV2 CJNE R7, #00H, SSV2CLR ES ;为0,则发送完成,关串行中断SJMP SSV3SSV2: INC DPTR ;指向下一个数据MOVX A, @DPTR ;取数LCALL XSS ;补校验位后发送SSV3: RETI补校验位并发送子程序清单:XSS: ADD A, #00H ;加入校验位MOV C, PMOV TB8, CMOV SBUF, A ;发送RET。

程序设计_51单片机应用开发范例大全(第2版)_[共5页]

程序设计_51单片机应用开发范例大全(第2版)_[共5页]

第11章 单片机实现信号与算法387║11.5.2 单片机浮点数运算实现原理一般浮点数均采用 ± M×C E的形式来表示,其中M称为尾数。

它一般取为小数0≤M<1,E为阶码,它为指数部分,它的基是C。

C可以取各种数,对于十进制数,它一般取10,而对于二进制数,C一般取2,对于十进制数,可以很方便地把它换成十进制浮点数。

对于微机系统来说,常用的浮点数均为C = 2,在浮点数中,有一位专门用来表示数的符号,阶码E的位数取决于数值的表示范围,一般取一个字节,而尾数则根据计算所需的精度,取2~4字节。

浮点数也有各种各样表示有符号数的方法,其中数的符号常和尾数放在一起,即把 ± M 作为一个有符号的小数,它可以采用原码、补码等各种表示方法,而阶码可采用各种不同的长度,并且数的符号也可以放于各种不同的地方。

所以浮点数有很多的表示方法。

四字节浮点数表示法是微机中常用的一种表示方式。

浮点数总长度是32位,其中阶码8位,尾数是24位。

阶码和尾数均为2的补码形式。

阶码的最大值位+127,最小值−128,这样四字节浮点数能表示的最大值近似于 1 × 2127=1.70 × 1038,能表示的最小值近似为0.5 × 2−128=1.47 × 10−39,这时该范围内的数具有同样的精度。

四字节的浮点数精度较高,接近7位十进制数,但是由于字节较多,运算速度较慢,往往不能满足实时控制和测量的需要,并且实际使用时所需的精度一般不要求这么高,三字节浮点数就满足了这个要求,精度较低,但运算速度较高。

浮点数总长为24位,其中阶码为7位,数符在阶码所在字节的最高位,尾数为16位,这种表示法运算速度较快需要的存储容量较小,并且数的范围和精度能满足大多数应用场合的需要。

下面的程序基本都采用这种表示方法。

规格化浮点数,在实际应用中,需要有一个程序来完成把一个非规格化数变规格化数的操作。

第3章_MCS-51单片机指令系统及汇编语言程序设计2

第3章_MCS-51单片机指令系统及汇编语言程序设计2

3. 汇编语言的语句格式是什么?使用标号有什么限制?注释段起什么作用? 答案: MCS-51汇编语言的语句格式应符合下列结构: 【标号:】 操作码 【操作数】【;注释】 标号位于语句的开始,由以字母开头的字母和数字组成,它代表该语句的地址。 标号与操作码之间要用“:”隔开,标号与“:”之间不能有空格,“:”与操 作码之间可以有空格。 注释在语句的最后,以“;”开始,是说明性的文字,与语句的具体功能无关。 4. MCS-51汇编语言有哪几条常用伪指令?各起什么作用? 答案: ORG:汇编程序起始地址,用来说明其后程序段在存储器中存放的起始地址; EQU:赋值指令,用来给变量标号赋予一个确定的数值; DB:定义数据字节,指令按字节数的形式把数据存放在存储单元中; DW:定义数据字,按字(双字节)的形式把数据存放在存储单元中; DS:定义存储区,从指定的地址单元开始,保留一定数量的存储单元; BIT:位定义,其功能是把位地址赋给字符名称; END:汇编结束,表明汇编语言程序结束。
2.顺序程序
顺序程序是指程序中没有使用转移类指令的程序段,机器执行这 类程序时也只需按照先后顺序依次执行,中间不会有任何分支、循环, 也不需要调用子程序。 例:将一个单字节十六进制数转换成BCD码。 解:算法分析。单字节十六进制数在0~255之间,将其除以100后, 商为百位数;余数除以10,商为十位数,余数为个位数。 设单字节数存放在40H,转换后,百位数存放在R0中,十位数存 放在R1中,个位数存放在R2中,具体程序如下: ORG 0030H MOV A, 40H ;将单字节十六进制数送入A中 MOV B,#64H ;将100送入B中, #64H可直接写成#100 DIV AB MOV R0,A ;百位数送R0,余数在B中 XCH A,B ;余数送入A中 MOV B,#0AH ;将10送入B中, #0AH可直接写成#10 DIV AB ;商为十位数,余数为个位数 MOV R1,A MOV R2,B SJMP $

51单片机功能程序

51单片机功能程序
TR1=1;
SM0=0; //十位异步收发器 (8位数据)
SM1=1;
EA=1;
ES=1; //串行口中断允许位;//RI,接收中断标志位;TI,发送中断标志位
REN=1;//允许串行接收位
void ser() interrupt 4
{
}
//1602液晶
void write_com(uchar com)//写指令
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
delay(5);//该变方向是要延时
}
uchar read_add(uchar address)
{
w/中断0
EA=1;//开总中断
EX0=1;//开外部中断0 //当IT0=0时,为电平触发方式。
IT0=1; //当IT0=1时,为边沿触发方式(下降沿有效)
void int0() interrupt 0
{
}
//中断1
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
TL0=(65536-50000)%256;
}
//T0计数器
EA=1;//总中断
ET0=1; //定时/计数器T0中断允许位;

51单片机C语言可调时钟(2)(1)

51单片机C语言可调时钟(2)(1)

/*这是一个真正有意义的时钟key1功能键选择可调位,短按,每按一下有一位闪烁长按闪烁不断向下一位推移key2 加键短按相应闪烁的位加1,长按连续加1;key3 减键短按相应闪烁的位减1,长按连续减一;key4 确定键按下退出调时,正常显示;*/#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define LED P0#define KEY_1 0x0e#define KEY_2 0x0d#define KEY_3 0x0b#define KEY_4 0x07#define KEY_NULL 0x0f#define KEY_PRESS 0x80#define KEY_LONG 0x40#define KEY_STATE_INIT 0#define KEY_STATE_PRESS 1#define KEY_STATE_LONG 2#define KEY_STATE_UP 3#define KEY_LONG_PERIOD 20#define KEY_CONTINUE_PERIOD 10bit set;bit dao1S=0;bit dao2MS=0;bit dao10MS;sbit dula=P2^6;sbit wela=P2^7;sbit key1=P3^4;sbit key2=P3^5;sbit key3=P3^6;sbit key4=P3^7;int main_flag,exit_flag,up_flag,down_flag;int tab[]={0,0,0,0,0,0};uchar weitable[]={0x01,0x02,0x04,0x08,0x10,0x20};uchar tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void nint(){ TMOD=0X01;TH0=0XF8;TL0=0XCC;TR0=1;ET0=1;}uchar KeyScan(){if(key1==0) return KEY_1;if(key2==0) return KEY_2;if(key3==0) return KEY_3;if(key4==0) return KEY_4;return KEY_NULL;}uchar GetKey(){uchar keyRetu=0,keyTemp=KEY_NULL;static uchar s_keyState=KEY_STATE_INIT,keyTime=0,keyLast=KEY_NULL;keyTemp=KeyScan();switch (s_keyState){case KEY_STA TE_INIT:if(keyTemp!=KEY_NULL){s_keyState=KEY_STA TE_PRESS;}break;case KEY_STA TE_PRESS:if(keyTemp!=KEY_NULL){s_keyState=KEY_STA TE_LONG;keyTime=0;keyLast=keyTemp;}else{s_keyState=KEY_STA TE_INIT;}break;case KEY_STA TE_LONG:if(keyTemp==KEY_NULL){s_keyState=KEY_STA TE_INIT;keyRetu=(keyLast|KEY_PRESS);}else{if(++keyTime>=KEY_LONG_PERIOD) //按下时间>1s{s_keyState=KEY_STATE_UP;keyTime=0;}}break;case KEY_STA TE_UP:if(keyTemp==KEY_NULL){s_keyState=KEY_STA TE_INIT;}else{if(++keyTime>=KEY_CONTINUE_PERIOD) //按下时间>0.5s {keyTime=0;keyRetu=(keyLast|KEY_LONG);}}break;}return keyRetu;}void updatetime(){if(dao1S){dao1S=0;if(++tab[5]==10){ tab[5]=0;if(++tab[4]==6){tab[4]=0;if(++tab[3]==10){ tab[3]=0;if(++tab[2]==6){ tab[2]=0;if(tab[0]<2){if(++tab[1]==10){ tab[1]=0;tab[0]++;}}else{ if(tab[1]==4){ tab[1]=0;tab[0]=0;}} }}}}}}void display(){ static uchar k=0;dula=1;LED=tab1[tab[k]];if(set&&((k==main_flag-1))){LED=0XFF;}dula=0;LED=0Xff;wela=1;LED=weitable[k];wela=0;if(++k>5) k=0;}void sittime(uchar hour,uchar minute,uchar second ) { uchar a1,a2,b1,b2,c1,c2;a1=hour/10;a2=hour%10;b1=minute/10;b2=minute%10;c1=second/10;c2=second%10;tab[0]=a1;tab[1]=a2;tab[2]=b1;tab[3]=b2;tab[4]=c1;tab[5]=c2;}void main(){ nint();EA=1;sittime(15,20,15);while(1){updatetime();if(dao2MS){dao2MS=0;display();}if(dao10MS){dao10MS=0;switch (GetKey()){case (KEY_1|KEY_PRESS):if(++main_flag>=7)main_flag=0;break;case (KEY_1|KEY_LONG):if(++main_flag>=7)main_flag=0;break;case (KEY_2|KEY_PRESS):switch(main_flag){case 1:{if(++tab[0]>=3)tab[0]=0;}break;case 2:{if(++tab[1]>4)tab[1]=0;}break;case 3:{if(++tab[2]>5)tab[2]=0;}break;case 4:{if(++tab[3]>9)tab[3]=0;}break;case 5:{if(++tab[4]>5)tab[4]=0;}break;case 6:if(++tab[5]>9)tab[5]=0;}break;case (KEY_2|KEY_LONG): switch(main_flag) {case 1:{if(++tab[0]>=3)tab[0]=0;}break;case 2:{if(++tab[1]>4)tab[1]=0;}break;case 3:{if(++tab[2]>5)tab[2]=0;}break;case 4:{if(++tab[3]>9)tab[3]=0;}break;case 5:{if(++tab[4]>5)tab[4]=0;}break;case 6:if(++tab[5]>9)tab[5]=0;}break;case (KEY_3|KEY_PRESS):switch(main_flag){case 1:{if(--tab[0]<0)tab[0]=2;}break;case 2:{if(--tab[1]<0)tab[1]=4;}break;case 3:{if(--tab[2]<0)tab[2]=5;}break;case 4:{if(--tab[3]<0)tab[3]=9;}break;case 5:{if(--tab[4]<0)tab[4]=5;}break;case 6:if(--tab[5]<0)tab[5]=9;}break;case (KEY_3|KEY_LONG): switch(main_flag){case 1:{if(--tab[0]<0)tab[0]=2;}break;case 2:{if(--tab[1]<0)tab[1]=4;}break;case 3:{if(--tab[2]<0)tab[2]=5;}break;case 4:{if(--tab[3]<0)tab[3]=9;}break;case 5:{if(--tab[4]<0)tab[4]=5;}break;case 6:if(--tab[5]<0)tab[5]=9;}break;case (KEY_4|KEY_PRESS):main_flag=0;display();}}}}void timer() interrupt 1{ static count=0;static count1=0;TH0=0XF8;TL0=0XCC;dao2MS=1;count++;if(++count1==10){ c ount1=0;dao10MS=1;}if(!(count%25)) set = !set;if(count==500) {count=0;dao1S=1; }}。

51单片机C语言编程100例 (2)(可打印修改) (2)

51单片机C语言编程100例 (2)(可打印修改) (2)
word 完美整理版
范文范例 学习指导
实例 45:用定时器 T0 的中断控制 1 位 LED 闪烁 .........................32 实例 46:用定时器 T0 的中断实现长时间定时 ...........................32 实例 47:用定时器 T1 中断控制两个 LED 以不同周期闪烁 .................33 实例 48:用计数器 T1 的中断控制蜂鸣器发出 1KHz 音频 ..................34 实例 49:用定时器 T0 的中断实现"渴望"主题曲的播放 ...................35 实例 50-1:输出 50 个矩形脉冲 .......................................38 实例 50-2:计数器 T0 统计外部脉冲数 .................................39 实例 51-2:定时器 T0 的模式 2 测量正脉冲宽度 .........................39 实例 52:用定时器 T0 控制输出高低宽度不同的矩形波 ...................40 实例 53:用外中断 0 的中断方式进行数据采集 ..........................41 实例 54-1:输出负脉宽为 200 微秒的方波 ..............................42 实例 54-2:测量负脉冲宽度 ..........................................42 实例 55:方式 0 控制流水灯循环点亮 ..................................43 实例 56-1:数据发送程序 ...........................

经典51单片机实用子程序库(二)

经典51单片机实用子程序库(二)

51单片机实用子程序库(二)MCS-51浮点运算子程序库及其使用说明本浮点子程序库有三个不同层次的版本,以便适应不同的应用场合:1.小型库(FQ51A.ASM):只包含浮点加、减、乘、除子程序。

2.中型库(FQ51B.ASM):在小型库的基础上再增加绝对值、倒数、比较、平方、开平方、数制转换等子程序。

3.大型库(FQ51.ASM):包含本说明书中的全部子程序。

为便于读者使用本程序库,先将有关约定说明如下:1.双字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据,地址小的单元存放高字节。

如果[R0]=1234H,若(R0)=30H,则(30H)=12H,(31H)=34H。

2.二进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节纯小数(原码)来表示。

当尾数的最高位为1时,便称为规格化浮点数,简称操作数。

在程序说明中,也用[R0]或[R1]来表示R0或R1指示的浮点操作数,例如:当[R0]=-6.000时,则二进制浮点数表示为83C000H。

若(R0)=30H,则(30H)=83H,(31H)=0C0H,(32H)=00H。

3.十进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(二进制补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节BCD码纯小数(原码)来表示。

当十进制数的绝对值大于1时,阶码就等于整数部分的位数,如 876.5 的阶码是03H,-876.5 的阶码是 83H;当十进制数的绝对值小于1时,阶码就等于 80H 减去小数点后面零的个数,例如 0.00382 的阶码是 7EH,-0.00382的阶码是 0FEH。

在程序说明中,用[R0]或[R1]来表示R0或R1指示的十进制浮点操作数。

例如有一个十进制浮点操作数存放在30H、31H、32H中,数值是 -0.07315,即-0.7315乘以10的-1次方,则(30H)=0FFH,31H=73H,(32H)=15H。

51单片机汇编语言常用程序集

51单片机汇编语言常用程序集

MCS-MCS-515151单片机实用子程序库单片机实用子程序库单片机实用子程序库((9696年版年版年版))周 航 慈目前已有若干版本的子程序库公开发表,它们各有特色。

笔者在1988年也编制了两个 子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方 面作了一些工作。

本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭 代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。

经过八年来全国 广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错 误,成为现在这个最新版本。

本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订: (1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库 的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。

(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮 点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。

(3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理 程序的工作变得更简单直观。

在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈 需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。

程序 清单中开列了四个栏目:标号、指令、操作数、注释。

为方便读者理解,注释尽力详细。

子程序库的使用方法如下:1.将子程序库全部内容链接在应用程序之后,统一编译即可。

优点是简单方便,缺 点是程序太长,大量无关子程序也包含在其中。

2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。

有些子程 序需要调用一些低级子程序,这些低级子程序也应该包含在内。

优点是程序紧凑,缺点是 需要对子程序库进行仔细删节。

(一) MCS-51定点运算子程序库及其使用说明定点运算子程序库文件名为DQ51.ASM ,为便于使用,先将有关约定说明如下:1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数 据。

第4章 MCS-51单片机汇编语言程序设计(2)

第4章 MCS-51单片机汇编语言程序设计(2)
START:MOV DPTR,#TAB : MOV A,R7 ADD A,R7 MOV R3,A MOVC A,@A+DPTR
XCH A,R3 INC A MOVC A,@A+DPTR MOV DPL,A MOV DPH,R3 CLR A JMP @A+DPTR TAB DW DW A0 A1
…………. DW AN
INC
DPTR
MOVX A,@DPTR SUBB A,R7 JNC XCH BIG1 A,R7
BIG0:INC DPTR
实现程序如下: 实现程序如下
START:CLR C : MOV DPTR,#ST1 , MOVX A,@DPTR , MOV R7,A
MOVX @DPTR,A RET BIG1:MOVX A,@DPTR SJMP BIG0
实现程序如下: 实现程序如下 MOV 30H, 20H ANL 30H,#00011111B MOV A,21H SWAP A RL A ANL A,#11100000B ORL 30H,A
第4章 MCS-51单片机汇编语言程序设计
实现程序如下: 实现程序如下 例 A,@R1 ADDC4.3 做3个字节的 无符号的加法. 无符号的加法.设一个加 MOV R0,#52H , MOV @R0,A 数存放在内部RAM 50H、 RAM的 数存放在内部RAM的50H、 MOV R1,#55H , DEC R0 51H、52H单元中 单元中, 51H、52H单元中,另一 DEC R1 RAM的53H、 MOV A,@R0 个加数存放在RAM 个加数存放在RAM的53H、 MOV A,@R0 54H、55H单元中 单元中, 54H、55H单元中,相加 ADD A,@R1 结果存内部RAM的50H、 结果存内部RAM的50H、 RAM ADDC A,@R1 51H、52H单元 单元, 51H、52H单元,均从高 MOV @R0,A 字节开始存放, 字节开始存放,进位存放 MOV 00H,C 在位寻址区的00H位中。 00H位中 在位寻址区的00H位中。 MOV @R0,A DEC DEC R0 R1

51单片机简单程序汇集

51单片机简单程序汇集

流水灯程序;使用杜邦线连接P1与LED端口J9ORG 00HSTART:MOV A,#0FFH ;赋初值CLR CMOV R2,#8LOOP1:RRC A ; 带进位右移MOV P1,ACALL DELAYDJNZ R2,LOOP1MOV R2,#7LOOP2:RLC A ; 带进位左移MOV P1,ACALL DELAYDJNZ R2,LOOP2JMP STARTDELAY:MOV R3,#20 ; 延时0.2秒D1: MOV R4,#20D2: MOV R5,#248DJNZ R5,$DJNZ R4,D2DJNZ R3,D1RETEND查表法流水灯;使用杜邦线连接P1与LED端口J9ORG 00HSTART: MOV DPTR,#TABLE ; 将表的地址存入数据指针LOOP: CLR AMOVC A,@A+DPTR ;到数据指针所指的地址取码CJNE A,#01,LOOP1 ; 取出的码是否01H?否则跳到LOOP1JMP STARTLOOP1: MOV P1,A ;取出的值输出到P1端口MOV R3,#20 ;用于改变延时长度CALL DELAYINC DPTRJMP LOOPDELAY: MOV R4,#20D1: MOV R5,#248DJNZ R5,$DJNZ R4,D1DJNZ R3,DELAYRETTABLE: DB 0FEH,0FDH,0FBH,0F7H ;左移DB 0EFH,0DFH,0BFH,7FHDB 0FEH,0FDH,0FBH,0F7H ;左移DB 0EFH,0DFH,0BFH,7FHDB 7FH,0BFH,0DFH,0EFH ;右移DB 0F7H,0FBH,0FDH,0FEHDB 7FH,0BFH,0DFH,0EFH ;右移DB 0F7H,0FBH,0FDH,0FEHDB 00H,0FFH,00H,0FFH ;闪烁DB 01H ;结束码END动态扫描两位数码管;利用中断的99秒计时器,动态扫描两位数码管;P0口接J3,数据端口;P2.2接J2 B端子,表示段码锁存;P2.3接J2 A端子,标志位码锁存LATCH1 BIT P2.2LATCH2 BIT P2.3ORG 00HJMP STARTORG 0BHJMP TIM0START:MOV R3,#00 ;中断循环次数MOV R4,#0 ;时间初值MOV DPTR,#TABLEMOV SP,#40HMOV TMOD,#01H ;定时器工作方式MOV TH0,#HIGH(65536-3800)MOV TL0,#LOW(65536-3800) ;初值4MSSETB TR0MOV IE,#82H ;开中断TIM0:MOV TH0,#HIGH(65536-3800)MOV TL0,#LOW(65536-3800)INC R3CJNE R3,#250,X1 ;1SMOV R3,#0MOV A,R4 ;十进制转换MOV B,#10DIV ABMOV 20H,B ; 个位MOV 21H,A ; 十位INC R4CJNE R4,#100,LEDSCAN ;到100则清零MOV R4,#0LEDSCAN: CALL SCAN ;调用数码管扫描X1: PUSH ACCPUSH PSWCALL SCANPOP PSWPOP ACCRETISCAN:MOV A,21HMOVC A,@A+DPTRMOV P0,ASETB LATCH1CLR LATCH1MOV P0,#11111110B ;扫描子程序SETB LATCH2CLR LATCH2CALL DELAY1MOV A,20HMOVC A,@A+DPTRMOV P0,ASETB LATCH1CLR LATCH1MOV P0,#11111101B ;0代表选通该位数码管SETB LATCH2CLR LATCH2CALL DELAY1RETDELAY:MOV R5,#50 ;典型延时程序D1: MOV R6,#40D2: MOV R7,#248CALL SCANDJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETDELAY1:MOV R6,#4 ;扫描延时D3: MOV R7,#248DJNZ R7,$DJNZ R6,D3RETTABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;共阴字码表END倒计时演示1;P0口接J3,数据端口;P2.2接J2 B端子,表示段码锁存;P2.3接J2 A端子,标志位码锁存; 这是一个9999 4位数倒计时,为了方便观察,定时时间稍短。

51单片机100例程序设计(可编辑)

51单片机100例程序设计(可编辑)

51单片机100例程序设计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】P0 I/O扩展并行输入口 12【实例23】P0 I/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【实例38】LED显示53【实例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】接口的A/D转换157【实例72】接口的D/A转换161第十章164【实例73】单片机间双机通信164【实例74】单片机间多机通信方法之一166【实例75】单片机间多机通信方法之二171【实例76】 PC与单片机通信176【实例77】红外通信接口178【实例79】单片机实现PWM信号输出180【实例80】实现基于单片机的低频信号发生器182 【实例81】软件滤波方法183【实例82】FSK信号解码接收186【实例83】单片机浮点数运算实现187【实例84】神经网络在单片机中的实现192【实例85】信号数据的FFT变换194第十二章198【实例86】总线接口的软件实现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【实例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← DPTRMOVX @ DPTR, A ; DPTR ←A【实例5】使用程序计数器PC查表:MOV A, #data ;A←dataMOVC A, @ A+DPTR ; PC← PC +1 ,A← A + PC 【实例6】if语句实例:void mainint 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 mainint num; printf "input one number:" ;scanf "%d",& num ;switch numcase 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 mainfor int a 10;n 0;a --printf "%d",a ;【实例9】while语句实例:void mainint i 0;while i 10 i++;【实例10】do…while语句实例:void mainint i 0;do i++;while i 10 ;【实例11】语句形式调用实例:void mainint i 0; while i 10 i++; … … Sum ; /*函数调用*/【实例12】表达式形式调用实例:void mainint a,b,i 0; while i 10 i++; … …i 4*Sum a,b ; /*函数调用*/【实例13】以函数的参数形式调用实例:void mainint a,b,c,i 0; while i 10 i++; … …i c,Sum a,b ; /*函数调用*/【实例14】函数的声明实例:void mainint int x,int y ; /*函数的声明*/ int a,b,c,i 0; while i 10 i++; … … i c,Sum a,b ; /*函数调用*/【实例15】函数递归调用的简单实例:void funint a 1, result,i;for i 0;i 10;i a+I;result fun ; /*函数调用*/return result;【实例16】数组的实例:void mainchar 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 mainint a 3,*p;p &a; /*将变量a的地址赋值给指针变量p*/printf “%d,%d”,a,*p ; /*输出二者的数值进行对比*/【实例18】数组与指针实例:void mainint i 3,num[3] 1,2,3 ,*p;p num; /*将数组num[]的地址赋值给指针变量p*/result p,3 ; /*函数调用,计算数组的最大值*/【实例19】P1口控制直流电动机实例sfr p1 0x90;sbit p10 p1^0;sbit p11 p1^1;void mainint 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++//正慢转for i 0; i 100; i++P10 1;for j 0; j 10; j++ m 0p10 0;for j 0; j 50; j++ m 0// 负快转for i 0; i 100; i++p11 1;for j 0; j 50; j++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)函数声明管脚定义//#includesbit LOAD P1^7;//用P1^7控制SH/ 管脚(2)串口初始化函数UART_init//// 函数名称:UART_init// 功能说明:串口初始化,设定串口工作在方式0 //void UART_init voidSCON 0x10;//设串行口方式0,允许接收,启动接收过程ES 0;//禁止串口中断(3)数据接收函数PA//// 函数名称:PA// 输入参数:无// 输出参数:返回由并口输入的数据// 功能说明:接收八位串行数据//unsigned char PA voidunsigned 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)函数声明管脚定义//#includesbit 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 voidunsigned char i;unsigned char data_buf;i 8;doACC ACC 1;for ;simuseri_CLK 0; ;a7 simuseri_DATA;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 voidunsigned char PAs_buf;drive74165_LD 0;drive74165_LD 1;PAs_buf in_simuseri ;return PAs_buf ;【实例21】用74LS164实现串口扩展并行输出口单片机串口驱动74LS164的程序主要包括函数声明管脚定义部分、串口初始化函数以及数据发送函数。

51单片机汇编程序集(二)

51单片机汇编程序集(二)

辛普生积分程序内部RAM数据排序程序(升序)外部RAM数据排序程序(升序)外部RAM浮点数排序程序(升序)BCD小数转换为二进制小数(2位)BCD小数转换为二进制小数(N位)BCD整数转换为二进制整数(1位)BCD整数转换为二进制整数(2位)BCD整数转换为二进制整数(3位)BCD整数转换为二进制整数(N位)二进制小数(2位)转换为十进制小数(分离BCD码)二进制小数(M位)转换为十进制小数(分离BCD码)二进制整数(2位)转换为十进制整数(分离BCD码)二进制整数(2位)转换为十进制整数(组合BCD码)二进制整数(3位)转换为十进制整数(分离BCD码)二进制整数(3位)转换为十进制整数(组合BCD码)二进制整数(M位)转换为十进制整数(组合BCD码)三字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7;辛普生积分程序;入口: DPTR,N,COUNT;占用资源: ACC,R3,R4,R6,R7;堆栈需求: 2字节;出口: R3,R4SJF : MOV R7,NMOVX A,@DPTRINC DPTRMOV R4,AMOV R3,#00HDEC R7SJF1 : MOVX A,@DPTRINC DPTRCLR CRLC AMOV R6,ACLR ARLC AJNB ACC.0,SJF2XCH A,R6RLC AXCH A,R6XCH A,R7RLC AXCH A,R7SJF2 : XCH A,R7XCH A,R6ADD A,R4MOV R4,AMOV A,R6ADDC A,R3MOV R3,ADJNZ R7,SJF1SJF3 : MOVX A,@DPTR ADD A,R4MOV R4,ACLR AADDC A,R3MOV R3,AMOV R7,#COUNT LCALL NMUL21MOV A,NMOV B,#03HMUL ABMOV R7,ALCALL NDIV31RETNMUL21 : MOV A,R4 MOV B,R7MUL ABMOV R4,AMOV A,BXCH A,R3MOV B,R7ADD A,R3MOV R3,ACLR AADDC A,BMOV R2,ACLR OVRETNDIV31 : MOV B,#10H NDV311 : 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,NDV311 RET;内部RAM数据排序程序(升序) ;入口: R0(起始地址),N(数据个数) ;占用资源: ACC,B,R5,R6,R7;堆栈需求: 2字节;出口: R0ISELSORT : MOV R7,NDEC R7ISST1: MOV A,R7MOV R6,AMOV R1,AMOV R2,AMOV B,@R1ISST2: INC R1MOV A,@R1CLR CSUBB A,BJC ISST3MOV A,R1MOV R2,AMOV B,@R1ISST3: DJNZ R6,ISST2MOV A,BXCH A,@R1MOV B,R2MOV R1,BMOV @R1,ADJNZ R7,ISST1RET;外部RAM数据排序程序(升序);入口: ADDPH,ADDPL(起始地址),N(数据个数) ;占用资源: ACC,B,R0,R1,R5,R7;堆栈需求: 2字节;出口: ADDPH-ADDPLESELSORT : MOV R7,NDEC R7ESST1: MOV A,R7MOV R6,AMOV DPL,ADDPLMOV R1,DPLMOV DPH,ADDPHMOV R0,DPHMOVX A,@DPTRMOV B,AESST2: INC DPTRMOVX A,@DPTRCLR CSUBB A,BJC ESST3MOV R0,DPLMOV R1,DPHMOVX A,@DPTRMOV B,AESST3: DJNZ R6,ESST2MOVX A,@DPTRXCH A,BMOVX @DPTR,AMOV DPL,R0MOV DPH,R1MOV A,BMOVX @DPTR,ADJNZ R7,ESST1RET;外部RAM浮点数排序程序(升序);入口: ADDPH,ADDPL(起始地址),N(数据个数);占用资源: ACC,B,R0,R1,R2,R3,R4,R5,R6,R7,NCNT ;堆栈需求: 5字节;出口: ADDPH,ADDPLFSORT: MOV A,NMOV NCNT,ADEC NCNTFST1 : MOV B,NCNTMOV DPL,ADDPLMOV R1,DPLMOV DPH,ADDPHMOV R0,DPHMOVX A,@DPTRMOV R2,AINC DPTRMOVX A,@DPTRMOV R3,AINC DPTRMOVX A,@DPTRFST2 : INC DPTR MOVX A,@DPTR MOV R5,AINC DPTRMOVX A,@DPTR MOV R6,AINC DPTRMOVX A,@DPTR MOV R7,APUSH BLCALL FCMPPOP BJNC FST4MOV A,DPLCLR CSUBB A,#02HMOV R1,AMOV R0,DPHJNC FST3DEC R0FST3 : MOV A,R5 MOV R2,AMOV A,R6MOV R3,AMOV A,R7MOV R4,AFST4 : DJNZ B,FST2 MOV A,DPLCLR CSUBB A,#02HMOV DPL,AJNC FST5DEC DPHFST5 : MOV A,R2 MOVX @DPTR,A INC DPTRMOVX @DPTR,AINC DPTRMOV A,R4MOVX @DPTR,AMOV A,R0MOV P2,AMOV A,R5MOVX @R1,AINC R1MOV A,R6MOVX @R1,AINC R1MOV A,R7MOVX @R1,ADJNZ NCNT,FST1RET;BCD小数转换为二进制小数(2位) ;入口: R0(低位首址),R7;占用资源: ACC,B,R5;堆栈需求: 2字节;出口: R3,R4PDTB : CLR AMOV R3,AMOV R4,APDB1 : MOV A,R3MOV B,#9AHMUL ABMOV R5,BXCH A,R4MOV B,#19HMUL ABADD A,R4MOV A,R5ADDC A,BMOV R5,AMOV A,@R0MOV B,#9AHMUL ABADD A,R5MOV R4,ACLR AADDC A,BXCH A,R3MOV B,#19HMUL ABADD A,R4MOV R4,AMOV A,BADDC A,R3MOV R3,AMOV A,@R0MOV B,#19HMUL ABADD A,R3MOV R3,ADEC R0DJNZ R7,PDB1RET;BCD小数转换为二进制小数(N位) ;入口: R1(低位首址),M,N;占用资源: ACC,B,R2,R3,R7;堆栈需求: 2字节;出口: R0PDTBMN : MOV A,R0MOV R2,AMOV A,R1MOV R3,AMOV B,NCLR APDBMN1 : MOV @R0,AINC R0DJNZ B,PDBMN1MOV A,NRR AMOV R7,APDBMN2 : MOV A,R2MOV R0,AMOV A,R3MOV R1,AMOV B,MCLR CPDBMN3 : MOV A,@R1 ADDC A,@R1DA AJNB ACC.4,PDBMN4SETB CCLR ACC.4PDBMN4 : MOV @R1,AINC R1DJNZ B,PDBMN3MOV B,NPDBMN5 : MOV A,@R0RLC AMOV @R0,AINC R0DJNZ B,PDBMN5DJNZ R7,PDBMN2MOV A,R2MOV R0,ARET;BCD整数转换为二进制整数(1位) ;入口: R0(高位地址),R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R4IDTB1: CLR AMOV R4,AIDB11: MOV A,R4MOV B,#0AHADD A,@R0INC R0MOV R4,ADJNZ R7,IDB11RET;BCD整数转换为二进制整数(2位) ;入口: R0(高位地址),R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R3,R4IDTB2: CLR AMOV R3,AMOV R4,AIDB21: MOV A,R4MOV B,#0AHMUL ABMOV R4,AMOV A,BXCH A,R3MOV B,#0AHMUL ABADD A,R3MOV R3,AMOV A,R4ADD A,@R0INC R0MOV R4,ACLR AADDC A,R3MOV R3,ADJNZ R7,IDB21RET;BCD整数转换为二进制整数(3位) ;入口: R0(高位地址),R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R2,R3,R4IDTB3: CLR AMOV R2,AMOV R3,AMOV R4,AIDB31: MOV A,R4MOV B,#0AHMUL ABMOV R4,AMOV A,BXCH A,R3MOV B,#0AHMUL ABADD A,R3MOV R3,ACLR AADDC A,BXCH A,R2MOV B,#0AHMUL ABADD A,R2MOV R2,AMOV A,R4ADD A,@R0INC R0MOV R4,ACLR AADDC A,R3MOV R3,ACLR AADDC A,R2MOV R2,ADJNZ R7,IDB31RET;BCD整数转换为二进制整数(N位) ;入口: R1(高位地址),M,N;占用资源: ACC,B,R2,R7,NCNT,F0;出口: R0IDTBMN : MOV A,R0MOV R2,AMOV B,NCLR AIDBMN1 : MOV @R0,AINC R0DJNZ B,IDBMN1MOV A,R2MOV R0,AMOV A,MMOV NCNT,AIDBMN2 : MOV R7,NCLR ACLR F0IDBMN3 : XCH A,@R0MOV B,#0AHMUL ABMOV C,F0ADDC A,@R0MOV F0,CMOV @R0,AINC R0MOV A,BDJNZ R7,IDBMN3MOV A,R2MOV R0,AMOV A,@R1INC R1ADD A,@R0MOV @R0,ADJNZ NCNT,IDBMN2RET;二进制小数(2位)转换为十进制小数(分离BCD码) ;入口: R3,R4,R7;占用资源: ACC,B;出口: R0PBTD : MOV A,R7PUSH APBD1 : MOV A,R4MOV B,#0AHMUL ABMOV R4,AMOV A,BXCH A,R3MOV B,#0AHMUL ABADD A,R3MOV R3,ACLR AADDC A,BMOV @R0,AINC R0DJNZ R7,PBD1POP AMOV R7,AMOV A,R0CLR CSUBB A,R7MOV R0,ARET;二进制小数(M位)转换为十进制小数(分离BCD码) ;入口: R1,M,N;占用资源: ACC,B,R2,R3,R7,NCNT;堆栈需求: 2字节;出口: R0PBTDMN : MOV A,R0MOV R2,AMOV A,R1MOV R3,AMOV A,NMOV NCNT,APBDMN1 : MOV R7,MCLR ACLR F0PBDMN2 : XCH A,@R1MOV B,#0AHMUL ABMOV C,F0ADDC A,@R1MOV F0,CMOV @R1,AINC R1MOV A,BDJNZ R7,PBDMN2ADDC A,#00HMOV @R0,AINC R0MOV A,R3MOV R1,ADJNZ NCNT,PBDMN1MOV A,R2MOV R0,ARET;二进制整数(2位)转换为十进制整数(分离BCD码) ;入口: R3,R4;占用资源: ACC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD21 : MOV NCNT,#00HMOV R2,#00HIBD211 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV @R0,AINC R0INC NCNTMOV A,R3ORL A,R4JNZ IBD211MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(2位)转换为十进制整数(组合BCD码) ;入口: R3,R4;占用资源: ACC,B,R7;堆栈需求: 3字节;出口: R0IBTD22 : MOV A,R0PUSH AMOV R7,#03HCLR AIBD221 : MOV @R0,AINC R0DJNZ R7,IBD221POP AMOV R0,AMOV R7,#10HIBD222 : PUSH ACLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV B,#03HIBD223 : MOV A,@R0ADDC A,@R0DA AMOV @R0,AINC R0DJNZ B,IBD223POP AMOV R0,ADJNZ R7,IBD222RET;二进制整数(3位)转换为十进制整数(分离BCD码) ;入口: R2,R3,R4;占用资源: ACC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD31 : CLR AMOV NCNT,AIBD311 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV @R0,AINC R0INC NCNTMOV A,R2ORL A,R3ORL A,R4JNZ IBD311MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(3位)转换为十进制整数(组合BCD码) ;入口: R2,R3,R4;占用资源: ACC,B,R7;堆栈需求: 3字节;出口: R0IBTD32 : MOV A,R0PUSH AMOV R7,#04HCLR AIBD321 : MOV @R0,AINC R0DJNZ R7,IBD321MOV R0,AMOV R7,#18HIBD322 : PUSH ACLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV B,#04HIBD323 : MOV A,@R0ADDC A,@R0DA AMOV @R0,AINC R0DJNZ B,IBD323POP AMOV R0,ADJNZ R7,IBD322RET;二进制整数(M位)转换为十进制整数(组合BCD码) ;入口: R1,M,N;占用资源: ACC,B,R2,R3,R7;堆栈需求: 2字节;出口: R0IBTDMN : MOV A,R0MOV R2,AMOV A,R1MOV R3,AMOV B,NCLR AIBDMN1 : MOV @R0,ADJNZ B,IBDMN1MOV A,MSWAP ARR ACLR CMOV R7,AIBDMN2 : MOV A,R2MOV R0,AMOV A,R3MOV R1,AMOV B,MIBDMN3 : MOV A,@R1RLC AMOV @R1,AINC R1DJNZ B,IBDMN3MOV B,NIBDMN4 : MOV A,@R0ADDC A,@R0DA AJNB ACC.4,IBDMN5SETB CCLR ACC.4IBDMN5 : MOV @R0,AINC R0DJNZ B,IBDMN4DJNZ R7,IBDMN2MOV A,R2MOV R0,ARET;三字节无符号除法程序(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,NDV311 POP ACLR OVJZ NDV314SETB OVNDV314 : XCH A,R2MOV R7,ARET。

51单片机c语言教程全集

51单片机c语言教程全集

单片机c语言教程全集第一课建立你的第一个KeilC51项目随着单片机技术的不断发展,以单片机C语言为主流的高级语言也不断被更多的单片机爱好者和工程师所喜爱。

使用C51肯定要使用到编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。

KEIL uVISION2 是众多单片机应用开发软件中优秀的软件之一,它支持众多不一样公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C语言的程序设计,它的界面和常用的微软 VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。

本站提供的单片机c语言教程都是基于keilc51的。

下面结合8051介绍单片机C语言的优越性:·无须懂得单片机的具体硬件,也能够编出符合硬件实际的专业水平的程序;·不懂得单片机的指令集,也能够编写完美的单片机程序;·不同函数的数据实行覆盖,有效利用片上有限的RAM空间;·提供auto、static、const等存储类型和专门针对8051单片机的data、idata、pdata、xdata、code等存储类型,自动为变量合理地分配地址;·C语言提供复杂的数据类型(数组、结构、联合、枚举、指针等),极大地增强了程序处理能力和灵活性;·提供small、compact、large等编译模式,以适应片上存储器的大小;·中断服务程序的现场保护和恢复,中断向量表的填写,是直接与单片机相关的,都由C编译器代办;·程序具有坚固性:数据被破坏是导致程序运行异常的重要因素。

C语言对数据进行了许多专业性的处理,避免了运行中间非异步的破坏·提供常用的标准函数库,以供用户直接使用;·有严格的句法检查,错误很少,可容易地在高级语言的水平上迅速地被排掉;·可方便地接受多种实用程序的服务:如片上资源的初始化有专门的实用程序自动生成;再如,有实时多任务操作系统可调度多道任务,简化用户编程,提高运行的安全性等等。

MCS51系列单片机指令系统及汇编语言程序设计课件

MCS51系列单片机指令系统及汇编语言程序设计课件
MOVC A, @A+PC ;A+PC为地址的存储器单元内容→A
第7页,共52页。
6. 相对寻址
以当前程序计数器PC的内容为基址,加上指令给出的一 字节补码数形成新的PC值的寻址方式。PC中的当前值称为 基地址,一字节补码数称为偏移量,新的PC值称为转移目 的地址。
例如:JC 80H ;C=1跳转
INC Rn
INC DPTR
第16页,共52页。
减1指令(4条)
DEC A DEC dir DEC @Ri
DEC Rn
十进制调整指令(1条)
DA A ;把A中按二进制相加后的结果调整成按BCD数相加的结果
第17页,共52页。
3.逻辑操作类指令(共24条)
逻辑操作类指令共有24条,主要包括“与”、“或”、“异或”、求反、清0、左右 移位等逻辑操作。
中(1050H)=64H。
堆栈操作类指令(2条)
PUSH dir POP dir
例:SP=07H,(35H)=55H,指令PUSH 35H执行后,55H送入08H地址单元,SP= 08H。
第13页,共52页。
交换指令(5条)
XCH A,Rn
XCH A,@Ri
XCH A,dir XCHD A,@Ri SWAP A 例:A=80H,R0=32H,(32H)=FFH,指令XCHD A,@R0执行后,
寄存器间接寻址的存储器空间包括:内部数据RAM和外部数据RAM。
内部数据RAM共用128字节,用一个字节的R0或R1可寻址整个空间。
外部数据RAM最大可达64K字节,仅用R0或R1无法寻址整个空间。在MCS-51系列单片机指 令中,对外部数据RAM作间接寻址有两种方法:第一种由P2口提供高8位外部数据RAM地址,由 R0或R1提供低8位地址,由此共同寻址64K空间;第二种是用16位的DPTR作寄存器间接寻址。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51单片机程序全集(二)
今天继续带大家来写51单片机的程序,可能对于一些学了一段时间51的同学来说这两天的程序过于简单,但我还是推荐大家耐心的看,反复的写,因为我想传达的是如何将程序规范化。

规范的程序将在以后做大的项目中给我们带来莫大的好处。

当初我也是跟郭天祥老师学习51的,开始觉得那样的写程序方式还挺容易理解和上手的,但后期跟着老师做项目时,才发现那样写出的程序是多么的难以修改,别人更是很难看懂。

要知道,在一个项目中写的程序可能成百上千行。

幸运的是,老师纠正了我写程序的方式,现在越发的感觉受益匪浅。

好的,就浅谈这么多,下面开始写程序。

程序1
/*-----------------------------------------------
名称:IO口高低电平控制
功能:让LED闪烁
说明:要注意LED是共阴还是共阳
日期:2012-8-2
单片机交流QQ :1278088276
------------------------------------------------*/
#include<reg52.h> //头文件,在程序的最顶部加上就可以,不需要改动。

sbit LED0 =P1^0; // 用sbit 关键字定义LED到P1.0端口,
//LED是自己任意定义且容易记忆的符号
//等号与它前面的字符加个空格,方便程序阅读
void Delay(unsigned int t); //函数声明。

因为Delay函数在主函数的后面,所以要在此声明,
//若Delay函数在主函数前面,则无需函数声明
/*------------------------------------------------
函数名:main
功能:实现LED翻转
说明:无
参数:无
返回值:无
------------------------------------------------*/
void main (void)
{
while (1) //主循环
{
LED0 =0; //将P1.0口赋值0,对外输出低电平
Delay(10000); //调用延时程序;更改延时数字可以更改延时长度;
//用于改变闪烁频率
LED0 =1; //将P1.0口赋值1,对外输出高电平
Delay(10000);
}
}
/*------------------------------------------------
函数名:Delay
功能:起延时作用
说明:无
参数:t---这里的t是形参,实指该函数被调用时括号里的数。

例如Delay(1000);这时t就代表1000.
返回值:无
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}
程序2
/*-----------------------------------------------
名称:IO口高低电平控制
功能:让LED以不同频率闪烁
说明:要注意LED是共阴还是共阳
日期:2012-8-2
单片机交流QQ :1278088276
------------------------------------------------*/
#include<reg52.h>
sbit LED0 =P1^0;
void Delay(unsigned int t);
/*------------------------------------------------
函数名:main
功能:实现LED不同频率闪烁
说明:无
参数:无
返回值:无
------------------------------------------------*/
void main (void)
{
unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255
while (1) //主循环
{
for(I =0;i<10;i++) //加入for循环,表明for循环大括号中的程序循环执行10次{
LED0 =0; //将P1.0口赋值0,对外输出低电平
Delay(5000); //调用延时程序;更改延时数字可以更改延时长度;
//用于改变闪烁频率
LED0 =1; //将P1.0口赋值1,对外输出高电平
Delay(5000);
}
for(I =0;i<10;i++)
{
LED0 =0; //将P1.0口赋值0,对外输出低电平
Delay(60000); //调用延时程序;更改延时数字可以更改延时长度;
//用于改变闪烁频率
LED0 =1; //将P1.0口赋值1,对外输出高电平
Delay(60000);
}
//主循环中添加其他需要一直工作的程序
}
}
/*------------------------------------------------
函数名:Delay
功能:起延时作用
说明:延时函数,含有输入参数unsigned int t,无返回值
unsigned int 是定义无符号整形变量,其值的范围是
0~65535
参数:t---这里的t是形参,实指该函数被调用时括号里的数。

例如
Delay(1000);这时t就代表1000.
返回值:无
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}
好的,今天先写到这里,我会把每期更新的文档的地址付在后面。

祝大家学业有成!
51单片机程序全集(一)
/view/405c23d3b14e852458fb5790.html。

相关文档
最新文档