单片机例程源代码汇编
单片机程序源代码
步进电机程序源代码#include<reg52.h>unsigned char step[]={0x01,0x02,0x04,0x08};sbit beep=P3^4;void delay_50us(unsigned int){unsigned int j;for(;t>0;t--)for(j=19;j>0;j--);}void main(){unsigned int i,k;for(i=512;i>=0;i--){for(k=0;k<4;k++){P1=step[k];delay_50us(200);}delay_50us(2000);if(i==0){beep=1;delay_50us(1000);}elsebeep=0;}}数码管电子时钟程序源代码#include<reg52.h> //在数码管上显示1~65536的数字,间隔1秒。
#define uint unsigned int#define uchar unsigned charuchar code d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};uchar code w[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//8个数码管的排列是从左到右:0,1,2,3,4,5,6,7sbit Exint0 = P3^2;sbit Exint1 = P3^3;sbit keyinc = P0^0; //单片机的第39脚sbit keydec = P0^1; //单片机的第38脚sbit SetH = P0^2; //单片机的第37脚sbit SetM = P0^3; //单片机的第36脚//sbit SetS = P0^4;char s,m,h; //定义秒、分、时变量uchar num=0,Stopgo = 1,hm = 0; void ExInt0init(void);void ExInt1init(void);void KeyScan(void);void delay(uint z){uint x,y;for(x=10;x>0;x--)for(y=z;y>0;y--);}void delay_50us(uint t){uint j;for(;t>0;t--)for(j = 19;j > 0;j--);}void display(){P1 = d[s%10];P2 = w[0];delay(10);P1 = d[s/10];P2 = w[1];delay(10);P1 = d[10]; //显示“-”P2 = w[2];delay(10);P2 = w[5];delay(10);delay(10);P1 = d[m%10];P2 = w[3];delay(10);P1 = d[m/10];P2 = w[4];delay(10);P1 = d[h%10];P2 = w[6];delay(10);P1 = d[h/10];P2 = w[7];delay(10);}void changenum(){if(num==20){num=0;if(Stopgo) s++; //让“ClockSet”来控制是否数字加1}if(s>=60){ s=0;if(++m>=60){ m=0;if(++h>=24)h=0;}}display();}void init_timer(){TMOD=0x01;TH0=(65535-50000)/256; //如果时间要完全精确,需用12MHZ的晶振TL0=(65535-50000)%256;EA=1; //开总中断开关ET0=1; //开定时器0中断开关TR0=1; //开始定时}void main(){init_timer(); //调用定时器初始化函数ExInt0init(); //调用外部中断0初始化函数ExInt1init(); //调用外部中断1初始化函数while(1){Exint0 = 1; //P3.2 = 1Exint1 = 1; //P3.3 = 1if(Stopgo == 0)KeyScan();elsechangenum();display();}}void ExInt0init(void){Exint0 = 1; //P3.2 = 1PX0 = 1;EX0 = 1; //打开外部中断0中断开关IT0 = 1; //设置外部中断的触发方式,IT0 = 0代表低电平触发;IT0 = 1代表下降沿触发EA = 1; //打开总中断开关}void ExInt1init(void){Exint1 = 1; //P3.3 = 1PX1 = 1;EX1 = 1;IT1 = 1; //设置外部中断的触发方式,IT0 = 0代表低电平触发;IT0 = 1代表下降沿触发EA = 1;}void timer() interrupt 1{TH0=(65535-50000)/256;TL0=(65535-50000)%256;TF0 = 0;num++;}void exInt0(void) interrupt 0{Stopgo = 0; //当按下停止按钮时,产生外部中断0,将标志“Stopgo”清0,停止数字加1。
单片机c语言实例程序300篇
单片机c语言实例程序300篇单片机C语言【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。
组成所有的排列后再去掉不满足条件的排列。
2.程序源代码:main(){inti,j,k;printf("\n");for(i=1;i<5;i++)/某以下为三重循环某/for(j=1;j<5;j++)for(k=1;k<5;k++){if(i!=k&&i!=j&&j!=k)/某确保i、j、k三位互不相同某/printf("%d,%d,%d\n",i,j,k);}}==============================================================【程序2】题目:企业发放的奖金根据利润提成。
利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.程序分析:请利用数轴来分界,定位。
注意定义时需把奖金定义成长整型。
2.程序源代码:main()单片机C语言{longinti;intbonu1,bonu2,bonu4,bonu6,bonu10,bonu;canf("%ld",&i);bonu1=100000某0.1;bonu2=bonu1+100000某0.75;bonu4=bonu2+200000某0.5;bonu6=bonu4+200000某0.3;bonu10=bonu6+400000某0.15;if(i<=100000)bonu=i某0.1;eleif(i<=200000)bonu=bonu1+(i-100000)某0.075;eleif(i<=400000)bonu=bonu2+(i-200000)某0.05;eleif(i<=600000)bonu=bonu4+(i-400000)某0.03;eleif(i<=1000000)bonu=bonu6+(i-600000)某0.015;elebonu=bonu10+(i-1000000)某0.01;printf("bonu=%d",bonu);}============================================================ ==【程序3】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。
51单片机五十个例程代码
程序里有中断,串口等驱动,直接复制即可使用1-IO输出-点亮1个LED灯方法1/*----------------------------------------------- 名称:IO口高低电平控制编写:shifang日期:2009.5修改:无内容:点亮P1口的一个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED=P1^0;// 用sbit 关键字定义 LED到P1.0端口,//LED是自己任意定义且容易记忆的符号/*------------------------------------------------ 主函数------------------------------------------------*/ void main (void){//此方法使用bit位对单个端口赋值LED=1; //将P1.0口赋值 1,对外输出高电平LED=0; //将P1.0口赋值 0,对外输出低电平while (1) //主循环{//主循环中添加其他需要一直工作的程序}}2-IO输出-点亮1个LED灯方法2/*----------------------------------------------- 名称:IO口高低电平控制编写:shifang日期:2009.5修改:无内容:点亮P1口的一个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/ #include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义/*------------------------------------------------ 主函数------------------------------------------------*/ void main (void){//此方法使用1个字节对单个端口赋值P1 = 0xFF; //P1口全部为高电平,对应的LED灯全灭掉,//ff换算成二进制是 1111 1111P1 = 0xfe; //P1口的最低位点亮,可以更改数值是其他的灯点亮//0xfe是16进制,0x开头表示16进制数,//fe换算成二进制是 1111 1110while (1) //主循环{//主循环中添加其他需要一直工作的程序}}3-IO输出-点亮多个LED灯方法1/*-----------------------------------------------名称:IO口高低电平控制编写:shifang日期:2009.5修改:无内容:点亮P1口的多个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/ #include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义 LED到P1.0端口,sbit LED1=P1^1;//LED是自己任意定义且容易记忆的符号sbit LED2=P1^2;sbit LED3=P1^3;sbit LED4=P1^4;sbit LED5=P1^5;sbit LED6=P1^6;sbit LED7=P1^7;/*------------------------------------------------ 主函数------------------------------------------------*/ void main (void){//此方法使用bit位对单个端口赋值LED0=0; //将P1.0口赋值 0,对外输出低电平LED1=1;LED2=0;LED3=1;LED4=0;LED5=1;LED6=0;LED7=1;while (1) //主循环{//主循环中添加其他需要一直工作的程序}}4-IO输出-点亮多个LED灯方法2/*----------------------------------------------- 名称:IO口高低电平控制编写:shifang日期:2009.5修改:无内容:点亮P1口的多个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义/*------------------------------------------------ 主函数------------------------------------------------*/ void main (void){//此方法使用bit位对单个端口赋值P1=0x55; //换成二进制是0101 0101while (1) //主循环{//主循环中添加其他需要一直工作的程序}}5-闪烁1个LED/*----------------------------------------------- 名称:IO口高低电平控制编写:shifang日期:2009.5修改:无内容:点亮P1口的1个LED灯闪烁该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/ #include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义 LED到P1.0端口,//LED是自己任意定义且容易记忆的符号void Delay(unsigned int t); //函数声明/*------------------------------------------------ 主函数------------------------------------------------*/ void main (void){//此方法使用bit位对单个端口赋值while (1) //主循环{LED0=0; //将P1.0口赋值 0,对外输出低电平Delay(10000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将P1.0口赋值 1,对外输出高电平Delay(10000);//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/ void Delay(unsigned int t){while(--t);}6-不同频率闪烁1个LED灯/*----------------------------------------------- 名称:IO口高低电平控制编写:shifang日期:2009.5修改:无内容:点亮P1口的1个LED灯闪烁该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/ #include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义 LED到P1.0端口,//LED是自己任意定义且容易记忆的符号void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255while (1) //主循环{for(i=0;i<10;i++) //加入 for循环,表明for循环大括号中的程序循环执行10次{LED0=0; //将P1.0口赋值 0,对外输出低电平Delay(5000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将P1.0口赋值 1,对外输出高电平Delay(5000);}for(i=0;i<10;i++){LED0=0; //将P1.0口赋值 0,对外输出低电平Delay(60000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将P1.0口赋值 1,对外输出高电平Delay(60000);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------ 延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/ void Delay(unsigned int t){while(--t);}7-不同频率闪烁多个LED灯/*-----------------------------------------------名称:IO口高低电平控制编写:shifang日期:2009.5修改:无内容:点亮P1口的多个LED灯闪烁该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义 LED到P1.0端口,LED是自己任意定义且容易记忆的符号sbit LED1=P1^1;sbit LED2=P1^2;sbit LED3=P1^3;sbit LED4=P1^4;sbit LED5=P1^5;sbit LED6=P1^6;sbit LED7=P1^7;void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255 while (1) //主循环{for(i=0;i<10;i++) //加入 for循环,表明for循环大括号中//的程序循环执行10次{LED0=0; //将P1.0口赋值 0,对外输出低电平LED2=1;LED4=0;Delay(5000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将P1.0口赋值 1,对外输出高电平LED2=0;LED4=1;Delay(5000);}for(i=0;i<10;i++){LED0=0; //将P1.0口赋值 0,对外输出低电平LED2=1;LED4=0;Delay(60000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将P1.0口赋值 1,对外输出高电平LED2=0;LED4=1;Delay(60000);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/ void Delay(unsigned int t){while(--t);}8-8位LED左移/*----------------------------------------------- 名称:IO口高低电平控制编写:shifang日期:2009.5修改:无内容:左移,直至LED全部点亮,左移符号 <<------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255Delay(50000);P1=0xfe; //赋初始值for(i=0;i<8;i++) //加入 for循环,表明for循环大括号中的程序循环执行8次{Delay(50000);P1<<=1;}while (1) //主循环{//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------ 延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/ void Delay(unsigned int t){while(--t);}9-8位LED右移/*----------------------------------------------- 名称:IO口高低电平控制编写:shifang日期:2009.5修改:无内容:右移,直至LED全部点亮,右移符号 >>------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255 Delay(50000);P1=0x7f; //赋初始值for(i=0;i<8;i++) //加入 for循环,表明for循环大括号中的程序循环执行8次{Delay(50000);P1>>=1;}while (1) //主循环{//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------ 延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/ void Delay(unsigned int t){while(--t);}10-LED循环左移/*-----------------------------------------------名称:IO口高低电平控制编写:shifang日期:2009.5修改:无内容:循环左移,始终一个led点亮,并循环执行流水动作,左移符号 << 逻辑或符号 |------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255 Delay(50000);P1=0xfe; //赋初始值while (1) //主循环{for(i=0;i<8;i++) //加入 for循环,表明for循环大括号中的程序循环执行8次{Delay(50000);P1<<=1;P1=P1|0x01; //左移后,最右端自动赋值0,所以需要该语句赋值1 }P1=0xfe; //重新赋初始值//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}11-LED循环右移/*-----------------------------------------------名称:IO口高低电平控制编写:shifang日期:2009.5修改:无内容:循环右移,始终一个led点亮,并循环执行流水动作,右移符号 >> 逻辑或符号 | ------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255Delay(50000);P1=0x7f; //赋初始值while (1) , //主循环{for(i=0;i<8;i++) //加入 for循环,表明for循环大括号中的程序循环执行8次{Delay(50000);P1>>=1;P1=P1|0x80; //右移后,最左端自动赋值0,所以需要该语句赋值1}P1=0x7f; //重新赋初始值//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/ void Delay(unsigned int t){while(--t);}12-查表显示LED灯/*----------------------------------------------- 名称:IO口高低电平控制编写:shifang日期:2009.5修改:无内容:通过查表获得1个字节的值然后赋值给P1端口,ROM允许情况可以设置更多表格------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/*------------------------------------------------查表表格------------------------------------------------*/unsigned char code table[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0x00,0x55,0x55,0xaa,0xaa};//rom允许情况可以无限添加/*------------------------------------------------函数声明------------------------------------------------*/void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255while (1) //主循环{for(i=0;i<16;i++) //加入 for循环,表明for循环大括号中的程序循环//执行16次,表明表格中有16个元素{P1=table[i];Delay(30000);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/ void Delay(unsigned int t){while(--t);}13-双灯左移右移闪烁/*----------------------------------------------- 名称:IO口高低电平控制编写:shifang日期:2009.5修改:无内容:2个led灯先左移,然后右移,然后同时闪烁------------------------------------------------*/ #include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------ 主函数------------------------------------------------*/ void main (void){unsigned char i; //定义一个无符号字符型局部变量 i //取值范围 0~255unsigned char temp;//定义临时变量用于转换while (1) //主循环{temp=0xfc;P1=temp;for(i=0;i<7;i++) //加入 for循环,表明for循环大括号//中的程序循环执行7次{Delay(50000); //调用延时程序;更改延时数字可//以更改延时长度;用于改变闪烁频率temp<<=1;temp=temp|0x01; //也可以直接把temp换成P1P1=temp; //之所以加入temp做中间变量,转换//完成后直接赋值到端口,防止直接//操作端口造成的短暂闪烁}temp=0x3f;P1=temp;for(i=0;i<7;i++) //加入 for循环,表明for循环大括号//中的程序循环执行7次{Delay(50000); //调用延时程序;更改延时数字可以//更改延时长度;用于改变闪烁频率temp>>=1;temp|=0x80; //等效于 temp=temp|0x80P1=temp;}for(i=0;i<3;i++) //加入 for循环,表明for循环大括号//中的程序循环执行3次{P1=0xff;Delay(50000);P1=0x00;Delay(50000);} //主循环中添加其他需要一直工作的程序}}/*------------------------------------------------ 延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/ void Delay(unsigned int t){while(--t);}14-花样灯/*----------------------------------------------- 名称:IO口高低电平控制编写:shifang日期:2009.5修改:无内容:花样灯一般有两种方法实现:1、程序循环执行2、查表法这里我们两种都使用一下------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/*------------------------------------------------花样表格------------------------------------------------*/unsigned char code seg[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0x00,0x55,0x55,0xaa,0xaa};//rom允许情况可以无限添加void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/ main(){unsigned char i; //定义一个无符号字符型//局部变量 i 取值范围 0~255while(1){P1=0xFE; //第1个LED亮for(i=0;i<8;i++){Delay(20000);P1 <<=1;}P1=0x7F; //第8个LED亮for(i=0;i<8;i++) {Delay(20000);P1 >>=1;}P1=0xFE; //第1个LED亮for(i=0;i<8;i++) {Delay(20000);。
51单片机C语言实例(350例)Proteus仿真和代码都有
51单片机C语言实例(350例)Proteus仿真和代码都有51单片机C语言实例(400例)所有实例程序均经测试过,适合新手学习。
1-IO输出-点亮1个LED灯方法1 10-LED循环左移100-24c02记忆开机次数101-24c02存储上次使用中状态102-DS1302 时钟原理103-DS1302可调时钟104-DS1302时钟串口自动更新时间105-1602液晶显示DS1302时钟106-字库ST7920 12864液晶基础显示107-按键 12864显示108-PCF8591 1路AD数码管显示109-PCF8591 4路AD数码管显示11-LED循环右移110-PCF8591 DA输出模拟111-PCF8591 输出锯齿波112-PCF8591 1602液晶显示113-串口通讯114-串口通讯中断应用115-RS485基本通讯原理116-红外接收原理117-红外解码数码管显示118-红外解码1602液晶显示119-红外发射原理12-查表显示LED灯120-红外收发测试121-双红外发射避障原理测试122-1个18B20 温度传感器数码管显示123-1个18b20温度传感器1602液晶显示124-多个18b20温度传感器1602液晶显示125-超温报警测试126-温度可调上下限1602126-温度可调上下限1602显示127-PS2键盘输入1602液晶显示128-双色点阵1种颜色显示测试129-双色点阵2种颜色显示测试13-双灯左移右移闪烁130-双色点阵显示特定图形131-双色点阵交替图形显示132-双色点阵双色交替动态显示133-热敏电阻测试数码管显示134-光敏电阻测试数码管显示135-自动调光测试136-串转并数字芯片测试137-非门数字芯片测试138-电子琴139-实用99分钟倒计时器14-花样灯140-外部频率测试141-定时做普通时钟可调142-1602液晶显示的密码锁143-实用密码锁144-1602液晶显示的计算器145-秒表146-串口测温电脑显示147-交通灯测试148-点阵模拟电梯上行下行149-点阵流动广告模拟15-PWM调光150-综合测试程序151-12位AD_DS1621与12864液晶152-闪烁灯一153-闪烁灯二154-流水灯A155-51单片机12864大液晶屏proteus仿真156-流水灯B157-数码管显示158-12864LCD显示计算器键盘按键实验159-数码管显示(锁存器)16-共阳数码管静态显示160-数码管动态显示161-数码管滚动显示162-数码管字符显示163-独立按键164-矩阵键盘165-矩阵键盘(LCD)166-用DS1302与12864LCD设计的可调式中文电子日历167-定时器的使用(方式1)168-12864LCD图形滚动演示169-用PG12864LCD设计的指针式电子钟17-1个共阳数码管显示变化数字170-定时器的使用(方式2)171-外部中断的使用172-定时器和外部中断173-开关控制12864LCD串行模式显示174-点阵显示175-液晶1602显示176-12864带字库测试程序177-串行12864显示178-遥控键值解码-12864LCD显示179-液晶12864并行18-单个数码管模拟水流180-液晶12864并行2181-串口发送试验182-串口接收试验183-串口接收(1602)184-蜂鸣器发声185-直流电机调速186-蜂鸣器间断发声187-lcd-12864应用188-继电器控制189-直流电机调速19-按键控制单个数码管显示190-步进电机191-存储AT24C02192-PCF8591T AD实验193-PCF8591T芯片DA实验194-温度采集DS18B20195-EEPROM_24C02196-12864LCD显示24C08保存的开机画面197-红外解码198-12864LCD显示EPROM2764保存的开机画面199-时钟DS1302(LCD)2-IO输出-点亮1个LED灯方法220-单个数码管指示逻辑电平200-宏晶看门狗201-SD卡202-秒表203-普通定时器时钟204-彩屏控制205-彩屏图片显示206-12864+DS1302时钟+18B20温度计207-12864测试程序208-12864串行驱动演示209-12864生产厂程序21-8位数码管显示其中之一210-12864中文显示测试211-LCD12864212-12864M液晶显示(有字库)程序(汇编)213-超声波测距LCD12864显示214-红外遥控键值解码12864液晶显示(汇编语言)215-用DS1302与12864LCD设计的可调式中文电子日历216-中文12864217-中文12864LCD显示红外遥控解码实验218-IO端口输出219-IO端口输入22-8位数码管静态显示其中之二220-流水灯221-数码管显示223-独立按键224-独立按键去抖动225-定时器0226-定时器1227-定时器2228-外部中断0电平触发229-外部中断0边沿触发23-8位数码管动态扫描显示230-外部中断1231-矩阵键盘232-液晶LCM1602233-LCD1602动态显示234-EEPROM24c02235-开机次数记忆236-红外解码LCD1602液晶显示237-红外解码数码管显示238-喇叭239-液晶背光控制24-8位数码管动态扫描原理演示240-与电脑串口通信241-步进电机242-字库LCD12864液晶测试243-液晶数码综合显示244-99秒计时245-99倒计时246-抢答器247-PWM调光248-LED点阵249-直流电机调速250-按键计数器251-秒表252-数码管移动253-花样灯254-红绿灯255-音乐播放256-红外收发演示257-普通定时器时钟258-继电器控制259-ps2键盘LCD1602液晶显示26-9累加260-RTC实时时钟DS1302液晶显示261-单线温度传感器18b20262-串口测温263-带停机步进电机正反转264-步进电机正反转265-AD_DA_PCF8591266-液晶AD_DA_PCF8591267-秒手动记数268-功能感受269-流水登27-99累加270-点亮一个二极管271-用单片机控制一个灯闪烁272-将P1口状态送入P0、P2、P3273-P3口流水灯274-通过对P3口地址的操作流水点亮8位LED 275-用不同数据类型控制灯闪烁时间276-用P0口、P1 口分别显示加法和减法运算结果277-用P0、P1口显示乘法运算结果278-用P1、P0口显示除法运算结果279-用自增运算控制P0口8位LED流水花样28-999累加280-用P0口显示逻辑与运算结果281-用P0口显示条件运算结果282-用P0口显示按位异或运算结果283-用P0显示左移运算结果284-万能逻辑电路实验285-用右移运算流水点亮P1口8位LED286-用if语句控制P0口8位LED的流水方向287-用swtich语句的控制P0口8位LED的点亮状态288-用for语句控制蜂鸣器鸣笛次数289-包含单片机寄存器的头文件29-9999累加290-用do-while语句控制P0口8位LED流水点亮291-用字符型数组控制P0口8位LED流水点亮292-用P0口显示字符串常量293-用P0 口显示指针运算结果294-用指针数组控制P0口8位LED流水点亮295-用数组的指针控制P0 口8 位LED流水点亮296-用P0 、P1口显示整型函数返回值297-用有参函数控制P0口8位LED流水速度298-用数组作函数参数控制流水花样299-用数组作函数参数控制流水花样3-IO输出-点亮多个LED灯方法130-9累减300-用函数型指针控制P1口灯花样301-用指针数组作为函数的参数显示多个字符串302-字符函数ctype.h应用举例303-内部函数intrins.h应用举例304-标准函数stdlib.h应用举例305-字符串函数string.h应用举例306-宏定义应用举例307-文件包应用举例308-条件编译应用举例309-用定时器T0查询方式P2口8位控制LED闪烁31-99累减310-用定时器T1查询方式控制单片机发出1KHz音频311-将计数器T0计数的结果送P1口8位LED显示311-用定时器T0的中断控制1位LED闪烁312-用定时器T0的中断实现长时间定时313-用定时器T1中断控制两个LED以不同周期闪烁314-用计数器T1的中断控制蜂鸣器发出1KHz音频315-用定时器T0的中断实现渴望主题曲的播放316-输出50个矩形脉冲317-输出正脉宽为250微秒的方波318-用定时器T0控制输出高低宽度不同的矩形波319-用外中断0的中断方式进行数据采集32-999累减320-输出负脉宽为200微秒的方波321-方式0控制流水灯循环点亮322-数据发送程序323-数据接收程序324-单片机向PC发送数据325-单片机接收PC发出的数据326-用LED数码显示数字5327-用LED数码显示器循环显示数字0~9328-用数码管慢速动态扫描显示数字1234329-用LED数码显示器伪静态显示数字123433-9999累减330-用数码管显示动态检测结果331-数码秒表设计332-数码时钟设计333-用LED数码管显示计数器T0的计数值334-静态显示数字“59”335-无软件消抖的独立式键盘输入实验336-软件消抖的独立式键盘输入实验337-CPU控制的独立式键盘扫描实验338-定时器中断控制的独立式键盘扫描实验339-独立式键盘控制的4级变速流水灯34-显示小数点340-独立式键盘的按键功能扩展:以一当四341-独立式键盘调时的数码时钟实验342-独立式键盘控制步进电机实验343-矩阵式键盘按键值的数码管显示实验344-矩阵式键盘按键音345-简易电子琴346-矩阵式键盘实现的电子密码锁347-用LCD显示字符'A'348-用LCD循环右移显示Welcome to China 349-将数据0x0f写入AT24C02再读出送P1口显示35-数码管消隐350-液晶时钟设计36-数码管递加递减带消隐37-数码管左移38-数码管右移38-数码管右移139-数码管右移24-IO输出-点亮多个LED灯方法240-数码管循环左移41-数码管循环右移41-数码管循环右移142-数码管循环右移243-数码管闪烁44-数码管局部闪烁45-定时器046-定时器147-定时器248-产生1mS方波49-产生200mS方波5-闪烁1个LED50-产生多路不同频率方波51-1个独立按键控制LED52-1个独立按键控制LED状态转换53-2按键加减操作53-2按键加减操作数码管显示54-多位数按键加减(闪烁)54-多位数按键加减(闪烁)数码管显示55-多位数按键加减(不闪烁)55-多位数按键加减(不闪烁)数码管显示56-定时器扫描数码管(不闪烁)57-按键长按短按效果58-抢答器59-独立按键依次输入数据6-不同频率闪烁1个LED灯60-按键从右至左输入61-8位端口检测8独立按键62-矩阵键盘行列扫描63-矩阵键盘反转扫描64-矩阵键盘中断扫描65-矩阵键盘密码锁66-矩阵键盘简易计算器67-外部中断0电平触发68-外部中断1电平触发69-外部中断0下降沿触发7-不同频率闪烁多个LED灯70-外部中断1下降沿触发71-T0外部计数输入72-T1外部计数输入73-看门狗溢出测试74-按键喂狗75-喇叭发声原理76-警车声音77-救护车声音78-喇叭滴答声79-报警发声8-8位LED左移80-消防车警报81-音乐播放82-步进电机转动原理83-步进电机正反转84-步进电机按键控制85-步进电机转速数码管显示86-双步进电机综合控制86-步进电机调速原理87-双步进电机综合控制87-步进电机综合控制87-步进电机调速原理88-直流电机按键控制89-直流电机调速控制9-8位LED右移90-继电器控制原理91-双继电器模拟洗衣机电机控制92-1602液晶静态显示93-1602液晶动态显示94-1602液晶滚动显示95-1602液晶移动显示96-1602液晶按键输入显示97-2402存储1个数据98-24c02存储多个数据99-24c02存储花样流水灯。
单片机的汇编源程序
例2.1将数据寄存器DPTR中的字无符号数除以4,商放在DPTR中,余数放到B中。
程序段如下:MOV A,#3 ;取最低2位的逻辑尺03H送AANL A,DPL ;取DPTR的最低2位即余数MOV B,A ;余数送BCLR C ;清进位CYMOV A,DPH ;高8位送ARRC A ;高8位除以2,其最低位移入CY中MOV DPH,A ;高8位除以2的结果送DPHMOV A,DPL ;低8位送ARRC A ;低8位除以2,并将CY 移入A的最高位MOV DPL,A ;低8位除以2的结果送DPLCLR C ;将除以2的结果再除以2MOV A,DPHRRC AMOV DPH,AMOV A,DPLRRC AMOV DPL,A例2.2将R7中的无符号数乘以10,结果放在R6和R7中(R6放高位)。
程序段如下:MOV R6,#0 ;清0 R6CLR C ;清进位MOV A,R7 ;低8位乘以2RLC AMOV R7,A ;存回R7MOV R5,A ;低8位乘以2暂存R5MOV A,R6 ;高8位乘以2RLC AMOV R6,A ;存回R6MOV R4,A ;高8位乘以2暂存R4MOV A,R7 ;乘以4RLC AMOV R7,AMOV A,R6RLC AMOV R6,AMOV A,R7 ;乘以8RLC AMOV R7,AMOV A,R6RLC AMOV R6,AMOV A,R7 ;乘以8和乘以2相加ADD A,R5MOV R7,AMOV A,R6ADDC A,R4MOV R6,A仿照例2.1的方法此例的程序段如下: MOV A,#80H ;取R7的最高位的逻辑尺ANL A,R7 ;取R7的最高位RL A ;移至最低位MOV R4,A ;暂存R4MOV A,#0E0H ;取R7的最高3位的逻辑尺ANL A,R7 ;取R7的最高3位 RL A ;移至最低3位RL ARL AMOV R6,A ;暂存R6MOV A,R7 ;低8位乘以8CLR CRLC AMOV R5,A ;暂存低8位乘以2 CLR CRLC ACLR CRLC AADD A,R5 ;乘以8和乘以2相加MOV R7,AMOV A,R6ADDC A,R4MOV R6,A例3.1将内部RAM 40H单元中一压缩BCD数转换为二进制数。
51单片机50个实例代码
51单片机50个例程代码程序里有中断,串口等驱动,直接复制即可使用1-IO输出-点亮1个LED灯方法1/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的一个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED=P1^0;// 用sbit 关键字定义 LED到端口,//LED是自己任意定义且容易记忆的符号/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值LED=1; //将口赋值 1,对外输出高电平LED=0; //将口赋值 0,对外输出低电平while (1) //主循环{//主循环中添加其他需要一直工作的程序 }}2-IO输出-点亮1个LED灯方法2/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的一个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义/*------------------------------------------------主函数------------------------------------------------*/ void main (void){//此方法使用1个字节对单个端口赋值P1 = 0xFF; //P1口全部为高电平,对应的LED灯全灭掉,//ff换算成二进制是 1111 1111P1 = 0xfe; //P1口的最低位点亮,可以更改数值是其他的灯点亮//0xfe是16进制,0x开头表示16进制数,//fe换算成二进制是 1111 1110while (1) //主循环{//主循环中添加其他需要一直工作的程序}}3-IO输出-点亮多个LED灯方法1/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的多个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义 LED到端口,sbit LED1=P1^1;//LED是自己任意定义且容易记忆的符号sbit LED2=P1^2;sbit LED3=P1^3;sbit LED4=P1^4;sbit LED5=P1^5;sbit LED6=P1^6;sbit LED7=P1^7;/*------------------------------------------------主函数------------------------------------------------*/ void main (void){//此方法使用bit位对单个端口赋值LED0=0; //将口赋值 0,对外输出低电平LED1=1;LED2=0;LED3=1;LED4=0;LED5=1;LED6=0;LED7=1;while (1) //主循环{//主循环中添加其他需要一直工作的程序 }}4-IO输出-点亮多个LED灯方法2/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的多个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义/*------------------------------------------------主函数------------------------------------------------*/ void main (void){//此方法使用bit位对单个端口赋值P1=0x55; //换成二进制是0101 0101while (1) //主循环{//主循环中添加其他需要一直工作的程序 }}5-闪烁1个LED/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的1个LED灯闪烁该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/ #include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义 LED到端口,//LED是自己任意定义且容易记忆的符号void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/ void main (void){//此方法使用bit位对单个端口赋值while (1) //主循环{LED0=0; //将口赋值 0,对外输出低电平Delay(10000); //调用延时程序;更改延时数字可以更改延时长度; //用于改变闪烁频率LED0=1; //将口赋值 1,对外输出高电平Delay(10000);//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}6-不同频率闪烁1个LED灯/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的1个LED灯闪烁该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义 LED到端口,//LED是自己任意定义且容易记忆的符号void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255while (1) //主循环{for(i=0;i<10;i++) //加入 for循环,表明for循环大括号中的程序循环执行10次 {LED0=0; //将口赋值 0,对外输出低电平Delay(5000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将口赋值 1,对外输出高电平Delay(5000);}for(i=0;i<10;i++){LED0=0; //将口赋值 0,对外输出低电平Delay(60000); //调用延时程序;更改延时数字可以更改延时长度; //用于改变闪烁频率LED0=1; //将口赋值 1,对外输出高电平Delay(60000);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}7-不同频率闪烁多个LED灯/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的多个LED灯闪烁该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义 LED到端口,LED是自己任意定义且容易记忆的符号sbit LED1=P1^1;sbit LED2=P1^2;sbit LED3=P1^3;sbit LED4=P1^4;sbit LED5=P1^5;sbit LED6=P1^6;sbit LED7=P1^7;void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255while (1) //主循环{for(i=0;i<10;i++) //加入 for循环,表明for循环大括号中//的程序循环执行10次{LED0=0; //将口赋值 0,对外输出低电平LED2=1;LED4=0;Delay(5000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将口赋值 1,对外输出高电平LED2=0;LED4=1;Delay(5000);}for(i=0;i<10;i++){LED0=0; //将口赋值 0,对外输出低电平LED2=1;LED4=0;Delay(60000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将口赋值 1,对外输出高电平LED2=0;LED4=1;Delay(60000);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}8-8位LED左移/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:左移,直至LED全部点亮,左移符号 <<------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255Delay(50000);P1=0xfe; //赋初始值for(i=0;i<8;i++) //加入 for循环,表明for循环大括号中的程序循环执行8次 {Delay(50000);P1<<=1;}while (1) //主循环{//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}9-8位LED右移/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:右移,直至LED全部点亮,右移符号 >>------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255Delay(50000);P1=0x7f; //赋初始值for(i=0;i<8;i++) //加入 for循环,表明for循环大括号中的程序循环执行8次 {Delay(50000);P1>>=1;}while (1) //主循环{//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}10-LED循环左移/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:循环左移,始终一个led点亮,并循环执行流水动作,左移符号 << 逻辑或符号 |------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255Delay(50000);P1=0xfe; //赋初始值while (1) //主循环{for(i=0;i<8;i++) //加入 for循环,表明for循环大括号中的程序循环执行8次 {Delay(50000);P1<<=1;P1=P1|0x01; //左移后,最右端自动赋值0,所以需要该语句赋值1}P1=0xfe; //重新赋初始值//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}11-LED循环右移/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:循环右移,始终一个led点亮,并循环执行流水动作,右移符号 >> 逻辑或符号 |------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255Delay(50000);P1=0x7f; //赋初始值while (1) , //主循环{for(i=0;i<8;i++) //加入 for循环,表明for循环大括号中的程序循环执行8次 {Delay(50000);P1>>=1;P1=P1|0x80; //右移后,最左端自动赋值0,所以需要该语句赋值1}P1=0x7f; //重新赋初始值//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}12-查表显示LED灯/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:通过查表获得1个字节的值然后赋值给P1端口,ROM允许情况可以设置更多表格------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/*------------------------------------------------查表表格------------------------------------------------*/unsigned char code table[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0x00,0x55,0x55,0xaa,0xaa};//rom允许情况可以无限添加/*------------------------------------------------函数声明------------------------------------------------*/void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255while (1) //主循环{for(i=0;i<16;i++) //加入 for循环,表明for循环大括号中的程序循环 //执行16次,表明表格中有16个元素{P1=table[i];Delay(30000);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}13-双灯左移右移闪烁/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:2个led灯先左移,然后右移,然后同时闪烁------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i//取值范围 0~255unsigned char temp;//定义临时变量用于转换while (1) //主循环{temp=0xfc;P1=temp;for(i=0;i<7;i++) //加入 for循环,表明for循环大括号 //中的程序循环执行7次{Delay(50000); //调用延时程序;更改延时数字可//以更改延时长度;用于改变闪烁频率 temp<<=1;temp=temp|0x01; //也可以直接把temp换成P1P1=temp; //之所以加入temp做中间变量,转换 //完成后直接赋值到端口,防止直接 //操作端口造成的短暂闪烁}temp=0x3f;P1=temp;for(i=0;i<7;i++) //加入 for循环,表明for循环大括号 //中的程序循环执行7次{Delay(50000); //调用延时程序;更改延时数字可以 //更改延时长度;用于改变闪烁频率 temp>>=1;temp|=0x80; //等效于 temp=temp|0x80P1=temp;}for(i=0;i<3;i++) //加入 for循环,表明for循环大括号 //中的程序循环执行3次{P1=0xff;Delay(50000);P1=0x00;Delay(50000);} //主循环中添加其他需要一直工作的程序 }}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}14-花样灯/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:花样灯一般有两种方法实现:1、程序循环执行2、查表法这里我们两种都使用一下------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/*------------------------------------------------花样表格------------------------------------------------*/unsigned char code seg[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0x00,0x55,0x55,0xaa,0xaa};//rom允许情况可以无限添加void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/main(){unsigned char i; //定义一个无符号字符型//局部变量 i 取值范围 0~255 while(1){P1=0xFE; //第1个LED亮for(i=0;i<8;i++){Delay(20000);P1 <<=1;}P1=0x7F; //第8个LED亮for(i=0;i<8;i++){Delay(20000);P1 >>=1;}P1=0xFE; //第1个LED亮for(i=0;i<8;i++){Delay(20000);P1 <<=1;P1 |=0x01;}P1=0x7F; //第8个LED亮for(i=0;i<8;i++){Delay(20000);P1 >>=1;P1 |=0x80;}//下面通过查表方法获得花样参数for(i=0;i<16;i++)//查表可以简单的显示各种花样实用性更强 {Delay(20000);P1=seg[i];}}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}15-PWM调光/*-----------------------------------------------名称:PWM调光论坛:编写:shifang日期:修改:无内容:通过PWM(脉宽调制)调节LED的亮度------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义 LED到端口,LED是自己任意定义且容易记忆的符号void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned int CYCLE=600,PWM_LOW=0;//定义周期并赋值while (1) //主循环{LED0=1;Delay(60000); //特意加延时,可以看到熄灭的过程for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){ //PWM_LOW表示低//电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次LED0=0; //点亮LEDDelay(PWM_LOW);//延时长度,600次循环中从1加至599LED0=1; //熄灭LEDDelay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1}LED0=0;for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){ //与逐渐变亮相反的过程LED0=0;Delay(PWM_LOW);LED0=1;Delay(CYCLE-PWM_LOW);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}16-共阳数码管静态显示/*-----------------------------------------------名称:单个共阳数码管静态显示论坛:编写:shifang日期:修改:无内容:通过赋值给P1,让数码管显示特定的字符或者数字------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义void main (void){P1=0xc0; //二进制为 1100 0000 参考数码管排列,//可以得出0对应的段点亮,1对应的段熄灭,结果显示数字"0" while(1){}}17-1个共阳数码管显示变化数字/*-----------------------------------------------名称:单个共阳数码管动态显示变化数字论坛:编写:shifang日期:修改:无内容:通过循环赋值给P1,让数码管显示特定的字符或者数字------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义unsigned char code dofly_table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x77,0x7c,0x 39,0x5e,0x79,0x71,};// 显示数值表0-9void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255while (1) //主循环{for(i=0;i<16;i++) //加入 for循环,表明for循环大括号中的程序循环执行10次 {P1=dofly_table[i]; //循环调用表中的数值Delay(60000); //延时,方便观看数字变化}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}18-单个数码管模拟水流/*-----------------------------------------------名称:单个共阳数码管模拟水流论坛:编写:shifang日期:修改:无内容:通过循环赋值给P1,让数码管显示特定流动样式------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255while (1) //主循环{P1=0xfe;for(i=0;i<6;i++) //加入 for循环,表明for循环大括号中的程序循环执行6次 {Delay(10000);P1<<=1;P1|=0x01;}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}19-按键控制单个数码管显示/*-----------------------------------------------名称:单个共阳数码管动态显示变化数字论坛:编写:shifang日期:修改:无内容:通过循环检测P1口按键输入值,然后用数码管输出,没有按键按下时原值不变------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义unsigned char code dofly_table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};// 显示数值表0-9/*------------------------------------------------主函数------------------------------------------------*/void main (void){while (1) //主循环{switch(P3) //P3口作为独立按键输入端,检测端口电平并做如下判断 {case 0xfe:P1=dofly_table[1];break;//0xfe = 1111 1110,//说明连接在端口的按键被按下,显示对应的数字然后跳出循环case 0xfd:P1=dofly_table[2];break;//调用表中的第三个//元素 0xa4 下标 0 才表示数组中的第一个元素case 0xfb:P1=dofly_table[3];break;case 0xf7:P1=dofly_table[4];break;case 0xef:P1=dofly_table[5];break;case 0xdf:P1=dofly_table[6];break;case 0xbf:P1=dofly_table[7];break;case 0x7f:P1=dofly_table[8];break;default:break; //如果都没按下,直接跳出}//主循环中添加其他需要一直工作的程序}}20-单个数码管指示逻辑电平/*-----------------------------------------------名称:单个共阳数码管指示逻辑电平论坛:编写:shifang日期:修改:无内容:通过循环检测口电平输入值,然后用数码管输出"H" or "L",表示该端口现在连接的是高电平还是低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit IO_IN=P3^2; //定义IO 信号输入端/*------------------------------------------------主函数------------------------------------------------*/void main (void){while (1) //主循环{if(IO_IN==1)//如果端口检测到1表示高电平P1=0x89; //"H"elseP1=0xc7; //"L"//否则表示低电平,这里使用条件语句 if 。
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熄灭。
单片机汇编语言入门实例
一、用单片机控制发光二极管图1为单片机控制发光二极管的实验电路图。
图中用P1口作为输出端,P1口的P1.0~P1.7引脚分别接了8个LED。
实例1:用单片机控制LED闪烁发光源程序如下:MAIN:SETB P1.0LCALL DELAYCLR P1.0LCALL DELAYLJMP MAINDELAY:MOV R7,#250D1:MOV R6,#250D2:DJNZ R6,D2DJNZ R7,D1RETEND程序说明:1、SETB P1.0:将P1.0口置“1”,既让P1.0输出高电平,让LED 熄灭。
2、LCALL DELAY:LCALL称为子程序调用指令,指令后面的参数DELAY是一个标号,用于标识第6行程序,执行LCALL指令时,程序转到LCALL后面的标号所指示的程序行处执行,如果执行指令过程中遇到RET指令,则程序就返回到LCALL指令下面的一条指令继续执行。
3、CLR P1.0:将P1.0口置“0”,既让P1.0输出低电平,让LED 亮。
4、LCALL DELAY:调用延时子程序DELAY。
5、LJMP MAIN:跳转到第1条指令处执行第1条指令。
6、第6~10条指令是一段延时子程序,子程序只能在被调用时运行,并有固定的结束指令RET。
7、END:不是S51单片机的指令,不会产生单片机可执行的代码,而是用于告诉汇编软件“程序到此结束”,这类用于汇编软件控制的指令称为“伪指令”。
延时程序说明:1、程序中的R6、R7代表工作寄存器的单元,用来暂时存放一些数据。
2、MOV指令的含义是传递数据。
指令“MOV R7,#250”的含义是:将数据250送到R7中。
250前面的“#”号表示250是一个数,而不是一个地址,“#”号后面的数称为立即数。
3、DJNZ指令后面有两个符号,一个是R6,一个是D2。
R6是寄存器,D2是标号。
DJNZ指令的执行过程是:将其后面第一个参数中的值减1,然后看这个值是否等于0,如果等于0,往下执行,如果不等于0,则转移到第二个参数所指定的位置去执行,这里是转移到由D2所标识的这条语句去执行。
(完整版)单片机汇编语言经典一百例
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,D2DJNZ 30H,D1RETEND4.2 方波输出程序介绍:P1.0 口输出高电平,延时后再输出低电平,循环输出产生方波。
实际应用中例如:波形发生器。
程序实例(FAN.ASM):ORG 0000HMAIN:;直接利用P1.0口产生高低电平地形成方波////////////// ACALL DELAYSETB P1.0ACALL DELAY10CLR P1.0AJMP MAIN;////////////////////////////////////////////////// DELAY:MOV R1,#0FFHDJNZ R1,$RETEND五、定时器功能实例5.1 定时1秒报警程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1 次,以达到定时报警的目的。
实际应用例如:定时报警器。
程序实例(DIN1.ASM):ORG 0000HAJMP MAINORG 000BHAJMP DIN0 ;定时器0入口MAIN:TFLA G EQU 34H ;时间秒标志,判是否到50个0.2秒,即50*0.2=1秒MOV TMOD,#00000001B;定时器0工作于方式1MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒11SETB EA ;开总中断SETB ET0 ;开定时器0中断允许SETB TR0 ;开定时0运行SETB P1.0LOOP: AJMP LOOPDIN0:;是否到一秒//////////////////////////////////////// INCC: INC TFLAGMOV A,TFLAGCJNE A,#20,REMOV TFLAG,#00HCPL P1.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 微秒,即一个高电12平或低电平的时间为2500 微秒。
单片机C语言代码手册 含100多个经典C程序
单片机C语言代码手册1.LED灯点亮一个LED#include<reg51.h>void main(){while(1){P0=0x01;P2=0x7d;}}流水灯闪烁#include<reg52.h>sbit LED=P0^0;void delay(unsigned int i){unsigned int j;for(i;i>0;i--)for(j=110;j>0;j--);}void main(){LED=0;delay(60);LED=1;delay(10);}流水灯_左移#include<reg52.h>#include<intrins.h>unsigned char aa;void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){aa=0xfe;while(1){P0=aa;delay(1000);aa=_crol_(aa,1);}}跑马灯#include<reg51.h>#include <intrins.h>void delayms(unsigned char ms){unsigned char i;while(ms--){for(i = 0; i < 120; i++);}}void main(){unsigned char LED;LED = 0xfe; //11111110P2 = LED;while(1){delayms(250);LED = _crol_(LED,1); //循环右移1位,点亮下一个LED P2 = LED;}}用循环移位指令实现LED流水灯效果#include <reg51.h>#include <intrins.h>void delayms(unsigned char i) //延时子程序{unsigned char j;while(i--){for(j=0;j<120;j++);}}void main(){unsigned char LED;LED = 0xfe; //0xfe = 1111 1110while(1){P2 = LED;delayms(250);LED = LED << 1; / /循环右移1位,点亮下一个LED "<<"为左移位if(LED == 0x00 ){LED = 0xfe; // 0xfe = 1111 1110}}}左右跑马灯#include <reg52.h>void delay(unsigned int i){unsigned char j;for(i; i > 0; i--)for(j = 255; j > 0; j--);}char LED;void main(){unsigned char i;while (1){LED = 0xfe;for (i = 0 ;i < 8 ; i++){P2 = LED;delay(500);LED = LED << 1; //左移LED = LED | 0x01; //移位后,后面的位为高电平if(LED == 0x7f)break; //提前退出FOR 循环}for (i = 0 ;i < 8 ; i++){P2 = LED;delay(500);LED = LED >> 1; // 右移LED = LED | 0x80; // 移位后,后面的位为高电平}}}LED作二进制加法#include <reg52.h>void delay(unsigned int i){unsigned char j;for(i; i > 0; i--)for(j = 255; j > 0; j--);}void main(){unsigned char Num = 0xff;while (1){P2 = Num;delay(1000);Num--;}}LED闪烁-定时器#include<reg52.h>#include<intrins.h>unsigned char num,aa=0xfe;void main(){TMOD=0x01;TH0=(65536-45872)/256;TL0=(65536-45872)%256;EA=1;ET0=1;TR0=1;while(1){if(num==1){num=0;P2=aa;aa=_crol_(aa,1);}}}void T0_time()interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;num++;}2.数码管0-9显示#include<reg51.h>void delay2ms(unsigned int delaytime){unsigned int cnt;for(cnt=0;cnt<delaytime*50;cnt++);}unsigned char num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void main(){int cnt=0;while(1){P0=0x02;P2=num[cnt];if(++cnt>9)cnt=0;delay2ms(2500);}}95显示#include<reg51.h>void delay2ms(unsigned int delaytime){unsigned int cnt;for(cnt=0;cnt<delaytime*50;cnt++);}unsigned char s[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};main(){unsigned char num=95;unsigned char cnt=0;while(1){switch(++cnt%2){case 0:P0=0x02;P2=s[num%10];break;case 1:P0=0x04;P2=s[num/10];break;}delay2ms(1);}}138片选实现动态显示#include <reg51.h>#include <intrins.h>sbit LS138A = P2^2; //定义LS138译码器的输入A脚由P2.2控制sbit LS138B = P2^3; //定义LS138译码器的输入B脚由P2.3控制sbit LS138C = P2^4; //定义LS138译码器的输入C脚由P2.4控制void delay(unsigned int i); //函数声名char cnt;unsigned char code Disp_Tab[] = //共阴数码管0-9{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};void main(){unsigned int i,j=1 ;unsigned int led[10];cnt=0;while(1) //进入循环状态{if(++cnt>=50){cnt=0; //延时计数每扫描一次加一次++j; //每隔50个扫描周期加一次}led[0]=Disp_Tab[j%10000/1000]|0x80;led[1]=Disp_Tab[j%1000/100]|0x80;led[2]=Disp_Tab[j%100/10]|0x80;led[3]=Disp_Tab[j%10]|0x80;led[4]=Disp_Tab[j%10000/1000]; //千位led[5]=Disp_Tab[j%1000/100]; //百位带小数点led[6]=Disp_Tab[j%100/10]; //十位led[7]=Disp_Tab[j%10]; //个位for( i=0; i<9; i++) //实现8位动态扫描循环{P0 = led[i]; //将字模送到P0口显示switch(i) //使用switch 语句控制位选{case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}单片机直接片选实现动态显示#include <reg51.h>#include <intrins.h>void delay(unsigned int i); //函数声名char DelayCNT; //定义变量unsigned char code Disp_Tab[] = //共阴数码管0-9{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40 };//段码控制unsigned char code dispbit[8]= //共阴数码管1-8个{0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制查表法void main(){unsigned int i,LedNumV al=1 ; //变量定义unsigned int LedOut[10]; //变量定义DelayCNT=0;while(1){if(++DelayCNT>=20) //控制数字变化速度{DelayCNT=0; //20个扫描周期清零一次++LedNumV al; //每隔20个扫描周期加一次}LedOut[0]=Disp_Tab[LedNumV al%10000/1000];LedOut[1]=Disp_Tab[LedNumV al%1000/100]|0x80;LedOut[2]=Disp_Tab[LedNumV al%100/10];LedOut[3]=Disp_Tab[LedNumV al%10];LedOut[4]=Disp_Tab[LedNumV al%10000/1000]; //千位LedOut[5]=Disp_Tab[LedNumV al%1000/100]|0x80; //百位小数LedOut[6]=Disp_Tab[LedNumV al%100/10]; //十位LedOut[7]=Disp_Tab[LedNumV al%10]; //个位for( i=0; i<9; i++){P0 = LedOut[i];P1 = dispbit[i]; //使用查表法进行位选switch(i) //使用switch 语句控制位选{case 0:P1 = 0x7F; break;case 1:P1 = 0xbF; break;case 2:P1 = 0xdF; break;case 3:P1 = 0xeF; break;case 4:P1 = 0xf7; break;case 5:P1 = 0xfb; break;case 6:P1 = 0xfd; break;case 7:P1 = 0xfe; break;}delay(150); //扫描间隔时太长会数码管会有闪烁感}}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}动态-静态LED#include <reg51.h>#include <intrins.h>sbit LED8_1=P1^1; //J14接在P1.1上void delay(unsigned int i); //函数声名char DelayCNT;char LED;void main(){LED = 0x01;DelayCNT=0;while(1){if(++DelayCNT>=10) //点亮动静LED灯速度控制{DelayCNT=0;LED = LED << 1; //左移if(LED==0) LED = 1; //移位后,后面的位为高电平}P0 =LED;LED8_1=0;delay(1000); //调用延时程序}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}数码管_138动态显示#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;uchar code led[8];void delay(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}uchar code table[]={0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void main(){while(1) //进入循环状态{uint cnt,j;LS138A=1;LS138B=1;LS138C=1;if(++cnt>=50){cnt=0; //延时计数每扫描一次加一次++j; //每隔50个扫描周期加一次}led[0]=table[j%10000/1000];led[1]=table[j%1000/100];led[2]=table[j%100/10];led[3]=table[j%10];led[4]=table[j%10000/1000]; //千位led[5]=table[j%1000/100]; //百位带小数点led[6]=table[j%100/10]; //十位led[7]=table[j%10]; //个位}}数码管_依次显示0-F#include<reg52.h>unsigned char code table[]= //共阳数码管{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F, ~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71}; void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){unsigned char cnt;while(1)for(cnt=0;cnt<16;cnt++){P0= table[cnt];delay(100);}}数码管_直选动态显示#include<reg52.h>unsigned char code dispiaybit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code table[]={0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){unsigned char m;while(1){for(m=0;m<8;m++){P0=table[m];P1=dispiaybit[m];delay(1);}}}数码管秒表#include<reg52.h>void delay(int xms){unsigned int cnt;for(cnt=0;cnt<xms*50;cnt++);}unsigned char s[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void main(){unsigned char num=0;unsigned char cnt=0;unsigned char hour=0;while(1){switch(++cnt%2){case 0:P0=0x02;P2=s[num%10];break;case 1:P0=0x04;P2=s[num/10];break;}delay(4);if(cnt>=250){num++;cnt=0;}}}一位静态显示#include <reg51.h>#include <intrins.h>#define NOP() _nop_() //定义空指令void delay(unsigned int i); //函数声名unsigned char code LED7Code[] = //共阳极{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F, ~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};void main(){unsigned int LedNumV al=1 ,C ; //定义变量while(1){if (++C>= 300){LedNumV al++ ; //每隔300个扫描周期加一次C =0; //每隔300个扫描清零} //将字模送到P0口显示P0 = LED7Code[LedNumV al%10]&0x7f;//LED7 0x7f为小数点共阴和共阳此处不一样;delay(150); //调用延时程序}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}3.蜂鸣器嘀嘀#include <reg52.h>sbit buzz = P3^4;main(){TMOD = 0x01;TH0 = -(1000/256);TL0 =- (1000%256);EA = 1;ET0 = 1;TR0 = 1;for(;;){} }void T0_irq(void) interrupt 1 using 1{TH0 = -(300/256);TL0 =- (300%256);buzz = ~buzz;}PZ_蜂鸣器#include<reg52.h>sbit beep=P1^5;void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){beep=1;delay(1);beep=0;delay(1);}八月桂花本例采用89C52, 晶振为11.0592MHZ关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍; #include <REG52.H>#include <INTRINS.H>sbit Beep = P1^5 ;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};void int0() interrupt 1 //采用中断0 控制节拍{ TH0=0xd8;TL0=0xef;n--;}void delay (unsigned char m) //控制频率延时{unsigned i=3*m;while(--i);}void delayms(unsigned char a) //豪秒延时子程序{while(--a); //采用while(--a) 不要采用while(a--);各位可编译一下看看汇编结果就知道了!}void main(){ unsigned char p,m; //m为频率常数变量unsigned char i=0;TMOD&=0x0f;TMOD|=0x01;TH0=0xd8;TL0=0xef;IE=0x82;play:while(1){a: p=music_tab[i];if(p==0x00){ i=0, delayms(1000); goto play;} //如果碰到结束符,延时1秒,回到开始再来一遍else if(p==0xff){ i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延时100ms,继续取下一音符else{m=music_tab[i++], n=music_tab[i++];} //取频率常数和节拍常数TR0=1; //开定时器1while(n!=0)Beep=~Beep,delay(m); //等待节拍完成,通过P1口输出音频(可多声道哦!)TR0=0; //关定时器1}}5.继电器按键控制继电器#include <reg51.h>sbit RELAY = P1^4; //定义继电器对应单片机管脚sbit K1 = P2^7; //定义按钮对应单片机管脚void main(){if (!K1)RELAY = 0; //按钮按下开启继电器else RELAY = 1; //按钮松开关闭继电器}4.按键模拟开关#include <reg52.H>sbit K1=P3^0;sbit L1=P2^0;void delay(unsigned int i){unsigned int j;for(i;i>0;i--)for(j=110;j>0;j--);}void main(){while(1){if(K1==0){delay(100);if(K1==0){L1=~L1;while(!K1);}}}}按键键状态显示#include <reg51.h>#include <intrins.h>sbit BEEP = P1^5;sbit RELAY= P1^4;sbit K1 = P0^0;sbit K2 = P0^1;sbit K3 = P0^2;sbit K4 = P0^3;sbit K5 = P0^4;sbit K6 = P0^5;void beep();main(){while(1){P2 = 0xff;if(K1==0)P2 = 0xfe;if(K2 == 0)P2 = 0xfd;if(!K3)P2 = 0xfb;if(!K4)P2 = 0xf7;if(!K5 )beep(); //喇叭发声RELAY = 1;if (!K6 )RELAY = 0; //通过了反相器}}void beep(){unsigned char i , j;for (i=0;i<100;i++){BEEP=!BEEP; //BEEP取反for (j = 0 ; j<250 ; j++) //需要产生方波_nop_();}BEEP=1; //关闭蜂鸣器}按键移位#include <reg51.h>#include <intrins.h>void delayms(unsigned char ms);void proc_key(unsigned char key_v);void delayms(unsigned char ms){unsigned char i;while(ms--){for(i = 0; i < 120; i++);}}sbit K1 = P0^0; //对应按钮K1sbit K2 = P0^1; //对应按钮K2void main(){unsigned char key_s,key_v;key_v = 0x03;P2 = 0xfe;while(1){key_s = scan_key();if(key_s != key_v){delayms(10);key_s = scan_key();if(key_s != key_v){key_v = key_s;proc_key(key_v);}}}}unsigned char scan_key(){unsigned char key_s;key_s = 0x00;key_s |= K2;key_s <<= 1;key_s |= K1;return key_s;}void proc_key(unsigned char key_v){if((key_v & 0x01) == 0){P2 = _cror_(P2,1);}else if((key_v & 0x02) == 0){P2 = _crol_(P2, 1);}}6.定时器/中断蜂铃器_timer1#include < reg51.h >#include <intrins.h>sbit Beep = P1^5;unsigned int USE_C ;void main(){TMOD=0x10; //定时/计数器1工作于方式1TH0=0x4C;TL0=0x00; //50ms定时常数EA=1; //开总中断ET1=1; //允许定时/计数器1 中断TR1=1; //启动定时/计数器1 中断while(1);}void Time1(void) interrupt 3{TH1=0x4c; //50ms定时TL1=0x00;if (++USE_C == 20) //每隔1秒发声{ Beep = ~Beep;USE_C = 0;}}中断0计数_1位数码管显示#include < reg51.h >#include <intrins.h>unsigned int LedNumV al;// 此表为LED 的字模/ 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)unsigned char code Disp_Tab[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83, 0xC6,0xA1,0x86,0xbf,0xc7,0x8c,0xc1, 0xff, 0xf7 };void main(void){// IT0=0; //低电平触发IT0=1; //下降沿触发EA=1;EX0=1;while(1){P0=Disp_Tab[LedNumV al%10];}}INT0中断函数void counter(void) interrupt 0{EX0=0;LedNumV al++; //中断计数EX0=1;}中断0计数_4位数码管显示试验4位数码管上显示外部中断计数#include < reg51.h >#include <intrins.h>sbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;unsigned int LedNumV al = 0 ,LedOut[8];// 此表为LED 的字模// 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)unsigned char code Disp_Tab[] ={ ~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x9 0,~0x88,~0x83,~0xC6,~0xA1,~0x86,~0xbf,~0xc7,~0x8c,~0xc1, ~0xff, ~0xf7 };void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}display(){ unsigned char i;LedOut[0]=Disp_Tab[LedNumV al%10000/1000];LedOut[1]=Disp_Tab[LedNumV al%1000/100]&0x7f;LedOut[2]=Disp_Tab[LedNumV al%100/10];LedOut[3]=Disp_Tab[LedNumV al%10];for( i=0; i<8; i++){ P0 = LedOut[i];switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}void main(void){P0=0xff;P1=0xff;P2=0xff;// IT0=0; //低电平触发IT0=1; //下降沿触发EA=1;EX0=1;while(1){display();}}INT0中断函数void counter(void) interrupt 0{EX0=0;LedNumV al++; //中断计数EX0=1;}INT0+INT1#include < reg51.h >#include <intrins.h>sbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;unsigned int LedNumV al_1,LedNumV al_2,LedOut[8]; unsigned char code Disp_Tab[] =/ /共阴数码管0-9{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}void main(void){ unsigned char i;P0=0xff;P1=0xff;P2=0xff;// IT0=0; //低电平触发IT0=1; //下降沿触发EX0=1;// IT1=0; //低电平触发IT1=1; //下降沿触发EX1=1;EA=1;while(1){LedOut[0]=Disp_Tab[LedNumV al_1%10000/1000];LedOut[1]=Disp_Tab[LedNumV al_1%1000/100]|0x80;//0x7f小数点LedOut[2]=Disp_Tab[LedNumV al_1%100/10];LedOut[3]=Disp_Tab[LedNumV al_1%10];LedOut[4]=Disp_Tab[LedNumV al_2%10000/1000];LedOut[5]=Disp_Tab[LedNumV al_2%1000/100];LedOut[6]=Disp_Tab[LedNumV al_2%100/10];LedOut[7]=Disp_Tab[LedNumV al_2%10];for( i=0; i<8; i++){ P0 = LedOut[i];switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}}INT0中断函数void counter0(void) interrupt 0{EX0=0;delay(100);LedNumV al_1++;EX0=1;}INT1中断函数void counter1(void) interrupt 2{EX1=0;delay(100);LedNumV al_2++;EX1=1;}T0_数码管#include<reg51.h>char num;unsigned char Led [10] ={0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void main(){TMOD=0x01;EA=1;ET0=1;TR0=1;TH0=(65536-45872)/256;TL0=(65536-45872)%256;while(1);}void T0_time() interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;num++;if(num==200){num=0;P0 = 0x1e;P2 = Led[1];}}TIMEER0试验数码管上显示定时器中断计数#include < reg51.h >#include <intrins.h>sbit LS138A=P2^2; //定义138管脚sbit LS138B=P2^3;sbit LS138C=P2^4;unsigned int LedNumV al,LedOut[8];// 此表为LED 的字模// 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)unsigned char code Disp_Tab[] ={ ~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x9 0,~0x88,~0x83,~0xC6,~0xA1,~0x86,~0xbf,~0xc7,~0x8c,~0xc1, ~0xff, ~0xf7 };系统初始化void system_Ini(){TMOD|= 0x11;TH1=0x1C; //12.000MTL1=0x18;IE = 0x8A;TR1 = 1;}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}void main(){system_Ini() ;while(1){ unsigned char i;LedOut[0]=Disp_Tab[LedNumV al%10000/1000];LedOut[1]=Disp_Tab[LedNumV al%1000/100]&0x7f;LedOut[2]=Disp_Tab[LedNumVal%100/10];LedOut[3]=Disp_Tab[LedNumV al%10];for( i=0; i<8; i++){P0 = LedOut[i];switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}}[ t1 (1ms)中断] 中断void T1zd(void) interrupt 3 //3定时器1的中断号{TH1 = 0x1c; //12.000TL1 = 0x18;LedNumV al++;}定时器#include"reg51.h"bit SecFlag = 0;code unsigned char LedSeg[10] = //数组{0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char Sec = 0,Min = 0;void Time0() interrupt 1 //中断1 //硬件延时{static unsigned int IntCnt,Counter = 0;TH0= 0xf8; //中断返回TL0 = 0xcd;if(++IntCnt > 500) //计数500次{IntCnt = 0;SecFlag = 1;}switch(++Counter%5){case 1:P0 = 0x02; // 0000 0010P2 = LedSeg[Sec % 10];break;case 2:P0 = 0x04; // 0000 0100P2 = LedSeg[Sec / 10];break;case 3:P0 = 0x08; // 0000 1000P2 = LedSeg[Min % 10];break;case 4:P0 = 0x10; // 0001 0000P2 = LedSeg[Min / 10];break;}}void InitTime() //中断定时初始化{TMOD = 0x01; // GATE C/T M1 M0 GA TE C/T M1 M0//设置为定时器0的工作方式1// 0 0 0 0 0 0 0 1 TH0 = 0xf8; //装载初值TL0 = 0xcd;TCON = 0x10; // TF1 TR1 TF0 TR0 0000//控制启停// 0 0 0 1IE = 0x82; // EA 00 ES ET1 EX1 ET0 EX0//中断允许控制E:enable// 1 00 0 0 0 1 0}void main(){unsigned int Counter = 0;bit StopFlag = 0; //0: Time Run 1:Time StopInitTime(); //初始化单片机内部的定时器,以中断方式工作在16位模式while(1){if(StopFlag == 0) //走时{ if(SecFlag) //计时程序{SecFlag = 0;if(++Sec > 59){Sec = 0;if(++Min > 59){Min = 0;}}}}}}定时器_按键#include"reg51.h"bit SecFlag = 0;sbit TIMESTOP_K = P1^0;void Delay2ms(unsigned int DelayTime) //软件延时{unsigned int Count;for(Count = 0;Count < DelayTime*50;Count++);}code unsigned char LedSeg[10] = //数组{0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char Sec = 0,Min = 0;void Time0() interrupt 1 //中断1 //硬件延时{static unsigned int IntCnt,Counter = 0;TH0 = 0xf8;TL0 = 0xcd;if(++IntCnt > 500) //计数500次{IntCnt = 0;SecFlag = 1;}switch(++Counter%5){case 1:P0 = 0x02; // 0000 0010P2 = LedSeg[Sec % 10];break;case 2:P0 = 0x04; // 0000 0100P2 = LedSeg[Sec / 10];break;case 3:P0 = 0x08; // 0000 1000P2 = LedSeg[Min % 10];break;case 4:P0 = 0x10; // 0001 0000P2 = LedSeg[Min / 10];break;}}void InitTime() //硬件延时{TMOD = 0x01; // GATE C/T M1 M0 GA TE C/T M1 M0//设置为定时器0的工作方式1// 0 0 0 0 0 0 0 1 TH0 = 0xf8; //装载初值TL0 = 0xcd;TCON = 0x10; // TF1 TR1 TF0 TR0 0000//控制启停// 0 0 0 1IE = 0x82; // EA 00 ES ET1 EX1 ET0 EX0E:enable //中断允许控制// 1 00 0 0 0 1 0 }void main(){unsigned int Counter = 0;bit StopFlag = 0; //0: Time Run 1:Time StopInitTime(); //初始化单片机内部的定时器,以中断方式工作在16位模式while(1){if(StopFlag == 0) //走时{ if(SecFlag) // 计时程序{SecFlag = 0;if(++Sec > 59){Sec = 0;if(++Min > 59){Min = 0;}}}}//按键工作,让走时停止,StopFlag = 1if(TIMESTOP_K == 0){Delay2ms(5);while(TIMESTOP_K == 0);StopFlag = ~ StopFlag;}}}7.LED点阵显示数字LED点阵实验(流动显示1 2 3 4 5 6 7 8 9)#include<reg51.h>unsigned char code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code digittab[18][8]={{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, //0{0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00}, //1{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, //2{0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, //3{0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, //4{0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, //5{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //6{0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, //7{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, //8{0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00}, //9{0x00,0x00,0x7F,0x48,0x48,0x30,0x00,0x00}, //P{0x00,0x00,0x7F,0x48,0x4C,0x73,0x00,0x00}, //R{0x00,0x00,0x7F,0x49,0x49,0x49,0x00,0x00}, //E{0x00,0x00,0x3E,0x41,0x41,0x62,0x00,0x00}, //C{0x00,0x00,0x7F,0x08,0x08,0x7F,0x00,0x00}, //H{0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00}, //I{0x00,0x7F,0x10,0x08,0x04,0x7F,0x00,0x00}, //N{0x7C,0x48,0x48,0xFF,0x48,0x48,0x7C,0x00} //中};unsigned int timecount;unsigned char cnta;unsigned char cntb;void main(void){TMOD=0x01;TH0=(65536-3000)/256;TL0=(65536-3000)%256;TR0=1; //开启定时0ET0=1;EA=1; //开启中断cntb=0;while(1){ ;}}void t0(void) interrupt 1 using 0{TH0=(65536-3000)/256; //定时器高位装载数据TL0=(65536-3000)%256; //定时器低位装载数据if(cntb<18) //红色{P1=0xFF;P2=tab[cnta];P0=digittab[cntb][cnta];}else //绿色{P2=0xFF;P1=tab[cnta];P0=digittab[cntb-18][cnta];}if(++cnta>=8) cnta=0;if(++timecount>=333){timecount=0;if(++cntb>=36)cntb=0;}}滚动LED点阵实验(左右上下流动显示)#include <REG51.H>unsigned char code taba[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code tabb[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};void delay1(void){unsigned char i,j,k;for(k=10;k>0;k--)for(i=20;i>0;i--)for(j=248;j>0;j--);}void main(void){unsigned char i,j;while(1){for(j=0;j<3;j++) //from left to right 3 time{for(i=0;i<8;i++){P2=taba[i];P0=0xff;delay1();}}for(j=0;j<3;j++) //from right to left 3 time{for(i=0;i<8;i++){P2=taba[7-i];P0=0xff;delay1();}}for(j=0;j<3;j++) //from top to bottom 3 time{for(i=0;i<8;i++){P2=0x00;P0=tabb[7-i];delay1();}}for(j=0;j<3;j++) //from bottom to top 3 time{for(i=0;i<8;i++){P2=0x00;P0=tabb[i];delay1();}}}}8.1602液晶静态显示#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table1[]="LIJUNLIN1988"; //12 uchar code table2[]="TEL 134********"; //15 sbit E=P2^7;sbit RS=P2^6;sbit R=P2^5;uchar num;void delay(uint x){uint y;for(x;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) //写指令{RS=0;P0=com;delay(5);E=1;delay(5);E=0;}void write_data(uchar date) //写数据{RS=1;P0=date;delay(5);E=1;delay(5);E=0;}void init() //初始化{E=0;write_com(0x38);write_com(0x0e);write_com(0x06);write_com(0x01);write_com(0x80);}void main(){R=0;init();for(num=0;num<12;num++){write_data(table1[num]);delay(20);}write_com(0x80+0x40);for(num=0;num<15;num++){write_data(table2[num]);delay(20);}while(1);}动态显示#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table1[]="LIJUNLIN"; //8 uchar code table2[]="134********"; //11 sbit E=P2^7;sbit RS=P2^6;sbit R=P2^5;uchar num;void delay(uint x){uint y;for(x;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) //写指令{RS=0;P0=com;delay(5);E=1;delay(5);E=0;}void write_data(uchar date) //写数据{RS=1;P0=date;delay(5);E=1;delay(5);E=0;}void init() //初始化{E=0;write_com(0x38);write_com(0x0e);write_com(0x06);write_com(0x01);write_com(0x80+0x10);}void main(){R=0;init();for(num=0;num<8;num++){write_data(table1[num]);delay(20);}write_com(0x80+0x53);for(num=0;num<11;num++){write_data(table2[num]);delay(20);}for(num=0;num<16;num++){write_com(0x18);delay(20);}while(1);}滚动显示1、从左到右逐字显示,闪动二次,清屏。
51单片机C语言源代码例程附带电路图
闪烁灯[实验要求]点亮与单片机P1.0口相连的发光二极管,延时0.2S,然后熄灭,延时0.2S,再点亮,如此循环下去。
[实验目的]初步了解单片机IO口输出高低电平的作用,延时函数的时间估算。
[硬件电路][源代码]#include<reg51.h>/**********************************************************上面这行是一个"文件包含"处理。
所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来这里的程序虽然只写了一行,但C编译器在处理的时候却要处理几十或几百行,这里包含reg51.h的目的在于本程序要使用P1这个符号,而P1是在reg51.h这个头文件中定义的。
大家可以在编译器目录下面用记事本打开这个文件看看。
*********************************************************/sbit P1_0=P1^0; //定义IO口这步的目的是让编//译器知道P1_0代表的就是单片机的P1.0口void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k; //定义3个无符号字符型变量。
for(i=20;i>0;i--) //三个FOR循环用来延时,这里为for(j=20;j>0;j--) //什么是0.2S大家可以用WAVE for(k=248;k>0;k--); //高断点仿真一下,就可知道大概 } //是0.2S了。
void main(void) //每一个C语言程序有且只有一个主函数,{while(1) //循环条件永远为真,以下程序一直执行下去。
{P1_0=0; // I/O口P1.0输出低电平,小灯被点亮。
delay02s(); //延时经过0.2秒。
P1_0=1; // I/O口P1.0输出高电平,小灯熄灭。
单片机程序源代码完整版.doc
{
uint i,j;
for(i=x;i>0;i--)
for(j=120;j>0;j--);
}
void main()
{
uint i;
while(1)
{
P1=0xff;
delay(500);
for(i=0;i<4;i++)
{
P1=table[i];
delay(500);
{uint j;
for(j=0;j<120;j++);
}
}
void main()
{
while(1)
{
P0=0xfe;
while(P0!=0x7f)
{
//P1=temp;
//delayms(500);
P0=_crol_(P0,1);
delayms(250);
}
temp=0x7f;
while(P0!=0xfe)
利用89c51单片机的端口控制8个LED(D0~D7)循环点亮,刚开始时D0点亮,延时片刻后,接着D1点亮,然后依次点亮D2->D3->D4->D5 ->D6->D7,然后再点亮D7->D6->D5->D4 ->D3->D2->lt;reg52.h>
#include <intrins.h>
}
for(i=3;i>0;i--)
{
P1=table[i-1];
delay(500);
}
}
}
任务四:复杂广告灯的设计
利用89c51单片机的端口实现8个LED(D0~D7)复杂广告灯的控制,要求显示规律为:正向流水->反向流水->隔灯闪烁3次->高四盏、低四盏闪烁2次->隔两盏闪烁3次,再重复循环。
单片机编程全集(含源代码)
单片机编程全集(含源代码)单片机编程全集(含源代码)引言:单片机编程是一门重要的技术,它在各个行业中都有广泛的应用。
本文将介绍单片机编程所需的基础知识、常用的编程语言和相关的实例代码,以及如何进行单片机的调试和测试。
一、单片机编程基础知识1.1 单片机概述单片机是一种集成电路,它集成了中央处理器、存储器和输入输出设备等功能单元。
它具有体积小、功耗低、成本低等优点,适用于各种嵌入式系统中。
1.2 单片机体系结构单片机的体系结构包括CPU、存储器、输入输出端口、计时/计数器等模块。
理解单片机的体系结构对于编程非常重要。
1.3 常用的单片机常见的单片机有AT89S52、STM32F103C8T6等,它们具有不同的性能和功能特点。
选择适合自己项目需求的单片机是编程的第一步。
二、单片机编程语言2.1 汇编语言汇编语言是一种低级语言,直接操作单片机的寄存器和内存。
虽然难以学习和理解,但它可以精确控制硬件。
2.2 C语言C语言是一种高级语言,易于学习和使用,可以编写出高效的代码。
许多单片机开发板都支持C语言编程,方便开发者进行开发。
2.3 基本编程指令无论是汇编语言还是C语言,都有一些基本的编程指令,如赋值、条件判断、循环等。
掌握这些指令对于编程非常关键。
三、单片机编程实例3.1 LED闪烁通过编程控制单片机的GPIO口,可以实现LED灯的闪烁效果。
代码如下:```c#include <reg52.h>void Delay(unsigned int t){while(t--);}void main()while(1){P1=0xFF; // 点亮LED灯Delay(60000);P1=0x00; // 关闭LED灯Delay(60000);}}```3.2 温度检测通过连接温度传感器到单片机的模拟输入引脚,可以实现对环境温度的检测。
代码如下:```c#include <reg52.h>sbit AD = P2^0; // 温度传感器连接的引脚void Delay(unsigned int t){while(t--);void main(){unsigned int temp;while(1){temp = AD; // 读取温度传感器的值if(temp > 50){P1=0xFF; // 温度超过50度时点亮LED灯 }else{P1=0x00; // 温度低于50度时关闭LED灯 }Delay(60000);}}```四、单片机的调试与测试4.1 调试工具常用的单片机调试工具有Keil、IAR等,它们提供了仿真功能,可以在计算机上模拟单片机的运行。
51单片机经典实例源码
#include <reg52.h>#include "LCD1602.h"uint Num=0;uchar NumCode[4]={0,0,0,0};//---------------中断加一--------------void my_INT1(void) interrupt 0{Num++;}//-----------------------------void Disp(){uint m;NumCode[0]=Num/1000;NumCode[1]=Num%1000/100;NumCode[2]=Num%100/10;NumCode[3]=Num%10;for(m=0;m<4;m++){LCD_Disp(0,5+m,NumCode[m]+0x30);}}//---------------------void main(){IT0=1;EA=1;EX0=1;LCD_Init();while(1){Disp();}} #include <reg52.h>#include "LCD1602.h"uint Num=3728;uchar NumCode[4]={0,0,0,0};//-----------------------自动加一------------------------- void Disp(){uchar m;NumCode[0]=Num/1000;NumCode[1]=Num%1000/100;NumCode[2]=Num%100/10;NumCode[3]=Num%10;for(m=0;m<4;m++){LCD_Disp(0,6+m,NumCode[m]+0x30);}}//--------------------------------------------void main(){LCD_Init();while(1){Disp();Num++;Delay(50000);}}#include<reg51.h>#include "LCD1602.h"uint Num=5432;uchar NumCode[4]={0,0,0,0};//----------定时器T0按键加一--------------- void T0Init(){ TMOD=0x0d;TH0=5432/256;TL0=5432%256;TR0=1; }//------------------------------------------void Disp(){ int m;NumCode[0]=Num/1000;NumCode[1]=Num%1000/100;NumCode[2]=Num%100/10;NumCode[3]=Num%10;for(m=0;m<4;m++){LCD_Disp(0,5+m,NumCode[m]+0x30);}}//-------------------------------------------void main(){T0Init();LCD_Init();while(1){Num=TH0*256+TL0;Disp();}} #include<reg51.h>#define uchar unsigned charuchar T0Num;sbit LED=P1^0;//--------定时器TO使LED自动一秒闪一下--------- void T0Init(){TMOD=0x01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;TR0=1;ET0=1;EA=1;}//---------------------------void T0Sever() interrupt 1{TH0=(65536-10000)/256;TL0=(65536-10000)%256;T0Num++;if(T0Num==100){LED=~LED;T0Num=0;}}//---------------------------void main(){T0Init();while(1){}}#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f ,0x6f};uint shu;//-----------外部中断按键加减一----------void my_INT1(void) interrupt 0{shu--;}//-----------------------------------------------------void my_INT2(void) interrupt 2{shu++;}//------------------------------------------------------void main(){shu=5;IT0=1;EA=1;EX0=1;IT1=1;EA=1;EX1=1;while(1){P2=num[shu];if(shu==10){shu=0;}if(shu==-1){shu=9;}}} #include <reg51.h>#define uint unsigned int#define uchar unsigned charuchar Disp[4]={0x9a,0xca,0xa9,0xac};//------------------------交通灯--------------------- void delay3ms(uchar i){uint n,j,k;for(;i>=1;i--){for(n=2;n>=1;n--){for(j=250;j>=1;j--){for(k=200;k>=1;k--);}}}}//-------------------------------------void main(){while(1){P1=Disp[0];delay3ms(4);P1=Disp[1];delay3ms(1);P1=Disp[2];delay3ms(4);P1=Disp[3];delay3ms(1);}}#include <reg51.h>#define uchar unsigned charuchar T0Num=0;uchar PWM=50;sbit LED=P3^7;//------------PWM频率------void T0Init(){TMOD=0x01;TH0=(65536-100)/256;// 0.1msTL0=(65536-100)%256;ET0=1;EA=1;TR0=1;}//-----------------------void Ex0Init(){IT0=1;EX0=1;EA=1;}//------------------------void main(){T0Init();Ex0Init();while(1){}}//------------------------void T0Server() interrupt 1{TH0=(65536-100)/256;// 0.1msTL0=(65536-100)%256;T0Num++;if(T0Num==PWM){LED=1;}if(T0Num==100){T0Num=0;LED=0;}}//--------------------------void Int0Server() interrupt 0{PWM=PWM+5;if(PWM>=100){PWM=0;}}include<reg52.h>#define uchar unsigned charuchar i,Flagls,Scon,T0Num;uchar code LedCode[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40, 0x80};//-------串口74LS164驱动流水灯--------------void T0_Init(){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;ET0=1;EA=1;}//----------------void Serial_Init(){Scon=0x00;}//------------------void SerialSend (uchar ch){SBUF=ch;while(TI==0){}TI=0;}//--------------void main(){T0_Init();Serial_Init();while(1){if(Flagls==1){Flagls=0;SerialSend(LedCode[i]);i++;if(i>7){i=0;}}}}//------------------void Toserver() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;T0Num++;if(T0Num>20){T0Num=0;Flagls=1;}}#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar DispCode[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0x3e,0xe0,0xfe,0xe6}; uint Num=9995;uchar NumCode[4]={0,0,0,0};uchar T1Num;bit Flag1s=0;//---------串口74LS164驱动数码管---------------- void SerialInit(){SCON=0x00;}//-----------------------------------------void T1Init(){TMOD=0x10;TH1= -10000/256;TL1= -10000%256;TR1=1;ET1=1;EA=1;}//------------------------------------------void Disp(){uchar i;NumCode[0]=Num/1000;NumCode[1]=Num%1000/100;NumCode[2]=Num%100/10;NumCode[3]=Num%10;for(i=0;i<4;i++){SBUF=DispCode[NumCode[3-i]];while(TI==0){}TI=0;}}//------------------------------------------ void main(){SerialInit();T1Init();while(1){if(Flag1s==1){Flag1s=0;Disp();}}}//----------------------------------------- void T1Server() interrupt 3{TH1= -10000/256;TL1= -10000%256;T1Num++;if(T1Num==100){T1Num=0;Flag1s=1;Num++;if(Num>9999){Num=0;}}}#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar T0Num;bit Flag1s=0;uchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};//--------MUC_MUC串口自发自收-----------void SerialInit(){SCON=0x50; //方式1 允许接收PCON=0x00; //串口波特率不加倍TMOD|=0x20; //定时器1,方式2TH1=0xfd; //波特率为9600TL1=0xfd;TR1=1; //启动定时器ES=1;EA=1;}//--------------------------------void T0Init(){TMOD|=0x01;TH0=-10000/256;TL0=-10000%256;ET0=1;TR0=1;EA=1;}//--------------------------------void main(){uchar k;SerialInit();T0Init();while(1){if(Flag1s==1){Flag1s=0;SBUF=DispCode[k];k++;if(k>9){k=0;}}}}//--------------------------------void SerialServer() interrupt 4{if(RI==1){RI=0;P2=SBUF;}else{TI=0;}}//--------------------------------void T0Server() interrupt 1{TH0=-10000/256;TL0=-10000%256;T0Num++;if(T0Num==100){T0Num=0;Flag1s=1;}}#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar T0Num;bit Flag1s=0;uchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};//-----------两机通信(主机代码)---------------------- void SerialInit(){SCON=0x50; //方式1 允许接收PCON=0x00; //串口波特率不加倍ES=1;EA=1;}//---------------------------------void T1Init(){TMOD=0x20; //定时器1,方式2TH1=0xfd; //波特率为9600TL1=0xfd;TR1=1; //启动定时器}//--------------------------------void T0Init(){TMOD|=0x01;TH0=-10000/256;TL0=-10000%256;ET0=1;TR0=1;EA=1;}//--------------------------------void main(){uchar k;SerialInit();T1Init();T0Init();while(1){if(Flag1s==1){Flag1s=0;P2=DispCode[k];SBUF=DispCode[k];k++;if(k>9){k=0;}}}}//--------------------------------void SerialServer() interrupt 4{if(RI==1){RI=0;}else{TI=0;}}//--------------------------------void T0Server() interrupt 1{TH0=-10000/256;TL0=-10000%256;T0Num++;if(T0Num==100){T0Num=0;Flag1s=1;}}#include <reg51.h>#define uchar unsigned charuchar Ch;//------两机通信(从机代码)---------------- void SerialInit(){SCON=0x50; //方式1 允许接收PCON=0x00; //串口波特率不加倍ES=1;EA=1;}//---------------------------------void T1Init(){TMOD=0x20; //定时器1,方式2TH1=0xfd; //波特率为9600TL1=0xfd;TR1=1; //启动定时器}//--------------------------------void main(){SerialInit();T1Init();while(1){P2=Ch;}}//--------------------------------void SerialServer() interrupt 4{if(RI==1){RI=0;Ch=SBUF;}else{TI=0;}} #include <reg51.h>#define uchar unsigned charuchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};uchar Num=5;//----------------多机通信(主机代码)------------ void ExInit(){ IT0=1;IT1=1;EX0=1;EX1=1;EA=1;}//---------------------------------void SerialInit(){ SCON=0xd0; //方式3 允许接收PCON=0x00; //串口波特率不加倍TMOD=0x20; //定时器1,方式2TH1=0xfd; //波特率为9600TL1=0xfd;TR1=1; //启动定时器ES=1;EA=1;}//--------------------------------void SBUFSend(uchar Ch){ SBUF=Ch;while(TI==0){ }TI=0; }//--------------------------------void SendControl(uchar Addr,uchar Data) { TB8=1;SBUFSend(Addr);TB8=0;SBUFSend(Data);}//--------------------------------void main(){ SerialInit();ExInit();while(1){ }}//--------------------------------void SerialServer() interrupt 4{ uchar Ch;if(RI==1){ RI=0;Ch=SBUF;if(Ch=='b'){P2=DispCode[1];}if(Ch=='c'){P2=DispCode[2];}}else{TI=0;}}//-------------------------------void Ex0Server() interrupt 0{ Num++;if(Num>9){Num=0;}SendControl('b',Num);}//-----------------------------void Ex1Server() interrupt 2{Num--;if(Num==255){Num=9;}SendControl('c',Num);}************************************* #include <reg51.h>#define uchar unsigned charuchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};//------------多机通信(从机1)--------------------- void SerialInit(){SCON=0xf0; //方式3 允许接收,SM2=1PCON=0x00; //串口波特率不加倍TMOD=0x20; //定时器1,方式2TH1=0xfd; //波特率为9600TL1=0xfd;TR1=1; //启动定时器ES=1;EA=1;}//-------------------------------void SBUFSend(uchar Ch){SBUF=Ch;while(TI==0){}TI=0;}//--------------------------------void main(){SerialInit();while(1){}}//--------------------------------void SerialServer() interrupt 4{uchar Ch;if(RI==1){RI=0;Ch=SBUF;if(RB8==1) //地址{if(Ch=='b'){SM2=0; //是自己的地址,置SM2=0,开始接收数据SBUFSend('b');}else{SM2=1; //不是自己的地址,置SM2=1。
单片机实验源汇编程序
PCTL EQU 0CFA3H
START: MOV DPTR,#PCTL
MOV A,#82H
MOVX @DPTR,A
LOOP: MOV DPTR,#PB
MOVX A,@DPTR
MOV DPTR,#PA
MOVX @DPTR,A
MOV R7,#10H
PRG3: MOV P1,#00H
JMP START
DELAY: MOV R1,#5
DEL1: MOV R2,#200
DEL2: MOV R3,#126
DEL3: DJNZ R3,DEL3
DJNZ R2,DEL2
DJNZ R1,DEL1
RET
END
T3
NAME T3
CSEG AT 0000H
LJMP START
CSEG AT 401BH
LJMP INT
CSEG AT 4100H
START: MOV A,#01H
MOV R1,#03H
MOV R0,#5H
MOV TMOD,#10H
MOV TL1,#0AFH
MOV TH1,#03CH
PORT EQU 0CFA0H
CSEG AT 0000H
LJMP START
CSEG AT 4100H
START: MOV A,#11H
ACALL DISP
ACALL DE3S
LLL: MOV A,#12H
ACALL DISP
ACALL DE10S
MOV A,#10H
ACALL DE02S
MOV A,#21H
51单片机C语言程序设计源代码
新概念51单片机C语言教程----入门、提高、开发、拓展全攻略郭天祥编著电子工业出版社例2.2.1编写程序,点亮第一个发光二极管(part2_1.c P27)#include <reg52.h> //52系列单片机头文件sbit led1=P1^0; //声明单片机P1口的第一位void main() //主函数{led1=0; /*点亮第一个发光二极管*/}例2.2.2编写程序,点亮P1口的若干二极管(part2_2.c P39)#include <reg52.h> //52系列单片机头文件void main() //主函数{P1=0xaa;//while(1);}例2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(part2_3.c P42)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位uint i,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 -例2.6.1编写程序使第一个发光二极管以间隔500ms亮灭闪动。
(part2_4.c P48)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位void delay1s(); //声明子函数void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/delay1s(); //调用延时子函数led1=1; /*关闭第一个发光二极管*/delay1s(); //调用延时子函数}}void delay1s() //子函数体{uint i,j;for(i=500;i>0;i--)for(j=110;j>0;j--);}例2.7.1编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。
单片机编程全集(含源代码)
前言 (2)基础知识:单片机编程基础 (2)第一节:单数码管按键显示 (4)第二节:双数码管可调秒表 (6)第三节:十字路口交通灯 (7)第四节:数码管驱动 (9)第五节:键盘驱动 (10)第六节:低频频率计 (15)第七节:电子表 (18)第八节:串行口应用 (19)前言本文是本人上课的一个补充,完全自写,难免有错,请读者给予指正,可发邮件到ZYZ@,或郑郁正@中国;以便相互学习。
结合课堂的内容,课堂上的部分口述内容,没有写下来;有些具体内容与课堂不相同,但方法是相通的。
针对当前的学生情况,尽可能考虑到学生水平的两端,希望通过本文都学会单片机应用。
如果有不懂的内容,不管是不是本课的内容,都可以提出来,这些知识往往代表一大部分同学的情况,但本人通常认为大家对这些知识已精通,而在本文中没有给予描述,由此影响大家的学习。
对于这些提出问题的读者,本人在此深表谢意。
想深入详细学习单片机的同学,可以参考其它有关单片机的书籍和资料,尤其是外文资料。
如果有什么问题,我们可以相互探讨和研究,共同学习。
本文根据教学的情况,随时进行修改和完善,所以欢迎同学随时注意本文档在课件中的更新情况。
基础知识:单片机编程基础单片机的外部结构:1、DIP40双列直插;2、P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)3、电源VCC(PIN40)和地线GND(PIN20);4、高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位)5、内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍)6、程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序)7、P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务)1、四个8位通用I/O端口,对应引脚P0、P1、P2和P3;2、两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1)3、一个串行通信接口;(SCON,SBUF)4、一个中断控制器;(IE,IP)针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4、附录实验一源程序ORG 00HAJMP STARTORG 0100HSTART: MOV A,#0FEHMOV P0,A ;初始化P0口MAIN: JNB P1.0,K1 ;判断K1是否按下JNB P1.1,K2 ;判断K2是否按下SJMP MAINK1: LCALL DELAYMS ;延时消抖JNB P1.0,K11 ;再次判断SJMP MAINK11: RR AMOV P0,ALCALL DELAYSJMP MAINK2: LCALL DELAYMS ;延时消抖JNB P1.1,K22 ;再次判断SJMP MAINK22: RL AMOV P0,ALCALL DELAYSJMP MAINDELAYMS:MOV R3,#60 ;30MSD0: MOV R4,#248DJNZ R4,$DJNZ R3,D0RETDELAY: MOV R5,#20 ;延时程序,延时0.2s D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND实验二源程序//与程序流程图不一致ORG 00HLJMP START ;跳至主程序ORG 000BH ;中断子程序起始地址T0INT: PUSH PSW ;状态保护MOV TH0,#0FCH ;置定时器初值MOV TL0,#17HMOV A,#0FFHMOV P0,AMOV A,P2RL AMOV P2,ACJNE A,#00000001B,N_LOOP1 ;相等就不跳转MOV DPTR,#TABLE ;指针指向表头地址MOV A,#01H ;设置地址偏移量MOVC A,@A+DPTR ;查表取得段码,送A存储MOV P0,A ;段码送LED显示JMP EXITN_LOOP1: CJNE A,#00000010B,N_LOOP2 ;相等就不跳转MOV DPTR,#TABLE ;指针指向表头地址MOV A,#02H ;设置地址偏移量MOVC A,@A+DPTR ;查表取得段码,送A存储MOV P0,AJMP EXITN_LOOP2: CJNE A,#00000100B,N_LOOP3 ;相等就不跳转MOV DPTR,#TABLE ;指针指向表头地址MOV A,#03H ;设置地址偏移量MOVC A,@A+DPTR ;查表取得段码,送A存储MOV P0,AJMP EXITN_LOOP3: CJNE A,#00001000B,N_LOOP4 ;相等就不跳转MOV DPTR,#TABLE ;指针指向表头地址MOV A,#04H ;设置地址偏移量MOVC A,@A+DPTR ;查表取得段码,送A存储MOV P0,AJMP EXITN_LOOP4: CJNE A,#00010000B,N_LOOP5 ;相等就不跳转MOV DPTR,#TABLE ;指针指向表头地址MOV A,#05H ;设置地址偏移量MOVC A,@A+DPTR ;查表取得段码,送A存储MOV P0,AJMP EXITN_LOOP5: CJNE A,#00100000B,N_LOOP6 ;相等就不跳转MOV DPTR,#TABLE ;指针指向表头地址MOV A,#06H ;设置地址偏移量MOVC A,@A+DPTR ;查表取得段码,送A存储MOV P0,AJMP EXITN_LOOP6: CJNE A,#01000000B,N_LOOP7 ;相等就不跳转MOV DPTR,#TABLE ;指针指向表头地址MOV A,#07H ;设置地址偏移量MOVC A,@A+DPTR ;查表取得段码,送A存储MOV P0,AJMP EXITN_LOOP7: CJNE A,#10000000B,EXIT ;相等就不跳转MOV DPTR,#TABLE ;指针指向表头地址MOV A,#08H ;设置地址偏移量MOVC A,@A+DPTR ;查表取得段码,送A存储MOV P0,AEXIT: POP PSWRETIORG 0100HSTART: MOV P0,#0FFHMOV P2,#01HMOV TMOD,#01H ;方式1,定时器MOV TH0,#0FCH ;置定时器初值MOV TL0,#17HMOV IE,#10000010B ;EA=1,IT0=1SETB TR0 ;开始定时JMP $TABLE: DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H,0ffH;(0-9,off) END实验三源程序org 0000hajmp mainorg 0100hmain: mov dptr,#table ;将表头放入DPTRlcall key ;调用键盘扫描程序movc a,@a+dptr ;查表后将键值送入ACCmov p0,a ;将Acc值送入P0口ljmp main ;返回反复循环显示KEY: LCALL KS ;调用检测按键子程序JNZ K1 ;有键按下继续LCALL DELAY2 ;无键按调用延时去抖AJMP KEY ;返回继续检测按键K1: LCALL DELAY2LCALL DELAY2 ;有键按下延时去抖动LCALL KS ;再调用检测按键程序JNZ K2 ;确认有按下进行下一步AJMP KEY ;无键按下返回继续检测K2: MOV R2,#0EFH ;将扫描值送入 R2暂存MOV R4,#00H ;将第一列值送入R4暂存K3: MOV P1,R2 ;将R2的值送入P1口L6: JB P1.0,L1 ;P1.0等于1跳转到L1MOV A,#00H ;将第一行值送入ACCAJMP LK ;跳转到键值处理程序L1: JB P1.1,L2 ;P1.1等于1跳转到L2MOV A,#04H ;将第二行的行值送入ACCAJMP LK ;跳转到键值理程序进行键值处理L2: JB P1.2,L3 ;P1.2等于1跳转到L3MOV A,#08H ;将第三行的行值送入ACCAJMP LK ;跳转到键值处理程序L3: JB P1.3,NEXT ;P1.3等于1跳转到NEXT处MOV A,#0cH ;将第四行的行值送入ACCLK: ADD A,R4 ;行值与列值相加后的键值送入APUSH ACC ;将A中的值送入堆栈暂存K4: LCALL KS ;调用按键检测程序JNZ K4 ;按键没有松开继续返回检测POP ACC ;将堆栈的值送入ACCRETNEXT: INC R4 ;将列值加一MOV A,R2 ;将R2的值送入AJNB ACC.7,KEY ;扫描完至KEY处进行下一扫描RL A ;扫描未完将A中的值右移一位进行下一列的扫描 MOV R2,A ;将ACC的值送入R2暂存AJMP K3 ;跳转到K3继续KS: MOV P1,#0FH ;将P1口高四位置0低四位值1MOV A,P1 ;读P1口XRL A,#0FH ;将A中的值与A中的值相异或RET ;子程序返回DELAY2: ;40ms延时去抖动子程序MOV R5,#08HL7: MOV R6,#0FAHL8: DJNZ R6,L8DJNZ R5,L7RETTABLE: ;七段显示器数据定义DB 0C0H, 0F9H, 0A4H, 0B0H, 99H ; 01234DB 92H, 82H, 0F8H, 80H, 90H ; 56789DB 88H, 83H, 0C6H, 0A1H, 86H ; ABCDEDB 8EH ; FEND ;程序结束实验四源程序;********************功能说明******************************* ;用AT89S52的MCU驱动DAC0832输出三角波;通过数码管显示输出的电压值;*********************************************************** ;************* IO口定义**************/DAC_CS BIT P2.7DAC_WR BIT P2.6DAC_BUS EQU P0TEMP EQU 30HDISSTART EQU 40H ;显示单元首地址LED_DATA EQU P1 ;数码管数据口定义ORG 0000HLJMP MAINORG 0100HMAIN:MOV SP,#60HMOV P1,#0FFHMOV P3,#00HMOV TEMP,#01MOV A,#00;MOV DISSTART+3,A ;清除百位显示缓存MOV DISSTART+2,A ;清除百位显示缓存MOV DISSTART+1,A ;清除十位显示缓存MOV DISSTART,A ;清除个位显示缓存M_LOOP:CALL CONVTLCALL DELAY2MSCALL DISPLAYLCALL DELAY2MSCALL DAC_CONVTLCALL DELAY2MSJMP M_LOOPDAC_CONVT:MOV P0,TEMPCLR DAC_CSCLR DAC_WRSETB DAC_CSSETB DAC_WRINC TEMPRET;-------------------------------------------------------- UIDIV:CJNE R4,#00H,LOOP_C11CJNE R6,#00H,LOOP_C32MOV A,R7MOV B,R5DIV ABMOV R7,AMOV R5,BRETLOOP_C11:CLR AXCH A,R4MOV R0,AMOV B,#08HLOOP_C17:MOV A,R7ADD A,R7MOV R7,AMOV A,R6RLC AMOV R6,AMOV A,R4RLC AMOV R4,AMOV A,R6SUBB A,R5MOV A,R4SUBB A,R0JC LOOP_C2BMOV R4,AMOV A,R6SUBB A,R5MOV R6,AINC R7LOOP_C2B:DJNZ B,LOOP_C17CLR AXCH A,R6MOV R5,ARETLOOP_C32:MOV A,R5MOV R0,AMOV B,AMOV A,R6DIV ABJB OV,LOOP_C57MOV R6,AMOV R5,BMOV B,#08HLOOP_C41:MOV A,R7ADD A,R7MOV R7,AMOV A,R5RLC ALOOP_C52:MOV R5,AJC LOOP_50SUBB A,R0JNC LOOP_C52DJNZ B,LOOP_C41LOOP_C57:RETLOOP_50:CLR CSUBB A,R0MOV R5,AINC R7DJNZ B,LOOP_C41RET;--------------------------------------------------------- ;代码变换 (HEX TO BCD);--------------------------------------------------------- CONVT:;--------------A*B------------MOV R3,#0C3HMOV R2,TEMPMOV A,R3MOV B,R2MUL ABMOV 08H,BMOV 09H,AMOV R6,08HMOV R7,AMOV R4,#27HMOV R5,#10HCALL UIDIVMOV 0AH,R7MOV DISSTART+2,R7MOV R6,08HMOV R7,09HMOV R4,#03HMOV R5,#0E8HCALL UIDIVMOV R4,#00HMOV R5,#0AHCALL UIDIVMOV 0BH,R5MOV DISSTART+1,R5MOV DISSTART+3,#0BHMOV DISSTART,#00HRET;--------------------------------------------------------- DISPLAY:MOV R0,#DISSTART ;获得显示单元首地址MOV R1,#08H ;从第一个数码管开始MOV R2,#04H ;共显示4位数码管DISP1:MOV P3,#00H ;开始清除显示MOV A,@R0 ;获得当前位地址MOV DPTR,#TAB_NU ;获得表头MOVC A,@A+DPTR ;查表获得显示数据MOV R3,AMOV A,R2SUBB A,#02HJNZ LOOP_SKIPMOV A,R3ANL A,#7fHMOV R3,ALOOP_SKIP:MOV LED_DATA,R3 ;显示数据MOV P3,R1 ;开始显示当前位MOV A,R1 ;准备显示下一位RR AMOV R1,A ;下一位INC R0 ;取下一个单元地址LCALL DELAY2MS ;延时 2 MSDJNZ R2,DISP1 ;重复显示下一个;MOV P3,#0FFH ;关闭显示RET ;显示完成,返回;--------------------------------------------------------- ;延时子程序;---------------------------------------------------------DELAY2MS:MOV R6,#10DEL1:MOV R7,#100DJNZ R7,$DJNZ R6,DEL1RETTAB_NU:DB 0C0h,0F9h,0a4h,0B0h,99h,92h,82h,0F8h,80h,90h,0FFH,0BFH;---------------------------------------------------------END实验五源程序org 0000hjmp startorg 0003hljmp keyscanorg 0013hljmp eint1org 0023hljmp serialstart:;定时器初始化mov tmod,#20h;设置定时器1工作在方式2mov tl1,#0f2hmov th1,#0f2hsetb tr1;串口初始化mov scon,#50h;串口工作在方式1,REN=1允许接收数据mov pcon,#0;波特率不加倍setb es;两外部中断使能setb ex1setb ex0setb eamov r1,#10;灭LEDmov r2,#10loop0:mov p1,#00000111b;上五位和下三位分别为行和列,所以送出高低电压检查有没有按键按下call display0;显示将要发送的数据call display2;显示已收到的数据jmp loop0;***********************************;显示程序display0:mov a,r1;将要发送的数据放在r1mov dptr,#tablemovc a,@a+dptrmov p0,aretdisplay2:mov a,r2;接收的数据放在r2mov dptr,#tablemovc a,@a+dptrmov p2,arettable:DB 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90hDB 0FFH;************************************;键盘扫描程序keyscan:call delay;去抖动延时;*************************************;第一列的扫描k10:jb p1.0,k20;扫描正式开始,先检查列1四个键是否有键按下,如果没有,则跳到K20检查列2k11:mov p1,#11110111b;列1有键按下时,P1.0变低,到底是那一个键按下?现在分别输出各行低电平jb p1.0,k12;该行的键不按下时,p1.0为高电平,跳到到K12,检查其它的行mov r1,#1;如果正好是这行的键按下,将寄存器R1写下1,表示1号键按下了k12:mov p1,#11101111bjb p1.0,k13mov r1,#4;如果正好是这行的键按下,将寄存器R1写下4,表示4号键按下了k13:mov p1,#11011111bjb p1.0,k14mov r1,#7;如果正好是这行的键按下,将寄存器R1写下7,表示7号键按下了k14:mov p1,#10111111bjb p1.0,kend;如果现在四个键都没有按下,可能按键松开或干扰,退出扫描(以后相同);mov r3,#10;如果正好是这行的键按下,将寄存器R3写下*,表示*号键按下了jmp kend;已经找到按下的键,跳到结尾;*****************************************************;第二列的扫描k20:jb p1.1,k30;列2检查为高电平再检查列3、4k21:mov p1,#11110111b;列2有健按下时,P0.0会变低,到底是那一行的键按下呢?分别输出行的低电平jb p1.1,k22;该行的键不按下时p0.0为高电平,跳到到K22,检查另外三行mov r1,#2;如果正好是这行的键按下,将寄存器R1写下5,表示5号键按下了(以后相同,不再重复了)k22:mov p1,#11101111bjb p1.1,k23mov r1,#5k23:mov p1,#11011111bjb p1.1,k24mov r1,#8k24:mov p1,#10111111bjb p1.1,kendmov r1,#0jmp kend;已经找到按下的键,跳到结尾;***************************************;第三列的扫描k30:jb p1.2,kendk31:mov p1,#11110111bjb p1.2,k32mov r1,#3k32:mov p1,#11101111bjb p1.2,k33mov r1,#6k33:mov p1,#11011111bjb p1.2,k34mov r1,#9k34:mov p1,#10111111bjb p1.2,kend;mov r3,#12;按下了#号kend:reti;发送命令的中断eint1:clr es;屏蔽因为发送完产生的中断mov a,r1mov sbuf,ajnb ti,$clr tisetb esreti;串口中断接收数据serial:clr rimov a,sbufmov r2,aretidelay:mov r4,#0fhloop2:mov r5,#0ffhloop4:djnz r5,loop4djnz r4,loop2retend实验六源程序ORG 0000H;单片机内存分配申明!TEMPER_L EQU 29H;用于保存读出温度的低8位TEMPER_H EQU 28H;用于保存读出温度的高8位FLAG1 EQU 38H;是否检测到DS18B20标志位a_bit equ 20h ;数码管个位数存放内存位置b_bit equ 21h ;数码管十位数存放内存位置MAIN:LCALL GET_TEMPER;调用读温度子程序;进行温度显示,这里我们考虑用网站提供的两位数码管来显示温度;显示范围00到99度,显示精度为1度;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度;这个转化温度的方法可是我想出来的哦~~非常简洁无需乘于0.0625系数MOV A,29HMOV C,40H;将28H中的最低位移入CRRC AMOV C,41HRRC AMOV C,42HRRC AMOV C,43HRRC AMOV 29H,ALCALL DISPLAY;调用数码管显示子程序;CPL P1.0AJMP MAIN; 这是DS18B20复位初始化子程序INIT_1820:SETB P3.7NOPCLR P3.7;主机发出延时537微秒的复位低脉冲MOV R1,#3TSR1:MOV R0,#107DJNZ R0,$DJNZ R1,TSR1SETB P3.7;然后拉高数据线NOPNOPNOPMOV R0,#25HTSR2:JNB P3.7,TSR3;等待DS18B20回应DJNZ R0,TSR2LJMP TSR4 ; 延时TSR3:SETB FLAG1 ; 置标志位,表示DS1820存在;CLR P1.7;检查到DS18B20就点亮P1.7LEDLJMP TSR5TSR4:CLR FLAG1 ; 清标志位,表示DS1820不存在;CLR P1.1LJMP TSR7TSR5:MOV R0,#117TSR6:DJNZ R0,TSR6 ; 时序要求延时一段时间TSR7:SETB P3.7RET; 读出转换后的温度值GET_TEMPER:SETB P3.7LCALL INIT_1820;先复位DS18B20JB FLAG1,TSS2CLR P1.2RET ; 判断DS1820是否存在?若DS18B20不存在则返回TSS2:CLR P1.3;DS18B20已经被检测到!!!!!!!!!!!!!!!!!! MOV A,#0CCH ; 跳过ROM匹配LCALL WRITE_1820MOV A,#44H ; 发出温度转换命令LCALL WRITE_1820;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒LCALL DISPLAYLCALL INIT_1820;准备读温度前先复位MOV A,#0CCH ; 跳过ROM匹配LCALL WRITE_1820MOV A,#0BEH ; 发出读温度命令LCALL WRITE_1820LCALL READ_18200; 将读出的温度数据保存到35H/36HCLR P1.4RET;写DS18B20的子程序(有具体的时序要求)WRITE_1820:MOV R2,#8;一共8位数据CLR CWR1:CLR P3.7MOV R3,#6DJNZ R3,$RRC AMOV P3.7,CMOV R3,#23DJNZ R3,$SETB P3.7NOPDJNZ R2,WR1SETB P3.7RET; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据READ_18200:MOV R4,#2 ; 将温度高位和低位从DS18B20中读出MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)RE00:MOV R2,#8;数据一共有8位RE01:CLR CSETB P3.7NOPNOPCLR P3.7NOPNOPNOPSETB P3.7MOV R3,#9RE10:DJNZ R3,RE10MOV C,P3.7MOV R3,#23RE20:DJNZ R3,RE20RRC ADJNZ R2,RE01MOV @R1,ADEC R1DJNZ R4,RE00RET;显示子程序display:MOV A,29H;将29H中的十六进制数转换成10进制MOV B,#10 ;10进制/10=10进制DIV ABMOV b_bit,A ;十位在aMOV a_bit,B ;个位在bMOV dptr,#numtab ;指定查表启始地址MOV R0,#4dpl1: mov r1,#250 ;显示1000次dplop: mov a,a_bit ;取个位数MOVC A,@A+DPTR ;查个位数的7段代码MOV P0,A ;送出个位的7段代码SETB P2.1 ;开个位显示ACALL d1ms ;显示1msCLR p2.1MOV a,b_bit ;取十位数MOVC A,@A+DPTR ;查十位数的7段代码MOV P0,A ;送出十位的7段代码SETB P2.0 ;开十位显示ACALL d1ms ;显示1msCLR P2.0DJNZ R1,dplop ;100次没完循环DJNZ R0,dpl1 ;4个100次没完循环RET;1MS延时(按12MHZ算)D1MS: MOV R7,#80DJNZ R7,$RET;实验板上的7段数码管0~9数字的共阴显示代码numtab:DB 0C0H;0DB 0F9H;1DB 0A4H;2DB 0B0H;3DB 099H;4DB 092H;5DB 082H;6DB 0F8H;7DB 080H;8DB 090H;9END实验七源程序;************* IO口定义**************/EOC BIT P3.0CS BIT P2.7;/****************************** 用户定义宏***********************************/ LED_0 DATA 30H ;显示缓冲区LED_1 DATA 31HLED_2 DATA 32HLED_3 DATA 33HADC DATA 34HORG 0000HLJMP MAINORG 0100HMAIN:MOV A,#0FFHMOV P0,AMOV A,#00HMOV P2,AMAIN1: MOV DPTR,#7FFFHMOV A,#0FHMOVX @DPTR,ALOOP: JNB EOC,LOOP ;等待转换结束MOVX A,@DPTRMOV ADC,A;------数据处理,已备显示------------------------MOV A,ADC ;将AD转换结果转换成BCD码MOV B,#0C3H ;乘以19.5MVMUL ABMOV R7,AMOV R6,BHB2: CLR A ;BCD码初始化CLR CMOV R3,AMOV R4,AMOV R5,AMOV R2,#10H ;转换双字节十六进制整数HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中RLC AMOV R7,AMOV A,R6RLC AMOV R6,AMOV A,R5 ;BCD码带进位自身相加,相当于乘2ADDC A,R5DA A ;十进制调整MOV R5,AMOV A,R4ADDC A,R4DA AMOV R4,AMOV A,R3ADDC A,R3MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整DJNZ R2,HB3MOV A,R5SWAP AANL A,#0FHMOV LED_0,AMOV A,R4ANL A,#0FHMOV LED_1,AMOV A,R4SWAP AANL A,#0FHMOV LED_2,AMOV A,R3ANL A,#0FHMOV LED_3,ALCALL DISP ;调用显示子程序;LCALL DELAYLJMP MAIN1;//////数码管显示子程序/////////////////////////////////////////////// DISP:MOV DPTR,#TABLE ;送字型码表首地址MOV A,LED_0 ;数码显示子程序MOVC A,@A+DPTRMOV P1,ASETB P2.3LCALL DELAYCLR P2.3MOV A,LED_1MOVC A,@A+DPTRMOV P1,ASETB P2.2LCALL DELAYCLR P2.2MOV A,LED_2MOVC A,@A+DPTRMOV P1,ASETB P2.1LCALL DELAYCLR P2.1MOV A,LED_3MOVC A,@A+DPTRMOV P1,ACLR P1.7SETB P2.0LCALL DELAYCLR P2.0RET;//////延时子程序//////////////////////////////////// DELAY: MOV R6,#0AH ;延时5毫秒D1: MOV R7,#0FAHDJNZ R7,$DJNZ R6,D1RET;//////数码管字形码表///////////////////////////////// TABLE:DB 0C0H;0DB 0F9H;1DB 0A4H;2DB 0B0H;3DB 099H;4DB 092H;5DB 082H;6DB 0F8H;7DB 080H;8DB 090H;9;/////程序结束//////////////////////////////////////// END。