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单片机模拟智能电梯系统代码及注释
#include<>#define uint unsigned int#define uchar unsigned char〃延时程序,以毫秒为单位,用软件计时,输入的参数为毫秒数void Delay_ms( uint Time);〃电梯向上走void Up();I〃电梯向下走void Down();〃报警函数void Warnning();〃获取目的楼层void Destination();//显示某一楼层void Display( uchar n, uchar a);//闪烁显示到达的楼层void Flash( uchar a);//点阵键盘扫描uchar KBScan();//延时void dl_ms();//解析出按键所代表的楼层uchar Reprsent();#include ""uchar code TAB[16]= (0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71);sbit P0_0 = P0A0;sbit P0_1 = P0A1;sbit P0_2 = P0A2;sbit P0_3 = P0A3;sbit P0_4 = P0A4;sbit P0_5 = P0A5;sbit P0_6 = P0A6;s bit P0_7 = P0A7;sbit P1_0 = P1A0;uchar lift = 1;〃电梯所在的楼层uchar destination1 = 1;〃电梯的目的楼层uchar flag = 0;〃进入电梯程序的标志uchar key;〃按键的键码uchar request[] = {0, 0, 0, 0, 0, 0, 0, 0, 0);//1-8 楼有无请求,有请求为 1uchar status = 1;//电梯往上还是往下走,1为上,0为下//报警的响声的频率产生void Timer1() interrupt 3 { P1_0=-P1_0;TH1 = 0xfc;TL1 = 0x0c;) int main(){'uchar i;P0 = 0xff;P2 = 0x76; //数码管‘H’EA = 1; //开启外部中断INT0EX0 = 1;IT0 = 1;while(1) //检查flag 标志{ //flag初始化为0if(flag == 1) 〃在中断中将其置1break;P1 = 0x01; 〃数码管跑马显示HDelay_ms( 100); //flag置1后则进入电梯程序for(i = 0; i < 5; ++i) (P1 = P1 << 1;Delay_ms( 100);) 一)while(1) 〃电梯程序的循环(if( (key = KBscan()) == 0x77) 〃若点阵按键右下角的按键(其代码为0x77)按下(Warnning(); 〃则报警) else (Destination(); 〃查询有无楼层请求到达if( destination1 >= lift) 〃请求的楼层比要到达的楼层高(Up(); 〃电梯向上走) else (〃否则电梯向下走;Down();)))return 0;)〃中断请求,将flag置1,表示要进入电梯程序void Int0() interrupt 0(flag = 1;)〃延时程序,以毫秒为单位,用软件计时,输入的参数void Delay_ms( uint Time)( 一uint i = 0, j = 0;for(i = 0; i < Time; ++i) (for(j = 0; j < 125; ++j);〃电梯向上走void Up() (uchar n, m; //n为所在楼层,m 为存储查询有无楼层请求的变量( uchar i;〃循环控制status = 1;〃置1表示电梯向上走for( n = lift; n <= destination1; ++n) 〃电梯到达目的楼层之前往上走(Display( n, 1); //没到达一楼就显示该楼层数lift = n;m = Represent(); if( m == 9) (Warnning();) else (request[m] = 1;)for(i = 1; i <= 8; ++i)〃若请求到达的楼层在所在楼层和目的楼层之间{〃则停下闪烁显示if( request[i] == 1 && i == n) //并将其对应的 request 清零{request[i] = 0; Flash( 1); ))) --n; lift = n;( Flash( 1);〃到达目的楼层闪烁显示该楼层)//电梯向下走void Down() {uchar n, m; //n为所在楼层,m 为存储查询有无楼层请求的变量uchar i;//循环控制//读取点阵键盘//报警键按下则报警〃有楼层请求到达〃将对应的request 置1for(i = 1; i <= 8; ++i)〃若请求到达的楼层在所在楼层和目的楼层之间{〃则停下闪烁显示if( request[i] == 1 && i == n) //并将其对应的 request 清零{request[i] = 0; Flash( 0);))) ++n; lift = n; Flash( 0);〃到达目的楼层闪烁显示该楼层)〃报警函数void Warnning() {TMOD = 0x10; //T1定时器初始化ET1 = 1; TH1 = 0xfc; TL1 = 0x0c; TR1 = 1; while(1) {P1=0x04; P2=0x07; Delay_ms( 5); P1=0x08; P2 = 0x3f; Delay_ms( 5); P1=0x10;status = 0;〃置1表示电梯向上走for( n = lift; n >= destinationl; --n) 〃电梯到达目的楼层之前往下走(Display( n, 0);楼层数lift = n;m = Represent(); if( m == 9) (Warnning();) else%(request[m] = 1;)//没到达一楼就显示该〃读取点阵键盘//报警键按下则报警〃有楼层请求到达〃将对应的request 置1P1=0x02; P2 = 0x6D; Delay_ms( 5); //显示STOPP2=0x73;Delay_ms( 5);if( KBScan() != 0x77) 〃报警键没有按{ 〃则跳出,并停止喇叭响break;) ))¥〃获取目的楼层void Destination() {uchar j, n; 〃j循环控制变量,n存储度点阵键盘变量n = Represent(); 〃有键按下request[n] = 1; 〃其对应的楼层request 置 1if( status == 1) 〃若电梯向上走则从高楼层到低楼层扫描〃以此达到判断优先级的目的!{for(j = 8; j >= 1; --j) {if( request[j] == 1){request[j] = 0; 〃哪一层有请求destination1 = j; 〃则将目的楼层设为该楼break; 〃并将其对应的request置1,然后跳出)),)else if( status == 0) 〃若电梯向下走则从低楼层到高楼层扫描{ 〃以此达到判断优先级的目的for(j = 1; j <= 8; ++j){if( request[j] == 1){request[j] = 0;destination1 = j; break;))〃显示某一楼层void Display( uchar n, uchar a)( uchar i, b;" 一一if(a == 1)( b=0x73;)else if(a == 0)( b = 0x5E;)for(i = 0; i < 60; ++i)P1=0x20;P2 = b;Delay_ms( 10);P1 = 0x02;P2 = TAB[n];Delay_ms( 10);//闪烁显示到达的楼层void Flash( uchar a) (uchar i, j, b;uchar m;if(a == 1) //a=1 表示向上(b = 0x73; //七段码P)表示向下/ else if(a == 0) //a=0(b = 0x5E; //七段码 d) for(i = 0; i < 5; ++i) {m = Represent(); 〃闪烁时判断有无楼层请求到达 request[m] = 1; for(j = 0; j < 15; ++j) 〃闪烁显示楼层和P 或者d(P1=0x20; P2 = b; Delay_ms( 10); P1 = 0x02; P2 = TAB[lift];Delay_ms( 10);)一for(j = 0; j < 15; ++j) (P1 = 0x20; P2 = b; Delay_ms( 10); P1 = 0x02; P2 = 0x00;Delay_ms( 10);}一)}》#include ""〃延时void dl_ms()( 一uchar i;for(i = 0; i < 200; ++i);〃点阵键盘扫描uchar KBScan() (uchar sccode, recode; //sccode 低位,recode 高位uchar i, a; //i循环控制,a 读取P0 口P0 = 0x0f;if( (P0 & 0x0f) != 0x0f) //有无键按下(dl_ms();〃消抖延时 if( (P0 & 0x0f) != 0x0f)〃有键按下则继续recode = 0x7f; for(i = 1; i <= 4; ++i) (〃先显示P 或者d 以及楼层数〃再显示P 或者d 而不显示楼层数〃以此达到闪烁的目的P0 = recode; 〃从P0的最高位开始扫描,即点阵键盘第四行if( (P0 & 0x0f) != 0x0f)# {a = P0; 〃若该行有键按下,则返回其代码sccode = a & 0x0f;recode = recode & 0xf0;return (sccode + recode);)else{recode = (recode >> 1) | 0x80; //若没有则扫描其上面一行))))return 0; )//解析出按键所代表的楼层uchar Represent(){uchar key, n;key = KBScan();switch( key){case 0xee: n = 1; break; case 0xed: n = 2; break; case 0xeb: n = 3; break; case 0xe7: n = 4; break; case 0xde: n = 5; break; case0xdd: n = 6; break; case 0xdb: n = 7; break; case 0xd7: n = 8; break; case 0x77: n = 9; break; default: n = 0; break;)return n; )。
分享简洁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语句内部执行的这种方式为嵌套}。
51单片机基本程序
1第一位隔一秒闪烁一次#include<reg52.h>#define uint unsigned intsbit led1=P1^0;uint i;uint j;void main(){while(1){led1=0;for(i=1000;i>0;i--)for(j=110;j>0;j--);led1=1;for(i=1000;i>0;i--)for(j=110;j>0;j--);}}2复杂广告灯#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar discode[]={ 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,//正向流水灯0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,//反向流水灯0xAA,0x55,0xAA,0x55,0xAA,0x55,0xFF,//隔灯闪烁3次0xF0,0x0F,0xF0,0x0F,0xFF,//高四盏。
低四盏闪烁2次0x33,0xCC,0x33,0xCC,0x33,0xCC,0xFF//隔两盏闪烁3次};void delayms(uint ms){uint i;while(ms--){for(i=0;i<120;i++);}}void main(void){uchar i;P0=0xFF;while(1){for(i=0;i<35;i++){P0=discode[i];delayms(250);}}}3拉幕式与闭幕式广告灯#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar discode1[4]={0x18,0x24,0x42,0x81}; uchar discode2[4]={0x7E,0x3C,0x18,0x00}; void delayms(uint ms){uint i;while(ms--){for(i=0;i<120;i++);}}void main(void){uchar i,j;P0=0xFF;while(1){for(i=0;i<4;i++){j=discode1[i];P0=~j;delayms(500);}j=0xFF;P0=~j;delayms(500);for(i=0;i<4;i++){j=discode2[i];P0=~j;delayms(500);}}}4流水灯跑马灯左移右移#include<reg52.h>#define uint unsigned int#define uchar unsigned charvoid delay(uint s){uint i;while(s--){for(i=0;i<120;i++);}}void main(void){uchar i,j;P0=0xFF;while(1){j=0x01;for(i=0;i<8;i++){P0=~j;delay(500);j=j<<1;}P0=0xFF;delay(1000);j=0x80;for(i=0;i<8;i++){P0=~j;delay(500);j=j>>1;}}}5千位静态显示数字#include<reg52.h>sbit SMG_q = P1^0; //定义数码管阳级控制脚〔千位〕sbit SMG_b = P1^1; //定义数码管阳级控制脚〔百位〕sbit SMG_s = P1^2; //定义数码管阳级控制脚〔十位〕sbit SMG_g = P1^3; //定义数码管阳级控制脚〔个位〕void main(){SMG_q=0;P0=0xF8;while(1);}6,4位数码管同时静态显示#include<reg52.h>#define unchar unsigned char#define uint unsigned intsbit SMG_q = P1^0; //定义数码管阳级控制脚〔千位〕sbit SMG_b = P1^1; //定义数码管阳级控制脚〔百位〕sbit SMG_s = P1^2; //定义数码管阳级控制脚〔十位〕sbit SMG_g = P1^3; //定义数码管阳级控制脚〔个位〕unchar mun;uchar; code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};void delay(uint);void main(void){SMG_q=0; SMG_b=0; SMG_s=0; SMG_g=0;//P1=0xf0;两种都可以实现。
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单片机实例(含详细代码说明)
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单片机汇编指令(全)
指令中常用符号说明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串口通信程序(带详细注释)#include;#include; //后面有一个比较函数#define uchar unsigned char#define uint unsigned intbit UART_Flag=0; //定义串口接收标志位uchar str[50];//定义一数组uchar length=0; //数组长度从0开始void init() //初始化uart{TMOD=0X20; //定时器1定时器方式工作模式2,可自动重载的8位计数器常把定时/计数器1以模式2作为串行口波特率发生器SCON=0X50; //选择工作模式1使能接收,允许发送,允许接收EA=1; //开总中断ES=1; //打开串口中断ET1=0; //打开定时器中断PCON=0X80; //8位自动重载,波特率加倍TH1=0XFF; //用22.1184 mhz波特率TL1=0XFF;TR1=1; //打开中时器}void UART_Putch(uchar dat) //输出一个字符{SBUF=dat; //把数据送给sbuf缓存器中while(TI!=1);//发送标志位 TI如果发送了为1,没发送为0,没发送等待,到了退出循环TI=0; //到了,TI清为0}void init1() interrupt 4 //uart中断,4为串口中断{if(RI==1) //收到数据{uchar m=SBUF; //m为计算机发送给串口的数据,例,open //总体思想是,计算机通知串口,我要发数据了RI=0;//收到清0if(m=='\r')//判断m这位数据有无\r{UART_Putch('\r'); //回车UART_Putch('\n'); // 换行str[length]='\0'; //数据最后位加0标志位表示发完了数据UART_Flag=1; // 传完标志位}else if(m=='\n'){}else if(m=='\b')//b表退格 //下面几句表删锄{UART_Putch('\b');UART_Putch(' ');UART_Putch('\b');length=length-1; //删锄了后总长度减一}else{str[length++]=m; //比如m为open,先传0后传p,length加一UART_Putch(m);//输出比如open}}}void check(char *str) //计算机发一数据,我来检查,{if( strcmp("open",str)==0 ) //比较两数是否相同,相同为0,不同为1 //要加string.h头文件{UART_Putch('o'); //计算机中写入open我回复ok UART_Putch('k');UART_Putch('\r'); //回车是跑到这一行的最前UART_Putch('\n'); //换行是跳到下一行}else if( strcmp("close",str)==0 ) {UART_Putch('o');UART_Putch('k');UART_Putch('\r');UART_Putch('\n'); }else//否则出错{UART_Putch('e'); UART_Putch('r');UART_Putch('r');UART_Putch('o');UART_Putch('r');UART_Putch('!'); UART_Putch('\r'); UART_Putch('\n'); }}void main(){init();while(1){if(UART_Flag==1) //接收标志位表示接收完成 {check(str);//检查length=0; //长度清0UART_Flag=0;//标志位清0}}}。
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单片机编程实例大全
//实例 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单⽚机实例(含详细代码说明)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单片机的汇编指令手册-高亮+注释
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)。
}
}
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)
dula1=1;//打开U1锁存端
P1=table[num1];//送入位选信号
dula1=0;//关闭U1锁存器
delayms(1000);//延时500毫秒约0.3s
for(num=0;num<=9;num++)
{
dula2=1;//打开U1锁存端
P1=table[num];//送入位选信号
dula2=0;//关闭U1锁存器
#define uint unsigned int//无符号整型,占16位数,表示范围0~65536
#define uchar unsigned char//无符号字符型占八位数,表示范围0~255
void 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--)
#define uchar unsigned char
#define uint unsigned int
sbit dula1=P1^7;//申明U1锁存器锁存端段选
sbit dula2=P2^7;//申明U1锁存器锁存端段选
uchar num,num1;
uchar code table[]={//共阴极数码管0123456789abcdef
0x3f,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++)
{
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
void delayms(uint);
uchar aa;//定义变量
void main()
{
aa=0xfe;
while(1)
{
P2=aa;//控制单片机接口p2,循环亮
delayms(500);//当500换成5,看起来全亮,实际上灯一直亮灭,原因是视觉延迟
#define uchar unsigned char
#define uint unsigned int
sbit dula1=P1^7;//申明U1锁存器锁存端段选
sbit dula2=P0^7;//申明U1锁存器锁存端段选
uchar num,num1;
uchar code table[]={//共阴极数码管0123456789abcdef
for(num=0;num<=9;num++)
{
dula2=1;//打开U1锁存端
P1=table[num];//送入位选信号
dula2=0;//关闭U1锁存器
delayms(100);//延时500毫秒约0.3s
dula1=1;//打开U1锁存端
P2=table[num1];//送入位选信号
dula1=0;//关闭U1锁存器
51单片机常见程序
附带注释
三位数分离成3个一位数,截取
bai=num/100;//输出百位数
shi=num%100/10;//输出十位数
ge=num/10;//输出个位数
#include<reg52.h>//跑马灯程序。当时间约为20ms,形成动态扫描,看上去全亮。
#include<intrins.h>
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系列单片机头文件(目标: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++)
{
#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,//共阳极数字:0123456789abcdefg
0x99,0x92,0x82,0xf8,
for(j=110;j>0;j--);
}
#include<reg52.h>//跑马灯程序。现在时间较长,多以是亮灭的流动,当时间约为20ms,形成动态扫描,看上去全亮。
#include<intrins.h>
#define uint unsigned int//无符号整型,占16位数,表示范围0~65536