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

m8单片机程序

m8单片机程序
m8单片机程序

/*多组合LED,1314管*/ void main()

{

uchar k,i,t;

DDRD=0XFF;

DDRB=0XFF;

while(1)

{

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

{

PORTD=0X00;//LED全亮

PORTB=0X00;//8

delay(500);

PORTD=0XFF;

delay(500);

}

for(t=0;t<3;t++)

{

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

{

PORTD&=~BIT(k);

PORTB=0XCF;//1

delay(100);

PORTD|=BIT(k);

delay(0);

}

for(k=8;k>0;k--)

{

PORTD&=~BIT(k);

PORTB=0XB0;//3

delay(100);

PORTD|=BIT(k);

delay(0);

}

}

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

{

PORTD=0X55;

PORTB=0XCF;//1

delay(400);

PORTD=0XAA;

PORTB=0X99;//4

delay(400);

} /*LED聚散*/

#include

#include

#define uchar unsigned char #define uint unsigned int

void delay(uint ms)

{

uint i,j;

for(i=0;i

{

for(j=0;j<1000;j++);

}

}

void main()

{

DDRD=0XFF;

while(1)

{

uint i;

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

{

PORTD=0X00;

PORTD|=(~BIT(i)&~BIT(7-i));

delay(100);

}

for(i=3;i<-1;i--)

{

PORTD=0X00;

PORTD|=(~BIT(i)&~BIT(7-i));

delay(100);

}

}

}

/*数码管3210*/

#include

#include

#define uchar unsigned char

#define uint unsigned int

const

table[]={0xC0,0xF9,0XA4,0xB0,0x99,0X92,0X8 2,0XF8,0X80,0X90,};

//const table1[]={0XEF,0XDF,0XBF,0X7F}; void delay(uint ms)

{

uint i,j;

for(i=0;i

{

for(j=0;j<1000;j++);

}

}

void main()

{

uint t,k;

DDRD=0XFF;

DDRB=0XFF;

while(1)

{

for(t=0;t<4;t++)

{

PORTB=table[t];

PORTD=0XFF;

PORTD&=~BIT(t+4);//位选方法一

//PORTD=table1[t];//位选方法二

delay(1);

}

/*for(k=4;k>0;k--)

{

PORTB=table[k];

PORTD=table1[k];

delay(1);

}*/

}

} /*543210流水变换*/

#include

#include

#define uchar unsigned char

#define uint unsigned int

const

table[]={0xC0,0xF9,0XA4,0xB0,0x99,0X92,0X8 2,0XF8,0X80,0X90,};

//const table1[]={0XEF,0XDF,0XBF,0X7F}; void delay(uint ms)

{

uint i,j;

for(i=0;i

{

for(j=0;j<1000;j++);

}

}

void show(uchar d,uchar w)

{

PORTB=table[d];

PORTD=0XFF;

PORTD&=~BIT(w);

delay(1);

}

void main()

{

uint t,k;

DDRD=0XFF;

DDRB=0XFF;

while(1)

{

for(k=0;k<600;k++)

{

for(t=0;t<6;t++)

{

show((t+k/100)%6,t+4);

}

}

}

}

/*1602液晶显示*/

#include

#include

#define uchar unsigned char

#define uint unsigned int

const uchar table[]="I LIKE *(-_-)* "; const uchar table1[]="SU CHUANG CHOU";

void delay(uint ms)

{

uint i,j;

for(i=0;i

{

for(j=0;j<1141;j++);

}

}

/*********写指令*************/

void write_com(uchar com)

{

PORTB&=~BIT(1);

PORTB&=~BIT(2);

PORTD=com;

PORTB|=BIT(3);

delay(1);

PORTB&=~BIT(3);

}

/*********写数据*************/

void write_dat(uchar dat)

{

PORTB|=BIT(1);

PORTB&=~BIT(2);

PORTD=dat;

PORTB|=BIT(3);

delay(1);

PORTB&=~BIT(3);

} /*********主函数*************/ void main()

{

while(1)

{

uchar i;

DDRD=0XFF;

DDRB|=BIT(1)|BIT(2)|BIT(3);

PORTB&=~BIT(3);

write_com(0X38);//光标闪烁

delay(5);

write_com(0X01);//清屏

delay(5);

write_com(0X0C);

delay(5);

write_com(0X06);

delay(5);

write_com(0X80+0X10);

delay(5);

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

{

write_dat(table[i]);

delay(5);

}

write_com(0X80+0X50);

delay(5);

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

{

write_dat(table1[i]);

delay(5);

}

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

{

write_com(0X18);

delay(500);

}

}

/*按键显示1.2*/

#include

#include

#define uchar unsigned char

#define uint unsigned int

const

table[]={0xC0,0xF9,0XA4,0xB0,0x99,0X92,0X8 2,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X8 6,0X8E,0};

//const table1[]={0XEF,0XDF,0XBF,0X7F};

/*********延时*************/

void delay(uint ms)

{

uint i,j;

for(i=0;i

{

for(j=0;j<1000;j++);

}

}

/*********显示函数*************/

void show(uchar d)

{

PORTB=table[d];

delay(1);

}

/*******是否有按键按下*******/

uchar key_press()

{

uchar j;

DDRD=0XFF;//11111111

PORTD|=0x0C;//00001100

DDRD&=0XF3;//11110011

j=PIND;

j=j&0x0C;//00001100

if(j==0x0C)

{

return 0;

}

else

{

return 1;

}

} /*****按键扫描************/ uchar key_scan()

{

uchar key;

delay(10);

if(key_press())

{

key=PIND;

key&=0X0C;//00001100

switch(key)

{

case 0X08:

key=1;

break;

case 0X04:

key=2;

break;

default:

key=11;

}

while(key_press());

}

else

{

key=11;

}

return key;

}

/********主函数***********/ void main()

{

uchar i,l;

DDRB=0XFF;

PORTB=0XFF;

while(1)

{

i=key_press();

if(i)

{

l=key_scan();

show(l);

}

/*4x4矩阵键盘*/

/*注意:数码管的位选接PC口,熔丝位的看门狗为1*/

#include

#include

#define uchar unsigned char

#define uint unsigned int

consttable[]={0xC0,0xF9,0XA4,0xB0,0x99,0X9 2,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA 1,0X86,0X8E,0XFF};

/**********延时**************/

void delay(uint ms)

{

uint i,j;

for(i=0;i

{

for(j=0;j<1000;j++);

}

}

/*******显示函数***********/

void show(uchar d)

{

PORTB=table[d];

delay(1);

}

/*****是否有按键按********/

uchar key_press()

{

uchar j;

DDRD=0XFF;

PORTD=0XF0;

DDRD=0X0F;

PORTD&=0XF0;

j=PIND;

if(j==0xF0)

{

//DDRD=0XFF;

return 0;

}

else

{

//DDRD=0XFF;

return 1;

} }

/*******按键扫描************/ uchar key_scan()

{

uchar key,i=0X7F,j;

delay(10);

if(key_press())

{

do

{

i=(i<<1|i>>7);

PORTD=i;

DDRD=0X0F;

PORTD&=0XF0;

key=PIND;

j=key&0XF0;

}while(j==0XF0);

while(key_press());

switch(key)

{

case 0xEE:key=0;break;

case 0xDE:key=1;break;

case 0xBE:key=2;break;

case 0x7E:key=3;break;

case 0xED:key=4;break;

case 0xDD:key=5;break;

case 0xBD:key=6;break;

case 0x7D:key=7;break;

case 0xEB:key=8;break;

case 0xDB:key=9;break;

case 0xBB:key=10;break;

case 0x7B:key=11;break;

case 0xE7:key=12;break;

case 0xD7:key=13;break;

case 0xB7:key=14;break;

case 0x77:key=15;break;

default: key=16;

}

}

else

{

key=16;

}

return key;

}

/**********主函数**********/

void main()

{

uchar i,l;

DDRB=0XFF;

PORTB=0XFF;

DDRC=0XEF;

PORTC=0X00;

while(1)

{

i=key_press();

if(i)

{

l=key_scan();

show(l);

}

}

}

/*秒表*/

#include

#include

#define uchar unsigned char

//unchar num=0;

//#pragma interrupt_handler miao:9

#define uint unsigned int

uchar num=0;

#pragma interrupt_handler miao:9

Const

table[]={0xC0,0xF9,0XA4,0xB0,0x99,0X92,0X8 2,0XF8,0X80,0X90,};

const table1[]={0XEF,0XDF,0XBF,0X7F};

void delay(uint ms)

{

uint i,j;

for(i=0;i

{

for(j=0;j<1000;j++);

}

}

void show(uchar d,uchar w)

{

PORTB=table[d];

PORTD=0XFF;

PORTD&=~BIT(w);

delay(1);

}

void miao()

{ num++;

if(num==60)

num=0;

TCNT1H=0X85;

TCNT1L=0XED;

}

void main()

{

DDRB=0XFF;

DDRD=0XFF;

TCCR1B=0X04;

TCNT1H=0X85;

TCNT1L=0XED;

TIMSK|=BIT(2);

SREG|=BIT(7);

while(1)

{

show(num/10,5);

show(num%10,4);

}

}

/*CTC(方波)*/

#include

#include

#define uint unsigned int

#define uchar unsigned char

void main()

{

DDRB|=0X06;

TCCR1A=0X50;

TCCR1B=0X09;

OCR1A=4999;

}

/*快速PWM*/

#include

#include

void main()

{

DDRB|=0X06;

TCCR1A=0X63;

TCCR1B=0X1B;

OCR1A=1249;

OCR1B=250;

}

/*相位修正PWM*/

#include

#include

void main()

{

DDRB|=0X06;

TCCR1A=0X63;

TCCR1B=0X13;

OCR1A=1249;

OCR1B=250;

}

/*按键选择PWM*/

#include

#include

#include"7.c"

void main()

{

uchar i;

DDRB|=0X06;

TCCR1A=0X63;

TCCR1B=0X13;

OCR1A=1249;

OCR1B=31;

while(1)

{

if(key_press())

{

i=key_scan();

switch(i)

{

case 1:OCR1B=31; break;

case 2:OCR1B=650; break;

default:OCR1B=124;

}

}

}

}

/*上面的附加程序*/

#include

#include

#define uchar unsigned char

#define uint unsigned int

/***********延时************/ void delay(uint ms)

{

uint i,j;

for(i=0;i

{

for(j=0;j<1000;j++);

}

}

/******是否有按键按下*******/ uchar key_press()

{

uchar j;

DDRD=0XFF;//11111111

PORTD|=0xFC;

DDRD&=0XF3;//11110011

j=PIND;

j=j&0x0C;//00001100

if(j==0x0C)

{

return 0;

}

else

{

return 1;

}

}

/********按键扫描**********/ uchar key_scan()

{

uchar key;

delay(10);

if(key_press())

{

key=PIND;

key&=0X0C;//00001100

switch(key)

{

case 0X08: key=1; break;

case 0X04: key=2; break;

default:key=11;

}

while(key_press());

}

else

{

key=11;

}

return key;

}

/*AD转换*/

#include

#include

#define uchar unsigned char #define uint unsigned int

#include"6.c"

uint mega8_ad()

{

uint addata;

DDRC&=~BIT(0);

PORTC&=~BIT(0);

ADMUX=0;

ADCSR=0X80;

ADCSR|=BIT(ADSC);

while(!(ADCSR&(BIT(ADIF))));

addata=ADCL;

addata=addata+ADCH*256;

return addata;

}

void main()

{

uint ada,i,ad[4];

DDRB=0XFF;

DDRD|=0XF0;

while(1)

{

ada=mega8_ad();

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

{

ad[3-i]=ada%10;

ada=ada/10;

}

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

{

show(ad[i],7-i);

delay(0);

}

}

}

/*上面的附加程序*/

Const

table[]={0xC0,0xF9,0XA4,0xB0,0x99,0X92,0X8 2,0XF8,0X80,0X90,};

void delay(uint ms)

{

uint i,j;

for(i=0;i

{

for(j=0;j<1000;j++);

}

}

void show(uchar d,uchar w)

{

DDRD=0XFF;

DDRB=0XFF;

PORTB=table[d];

PORTD=0XFF;

PORTD&=~BIT(w);

delay(1);

}

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单片机实用汇编程序库(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 微秒,即一个高电

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单片机基本程序

1第一位隔一秒闪烁一次 #include #define uint unsigned int sbit led1=P1^0; uint i; uint j; void main() { while(1) { led1=0; for(i=1000;i>0;i--) for(j=110;j>0;j--); led1=1; for(i=1000;i>0;i--) for(j=110;j>0;j--); } } 2复杂广告灯 #include #define uint unsigned int #define uchar unsigned char uchar discode[]={ 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,//正向流水灯 0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,//反向流水灯 0xAA,0x55,0xAA,0x55,0xAA,0x55,0xFF,//隔灯闪烁3次 0xF0,0x0F,0xF0,0x0F,0xFF,//高四盏。低四盏闪烁2次 0x33,0xCC,0x33,0xCC,0x33,0xCC,0xFF//隔两盏闪烁3次 }; void delayms(uint ms) { uint i; while(ms--) { for(i=0;i<120;i++); } } void main(void) { uchar i; P0=0xFF;

while(1) { for(i=0;i<35;i++) { P0=discode[i]; delayms(250); } } } 3拉幕式与闭幕式广告灯 #include #define uint unsigned int #define uchar unsigned char uchar discode1[4]={0x18,0x24,0x42,0x81}; uchar discode2[4]={0x7E,0x3C,0x18,0x00}; void delayms(uint ms) { uint i; while(ms--) { for(i=0;i<120;i++); } } void main(void) { uchar i,j; P0=0xFF; while(1) { for(i=0;i<4;i++) { j=discode1[i]; P0=~j; delayms(500); } j=0xFF; P0=~j; delayms(500); for(i=0;i<4;i++) { j=discode2[i]; P0=~j;

单片机汇编子程序

; 1, 以下的程序是一些关于数据转换与计算的子程序.但由于本人现在很忙,仅测试了 ; 其中的很少一部分.本人不保证所有的程序都是正确的,并且由于使用不同的编译器, ; 即使是本人已测试过的程序,您也可能要修改一些指令. ; 2. 一旦将其整理测试完毕,将会免费发送. ; 3. 若有任何问题,与TongZhongZhi@https://www.wendangku.net/doc/0f507697.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单片机实用程序库 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单片机简易计算器程序

#include <reg51.h>#include <intrins.h> #include <ctype.h> #include <stdlib.h> #define uchar unsigned char #define uint unsigned int uchar operand1[9], operand2[9]; uchar operator; void delay(uint); uchar keyscan(); void disp(void); void buf(uint value); uint compute(uint va1,uint va2,uchar optor); uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0xff}; uchar dbuf[8] = {10,10,10,10,10,10,10,10}; void delay(uint z) { uint x,y; for(x=z;x>0;x--)

for(y=110;y>0;y--); } uchar keyscan() { uchar skey; P1 = 0xfe; while((P1 & 0xf0) != 0xf0) { delay(3); while((P1 & 0xf0) != 0xf0) { switch(P1) { case 0xee: skey = '7'; break; case 0xde: skey = '8'; break; case 0xbe: skey = '9'; break; case 0x7e: skey = '/'; break; default: skey = '#'; }

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微秒,即一个高电

AT89C51单片机C实现简易计算器

AT89C51单片机简易计算器的设计 一、总体设计 根据功能和指标要求,本系统选用MCS-51系列单片机为主控机。通过扩展必要的外围接口电路,实现对计算器的设计。具体设计如下:(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LCD 显示数据和结果。 (2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可,设计中采用集成的计算键盘。 (3)执行过程:开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果。 (4)错误提示:当计算器执行过程中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCD上提示溢出;当除数为0时,计算器会在LCD 上提示错误。 系统模块图:

二、硬件设计 (一)、总体硬件设计 本设计选用AT89C51单片机为主控单元。显示部分:采用LCD 静态显示。按键部分:采用4*4键盘;利用MM74C922为4*4的键盘扫描IC,读取输入的键值。 总体设计效果如下图:

(二)、键盘接口电路 计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。矩阵键盘采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。 矩阵键盘的工作原理: 计算器的键盘布局如图2所示:一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。 图 2 矩阵键盘布局图 矩阵键盘内部电路图如图3所示:

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

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.单片机程序执行流程 这是我们首先必须要知道的。单片机程序一般就有两种,一种是汇编程序,一种是c语言程序。这里我们讲c语言程序。 单片机程序都有一个包含主函数的文件,包含主函数的文件都有一个统一的结构,如下所示: #include "xxx.h" int main() // 这是主函数的函数名 { ......; // 若干条语句 ......; while(1) // while括号中是1,说明程序进入后将在while里面无线循环,不会出来了,不懂的去看c语言基础之while篇 { ......; // 若干条语句 ......; } } 重点:单片机一上电,从主函数main的第一条语句开始执行,是一条语句接着一条语句从上而下执行,直到进入while后,再从while的第一条语句执行到最后一条语句,由于是死循环,会再从while的第一条语句执行到最后一条语句,如此反复执行,永不停止!直到断电! 这些语句当中,有些是函数的调用,遇到函数的调用,进入到函数,再从函数的第一条语句执行到最后一条语句,然后跳出函数,再从刚才主函数中那条函数的下一条语句开始执行。如果实在搞不明白函数是怎么一回事,你可以用函数里面的所有语句代替函数在主函数中的位置。例如:

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

单片机原理及应用习题 第一章绪论 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单片机50个实例代码

51单片机50个例程代码程序里有中断,串口等驱动,直接复制即可使用1-IO输出-点亮1个LED灯方法1 /*----------------------------------------------- 名称:IO口高低电平控制 论坛:https://www.wendangku.net/doc/0f507697.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的一个LED灯 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动, //头文件包含特殊功能寄存器的定义 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口高低电平控制 论坛:https://www.wendangku.net/doc/0f507697.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的一个LED灯 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动, //头文件包含特殊功能寄存器的定义 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { //此方法使用1个字节对单个端口赋值 P1 = 0xFF; //P1口全部为高电平,对应的LED灯全灭掉, //ff换算成二进制是1111 1111 P1 = 0xfe; //P1口的最低位点亮,可以更改数值是其他的灯点亮 //0xfe是16进制,0x开头表示16进制数, //fe换算成二进制是1111 1110 while (1) //主循环 { //主循环中添加其他需要一直工作的程序 } } 3-IO输出-点亮多个LED灯方法1 /*----------------------------------------------- 名称:IO口高低电平控制 论坛:https://www.wendangku.net/doc/0f507697.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的多个LED灯

MCS-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单片机常用数码管显示程序

51单片机常用数码管显示程序---之汇编篇 2010-07-21 03:35:46| 分类:单片机| 标签:51单片机数码管汇编程序|字号大中小订阅一)显示数据缓存寄存器70H,71H,72H,73H,74H,75H,76H,77H。 START: MOV 70H,#1 MOV 71H,#2 MOV 72H,#3 MOV 73H,#4 MOV 74H,#5 MOV 75H,#6 MOV 76H,#7 MOV 77H,#8 ACALL DISP AJMP START DISP: MOV R1,#70H MOV R5,#0FEH PLAY: MOV P0,#0FFH MOV A,R5 ANL P2,A

MOV A,@R1 MOV DPTR,#TAB MOVC A,@A+DPTR MOV P0,A LCALL DL1MS INC R1 MOV A,P2 JNB ACC.7,ENDOUT RL A MOV R5,A MOV P2,#0FFH AJMP PLAY ENDOUT: MOV P2,#0FFH MOV P0,#0FFH RET TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH;共阳数码管 ; 1MS延时子程序,LED显示用 DL1MS: MOV R6,#14H ; DL1: MOV R7,#19H DL2: DJNZ R7,DL2 DJNZ R6,DL1 RET END 二)

START:;ORG 00H MOV 70H,#0C0H;0 MOV 71H,#0F9H;1 MOV 72H,#0A4H;2 MOV 73H,#0B0H;3 MOV 74H,#99H ;4 MOV 75H,#92H ;5 MOV 76H,#82H ;6 MOV 77H,#0F8H;7 ACALL DISP AJMP START DISP: MOV P0,70H CLR P2.7 ACALL DL1MS SETB P2.7 MOV P0,71H CLR P2.6 ACALL DL1MS SETB P2.6 MOV P0,72H CLR P2.5 ACALL DL1MS SETB P2.5 MOV P0,73H CLR P2.4 ACALL DL1MS SETB P2.4 MOV P0,74H CLR P2.3 ACALL DL1MS SETB P2.3 MOV P0,75H CLR P2.2 ACALL DL1MS SETB P2.2 MOV P0,76H CLR P2.1 ACALL DL1MS SETB P2.1 MOV P0,77H CLR P2.0 ACALL DL1MS SETB P2.0 RET

单片机实用技术课后答案

1.设变量x以补码形式存放在片内RAM 30H单元中,变量y与x的关系是: X, X>0 Y= 20H, X=0 X+5, X<0 编程根据x的值求y值并放回原单元。 答:START:MOV A,30H JZ NEXT ANL A,#80H JZ ED MOV A,#05H ADD A,30H MOV 30H,A SJMP ED NEXT:MOV 30H,#20H ED:SJMP $ 2.MCS-51单片机有哪几种寻址方式?各寻址方式所对应的寄存器或存储器空间如何?答:立即寻址对应程序存储器 直接寻址对应内部数据存储器和SFR 寄存器寻址对应工作寄存器R0~R7,A,B,DPTR 寄存器间接寻址对应片内RAM:@R0,@R1,SP,片外RAM:@R0,@R1,@DPTR 变址寻址对应程序存储器:@A+PC,@A+DPTR 相对寻址对应程序存储器256字节范围内:PC+偏移量 位寻址对应片内RAM的位寻址区(20H~2FH字节地址),某些可位寻址的SFR 3.访问特殊功能寄存器SFR可以采用哪些寻址方式? 答:直接寻址方式和位寻址方式 4.访问片内RAM单元可以采用哪些寻址方式? 答:直接和间接寻址方式 5.访问外部RAM单元可以采用哪些寻址方式? 答:间接寻址方式 6.访问外部ROM可以采用哪些寻址方式? 答:立即、变址和相对寻址方式 7.为什么说布尔处理功能是8051单片机的重要特点? 答:因为8051具有位寻址功能 8.对于AT89S52单片机内部RAM还存在高128字节,应采用何种方式访问? 答:采用间接寻址方式 9.完成某种操作可以采用几条指令构成的指令序列实现,试写出完成以下每种操作的指令。(1)将R0的内容传送到R1; (2)内部RAM单元50H的内容传送到寄存器R4; (3)外部RAM单元2000H的内容传送到内部RAM单元70H; (4)外部RAM单元0800H的内容传送到寄存器R5; (5)外部RAM单元2000H的内容传送到外部RAM单元2100H。 答:(1)MOV A,R0 MOV R1,A

单片机实验指导书——带答案

《单片机原理及应用》 实验指导书 姓名: 学号: 专业班级: 所在学院:成人教育学院 2012年5月日 单片机实验指导书

目录 实验一系统认识实验 (2) 实验二程序调试 (4) 实验三外部中断实验 (6) 实验四串口实验 (8) 实验一系统认识实验 一、实验目的 1.掌握SICElab-G2200实验/仿真系统的结构与使用方法; 2.熟悉单片机系统开发软件WAVE6000。

二、实验设备 1.G2200/2100 实验平台 1 台 2.仿真器/ 仿真板 1 台 3.连线若干根 4.计算机 1 台 三、实验内容 P1端口接发光二极管,加1点亮。 四、连线方案: 实验箱 内部已 连好 五、实验步骤 1.连接Lab51CPU板。(已由实验师连好) 2.仿真器与实验平台的连接 将Lab51板的DC34芯插座与G6W仿真器上的DC34插座用扁平电缆连接起来。(已由实验师连好) 3.仿真器与计算机的连接 用随机配带的串口通讯电缆,将仿真器与计算机连接起来,串口1、串口2均可。 特别注意:在仿真器与计算机连接串口电缆时,两台机器必须都断电,否则易损坏计算机和仿真器。 4.实验连线 按连线方案,用随机配带的实验连线插入孔后,轻轻转动一下锁紧插头,保证良好接触。拆线时,应先回转一下,不要硬拨,以免损坏线路板。不管是拆线还是插线,都应在断电的情况下进行。实验中“连线方案”的粗线即为需用户动手接连的线。 5.检查接线是否有误,确信没有接错后,接上电源,打开电源开关。 6.在计算机上打开“WAVE6000集成调试环境”,界面如下图所示: 7.建立新程序(如果程序已编好,直接跳到第9步) 选择菜单[文件 | 新建文件]功能。 出现一个文件名为NONAME1的源程序窗口,在此窗口中输入以下程序 ORG 0 MOV P1,#0 ;熄灭发光二极管 LOOP: INC P1 CALL Delay SJMP LOOP Delay: MOV R2,#3 ;延时程序 MOV R1,#0

相关文档
相关文档 最新文档