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单片机常用子程序2
//uchar seg[10]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};//七段uchar seg[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};//七段小数点不亮/************* 音乐数据表 *****************/unsigned char n=0; //n为节拍常数变量unsigned char code music_tab[] ={0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,0x20, 0x40, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x10,0x1C, 0x10, 0x18 , 0x40,0x1C, 0x20, 0x20 , 0x20,0x1C, 0x20, 0x18 , 0x20,0x20, 0x80, 0xFF , 0x20,0x30, 0x1C, 0x10 , 0x18,0x20, 0x15, 0x20 , 0x1C,0x20, 0x20, 0x20 , 0x26,0x40, 0x20, 0x20 , 0x2B,0x20, 0x26, 0x20 , 0x20,0x20, 0x30, 0x80 , 0xFF,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x80,0x20, 0x30, 0x1C , 0x10,0x20, 0x10, 0x1C , 0x10,0x20, 0x20, 0x26 , 0x20,0x2B, 0x20, 0x30 , 0x20,0x2B, 0x40, 0x20 , 0x15,0x1F, 0x05, 0x20 , 0x10,0x1C, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x30,0x20, 0x30, 0x1C , 0x10,0x18, 0x40, 0x1C , 0x20,0x20, 0x20, 0x26 , 0x40,0x13, 0x60, 0x18 , 0x20,0x15, 0x40, 0x13 , 0x40,0x18, 0x80, 0x00};uchar h[4];uint i;uchar ADCRS;uchar Rchar;uchar X=0;float hres;void delayms(int t)//51单片机常用延时子程序毫秒级延时{int i; //声明变量i--内循环变量int j; //声明变量j--外循环变量for(j=0;j<t;j++){for (i=0;i<150;i++);//循环加法计算,消耗CPU时间,达到延时的目的}}uchar ADC(void) //adc 子程序,本程序针对常用并行8位AD芯片ADC0804 {uchar ADCRes; //声明一个uchar(无符号单字节变量,用于保存AD转换结果) P0=0xFF;//拉高P0数据总线,为读做准备(51单片机中,读取IO端口时,必须先拉高对应端口)WR=0;//把ADC0804的WR脚拉低DAC_WR=1;delayms(1);}}void int0() interrupt 1 //采用中断0 控制节拍{ TH0=0xd8;TL0=0xef;n--;}void delay (unsigned char m) //控制频率延时{unsigned i=3*m;while(--i);}void jkc_Flash_LED(void) //接于P0口的8个LED闪烁例程{P2=0XFF; //P2口高电平,关掉数码管while(1){P0=0X00;//P0端口拉低,灯亮delayms(200);P0=0XFF;//P0端口拉高,灯灭delayms(200);}void jkc_Horse_LED(void) //跑马灯例程{unsigned char temp;P2=0XFF; //P2口高电平,关掉数码管temp=0x01;P0=~temp; //temp 按位取反后赋给P0,直接输出temp(0x01),最低位是1高电平,灯不亮,低电平才亮,所以要反转位delayms(100);while(1){P0=~temp;temp<<=1;//temp向左移动一位,即里面的1向左移动一位。
51单片机实用汇编程序库
51单片机实用汇编程序库51 单片机实用程序库4、1 流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮得效果。
实际应用中例如: 广告灯箱彩灯、霓虹灯闪烁。
程序实例(LAMP、ASM)ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOV P1,A;灭所有得灯MOV A,#11111110BMAIN1:MOV P1,A;开最左边得灯ACALL DELAY ;延时RL A ;将开得灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ30H,D1RETEND4、2 方波输出程序介绍:P1、0 口输出高电平,延时后再输出低电平,循环输出产生方波。
实际应用中例如:波形发生器。
程序实例(FAN、ASM):ORG 0000HMAIN:;直接利用P1、0 口产生高低电平地形成方波//////////////ACALL DELAYSETB P1、0ACALL DELAY10CLR P1、0AJMP MAIN;////////////////////////////////////////////////// DEL AY:MOV R1,#0FFHDJNZ R1,$RET五、定时器功能实例5、1 定时1 秒报警程序介绍:定时器1 每隔1 秒钟将p1、o得输出状态改变1次,以达到定时报警得目得。
实际应用例如:定时报警器。
程序实例(DIN1、ASM):ORG 0000HAJMP MAINORG 000BHAJMP DIN0 ;定时器0入口MAIN:TFLA G EQU34H ;时间秒标志,判就是否到50个0、2 秒,即50*0、2=1 秒MOVTMOD,#00000001B;定时器0 工作于方式1MOVTL0,#0AFHMOV TH0,#3CH ;设定时时间为0、05 秒,定时20 次则一秒11SETB EA;开总中断SETB ET0;开定时器0 中断允许SETBTR0 ;开定时0 运行SETB P1、0LOOP: AJMP LOOPDIN0:;就是否到一秒//////////////////////////////////////// INCC:INC TFLAGMOV A,TFLAGCJNE A,#20,REMOV TFLAG,#00HCPLP1、0;////////////////////////////////////////////////// RE:MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0、05秒,定时20 次则一秒RETIEND5、2 频率输出公式介绍:f=1/ts51 使用12M 晶振,一个周期就是1微秒使用定时器1工作于方式0,最大值为65535,以产生200HZ 得频率为例:200=1/t:推出t=0、005秒,即5000微秒,即一个高电平或低电平得时间为2500微秒。
基于51单片机的计算器(附Proteus仿真图且程序有详细注释)
}
while(temp!=0xf0)
{
temp=P1;temp=temp&0xf0;
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P1;
x--;
delay(3);
}
}
}
else if ((flag1==1)&&(flag2==1))
{
for(i=7;i>=px3;i--)
{
display(i,RESUIT[i]);
delay(3);
}
}
}
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P1;
switch(temp)
{
case 0xee: key=0;flag=1;break;
case 0xde: key=1;flag=1;break;
case 0xbe: key=2;flag=1;break;
{
k=k*10;
}
x1=x1+k;
}
x1=x1+DATA1[px1-1];
for(i=0;i<(px2-1);i++) //把第二个数组中的数处理成十进制数
{
k=DATA2[i];
for(j=0;j<(px2-i-1);j++)
51单片机程序简单详解
#include<reg52.h>ﻩ//头文件后面不加; 定义了单片机所有常用到的地址sbit d1=P1^0;//位定义定义P1口的0位为d1ﻩ后面加;void main()ﻩﻩﻩ//主函数后面不加;{ﻩd1=0;ﻩ//输出P1口0位为低电平后面加;while(1); //一个完整程序必须得有始有终程序停止}#include<reg52.h>ﻩ//头文件sbitd1=P1^0;ﻩﻩ//位定义unsignedinta;ﻩﻩﻩ//定义无符号整形的变量,变量名随便写void main()ﻩﻩﻩﻩ//主函数{ﻩwhile(1) //程序须有始有终,首先进入大循环,以防出乱{ﻩﻩﻩﻩa=50000;ﻩ//给a赋值ﻩd1=0; //给d1低电平(点亮LED)ﻩwhile(a--); ﻩ //a自减1共减完到a所赋的值达到延时的目的a=50000; ﻩ //给a赋值d1=1; ﻩ//给d1高电平(熄灭LED)ﻩwhile(a--);ﻩﻩ//a自减1 共减完到a所赋的值达到延时的目的ﻩ}}#include<reg52.h>#define a unsigned int //宏定义定义a,在工程当中所用的a就代表了unsi gned int#define bunsigned char //宏定义定义b,在工程当中所用的b就代表了unsi gnedcharsbit d1=P1^0;void cnm(); ﻩ//在主函数之前要声名子函数,加;void main(){while(1) // while(1)是个死循环,始终都在执行它内部的语句{ﻩﻩd1=0; //输出低电平(点亮LED)ﻩcnm(); //调用子程序,直接写子函数的函数名作延时用ﻩd1=1; //输出高电平(熄灭LED)cnm();//调用子程序,直接写子函数的函数名作延时用ﻩ}}voidcnm()ﻩ //void代表:无返回值,()空的!代表无参数cnm代表子函数函数名(函数名可以任意取)子程序=子函数{ax,y; //定义两个变量ﻩ在一个子函数当中定义的变量称为局部变量局部变量只在当前的函数当中有效ﻩfor(x=100;x>0;x--)ﻩ//for循环(见资料)第一个for后面不加大括号的时候,只有下面的第一条认为是它内部的语句ﻩfor(y=2000;y>0;y--);//后面所加;代表这条语句是在前一条for语句内部执行的ﻩ这种方式为嵌套}#include<reg52.h> //头文件#define a unsignedint //宏定义定义a,在工程当中所用的a就代表了unsigned int#define b unsigned charﻩ//宏定义定义b,在工程当中所用的b就代表了unsign edcharsbit d1=P1^0;voidcnm(a);ﻩﻩ//在主函数之前要声名子函数, 在参数当中要写上参数的类型带多个参数时用,隔开参数名可写可不写后面加;voidmain(){ﻩwhile(1) //while(1)是个死循环,始终都在执行它内部的语句ﻩ{d1=0;//输出低电平(点亮LED)ﻩcnm(200);// 调用子程序,直接写子函数的函数名()内参数方便修改,作延时用ﻩﻩd1=1;//输出高电平(熄灭LED)ﻩcnm(200);// 调用子程序,直接写子函数的函数名()内参数方便修改,作延时用}}void cnm(a z)ﻩ//void代表:无返回值,()内带东西!即带参数cnm代表子函数函数名(函数名可以任意取) 子程序=子函数{a x,y;ﻩ//定义两个变量在一个子函数当中定义的变量称为局部变量局部变量只在当前的函数当中有效ﻩfor(x=100;x>0;x--)ﻩ//for循环(见资料P88)ﻩ第一个for后面不加大括号的时候,只有下面的第一条认为是它内部的语句ﻩfor(y=z;y>0;y--);//后面所加;代表这条语句是在前一条for语句内部执行的这种方式为嵌套}。
DH11模块(51单片机程序已调通有注释简单易懂)
DH11模块(51单片机程序已调通有注释简单易懂)#include#define uint unsignedint#define uchar unsigned charuchar a[40];uchar b[5];sbit date=P2^0;/*延时函数*/voiddelayms(uint);voiddelayus(uchar);/*初始化函数*/void dh11_init();void t1_init();/*dh11数据处理函数*/void RX_dh11_date();voiddate_work();voiddate_pr();/*串口发数据函数*/voidsend_date();void main(){dh11_init();t1_init();while(1){RX_dh11_date();date_work();date_pr();send_date();}}/*****************************延时函数***********************/ voiddelayms(uint x){uinta,b;for(a=x;a>0;a--)for(b=110;b>0;b--);}voiddelayus(uchar t){while(--t);//T=tx2+5uS}/*******************初始化函数*********************/ void dh11_init(){date=1;delayms(10);}void t1_init(){TMOD=0x20; //方式2 自动重装初值EA=1;TH1 = 253; // 设置初值TL1 = 253;TR1 = 1; // 开始计时SCON =0x50; //工作方式1,波特率9600bps,允许接收ES = 1; //打开串口中断}/***************dh11接收数据*************************/ voidRX_dh11_date(){ /*****开始信号******/date=0;delayms(30);date=1;delayus(3); //11.9usdelayus(3); //11.9us/****判断dh11是否响应*****/if(!date){while(date); //从机拉高80us等待变低发送数据/*开始传输数据*/}}voiddate_work(){uchari;uintL_flag,H_flag;for(i=0;i<40;i++){ /***L_flag的值表示的是50us****/L_flag=0;H_flag=0;while(!date){L_flag++;}/*拉高一个字节传送完毕*/while(date){H_flag++;/*根据flag的值判断是1或0*//*L_flag代表的是50us*/if(L_flag<="" p="">{a[i]=1;}elsea[i]=0;}while(!date);//传送字节完毕拉低总线50us date=1; delayus(3);}voiddate_pr(){uchari,j,k,mun,n;n=1;for(j=0;j<5;j++){k=0;for(i=0;i<8;i++){mun=a[n];mun=mun&0x01;k=k<<1;k=mun|k;n++;}b[j]=k;}voidsend_date(){uchar j;while(1){for(j=0;j<40;j++){SBUF=a[j];while(!TI);TI=0;}for(j=0;j<4;j++){SBUF=b[j];while(!TI);TI=0;}while(1);}}/*串口中段函数*/void RSINTR() interrupt 4 { if(RI==1){RI=0;}}。
常见51单片机指令及详解
常见51单片机指令及详解1. 简介单片机是一种集成电路,具备处理和控制功能。
51单片机是指Intel公司推出的一系列8位单片机,常用于嵌入式系统和物联网设备。
本文将介绍一些常见的51单片机指令,并对其进行详解。
2. 数据传送指令2.1 MOV指令MOV指令用于将数据从一个寄存器或内存位置传送到另一个寄存器或内存位置。
例如:MOV A, #10 ;将立即数10传送给累加器AMOV R0, R1 ;将寄存器R1的值传送给R02.2 XCH指令XCH指令用于交换两个寄存器或内存位置中的数据。
例如:XCH A, B ;交换累加器A和B的值3. 算术运算指令3.1 ADD指令ADD指令用于将两个操作数相加,并将结果保存在累加器中。
例如:ADD A, B ;将累加器A和寄存器B的值相加,结果存储在A中3.2 SUBB指令SUBB指令用于将第二个操作数的补码与累加器的值相减,并将结果存储在累加器中。
例如:SUBB A, B ;将B的补码与累加器A的值相减,结果存储在A中4. 逻辑运算指令4.1 ANL指令ANL指令用于对两个操作数进行按位与运算,并将结果存储在目的操作数中。
例如:ANL A, B ;将累加器A和寄存器B的值按位与,结果存储在A 中4.2 ORL指令ORL指令用于对两个操作数进行按位或运算,并将结果存储在目的操作数中。
例如:ORL A, B ;将累加器A和寄存器B的值按位或,结果存储在A 中5. 跳转指令5.1 JMP指令JMP指令用于无条件跳转至指定的目标地址。
例如:JMP 2000H ;跳转至内存地址2000H处执行指令5.2 JZ指令JZ指令用于在累加器为零时跳转至指定的目标地址。
例如:JZ 3000H ;当累加器为零时,跳转至内存地址3000H处执行指令6. 输入输出指令6.1 IN指令IN指令用于将外部设备的数据输入到累加器或指定的寄存器中。
例如:IN A, P1 ;将P1端口的数据输入到累加器A中6.2 OUT指令OUT指令用于将累加器或指定的寄存器中的数据输出到外部设备。
完整word版,51单片机读写AT24C02源代码详细注释
51单片机读写AT24C02源代码(详细注释)在P1口上接八个led灯,结果就显示在这八个灯上面。
AT24C02的接线方式见程序的顶部的定义。
以下是源代码:#include ;//包含头文件typedef unsigned char uchar;typedef unsigned int uint;#define write_c02 0xa0#define read_c02 0xa1sbit sda = P2^0;sbit scl = P2^1;void delay(){ //delay:5us;;}//i2c:initvoid i2c_init(){sda = 1;delay();scl = 1;delay();}//delayms:void delayms(uint xms){uchar x, y;for(x = xms; x >; 0; x--)for(y = 110; y >; 0; y--);}//start:void start() //启动i2c{sda = 1;scl = 1;delay();//延时必须大于4.7us,此约为五微秒sda = 0; //在scl为高电平时,sda一个下降沿为启动信号delay();}//stop:void stop() //停止i2c{sda = 0;scl = 1;delay();sda = 1; //在scl为高电平时,sdasda一个上升沿为停止信号delay();}//ack:void ack() //应答信号0{uchar i = 0; //等待变量scl = 1;//在scl为高电平期间等待应答delay();while((sda == 1) && i < 250)//若为应答0即退出,从机向主机发送应答信号i++;//等待一段时间scl = 0; //应答之后将scl拉低delay();}//nack:void nack() //非应答{scl = 1;//在scl为高电平期间,由主机向从机发送一个1,非应答信号delay();sda = 1;scl = 0; //应答之后将scl拉低delay();}//send byte:void send_byte(uchar date)//写一个字节{uchar i, temp;temp = date; //存入要写入的数据,即要发送到sda上的数据for(i = 0; i < 8; i++){ //发送8位temp <<= 1; //to CY 将数据的最高位移入到PSW中的CY位中scl = 0;//只有在scl为低电平时,才允许sda上的数据变化delay();sda = CY; //将CY里的数据发送到sda数据线上delay(); //可以延时scl = 1; //在scl为高电平时,不允许sda上的数据变化,使数据稳定delay();scl = 0;//允许sda数据线的数据变化,等待下一个数据的传输delay();}//wait ack:发送完一个字节数据后要主机要等待从机的应答,第九位scl = 0;//允许sda变化delay();sda = 1;//wait:ack,sda拉高等待应答,当sda=0时,表示从机的应答delay();}//read: byteuchar read_byte() //读一个字节数据{uchar i, j, k;scl = 0; //读之前先允许sda变化delay(); //等待数据for(i = 0; i < 8; i++){scl = 1; //不允许sda变化delay(); //使sda数据稳定后开始读数据j = sda; //读出sda上的数据k = (k << 1)| j; //将数据通过|运算存入k中scl = 0;//允许sda变化等待下一位数据的到来delay();}//delay();//可不用延时return k;//返回读出的数据}//write:at24c02 在at24c02中的指定地址写入数据void write_at24c02(uchar address, uchar date) {start(); //启动i2csend_byte(write_c02);//写入期间地址和写操作ack(); //从机应答0send_byte(address); //写入写数据的单元地址ack(); //ack0send_byte(date); //在指定地址中写入数据ack(); //从机应答0stop();//停止i2c}//read: at24c02在at24c02的指定地址中读出写入的数据uchar read_at24c02(address){uchar dat;//用来存储读出的数据start(); //启动i2csend_byte(write_c02); //写入at24c02器件地址和写操作ack(); //从机应答0send_byte(address); //写入要读取AT24C02的数据的单元地址ack(); //从机应答0start(); //再次启动i2csend_byte(read_c02); //写入AT24C02器件地址和读操作ack();//从机应答‘0’dat = read_byte();//读出指定地址中的数据nack(); //主机发出非应答‘1’stop(); //停止i2creturn dat;//返回读出的数据}//main:void main(){uchar i;i2c_init();start();while(1){for(i = 0x00; i < 0xff; i++){write_at24c02(10, i);delayms(10);//需等待十毫秒P1 = read_at24c02(10);//1010 1010 delayms(2000);}}}。
51单片机应用程序大全
delay(8);
io=0;
delay(80);//12M延时600us
io=1;
delay(8);
n=io;//
delay(50);//由于器件一般是好的,在这里就不判断。
//判断可在后返回n,判断n的值是否为零。
}
/***********写字节数据************/
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
io=0;
io=dat&0x01;
delay(4);//延时一会,让器件采样
io=1;
dat>>=1;
}
delay(4);
}
/*******读字节函数**************/
uchar read_byte(void)
{
uchar i,value;
uchar temp;
void delay1(void)
{
uint t;
for(t=0;t<2000;t++);
}
void delay(uint t)
{
while(t--);
}
/***********初始化函数************/
void init_ds18b20(void)
{
uchar n;
init_ds18b20();
write_byte(0xcc); //跳过ROM
write_byte(0x44); //启动温度测量地址
delay1(); //给一段时间让它测量温度
for(i=0;i<8;i++)
(完整版)51单片机汇编指令(全)
指令中常用符号说明Rn当前寄存器区的8个工作寄存器R0~R7(n=0~7)Ri当前寄存器区可作为地址寄存器的2个工作寄存器R0和R1(i=0,1)Direct8位内部数据寄存器单元的地址及特殊功能寄存器的地址#data表示8位常数(立即数)#data16表示16位常数Add16表示16位地址Addr11表示11位地址Rel8位代符号的地址偏移量Bit表示位地址@间接寻址寄存器或基址寄存器的前缀( )表示括号中单元的内容(( ))表示间接寻址的内容指令系统数据传送指令(8个助记符)助记符中英文注释MOV Move 移动MOV A , Rn;Rn→A,寄存器Rn的内容送到累加器AMOV A , Direct;(direct)→A,直接地址的内容送AMOV A ,@ Ri;(Ri)→A,RI间址的内容送AMOV A , #data;data→A,立即数送AMOV Rn , A;A→Rn,累加器A的内容送寄存器RnMOV Rn ,direct;(direct)→Rn,直接地址中的内容送RnMOV Rn , #data;data→Rn,立即数送RnMOV direct , A;A→(direct),累加器A中的内容送直接地址中MOV direct , Rn;(Rn)→direct,寄存器的内容送到直接地址MOV direct , direct;(direct)→direct,直接地址的内容送到直接地址MOV direct , @Ri;((Ri))→direct,间址的内容送到直接地址MOV direct , #data;8位立即数送到直接地址中MOV @Ri , A;(A)→@Ri,累加器的内容送到间址中MOV @Ri , direct;direct→@Ri,直接地址中的内容送到间址中MOV @Ri , #data; data→@Ri ,8位立即数送到间址中MOV DPTR , #data16;data16→DPTR,16位常数送入数据指针寄存器,高8位送入DPH,低8位送入DPL中(单片机中唯一一条16位数据传送指令)(MOV类指令共16条)MOVC Move Cod 查表指令MOVC A , @A+PC;PC+1→PC,(A+PC)→AMOVC A , @A+DPTR;(A+DPTR) →A(MOVC类指令共两条)MOVX Move External 与外部数据寄存区传送数据MOVX A , @DPTR;(DPTR)→A,DPTR间址单元内容送AMOVX @DPTR , A;A→(DPTR),A中内容送入DPTR间址单元MOVX A , @Ri;(Ri)→A,Ri间址单元内容送AMOVX @Ri , A;A→(Ri),A中内容送Ri间址单元(MOVX类指令4条)XCH Exchange 交换指令XCH A , Rn;Rn←→A , Rn的内容与A的内容交换XCH A , Direct; Direct ←→A ,直接地址的内容与A的内容交换XCH A , @Ri;(Ri)←→A ,间址的内容与A的内容交换XCHD Exchange Decimal十进制交换XCHD A , @Ri;(Ri.3~Ri.0) ←→A.3~A.0,间址内容低四位与A中内容低四位交换SWAP Swap 交换SWAP A;A.3~A.0←→ A.7~A.4 , A中低四位与高四位内容交换PUSH Push 入栈PUSH direct;SP+1→SP , (direct)→(SP);直接地址内容压入堆栈顶POP Pop 出栈POP direct;(SP)→(direct) , SP-1→SP;堆栈内容弹出到直接地址●算术运算类指令(7个助记符)ADD Add 加法运算ADD A , Rn;A + Rn→A , A与Rn的内容相加,结果送到A中ADD A , direct;(direct)+A→A,A与直接地址的内容相加,结果送到A中ADD A , @Ri;((Ri))+A→A, A与间址中的内容相加,结果送到A中ADD A , #data;data+A→A,A与立即数相加,和送入AADDC ADD with Carry 带进位加法ADDC A , Rn;A + Rn+CY→A , A与Rn的内容、进位状态相加,结果送到A中ADDC A , direct;(direct)+A+CY→A,A与直接地址的内容、进位状态相加,结果送到A中ADDC A , @Ri;((Ri))+A+CY→A, A与间址中的内容、进位状态相加,结果送到A中ADDC A , #data;data+A+CY→A,A与立即数、进位状态相加,和送入ASUBB Subbtract with Borrow 带进位减法SUBB A , Rn;A-Rn-CY→A,A减寄存器Rn的内容及进位标志,结果送ASUBB A , direct; A-(direct)-CY→A,A直接地址的内容及进位标志,结果送ASUBB A , @Ri; A-((Ri))-CY→A,A间址的内容及进位标志,结果送ASUBB A , #data; A-data-CY→A,A立即数及进位标志,结果送AMUL Multiply 乘法指令MUL AB;A x B→B和A,结果16位,高8位存入B,低8位存入A;若结果大于FFH,则将溢出标志OV置1DIV Divide 除法指令DIV AB;A÷B 商→A,余数→B;若除数为0,结果不确定,则将溢出标志OV置1INC Increment 加1指令INC A;A+1→A,A加1,结果放在AINC Rn; Rn +1→ Rn, Rn加1,结果放在RnINC direct; (direct)+1→ direct,直接地址的内容加1,结果放在该地址中INC @Ri;((Ri))+1→( Ri),间址中的内容加1,结果放在该间址中INC DPTR;(DPTR)+1→DPTR,数据指针内容加1,结果放在数据指针寄存器(DPTR)中DEC Decrement 减1指令INC A;A-1→A,A减1,结果放在AINC Rn; Rn -1→ Rn, Rn减1,结果放在RnINC direct; (direct)-1→ direct,直接地址的内容减1,结果放在该地址中INC @Ri;((Ri))-1→( Ri),间址中的内容减1,结果放在该间址中DA Decimal Adjust 十进制加法调整指令DA A;在加法指令后,把A中二进制码自动调整为BCD码;DA A只能更跟在ADD或ADDC加法指令后,不适用于减法●逻辑运算指令(9个助记符)ANL Logical And 逻辑与运算ANL A , Rn; (A)与(Rn)→A, A的内容与Rn中的内容相与,结果放在A中ANL A , direct; (A)与(direct)→A, A的内容与直接地址中的内容相与,结果放在A中ANL A , @Ri; (A)与((Ri))→A, A的内容与间址的内容相与,结果放在A中ANL A , #data; (A)与(data)→A, A的内容与立即数相与,结果放在A中ANL direct , A; (direct)与(A)→direct, 直接地址中的内容相与A的内容相与,结果放在直接地址中ANL direct , #data;(direct)与#data→direct, 直接地址中的内容相与立即数相与,结果放在直接地址中ORL Logical OR 逻辑或运算ORL A , Rn; (A) 或(Rn)→A, A的内容与Rn中的内容相或,结果放在A中ORL A , direct; (A) 或(direct)→A, A的内容与直接地址中的内容相或,结果放在A中ORL A , @Ri; (A) 或((Ri))→A, A的内容与间址的内容相或,结果放在A中ORL A , #data; (A) 或(data)→A, A的内容与立即数相或,结果放在A中ORL direct , A; (direct) 或A)→direct, 直接地址中的内容相与A的内容相或,结果放在直接地址中ORL direct , #data;(direct) 或#data→direct, 直接地址中的内容相与立即数相或,结果放在直接地址中XRL Logical exclusive or 逻辑异或运算ORL A , Rn; (A) 异或(Rn)→A, A的内容与Rn中的内容相异或,结果放在A中ORL A , direct; (A) 异或(direct)→A, A的内容与直接地址中的内容相异或,结果放在A中ORL A , @Ri; (A) 异或((Ri))→A, A的内容与间址的内容相异或,结果放在A中ORL A , #data; (A) 异或(data)→A, A的内容与立即数相异或,结果放在A中ORL direct , A; (direct) 或A)→direct, 直接地址中的内容相与A的内容相异或,结果放在直接地址中ORL direct , #data;(direct) 异或#data→direct, 直接地址中的内容相与立即数相异或,结果放在直接地址RL Rotate Left 循环左移指令RL A;每执行一次,A中的内容左移一位RR Rotate Right 循环右移指令RR A;每执行一次,A中的内容右移一位RLC Rotate Left with the Carry flag 带进位循环左移指令RLC A;每执行一次,CY和A中的内容左移一位RRC Rotate Right with the Carry flag带进位循环又移指令RRC A;每执行一次,CY和A中的内容右移一位注意:循环移位指令只能对A中的内容进行移位操作CPL Complement 取反指令(求补指令)CPL A;累加器内容按位取反,0变1,1变0CLR Clear 清零指令CLR A;累加器清零(A各位全变为0)●控制转移指令(9个助记符)LJMP Long Jump 长跳转指令LJMP add16;add16→PC,无条件跳转到add16地址,可在64KB范围内转移AJMP Absolute Jump 绝对跳转指令AJMP add11;add11→PC,无条件跳转到add11地址,可在2KB范围内转移SJMP Short Jump 短跳转指令SJMP rel;PC+2+rel→PC,rel是偏移量,8位有符号数(-127~127),可向前后跳转±128个地址单元JMP Jump 跳转指令JMP @A+DPTR;A+DPTR→PC,属于散转指令,无条件转向A与DPTR内容相加后形成的新地址JZ Jump if acc is Zero累加器为零转移JZ rel;A=0转向PC+2+rel→PC,A≠0,顺序执行JNZ Jump if acc is Not Zero累加器不为零转移JNZ rel;A≠0转向PC+2+rel→PC,A=0,顺序执行CJNE Compare and Jump if Not Equal比较不相等则转移CJNE A , direct , rel;A≠(direct)转向PC+3+rel→PC,否则顺序执行(PC+3 →PC);(A)>(direct)CY=0, (A)<(direct)CY=1CJNE A , #data , rel;A≠(data)转向PC+3+rel→PC,否则顺序执行(PC+3 →PC);(A)>(data)CY=0,( A)<(data)CY=1CJNE Rn , #data , rel; Rn≠(data)转向PC+3+rel→PC,否则顺序执行(PC+3 →PC); (Rn) >(data)CY=0, (Rn) <(data)CY=1CJNE @Ri , #data , rel;((Ri))≠(data)转向PC+3+rel→PC,否则顺序执行(PC+3 →PC); ((Ri))>(data)CY=0, ((Ri)) <(data)CY=1DJNE Decrement and Jump if Not Zero 减1不为0则转移DJNE Rn , rel;Rn-1→Rn, Rn≠0转向PC+2+rel→PC,否则顺序执行(PC+2→PC)DJNZ direct , rel;(direct-1)→direct, direct≠0转向PC+2+rel→PC,否则顺序执行(PC+2→PC)LCALL Long Call 长条用指令LCALL addr16;调用程序入口地址为addr16的之程序ACALL Absolute Call短调用ACALL addr11;调用程序入口地址为addr11的之程序RET ReturnRET;放在子程序最后,使程序准确返回到主程序断点处RETI Return from InterruptRETI;中断返回指令,能清楚优先级状态NOP No Operation 空操作指令NOP;空操作,产生一个机器周期延时●位操作指令MOV Move 数据传送指令MOV C , bit;(bit)→C,寻址位的状态送入CMOV bit , C;(C)→bit,C的转态送入地址中CLR Clear 清零指令CLR C;0→C,清零累加器CLR bit;清零直接寻址位CPL Complement 取反指令(求补指令)CPL C;c取反CPL bit;直接寻址位取反SETB Set Bit 置位SETB C;C置1SETB bit;直接寻址位置1ANL And Logical 与逻辑运算ANL C , bit;直接寻址位与C相与,结果放在CANL C , /bit; 直接寻址位与非C相与,结果放在CORL OR Logical 或逻辑运算ORL C , bit;直接寻址位与C相或,结果放在CORL C , /bit; 直接寻址位与非C相或,结果放在CJC Jump if Carry is set 进位位为1则转移JC rel;C=1,转向PC+2+rel→PC,否则顺序执行PC+2→PCJNC Jump if Carry is Not set 进位位为不为1则转移JNC rel;C=0,转向PC+2+rel→PC,否则顺序执行PC+2→PCJB Jump if Bit is set 进位位为1则转移JB bit , rel;(bit)=1,转向PC+3+rel→PC,否则顺序执行PC+3→PCJNB Jump if Bit is Not set 进位位为1则转移JNB bit , rel;(bit)=0,转向PC+3+rel→PC,否则顺序执行PC+3→PCJBC Jump if Bit is set and Clear bit指定位等于1转移并清该位JBC bit , rel; (bit)=1,转向PC+3+rel→PC,同时0→bit否则顺序执行PC+3→PC伪指令ORG Origin 代码起始地址指令ORG 0000HMOV A , #0010H;这条指令从0000H这个地址单元开始写起END End 汇编程序结束指令END;汇编指令结束DB字节定义伪指令ORG 1000HDB 01H , 02H;则(1000H)=01H,(1001H)=02HORG 1100HDB ‘01’;则(1100H)=30H,30H是0的ASCII码,(1101H)=31H,31H是1的ASCII码DW双字节定义伪指令ORG 2000HDW 2546H , 0178H; (2000H)=25H, (2001H)=46H, (2002H)=01H, (2003H)=78H,EQU数据赋值伪指令X EQU n;将n的值赋给xBIT位数据赋值伪指令y BIT b;y是用户定义标号,b为0或1MACRO宏指令宏指令名MACRO 形式参数······代码段······ENDM;宏指令定义结束寻址方式及相关的存储空间寻址方式寻址范围寄存器寻址R0~R7A 、B、C(CY)、AB(双字节)、DPTR(双字节)、PC(双字节)直接寻址内部RAM低128字节特殊功能寄存器内部RAM位寻区的128个位特殊功能寄存器中可寻址的位寄存器间接寻址内部数据存储器RAM【@R0,@R1,@SP(仅PUSH,POP)】内部数据存储器单元的低4位(@R0,@R1)外部RAM或I/O口(@R0,@R1,@DPTR)立即寻址程序存储器(常数)程序存储器(@A+PC,@A+DPTR)基寄存器加变址寄存器间接寻址。
51单片机简易程序
51单片机简易程序1. 点亮你的LED灯a. 程序/**LED接P0,低电平有效**/#include //51单片机头文件typedefunsigned char uchar; //宏定义,末尾有分号uchari,j,temp;voiddelay(unsigned int ms) //延时函数{uchar t;while(ms--)for(t=0;t<123;t++);}voidmain(){P1=0xff;temp=0xff; //灯全灭while(1){for(i=0;i<8;i++){delay(100);//temp左移i个单位,再按位取反temp=~(1<<i);< p="">P1=temp;delay(100);}for(j=7;j>0;j--){delay(100);temp=~(1<<j);< p="">P1=temp;delay(100);}}}2. 数码管显示共阴极数码管编码:0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;共阳极数码管编码:0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/***数码管接P0,1、3显示相同,2、4相同***/ #includetypedefunsigned int uint;typedefunsigned char uchar;voidDelay_1ms(uint i);voiddisplay(int x,int y);//定义一个数组,赋值为0123456789ucharseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0 x90}; uchari,j;voidmain(){while(1){display(10,10); //x,y初值为10}}voidDelay_1ms(uint i) //1ms延时{uchar x,j;for(j=0;j<i;j++)< p="">for(x=0;x<=148;x++);}voiddisplay(int x,int y){int i,j,shi,ge;for(i=x;i>0;i--){for(j=0;j<y;j++)< p="">{shi=i/10;ge=i%10;P2=0X01; //数码管只亮一位P0=seg[shi];Delay_1ms(10);P2=0X02; //数码管亮两位P0=seg[ge];Delay_1ms(10);}}}3. 外部中断外部中断0:函数名()interrupt 0 接P3^2;定时器计时器0:函数名()interrupt 1;外部中断1:函数名()interrupt 2 接P3^3;定时器计时器1:函数名()interrupt 3;串行口中断:函数名()interrupt 4;EA为CPU中断允许标志。
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单片机编程实例大全
//实例 16:用 P0 显示左移运算结果
#include<reg51.h> //包含单片机寄存器的头文件 void main(void) {
P0=0x3b<<2;//将左移运算结果送 P0 口,P0=1110 1100B=0xec while(1)
; //无限循环,防止程序“跑飞” }
//实例 17:"万能逻辑电路"实验
}
//实例 10:用 P0、P1 口显示乘法运算结果
#include<reg51.h> //包含单片机寄存器的头文件 void main(void) {
unsigned char m,n; unsigned int s; m=64;
n=71; s=m n; 位送 P0 口
/256 除以 256 的商 的余数
//s=64 71=4544,需要 16 位二进制数表示,高 8 位送 P1 口,低 8
//由于 4544=17 256+192=H3 16 16 16+H2 16 16+H1 16+H0 //两边同除以 256,可得 17+192/256=H3 16+H2+(H1 16+H0)
//因此,高 8 位 16 进制数 H3 16+H2 必然等于 17,即 4544
//无限循环
{ P1=0xfe; //P1=1111 1110B, P1.0 输出低电平 delay(); //延时一段时间 P1=0xff; //P1=1111 1111B, P1.0 输出高电平 delay(); //延时一段时间
}
}
//实例 3:将 P1 口状态分别送入 P0、P2、P3 口:认识 I/O 口 的引脚功能
51单片机程序全集(二)
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是形参,实指该函数被调用时括号里的数。
51单片机实例(含详细代码说明)
51单⽚机实例(含详细代码说明)1.闪烁灯1.实验任务如图4.1.1所⽰:在端⼝上接⼀个发光⼆极管L1,使L1在不停地⼀亮⼀灭,⼀亮⼀灭的时间间隔为秒。
2.电路原理图图4.1.13.系统板上硬件连线把“单⽚机系统”区域中的端⼝⽤导线连接到“⼋路发光⼆极管指⽰模块”区域中的L1端⼝上。
4.程序设计内容(1).延时程序的设计⽅法作为单⽚机的指令的执⾏的时间是很短,数量⼤微秒级,因此,我们要求的闪烁时间间隔为秒,相对于微秒来说,相差太⼤,所以我们在执⾏某⼀指令时,插⼊延时程序,来达到我们的要求,但这样的延时程序是如何设计呢下⾯具体介绍其原理:如图4.1.1所⽰的⽯英晶体为12MHz,因此,1个机器周期为1微秒机器周期微秒MOV R6,#20 2个 2D1: MOV R7,#248 2个 2 2+2×248=498 20× DJNZ R7,$ 2个2×248 (498DJNZ R6,D1 2个2×20=4010002因此,上⾯的延时程序时间为。
由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。
如本实验要求秒=200ms,10ms×R5=200ms,则R5=20,延时⼦程序如下:DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET(2).输出控制如图1所⽰,当端⼝输出⾼电平,即=1时,根据发光⼆极管的单向导电性可知,这时发光⼆极管L1熄灭;当端⼝输出低电平,即=0时,发光⼆极管L1亮;我们可以使⽤SETB 指令使端⼝输出⾼电平,使⽤CLR 指令使端⼝输出低电平。
5.程序框图如图4.1.2所⽰图4.1.26.汇编源程序ORG 0START: CLRLCALL DELAYSETBLCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时⼦程序,延时秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C语⾔源程序#include <>sbit L1=P1^0;void delay02s(void)4.2.14.2.14.2.24.3.14.3.14.3.20F0F4.4.14.4.14.4.24.5.1 4.5.20F0F0F0F7f7f7f7f4.6.14.6.2实验任务如图13所⽰,利⽤AT89S51单⽚机的P0端⼝的-连接到⼀个共阴数码管的a-h的笔段上,数码管的公共端接地。
常见51单片机指令及详解
常见51单片机指令及详解数据传递类指令(1)以累加器为目的操作数的指令MOV A,RnMOV A,directMOV A,@RiMOV A,#data第一条指令中,Rn代表的是R0-R7。
第二条指令中,direct就是指的直接地址,而第三条指令中,就是我们刚才讲过的。
第四条指令是将立即数data送到A中。
下面我们通过一些例子加以说明:MOV A,R1 ;将工作寄存器R1中的值送入A,R1中的值保持不变。
MOV A,30H ;将内存30H单元中的值送入A,30H单元中的值保持不变。
MOV A,@R1 ;先看R1中是什么值,把这个值作为地址,并将这个地址单元中的值送入A中。
如执行命令前R1中的值为20H,则是将20H单元中的值送入A中。
MOV A,#34H ;将立即数34H送入A中,执行完本条指令后,A中的值是34H。
(2)以寄存器Rn为目的操作的指令MOV Rn,AMOV Rn,directMOV Rn,#data这组指令功能是把源地址单元中的内容送入工作寄存器,源操作数不变。
(3)以直接地址为目的操作数的指令MOV direct,A 例: MOV 20H,AMOV direct,Rn MOV 20H,R1MOV direct1,direct2 MOV 20H,30HMOV direct,@Ri MOV 20H,@R1MOV direct,#data MOV 20H,#34H(4)以间接地址为目的操作数的指令MOV @Ri,A 例:MOV @R0,AMOV @Ri,direct MOV @R1,20HMOV @Ri,#data MOV @R0,#34H(5)十六位数的传递指令MOV DPTR,#data168051是一种8位机,这是唯一的一条16位立即数传递指令,其功能是将一个16位的立即数送入DPTR中去。
其中高8位送入DPH,低8位送入DPL。
例:MOV DPTR,#1234H,则执行完了之后DPH中的值为12H,DPL中的值为34H。
51单片机实例(含详细代码说明)
1.闪烁灯1.实验任务如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。
2.电路原理图图4.1.13.系统板上硬件连线把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。
4.程序设计内容(1).延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒机器周期微秒MOV R6,#20 2个 2D1: MOV R7,#248 2个 2 2+2×248=498 20× DJNZ R7,$ 2个2×248 (498DJNZ R6,D1 2个2×20=4010002因此,上面的延时程序时间为10.002ms。
由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。
如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET(2).输出控制如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。
5.程序框图如图4.1.2所示图4.1.26.汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时0.2秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C语言源程序#include <AT89X51.H>sbit L1=P1^0;void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}void main(void) {while(1){L1=0;delay02s();L1=1;delay02s();}2.模拟开关灯1.实验任务如图4.2.1所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。
51单片机的汇编指令手册-高亮+注释
51单片机的汇编指令手册1、数据传送类指令:(28条)1 MOV A,Rn ;寄存器内容送入累加器2 MOV A,direct ;直接地址单元中的数据送入累加器3 MOV A,@Ri ;间接RAM 中的数据送入累加器4 MOV A,#data ;立即数送入累加器5 MOV Rn,A ;累加器内容送入寄存器6 MOV Rn,direct ;直接地址单元中的数据送入寄存器7 MOV Rn,#data ;立即数送入寄存器8 MOV direct,A ;累加器内容送入直接地址单元9 MOV direct,Rn ;寄存器内容送入直接地址单元10 MOV direct,direct ;直接地址单元中的数据送入另一个直接地址单元11 MOV direct,@Ri ;间接RAM 中的数据送入直接地址单元12 MOV direct,#data ;立即数送入直接地址单元13 MOV @Ri,A ;累加器内容送间接RAM 单元14 MOV @Ri,direct ;直接地址单元数据送入间接RAM 单元15 MOV @RI,#data ;立即数送入间接RAM 单元16 MOV DRTR,#dat16 ;16 位立即数送入地址寄存器17 MOVC A,@A+DPTR ;以DPTR为基地址变址寻址单元中的数据送入累加器18 MOVC A,@A+PC ;以PC 为基地址变址寻址单元中的数据送入累加器19 MOVX A,@Ri ;外部RAM(8 位地址)送入累加器20 MOVX A,@DPTR ;外部RAM(16 位地址)送入累加器21 MOVX @Ri,A ;累计器送外部RAM(8 位地址)22 MOVX @DPTR,A ;累计器送外部RAM(16 位地址)23 PUSH direct ;直接地址单元中的数据压入堆栈24 POP direct弹栈送直接地址单元25 XCH A,Rn ;寄存器与累加器交换26 XCH A,direct ;直接地址单元与累加器交换27 XCH A,@Ri ;间接RAM 与累加器交换28 XCHD A,@Ri ;间接RAM 的低半字节与累加器交换2、算术操作类指令:(24条)1 ADD A,Rn ;寄存器内容加到累加器2 ADD A,direct ;直接地址单元的内容加到累加器3 ADD A,@Ri ;间接ROM 的内容加到累加器4 ADD A,#data ;立即数加到累加器5 ADDC A,Rn ;寄存器内容带进位加到累加器6 ADDC A,direct ;直接地址单元的内容带进位加到累加器7 ADDC A,@Ri ;间接ROM 的内容带进位加到累加器8 ADDC A,#data ;立即数带进位加到累加器9 SUBB A,Rn ;累加器带借位减寄存器内容10 SUBB A,direct ;累加器带借位减直接地址单元的内容11 SUBB A,@Ri ;累加器带借位减间接RAM 中的内容12 SUBB A,#data ;累加器带借位减立即数13 INC A ;累加器加114 INC Rn ;寄存器加115 INC direct ;直接地址单元加116 INC @Ri ;间接RAM 单元加117 DEC A ;累加器减118 DEC Rn ;寄存器减1 1 1219 DEC direct ;直接地址单元减120 DEC @Rj ;间接RAM 单元减 121 INC DPTR ;地址寄存器DPTR 加 122 MUL AB A ;乘以B,结果放在A23 DIV AB A ;除以B,结果放在A24 DA A ;累加器十进制调整3、布尔变量操作类指令:(17条)1 CLR C ;清进位位2 CLR bit ;清直接地址位3 SETB C ;置进位位4 SETB bit ;置直接地址位5 CPL C ;进位位求反6 CPL bit ;置直接地址位求反7 ANL C,bit ;进位位和直接地址位相“与”8 ANL C,bit ;进位位和直接地址位的反码相“与”9 ORL C,bit ;进位位和直接地址位相“或”10 ORL C,bit ;进位位和直接地址位的反码相“或”11 MOV C,bit ;直接地址位送入进位位12 MOV bit,C ;进位位送入直接地址位13 JC rel ;进位位为1 则转移14 JNC rel ;进位位为0 则转移15 JB bit,rel ;直接地址位为1 则转移16 JNB bit,rel ;直接地址位为0 则转移17 JBC bit,rel ;直接地址位为1 则转移,该位清零4、逻辑操作数指令:(25条)1 ANL A,Rn ;累加器与寄存器相“与”2 ANL A,direct ;累加器与直接地址单元相“与”3 ANL A,@Ri ;累加器与间接RAM 单元相“与”4 ANL A,#data ;累加器与立即数相“与”5 ANL direct,A ;直接地址单元与累加器相“与”6 ANL direct,#data ;直接地址单元与立即数相“与”7 ORL A,Rn ;累加器与寄存器相“或”8 ORL A,direct ;累加器与直接地址单元相“或”9 ORL A,@Ri ;累加器与间接RAM 单元单元相“或”10 ORL A,#data ;累加器与立即数相“或”11 ORL direct,A ;直接地址单元与累加器相“或”12 ORL direct,#data ;直接地址单元与立即数相“或”13 XRL A,Rn ;累加器与寄存器相“异或”14 XRL A,direct ;累加器与直接地址单元相“异或”15 XRL A,@Ri ;累加器与间接RAM 单元单元相“异或”16 XRL A,#data ;累加器与立即数相“异或”17 XRL direct,A ;直接地址单元与累加器相“异或”18 XRL direct,#data ;直接地址单元与立即数相“异或”19 CLR A ;累加器清“0”20 CPL A ;累加器求反21 RL A ;累加器循环左移22 RLC A ;累加器带进位位循环左移23 RR A ;累加器循环右移24 RRC A ;累加器带进位位循环右移25 SWAP A ;累加器半字节交换5、控制转移类指令:(17条)1 ACALL addr11 ;绝对(短)调用子程序2 LCALL addr16 ;长调用子程序3 RET ;子程序返回4 RETI ;中数返回5 AJMP addr11 ;绝对(短)转移6 LJMP addr16 ;长转移7 SJMP rel ;相对转移8 JMP @A+DPTR ;相对于DPTR 的间接转移9 JZ rel ;累加器为零转移10 CJNE rel ;累加器非零转移11 CJNE A,direct,rel ;累加器与直接地址单元比较,不相等则转移12 CJNE A,#data,rel ;累加器与立即数比较,不相等则转移13 CJNE Rn,#data,rel ;寄存器与立即数比较,不相等则转移14 CJNE @Ri,#data,rel ;间接RAM 单元与立即数比较,不相等则转移15 DJNZ Rn,rel ;寄存器减1,非零转移16 DJNZ direct,erl ;直接地址单元减1,非零转移17 NOP ;空操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51 单片机常见程序附带注释三位数分离成3个一位数,截取bai=num/100;//输出百位数shi=num%100/10;//输出十位数ge=num/10;//输出个位数#include<reg52.h> //跑马灯程序。
当时间约为20ms,形成动态扫描,看上去全亮。
#include<intrins.h>#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<reg52.h> //跑马灯程序。
现在时间较长,多以是亮灭的流动,当时间约为20ms,形成动态扫描,看上去全亮。
#include<intrins.h>#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 <reg52.h> //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 <reg52.h> //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 <reg52.h> //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 <reg52.h> //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 <reg52.h> //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 <reg52.h> //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, //共阳极数字:0123456789abcdefg0x99,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 <reg52.h> //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 <reg52.h> //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 <reg52.h> //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 <reg52.h> //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) ;void display(uchar,uchar) ;uchar num,num1,num2,shi,ge;void main (){TMOD=0x01;//设置定时器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);}}void display (uchar shi,uchar ge) //控制数码管{dula=1; //打开U1锁存端段选P0=table[shi]; //送入段选信号dula=0; //关闭U1锁存器P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存器时wela=1; //原来的段选数据通过位选锁存器造成混乱P0=0xfe; //送位选数据wela=0;delayms(5); //延时dula=1; //打开U1锁存端段选P0=table[ge]; //送入段选信号dula=0; //关闭U1锁存器P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存器时 wela=1; //原来的段选数据通过位选锁存器造成混乱P0=0xfe; //送位选数据wela=0;delayms(5); //延时}void delayms(uint xms) //延时子程序{uint i,j;for (i=xms;i>0;i--) //i=xms即延时约为xms毫秒for (j=110;j>0;j--);}void T0_time()interrupt 1{TH0= (65536-50000)/256; //重装初值TL0= (65536-50000)%256;num++;if(num1==4) //num1每加1次判断一次是否到4次 ,时间间隔200ms {num1=0; //然后把num1清0重新再计数4次led1=~led1; //让发光管状态取反}}void T1_time()interrupt 3{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 <reg52.h> //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) ;void display(uchar,uchar) ;uchar num,num1,num2,shi,ge;void main (){TMOD=0x01;//设置定时器0和1为工作方式1(M1M0为01,0001 0001)TH0= (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);}}void display (uchar shi,uchar ge) //控制数码管{dula=1; //打开U1锁存端段选P0=table[shi]; //送入段选信号dula=0; //关闭U1锁存器P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存器时wela=1; //原来的段选数据通过位选锁存器造成混乱P0=0xfe; //送位选数据wela=0;delayms(5); //延时dula=1; //打开U1锁存端段选P0=table[ge]; //送入段选信号dula=0; //关闭U1锁存器P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存器时wela=1; //原来的段选数据通过位选锁存器造成混乱P0=0xfe; //送位选数据wela=0;delayms(5); //延时}void delayms(uint xms) //延时子程序{uint i,j;for (i=xms;i>0;i--) //i=xms即延时约为xms毫秒for (j=110;j>0;j--);}#include <reg52.h> //52系列单片机头文件(目标:中断程序,控制1点0二极管10ms闪烁)#define uchar unsigned char#define uint unsigned intsbit led1=P1^0; //声明单片机 P1口的第一位uchar num;void main (){TMOD=0x01;//设置定时器0为工作方式1(M1M0为01)TH0= (65535-50000)/256;//装初值12.00M晶振定时50ms数为50000TL0= (65535-50000)%256;EA=1;// 开总中断ET0=1; // 开定时器0中断TR0=1;// 启动定时器0while(1)// 程序停止在这里等待中断的发生{if(num==200)//判断一次是否到20{num=0; //然后把num清0重新再计数20次led1=~led1; //让发光管状态取反}}}void T0_time()interrupt 1{TH0= (65535-50000)/256; //重装初值TL0= (65535-50000)%256;num++; //num加上1}#include <reg52.h> //52系列单片机头文件(目标:中断程序,控制1点0二极管100ms闪烁,若num=10,则0.05s闪烁,换句话控制5000或者num都可以控制时间。