文档库 最新最全的文档下载
当前位置:文档库 › 单片机的一些常用程序

单片机的一些常用程序

单片机的一些常用程序
单片机的一些常用程序

单片机复习程序1、从左到右的流水灯

/* 名称:从左到右的流水灯

说明:接在P0 口的8 个LED

从左到右循环依次点亮,产生走

马灯效果

*/

#include

#include

#define uchar unsigned char

#define uint unsigned int//延时

void DelayMS(uint x)

{

uchar i;

while(x--)

{

for(i=0;i<120;i++);

}

}

//主程序

void main()

{

P0=0xfe;

while(1)

{

P0=_crol_(P0,1); //P0 的值向左循环移动DelayMS(150);

}

}

2、交通灯

/* 名称:LED 模拟交通灯

说明:东西向绿灯亮若干秒,黄

灯闪烁5 次后红灯亮,红灯亮后,南北向由红灯变为绿灯,若干秒后南北

向黄灯闪烁5 此后变红灯,东西向变绿灯,如此重复。

*/#include

#define uchar unsigned char

#define uint unsigned int

sbit RED_A=P0^0; //东西向灯

sbit YELLOW_A=P0^1;

sbit GREEN_A=P0^2;

sbit RED_B=P0^3; //南北向灯

sbit YELLOW_B=P0^4;

sbit GREEN_B=P0^5;

uchar Flash_Count=0,Operation_Type=1; //闪烁次数,操作类型变量

//延时

void DelayMS(uint x)

{

uchar i;

while(x--) for(i=0;i<120;i++);

}

//交通灯切换

void Traffic_Light()

{

switch(Operation_Type)

{

case 1: //东西向绿灯与南北向红灯亮

RED_A=1;YELLOW_A=1;GREEN_A=0;

RED_B=0;YELLOW_B=1;GREEN_B=1;

DelayMS(2000);

Operation_Type=2;

break;

case 2: //东西向黄灯闪烁,绿灯关闭DelayMS(300);

YELLOW_A=~YELLOW_A;GREEN_A=1; if(++Flash_Count!=10) return; //闪烁5 次Flash_Count=0;

Operation_Type=3;

break;

case 3: //东西向红灯,南北向绿灯亮

RED_A=0;YELLOW_A=1;GREEN_A=1; RED_B=1;YELLOW_B=1;GREEN_B=0; DelayMS(2000);

Operation_Type=4;

break;

case 4: //南北向黄灯闪烁5 次

DelayMS(300);

YELLOW_B=~YELLOW_B;GREEN_B=1; if(++Flash_Count!=10) return;

Flash_Count=0;

Operation_Type=1;

}

}

//主程序

void main()

{

while(1) Traffic_Light();

}

3、定时器控制交通指示灯

/* 名称:定时器控制交通指示灯

说明:东西向绿灯亮5s 后,黄灯闪烁,闪烁5 次亮红灯,红灯亮后,南北向由红灯变成绿灯,5s 后南北向黄灯闪烁,闪烁5 次后亮红灯,东西向绿灯亮,如此往复。

*/

#include

#define uchar unsigned char

#define uint unsigned int

sbit RED_A=P0^0; //东西向指示灯

sbit YELLOW_A=P0^1;

sbit GREEN_A=P0^2;

sbit RED_B=P0^3; //南北向指示灯

sbit YELLOW_B=P0^4;

sbit GREEN_B=P0^5;

//延时倍数,闪烁次数,操作类型

变量

uchar Time_Count=0,Flash_Count=0,Operation_Type=1; //定时器0 中断函数

void T0_INT() interrupt 1

{

TL0=-50000/256;

TH0=-50000%256;

switch(Operation_Type)

{

case 1: //东西向绿灯与南北向红灯亮5s

RED_A=0;YELLOW_A=0;GREEN_A=1;

RED_B=1;YELLOW_B=0;GREEN_B=0;

if(++Time_Count!=100) return; //5s(100*50ms)切换Time_Count=0;

Operation_Type=2;

break;

case 2: //东西向黄灯开始闪烁,绿灯关闭

if(++Time_Count!=8) return;

Time_Count=0;

YELLOW_A=~YELLOW_A;GREEN_A=0;

if(++Flash_Count!=10) return; //闪烁

Flash_Count=0;

Operation_Type=3;

break;

case 3: //东西向红灯与南北向绿灯亮5s

RED_A=1;YELLOW_A=0;GREEN_A=0;

RED_B=0;YELLOW_B=0;GREEN_B=1;

if(++Time_Count!=100) return; //5s(100*50ms)切换Time_Count=0;

Operation_Type=4;

break;

case 4: //南北向黄灯开始闪烁,绿灯关闭

if(++Time_Count!=8) return;

Time_Count=0;

YELLOW_B=~YELLOW_B;GREEN_A=0;

if(++Flash_Count!=10) return; //闪烁

Flash_Count=0;

Operation_Type=1;

break;

}

}

//主程序

void main()

{

TMOD=0x01; //T0 方式1

IE=0x82;

TR0=1;

while(1);

}

4、单只数码管循环显示0~9

/* 名称:单只数码管循环显示0~9

说明:主程序中的循环语句反复将0~9 的段码送至P0 口,使数字0~9 循环显示

*/

#include

#include

#define uchar unsigned char

#define uint unsigned int

uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x 80,0x90,0xff};

//延时

void DelayMS(uint x)

{

uchar t;

while(x--) for(t=0;t<120;t++);

}

//主程序

void main()

{

uchar i=0;

P0=0x00;

while(1)

{

P0=~DSY_CODE[i];

i=(i+1)%10;

DelayMS(300);

}

}

5、8只数码管动态显示多个不同字符

/* 名称:8 只数码管动态显示多个不同字符说明:数码管动态扫描显示0~7。

*/

#include

#include

#define uchar unsigned char

#define uint unsigned int

uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x 80,0x90};

//延时

void DelayMS(uint x)

{

uchar t;

while(x--) for(t=0;t<120;t++);

}

//主程序

void main()

{

uchar i,wei=0x80;

while(1)

{

for(i=0;i<8;i++)

{

P0=0xff;

P0=DSY_CODE[i]; //发送段码

wei=_crol_(wei,1);

P2=wei; //发送位码

DelayMS(2);

}

}

}

6、K1-K4 按键状态显示

/* 名称:K1-K4 按键状态显示

说明:K1、K2 按下时LED 点亮,松开时熄灭,

K3、K4 按下并释放时LED 点亮,再次按下并释放时熄灭;*/

#include

#define uchar unsigned char

#define uint unsigned int

sbit LED1=P0^0;

sbit LED2=P0^1;

sbit LED3=P0^2;

sbit LED4=P0^3;

sbit K1=P1^0;

sbit K2=P1^1;

sbit K3=P1^2;

sbit K4=P1^3;

//延时

void DelayMS(uint x)

{

uchar i;

while(x--) for(i=0;i<120;i++); }

//延时

void DelayMS(uint x)

{

uchar i;

while(x--) for(i=0;i<120;i++); }

//主程序

void main()

{

P0=0xff;

P1=0xff;

while(1)

{

LED1=K1;

LED2=K2;

if(K3==0)

{

while(K3==0);

LED3=~LED3;

}

if(K4==0)

{

while(K4==0);

LED4=~LED4;

}

DelayMS(10);

}

}

7、INT0 中断计数

/* 名称:INT0 中断计数

说明:每次按下计数键时触发

INT0 中断,中断程序累加计数,计数值显示在 3 只数码管上,按下清零键时数码管清零

*/

#include

#define uchar unsigned char

#define uint unsigned int

//0~9 的段码

uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x 7f,0x6f,0x00};

//计数值分解后各个待显示的数位

uchar DSY_Buffer[]={0,0,0};

uchar Count=0;

sbit Clear_Key=P3^6;

//数码管上显示计数值

void Show_Count_ON_DSY()

{

DSY_Buffer[2]=Count/100; //获取3 个数

DSY_Buffer[1]=Count%100/10;

DSY_Buffer[0]=Count%10;

DSY_Buffer[1]=Count%100/10;

DSY_Buffer[0]=Count%10;

if(DSY_Buffer[2]==0) //高位为0 时不显示

{

DSY_Buffer[2]=0x0a;

if(DSY_Buffer[1]==0) //高位为0,若第二位为0 同样不显示DSY_Buffer[1]=0x0a;

}

P0=DSY_CODE[DSY_Buffer[0]];

P1=DSY_CODE[DSY_Buffer[1]]; P2=DSY_CODE[DSY_Buffer[2]]; }

//主程序

void main()

{

P0=0x00;

P1=0x00;

P2=0x00;

IE=0x81; //允许INT0 中断

IT0=1; //下降沿触发

while(1)

{

if(Clear_Key==0) Count=0; //清0 Show_Count_ON_DSY();

}

}

//INT0 中断函数

void EX_INT0() interrupt 0

{

Count++; //计数值递增

}

8、10s 的秒表

* 名称:10s 的秒表

说明:首次按键计时开始,再次按键暂停,第三次按键清零。*/

#include

#define uchar unsigned char

#define uint unsigned int

sbit K1=P3^7;

uchar

i,Second_Counts,Key_Flag_Idx;

bit Key_State;

uchar

DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x 7f,0x6f};

//延时

void DelayMS(uint ms)

{

uchar t;

while(ms--) for(t=0;t<120;t++);

}

//处理按键事件

void Key_Event_Handle()

{

if(Key_State==0)

{

Key_Flag_Idx=(Key_Flag_Idx+1)%3;

switch(Key_Flag_Idx)

{

case 1: EA=1;ET0=1;TR0=1;break;

case 2: EA=0;ET0=0;TR0=0;break;

case 0: P0=0x3f;P2=0x3f;i=0;Second_Counts=0;

}

}

}

//主程序

void main()

{

P0=0x3f; //显示00

P2=0x3f;

i=0;

Second_Counts=0;

Key_Flag_Idx=0; //按键次数(取值0,1,2,3)Key_State=1; //按键状态

TMOD=0x01; //定时器0 方式1

TH0=(65536-50000)/256; //定时器0:15ms TL0=(65536-50000)%256;

while(1)

{

if(Key_State!=K1)

{

DelayMS(10);

Key_State=K1;

Key_Event_Handle();

}

}

}

//T0 中断函数

void DSY_Refresh() interrupt 1

{

TH0=(65536-50000)/256; //恢复定时器0 初值TL0=(65536-50000)%256;

if(++i==2) //50ms*2=0.1s 转换状态

{

i=0;

Second_Counts++;

P0=DSY_CODE[Second_Counts/10];

P2=DSY_CODE[Second_Counts%10];

if(Second_Counts==100) Second_Counts=0; //满100(10s)后显示00

}

}

9、控制单只LED闪烁

/* 名称:闪烁的LED

说明:LED 按设定的时间间隔闪烁

*/

#include

#define uchar unsigned char

#define uint unsigned int

sbit LED=P1^0;

//延时

void DelayMS(uint x)

{

uchar i;

while(x--)

{

for(i=0;i<120;i++);

}

}

//主程序

void main() {

while(1)

{

LED=~LED; DelayMS(150); }

}

51单片机常用子程序汇总

目录 1、通过串口连续发送n个字节的数据 /*************************************************************** 模块功能:通过串口连续发送n个字节的数据 参数说明: s:待发送数据的首地址 n:要发送数据的字节数 ***************************************************************/ void SendD(unsigned char *s,unsigned char n) { unsigned char unX; if(n>0) { ES=0; // 关闭串口中断 for(unX=0;unX #include #define Nop() _nop_() //空指令

sbit SDA=P1^3; sbit SCL=P1^2; bit ACK; void Start_I2c() { SDA=1; Nop(); SCL=1; Nop(); Nop(); Nop(); Nop(); Nop(); SDA=0; Nop(); Nop(); Nop(); Nop(); Nop(); SCL=0; //钳住I2C总线,准备发送或接受数据Nop(); Nop(); } (2)结束总线函数 /*************************************************************** 模块功能:发送I2C总线结束条件 ***************************************************************/ void Stop_I2c() { SDA=0; Nop(); SCL=1; Nop(); Nop(); Nop(); Nop(); Nop(); SDA=1; Nop(); Nop(); Nop(); Nop();

汇编51单片机考试常见试题

一、填空题 1.单片机是把中央处理器、存储器、定时器/计数器以及I/O接口电路等主要计算机部件集成在一块集成电路芯片上的微型计算机。 2.除了单片机这一名称之外,单片机还可称为微控制器、嵌入式控制器。 3.计算机的系统总线有地址总线、控制总线和数据总线。 4.80C51单片机基本型内部RAM有 128 个字节单元,这些单元可以分为三个用途不同的区域,一是工作寄存器区、二是位寻址区、三是数据缓冲区。5.8051单片机有2 个16位定时/计数器。 6.单片机存储器的主要功能是存储程序和数据。80C51含4 KB掩膜ROM。7.80C51在物理上有4个独立的存储器空间。 8.通常、单片机上电复位时PC= 0000H,SP= 07H;而工作寄存器则缺省采用第00 组,这组寄存器的地址范围是从00H~ 07H。 9.8051的堆栈是向地址的高端生成的。入栈时SP先加1,再压入数据。10.使用8031芯片时,需将/EA引脚接低电平,因为其片内无程序存储器。11.MCS-51特殊功能寄存器只能采用直接寻址方式。 12.汇编语言中可以使用伪指令,它们不是真正的指令,只是用来对汇编过程进行某种控制。 13.半导体存储器的最重要的两个指标是存储容量和存储速度。 14.当PSW4=1,PSW3=0时,工作寄存器Rn,工作在第2组。 15.在8051单片机中,由 2 个振荡(晶振)周期组成1个状态(时钟)周期,由 6个状态周期组成1个机器周期。 16.假定累加器A的内容30H,执行指令:1000H:MOVC A,@A+PC后,把程序存储器1031H单元的内容送累加器A中。 17.MCS-51单片机访问外部存储器时,利用ALE信号锁存来自P0口的低8位地址信号。 18.内部RAM中,位地址为30H的位,该位所在字节的字节地址为26H。 19.若A中的内容为63H,那么,P标志位的值为0。 20.在基址加变址寻址方式中,以累加器A作变址寄存器,以DPTR或PC作基址寄存器。 21.指令格式是由操作码和操作数所组成,也可能仅由操作码组成。 22.通过堆栈操作实现子程序调用,首先就要把PC的内容入栈,以进行断点保护。调用返回时,再进行出栈保护,把保护的断点送回到PC。 23.MCS-51单片机程序存储器的寻址范围是由程序计数器PC的位数所决定的,因为MCS-51的PC是16位的,因此其寻址的范围为64KB。 24.在寄存器间接寻址方式中,其“间接”体现在指令中寄存器的内容不是操作数,而是操作数的地址。 25.假定累加器A中的内容为30H,执行指令1000H:MOVC A,@A+PC 后,把程序存储器1031H单元的内容送入累加器A中。 26.12根地址线可寻址4 KB存储单元。 27.:假定A=55H,R3=0AAH,在执行指令ANL A,R3后,A=00H,R3=0AAH。28.MCS-51的P0口作为输出端口时,每位能驱动8个LSTTL负载。 29.MCS-51有4个并行I/O口,其中P1~P3是准双向口,所以由输出转输入时必须先写入“1”。 30.MCS-51的堆栈是软件填写堆栈指针临时在片内数据存储器内开辟的区域。

51单片机实用汇编程序库(word)

51 单片机实用程序库 4.1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#11111110B MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY: MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波输出 程序介绍:P1.0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM): ORG 0000H MAIN: ;直接利用P1.0 口产生高低电平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH DJNZ R1,$ RET

五、定时器功能实例 5.1 定时1 秒报警 程序介绍:定时器1 每隔1 秒钟将p1.o 的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0 入口 MAIN: TFLA G EQU 34H ;时间秒标志,判是否到50 个 0.2 秒,即50*0.2=1 秒 MOV TMOD,#00000001B;定时器0 工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 11 SETB EA ;开总中断 SETB ET0 ;开定时器0 中断允许 SETB TR0 ;开定时0 运行 SETB P1.0 LOOP: AJMP LOOP DIN0: ;是否到一秒//////////////////////////////////////// INCC: INC TFLAG MOV A,TFLAG CJNE A,#20,RE MOV TFLAG,#00H CPL P1.0 ;////////////////////////////////////////////////// RE: MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 RETI END 5.2 频率输出公式 介绍:f=1/t s51 使用12M 晶振,一个周期是1 微秒使用定时器1 工作于方式0,最大值为65535,以产生200HZ 的频率为例: 200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电

单片机的各种程序

单片机的各种程序 1. 八个灯循环点亮 ORG 0030H START:MOV SP,#5FH MOV R2,#08H MOV A,#0FEH NEXT:MOV P1,A ACALL DELAY RL A DJNZ R2,NEXT MOV R2,#08H MOV A,#7FH NEXT1:MOV P1,A ACALL DELAY RR A DJNZ R2,NEXT1 SJMP START DELAY:MOV R3,#0FFH DEL1:MOV R4,#0FFH DJNZ R4,$ DJNZ R3,DEL1 RET END 2. 查表的例子 org 0000h start: mov dptr,#ledtab movc a,@a+dptr mov p0,a sjmp start ledtab: db:0c0h,0f9h,04h,0b0h,99h,92h,82h,0f8h,80h end https://www.wendangku.net/doc/6e15534011.html, 0000H MOV A,#0FEH SHIFT: LCALL FLASH

RL A SJMP SHIFT FLASH: MOV R2,0AH FLASH1:MOV P1,A LCALL DELAY MOV P1,#0FFH LCALL DELAY DJNZ R2,FLASH1 RET DELAY:MOV R5,#200 D1:MOV R6,#123 NOP DJNZ R6,$ DJNZ R5,D1 RET 4.数码显示管显示2015循环 org 0000h start: loop: mov p1,#0c0h lcall DELAY mov p1,#0f9h lcall DELAY mov p1,#0a4h lcall DELAY mov p1,#0b0h lcall DELAY mov p1,#99h lcall DELAY mov p1,#92h lcall DELAY mov p1,#82h lcall DELAY mov p1,#0f8h lcall DELAY mov p1,#80h lcall DELAY

51单片机实用子程序(汇编)

《MCS-51单片机实用子程序库(96年版)》 周航慈 目前已有若干版本的子程序库公开发表,它们各有特色。笔者在1988年也编制了两个子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方 面作了一些工作。本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。经过八年来全国广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错误,成为现在这个最新版本。 本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。 (2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。 (3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理 程序的工作变得更简单直观。 在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈 需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。程序 清单中开列了四个栏目:标号、指令、操作数、注释。为方便读者理解,注释尽力详细。 子程序库的使用方法如下: 1.将子程序库全部内容链接在应用程序之后,统一编译即可。优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。 2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。优点是程序紧凑,缺点是需要对子程序库进行仔细删节。 (一)MCS-51定点运算子程序库及其使用说明 定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下: 1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。地址小的单元存放数据的高字节。例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,(31H)=34H,(32H)=56H。 2.运算精度:单次定点运算精度为结果最低位的当量值。 3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无 关的或非消耗性的信息,程序就具有较好的透明性。

最经典的51单片机经典流水灯汇编程序

单片机流水灯汇编程序设计 开发板上的8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。 程序A: ;用最直接的方式实现流水灯 ORG 0000H START:MOV P1,#01111111B ;最下面的LED点亮 LCALL DELAY;延时1秒 MOV P1,#10111111B ;最下面第二个的LED点亮 LCALL DELAY;延时1秒 MOV P1,#11011111B ;最下面第三个的LED点亮(以下省略) LCALL DELAY MOV P1,#11101111B LCALL DELAY MOV P1,#11110111B LCALL DELAY MOV P1,#11111011B LCALL DELAY MOV P1,#11111101B LCALL DELAY MOV P1,#11111110B LCALL DELAY MOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒 AJMP START ;反复循环 ;延时子程序,12M晶振延时约250毫秒 DELAY: MOV R4,#2 L3: MOV R2 ,#250 L1: MOV R3 ,#250 L2: DJNZ R3 ,L2 DJNZ R2 ,L1 DJNZ R4 ,L3 RET END 程序B: ;用移位方式实现流水灯

ajmp main ;跳转到主程序 org 0030h ;主程序起始地址 main: mov a,#0feh ;给A赋值成11111110 loop: mov p1,a ;将A送到P1口,发光二极管低电平点亮 lcall delay ;调用延时子程序 rl a ;累加器A循环左移一位 ajmp loop ;重新送P1显示 delay: mov r3,#20 ;最外层循环二十次 d1: mov r4,#80 ;次外层循环八十次 d2: mov r5,#250 ;最内层循环250次 djnz r5,$ ;总共延时2us*250*80*20=0.8S djnz r4,d2 djnz r3,d1 ret end 51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。 ORG 0 ;程序从0地址开始 START: MOV A,#0FEH ;让ACC的内容为11111110 LOOP: MOV P2,A ;让P2口输出ACC的内容 RR A ;让ACC的内容左移 CALL DELAY ;调用延时子程序 LJMP LOOP ;跳到LOOP处执行 ;0.1秒延时子程序(12MHz晶振)=================== DELAY: MOV R7,#200 ;R7寄存器加载200次数 D1: MOV R6,#250 ;R6寄存器加载250次数 DJNZ R6,$ ;本行执行R6次 DJNZ R7,D1 ;D1循环执行R7次 RET ;返回主程序

单片机汇编子程序

; 1, 以下的程序是一些关于数据转换与计算的子程序.但由于本人现在很忙,仅测试了 ; 其中的很少一部分.本人不保证所有的程序都是正确的,并且由于使用不同的编译器, ; 即使是本人已测试过的程序,您也可能要修改一些指令. ; 2. 一旦将其整理测试完毕,将会免费发送. ; 3. 若有任何问题,与TongZhongZhi@https://www.wendangku.net/doc/6e15534011.html,联系 ;******************************************************************** 函数名说明 BIN3toBCD4 三字节二进制整数--->>BCD码四字节转换 SIBITD 单字节二进制整数-->>BCD码转换子程序 ADDM1 三字节加法子程序并显示和值 SUBM 多字节减法子程序 SUBM4 四字节乘四字节乘法子程序 CHU3 五字节除五字节除法子程序 CHU4 双字节除单字节除法子程序 CHU5 双字节除单字节商为双字节除法子程序 CHU6 三字节除单字节商为三字节除法了程序 CHU7 三字节除双字节商为三字节除法子程序 CHU8 四字节除双字节商为二字节除法子程序 CHU9 三字节或二字节的倒数结果为三字节除法子程序 CHU10 带符号双字节除单字节除法子程序 SQRT 双字节平方根子程序 BCDAD1 单字节BCD码加法子程序 BCDAD2 四字节BCD码加法子程序 BCDSUB3 单字节BCD码减法子程序 DSUB2 四字节BCD码减法子程序 BCDSUB4 单字节BCD码乘法子程序 DCHFA 十进制数8位乘8位(四字节BCD码乘四字节BCD码)乘法子程序DCHU1 单字节BCD码除法子程序 DCHU2 四字节BCD码除法子程序 DSQR1 单字节BCD码平方根子程序 DSQR2 双字节BCD码平方根子程序 DSQR3 三字节BCD码平方根子程序 ASBIN1 ASCII码--->>二进制数转换子程序 EXASC1 十六进制--->>ASCII码转换子程序 BCDAS1 BCD码--->>ASCII码转换子程序 BINBCD 双字节二进制-->>三字节BCD码转换子程序 DTOB4 四位BCD码--->>十六位二进制数转换子程序 BINASC 二进制数--->>ASCII码字符串转换子程序 BCH 二进制数--->>十六进制数转换子程序 ASCBCD ASCII码-->>BCD码转换子程序 ASCHEX ASCII码-->>十六进制数转换子程序 BCDBIN BCD码--->>二进制数转换子程序

51单片机考试常见试题简答 题

简答题部分 1、什么叫堆栈? 答:堆栈是在片内RAM中专门开辟出来的一个区域,数据的存取是以"后进先出"的结构方式处理的。实质上,堆栈就是一个按照"后进先出"原则组织的一段内存区域。 2、进位和溢出? 答:两数运算的结果若没有超出字长的表示范围,则由此产生的进位是自然进位;若两数的运算结果超出了字长的表示范围(即结果不合理),则称为溢出。 3、在单片机中,片内ROM的配置有几种形式?各有什么特点? 答:单片机片内程序存储器的配置形式主要有以下几种形式:(1)掩膜(Msak)ROM型单片机:内部具有工厂掩膜编程的ROM,ROM中的程序只能由单片机制造厂家用掩膜工艺固 化,用户不能修改ROM中的程序。掩膜ROM单片机适合于 大批量生产的产品。用户可委托芯片生产厂家采用掩膜方法 将程序制作在芯片的ROM。 (2)EPROM型单片机:内部具有紫外线可擦除电可编程的只读存储器,用户可以自行将程序写入到芯片内部的EPROM 中,也可以将EPROM中的信息全部擦除。擦去信息的芯片 还可以再次写入新的程序,允许反复改写。 (3)无ROM型单片机:内部没有程序存储器,它必须连接程序存储器才能组成完整的应用系统。 无ROM型单片机价格低廉,用户可根据程序的大小来选择外接 程序存储器的容量。这种单片机扩展灵活,但系统结构较复 杂。 (4)E2ROM型单片机:内部具有电可擦除叫可编程的程序存储器,使用更为方便。该类型目前比较常用 (5) OTP(One Time Programmable)ROM单片机:内部具有一次可编程的程序存储器,用户可以在编程器上将程序写入片 内程序存储器中,程序写入后不能再改写。这种芯片的价 格也较低。 4、什么是单片机的机器周期、状态周期、振荡周期和指令周期?它们之间是什么关系? 答:某条指令的执行周期由若干个机器周期(简称M周期)构成,一个机器周期包含6个状态周期(又称时钟周期,简称S周期),而一个状态周期又包含两个振荡周期(P1和P2,简称P周期)。也就是说,指令执行周期有长有短,但一个机器周期恒等于6个状态周期或12个振荡周

单片机汇编语言经典一百例

51单片机实用程序库 4.1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#11111110B MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY:

MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波输出 程序介绍:P1.0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM): ORG 0000H MAIN: ;直接利用P1.0口产生高低电平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH

DJNZ R1,$ RET END 五、定时器功能实例 5.1 定时1秒报警 程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0入口 MAIN: TFLA G EQU 34H ;时间秒标志,判是否到50个 0.2秒,即50*0.2=1秒 MOV TMOD,#00000001B;定时器0工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05秒,定时 20次则一秒 11 SETB EA ;开总中断

基于51单片机的音乐程序

基于51单片机的按键切换播放音乐 原理图: 引脚说明:共5个按键,分别接51单片机的P0~P4引脚,前4个按键控制播放设置好的四首音乐,第5个按键用来关闭音乐。按键采用中断方式,任意时刻按下任意按键则立即进入所按按键的功能;蜂鸣器接单片机的P3.6口。 仿真说明:使用proteus仿真,晶振:12MHZ。 程序代码如下: /*12Mhz晶振工作*/ #include #define uint unsigned int #define uchar unsigned char sbit voice=P3^6; uchar code sound1[]={0xff, 0x40,0x80,0x30,0x40,0x2b,0x40,0x26,0x80,0x24,0x10,0x26,0x40,0x30,0x40, 0x2b,0x80,0x30,0x40,0x39,0x40,0x30,0xc0,0x40,0x80,0x30,0x40,0x2b,0x40, 0x26,0x40,0x26,0x20,0x24,0x20,0x20,0x40,0x30,0x40,0x24,0x80,0x26,0x10,

0x20,0x40,0x19,0x40,0x19,0x80,0x1c,0x10,0x1c,0x80,0x20,0x40,0x20,0x20, 0x1c,0x20,0x19,0x40,0x1c,0x20,0x20,0x20,0x26,0xc0,0x24,0x80,0x24,0x10, 0x20,0x40,0x1c,0x40,0x20,0x40,0x24,0x20,0x26,0x20,0x2b,0x80,0x33,0x40, 0x33,0x20,0x39,0x20,0x40,0x40,0x39,0x40,0x30,0xc0,0x18,0x80,0x1c,0x80, 0x24,0x80,0x20,0x10,0x1c,0x80,0x19,0x40,0x19,0x20,0x19,0x20,0x19,0x40, 0x1c,0x20,0x20,0x20,0x26,0xc0,0x18,0x80,0x1c,0x80,0x24,0x80,0x20,0x10, 0x1c,0x80,0x1c,0x40,0x1c,0x20,0x1c,0x20,0x1c,0x40,0x24,0x20,0x26,0x20, 0xff,0x20,0x00};//同一首歌*/ uchar code sound2[]={0xff, 0x18,0x40,0x1c,0x20,0x18,0x20,0x13,0x40,0x13,0x20,0x15,0x20,0x13,0x20, 0x15,0x20,0x13,0x20,0x15,0x20,0x18,0x20,0x19,0x20,0x1c,0x20,0x20,0x20, 0x1c,0x40,0x19,0x20,0x18,0x20,0x15,0x40,0x10,0x80, 0x13,0x10,0x10,0x40,0x15,0x10,0x13,0x10,0x18,0x10,0x1c,0x10,0x26,0x10, 0x13,0x10,0x18,0x10,0x1c,0x10,0x26,0x10,0x13,0x10,0x18,0x10,0x1c,0x10, 0x26,0x10,0x13,0x10,0x18,0x10,0x1c,0x10,0x26,0x10,0x15,0x10,0x19,0x10, 0x20,0x10,0x2b,0x10,0x15,0x10,0x19,0x10,0x20,0x10,0x2b,0x10,0x15,0x10, 0x19,0x10,0x20,0x10,0x2b,0x10,0x15,0x10,0x19,0x10,0x20,0x10,0x2b,0x10, 0x18,0x10,0x1c,0x10,0x24,0x10,0x30,0x10,0x18,0x10,0x1c,0x10,0x24,0x10, 0x30,0x10,0x19,0x10,0x20,0x10,0x2b,0x10,0x19,0x10,0x19,0x10,0x20,0x10, 0x2b,0x10,0x19,0x10,0x18,0xc0,0xff,0x40,0x40,0x10,0x39,0x20,0x30,0x20, 0x2b,0x20,0x30,0x20,0x2b,0x20,0x26,0x20,0x26,0x20,0x26,0x20,0x26,0x20, 0x26,0x20,0x2b,0x20,0x30,0x20,0x2b,0x20,0x26,0x20,0x26,0x20,0x26,0x20, 0x26,0x20,0x26,0x20,0x2b,0x20,0x30,0x20,0x2b,0x40,0x30,0x10,0x30,0x20, 0x39,0x20,0x30,0x40,0x2b,0x10,0x2b,0x20,0x26,0x20,0x26,0x80,0x40,0x10, 0x39,0x20,0x30,0x20,0x2b,0x20,0x30,0x20,0x2b,0x20,0x30,0x20,0x30,0x20, 0x20,0x20,0x20,0x20,0x26,0x20,0x2b,0x20,0x26,0x20,0x2b,0x20,0x30,0x20, 0x30,0x20,0x26,0x20,0x26,0x20,0x26,0x20,0x2b,0x20,0x30,0x20,0x2b,0x40, 0x2b,0x10,0x2b,0x20,0x2b,0x20,0x2b,0x40,0x30,0x10,0x30,0x20,0x39,0x20,

51单片机实用汇编程序库

51 单片机实用程序库 4、1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮得效果。实际应用中例如: 广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP、ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A;灭所有得灯 MOV A,#11111110B MAIN1: MOV P1,A;开最左边得灯 ACALL DELAY ;延时 RL A ;将开得灯向右边移 AJMP MAIN ;循环 DELAY: MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ30H,D1 RET END 4、2 方波输出 程序介绍:P1、0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN、ASM): ORG 0000H MAIN: ;直接利用P1、0 口产生高低电平地形成方波////////////// ACALL DELAY SETB P1、0 ACALL DELAY 10 CLR P1、0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH DJNZ R1,$ RET

五、定时器功能实例 5、1 定时1 秒报警 程序介绍:定时器1 每隔1 秒钟将p1、o得输出状态改变1 次,以达到定时报警得目得。实际应用例如:定时报警器。 程序实例(DIN1、ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0入口 MAIN: TFLA G EQU34H ;时间秒标志,判就是否到50个 0、2 秒,即50*0、2=1 秒 MOVTMOD,#00000001B;定时器0 工作于方式 1 MOVTL0,#0AFH MOV TH0,#3CH ;设定时时间为0、05 秒,定时 20 次则一秒 11 SETB EA;开总中断 SETB ET0;开定时器0 中断允许 SETBTR0 ;开定时0 运行 SETB P1、0 LOOP: AJMP LOOP DIN0: ;就是否到一秒//////////////////////////////////////// INCC:INC TFLAG MOV A,TFLAG CJNE A,#20,RE MOV TFLAG,#00H CPLP1、0 ;////////////////////////////////////////////////// RE: MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0、05秒,定时 20 次则一秒 RETI END 5、2 频率输出公式 介绍:f=1/t s51 使用12M 晶振,一个周期就是1微秒使用定时器1 工作于方式0,最大值为65535,以产生200HZ 得频率为 例: 200=1/t:推出t=0、005秒,即5000微秒,即一个高电

51单片机常见汇编程序实验代码

1. 将片外8000H-80FFH单元写入数据AB (1) 2. 将片内RAM20H单元中数据在数码管 上显示出来 (1) 3. 将片内ARM30H-40H单元清零 (2) 4. 将六位数显示在数码管上 (2) 5. 8255并口芯片的应用:交通灯控制系统 的设计 (3) 6. 将交通灯点亮 (3) 7. AD转换实验 (4) 8. DA转换实验 (5) 9. 定时器的应用 (5) 10. 开关控制LED的亮灭及速度 (6) 11. 计数器实验 (6) 12. 串并转换实验 (7) 13. 直流电机速度检测 (7) 14. 8255PB外接8个开关,编程将开关状 态显示在数码管上(串并转换动态扫描方式) (8) 15. P3.4接开关K,编程将开关拨动次数, 通过串并转换的方式进行显示 (9) 16. 比较片内RAM30H、31H两个单元值 的大小,将较大的数显示在数码管上· 10 17. 单片机P1口接8个开关,编程将开关 状态显示在数码管上(串并转换动态扫描 方式) (10) 18. 将片内50H单元的值显示在数码管上11 19. 开关K1接P1.0,K2接P1.1,编程实 现当按下K1时在数码管上显示50H单元 的值,按下K2在数码管上显示51H单元 的值 (12) 1. 将片外8000H-80FFH单元写入数据AB ORG 0000H ;程序从0000H开始执行 AJMP MAIN ;跳转到主程序 ORG 0030H ;以免覆盖中断地址 MAIN: MOV SP,#60H; 避免堆栈和工作寄存 器区冲突 MOV DPTR,#8000H MOV R0,#0 LOOP: MOV A,#0ABH MOVX @DPTR,A INC DPTR INC R0 CJNE R0,#0,LOOP ; 判断 AJMP $; 等待 END ;调试-视图-M存储器(输入地址X:8000H) 2. 将片内RAM20H单元中数据在数码管上显示 出来 ORG 0000H ;程序从0000H开始执行 AJMP MAIN ;跳转到主程序 ORG 0030H ;以免覆盖中断地址 MAIN: MOV SP,#60H ;避免堆栈和工作寄存器区冲突 MOV DPTR,#0E100H ;指向命令口地址 MOV A,#03H ;PA、PB口输出 MOVX @DPTR,A ;所有并口显示程序先进行8155初始化 MOV 20H,#34H MOV A,20H ACALL CHAI LOOP: MOV R0,#10H ;第一个显示数的地址送R0 MOV R1,#2 ;显示2个数 MOV R2,#1 ;从倒数第一个数码管开始显示 ACALL DISPLAY LJMP LOOP ;判断 CHAI: MOV B,#10H DIV AB MOV 10H,B MOV 11H,A RET DISPLAY: MOV A,@R0 MOV 0FH,#8 ACALL P164 ACALL PBIT ACALL DELAY MOV A,#0 MOVX @DPTR,A INC R0 DJNZ R1,DISPLAY

单片机实用教程部分课后习题_朱一纶

1、从22H单元开始存放一数据块,其长度存放在20H单元,编写一个数据块求和程序,要求将和存入21H单元,设和不超过255。(5分) (1) 2、编写一查表子程序。设40单元中的内容为00~09之间的整数,求其平方值(BCD码),并将其存入41H单元中。(5分) (2) 3、有50个无符号8位二进制数,存放在内部RAM以BUFFR为首地址的连续单元中,试编写将其最小数存放到内部RAM的MIN单元的程序并画出相应的流程。(10分) (2) 4、用中断方法设计单片机秒、分脉冲发生器。从P1.0每秒产生一个机器周期的正脉冲,从P1.1每分钟产生一个机器周期的正脉冲。(10分) (3) 5、将8255A的PA口设为方式0——基本输出方式,8255A的PB口设为方式1——选通输入方式,并在数据输入后会向CPU发出中断请求,不作控制用的C口端口数位全部输出,设PA口地址为4000H。编写初始化程序。(10分) (4) 6、设字符串存放在以21H开始的内部RAM单元中,以“$”作结束标志,试计算该字符串的长度,并存入20H单元。(5分) (4) 7、编写一查表子程序。设40单元中的内容为00~09之间的整数,求其立方值(BCD码),并将其存入41H单元中。(5分) (5) 8、设有50个无符号8位二进制数,存放在内部RAM以BUFFR为首地址的连续单元中,试编写将其最小数存放到内部RAM的MIN单元的程序并画出相应的流程。(10分) (5) 9、利用定时器T1产生50HZ的方波,由P1.1输出(f=6MHZ)。(10分) (6) 10、8051内部RAM的30H~39H中存放10个数,试编程采用串行口工作方式0把它逐个发送出去。(10分) (6) 11、7-4-4 (7) 1、从22H单元开始存放一数据块,其长度存放在20H单元,编写一个数据块求和程序,要求将和存入21H单元,设和不超过255。(5分) ORG 0000H LJMP START ORG 2000H START: CLR A MOV R2, 20H MOV R1, #22H LOOP: ADD A, @R1 INC R1 DJNZ R2, LOOP MOV 21H, A SJMP $ END

针对常用51单片机下载程序问题做下详解

针对常用51单片机下载程序问题做下详解 目前为止,接触单片机已有不少,从选择元器件、原理图、PCB、电路硬件调试、软件开发也算小有心得。 单片机软件开发里面第一步当属下载程序了,如果这一步都有问题,那么后面的一切便无从谈起,记得当初刚接触单片机时,对于下载电路方法及原理也是一头雾水。好在随着经验的积累以及自己的努力探求,现在对此问题算是有了点点自己的经验理解。故今天在此针对常用51单片机下载程序问题做下详解,以求新手们少走弯路。 原理 单片机的TXD、RXD是TTL电平,所以你得万变不离其宗的将其它信号转成TTL电平,只有这样给单片机下载程序才有可能成功!其中CH340、PL2303等芯片是直接将USB信号转换为TTL电平,而MAX232等芯片是将TTL转换为RS232信号或者将RS232信号转换为TTL.下面请看利用这种原理的两种常用方法: 方法一: 请看图一,这是我们最常见的单片机下载电路了,其中从②到⑥属于大家常用的USB转串口线,用这种方案的好处是,如果自己的PC带有串口(可能很老的机器没有USB接口),那么就可以直接给单片机开发板下载程序,因为采用这种方法的开发板必定带有串口接口嘛。当然,如果PC仅有USB接口而不带串口,那么只能找根USB转串口线了(其电路原理就是图中②到⑥),这里我推荐大家使用采用CH340芯片的USB转串口线,而不要采用PL2303的USB转串口线,因为PL2303价钱便宜所以山寨的水货较多,这会导致下载电路不稳定,甚至无法正常下载。同时此方案的坏处是电路板上必定要做一个9针串口接口(太巨大了),这必将增加了电路PCB的面积,当然也就增加了成本啦!(顺便发表下个人见解:那个9针接口实在太丑,又大又重,无形中便降低了自己的设计档次,哈哈。所以不推荐这种方法!) 请看图二,这是我经常采用的单片机下载电路。实践证明效果非常好,几乎没出过任何问

单片机习题集(含答案)经典

单片机原理及应用习题 第一章绪论 1-1单项选择 1、计算机中最常用的字符信息编码是()。 (A)ASCII (B)BCD码(C)余3码(D)循环码 2、-31D的二进制补码为.( )。 (A)1110000B (B)11100001B (C)01100000B (D)01100001B 3、十进制29的二进制表示为原码()。 (A)11100010B (B) 10101111B (C)00011101B (D)00001111B 4、十进制0.625转换成二进制数是()。 (A)0.101 (B) 0.111 (C)0.110 (D)0.100 5、十六进制数7的ASCII码是()。 (A) 37 (B) 7 (C) 07 (D) 47 6、十六进制数B的ASCII码是()。 (A) 38 (B) 42 (C) 11 (D) 1011 7、通常所说的主机是指() (A)运算器和控制器(B)CPU和磁盘存储器(C)CPU和主存储器(D)硬件和软件8、使用单片机实现在线控制的好处不包括( ) (A)精确度高(B)速度快(C)成本低(D)能与数据处理结合 1-2填空 1、计算机中常作的码制有、和。 2、十进制29的二进制表示为。 3、十进制数-29的8位补码表示为。 4、是计算机与外部世界交换信息的载体。 5、十进制数-47用8位二进制补码表示为。 6、-49D的二进制补码为。 7、计算机中的数称为,它的实际值叫。 8、单片机的存储器结构形式有普林斯顿结构(又称冯.依诺曼结构)与哈佛结构,MCS-51存储器采用的是结构。 1-3 问答题 1、何谓单片机?单片机与一般微型计算机相比,具有哪些特点? 2、单片机主要应用在哪些领域? 3、为什么80C51系列单片机能成为8位单片机应用主流? 4、举例说明单片机的主要应用领域。

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~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--) for(j=110;j>0;j--); } #include //跑马灯程序。现在时间较长,多以是亮灭的流动,当时间约为20ms,形成动态扫描,看上去全亮。 #include #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); } }

相关文档