单片机程序整理
(整理)单片机液晶屏C程序.
![(整理)单片机液晶屏C程序.](https://img.taocdn.com/s3/m/552f56f408a1284ac950432e.png)
for(i=0;i<2;i++)
{
lcd_wdat(DIS41[i]);
}
}
else
{
PORTB&=~(1<<0);
lcd_pos(4,3);
for(i=0;i<2;i++)
{
lcd_wdat(DIS42[i]);
}
}
////////*******“运行”显示**************************
}
DDRC=0xFF;
PORTD&=~(1<<3);
}
//******************************************************************
void lcd_wcmd(uchar cmd)
{
lcd_busy();
DDRD=0xF8;
PORTD&=~(1<<5);
{
lcd_wcmd(0x30); //基本指令操作
lcd_wcmd(0x30);
delay(1);
lcd_wcmd(0x0c); //显示开,关光标
delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
}
//*****************************************************************
lcd_pos(4,6);
(2)可能造成轻度环境影响的建设项目,编制环境影响报告表,对产生的环境影响进行分析或者专项评价;for(i=0;i<4;i++)
单片机作业整理
![单片机作业整理](https://img.taocdn.com/s3/m/9d97b4b8f12d2af90342e625.png)
作业一3-1 什么是寻址方式?MCS-51指令系统有哪些寻址方式?相应的寻址空间在何处?3-2 访问外部数据存储器和程序存储器可以用哪些指令来实现?举例说明。
3-3 试用下列3种寻址方式编程,将立即数0FH送入内部RAM的30H单元中。
(1) 立即寻址方式;(2) 寄存器寻址方式;(3) 寄存器间接寻址方式。
3-4 试编写一段程序,将内部数据存储器的30H和3lH单元内容传送到外部数据存储器的1000H和1001H单元中。
3-5 试编写一段程序,将外部数据存储器的40H单元中的内容传送到0l00H单元中。
3-6试写一段程序,将R3H中的数乘以4(用移位指令)。
作业二5-1 简述中断、中断源、中断嵌套及中断优先级的含义。
5-2 MCS-51单片机提供了几个中断源?有几级中断优先级别?各中断标志是如何产生的又如何清除这些中断标志?各中断源所对应的中断矢量地址是多少?5-3 外部中断源有电平触发和边沿触发两种触发方式,这两种触发方式所产生的中断过程有何不同?怎样设定?5-4 MCS-51中若要扩充6个中断源,可采用哪些方法?如何确定它们的优先级?5-5 试叙述中断的作用和中断的全过程。
5-6 某系统有2个外部中断源1、2,当某一中断源变为低电平时,便要求CPU处理,它们的优先次序由高到低为2、1,处理程序的入口地址分别为2000H,2100H。
试编写程序及中断服务程序(转到相应的入口即可)。
5-7试分别用汇编语言、C语言编写程序,采用算术平均值滤波法求采样平均值,设8次采样值依次放在20H~27H的连续单元中,结果保留在寄存器A中。
5-8若晶振频率为3MHz,在定时/计数器工作方式0、1、2下,其最大定时时间分别为多少。
作业三1.简述特殊功能寄存器SCON、TCON、TMOD功能。
2.串行通信的主要优点和用途是什么?3.简述串行口接收和发送数据的过程。
4.帧格式为1个起始位、8个数据位和1个停止位的异步串行通信方式是方式几?5.简述串行口通信的第9个数据位的功能。
[知识]单片机程序清单
![[知识]单片机程序清单](https://img.taocdn.com/s3/m/73c5e52266ec102de2bd960590c69ec3d5bbdbe0.png)
单片机程序清单数码管"hello "循环程序清单:循环hello程序清单:ORG 0000HSS2: MOV R5,#13MOV R3,#0SS1: MOV R4,#20START:MOV R2,#06H ;循环次数,等于数码管位数MOV R1,#0FEH ;初始位选信号MOV A,R3MOV R0,A ;初始偏移地址DISPLOOP:MOV P0,#0H ;熄灭数码管MOV P1,R1 ;送位选信号MOV DPTR,#TABMOV A,R0MOVC A,@A+DPTRMOV P0,A ;送段选信号ACALL DELAYINC R0MOV A,R1RL AMOV R1,A ;将下一位的选通信号送至R1DJNZ R2,DISPLOOPDJNZ R4,STARTINC R3DJNZ R5,SS1AJMP SS2DELAY: MOV R7,#04HDL0: MOV R6,#10HDL1: NOPDJNZ R6,DL1DJNZ R7,DL0RETTAB: DB 00H,00H,00H,00H,00H,00H,76H DB 79H,38H,38H,3FH,00H,00H,00H,00H,00H,00H,00HEND频率计数器程序清单:org 0000hljmp mainorg 000bhljmp tt0org 0030hmain:mov tmod,#01010001bmov tl0,#0b0hmov th0,#3chsetb ea ;开中断setb et0setb tr0setb tr1loop:lcall holdlcall displayajmp loopdisplay: mov r7,#3mov r6,#01hmov r5,#0mov r0,#30h mov dptr,#tab loop1:mov a,@r0movc a,@a+dptr mov p0,amov p2,r6lcall delayinc r0mov a,r6rl amov r6,amov p2,#0djnz r7,loop1retdelay:mov r4,#50hdjnz r4,$rettt0:mov tl0,#0b0hmov th0,#3chinc 20hretihold:mov a,20hcjne a,#20,ss1mov 20h,#0mov 21h,tl1mov tl1,#0ss1:mov a,21hmov b,#100div abmov 30h,amov a,bmov b,#10div abmov 31h,amov 32h,brettab:db 0c0h,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H end数码管循环99-0的程序清单:org 0000hajmp mainorg 000bajmp tt0org 0030hmain:mov tmod,#01hmov th0,#3chmov tl0,#0b0hsetb ea ;开中断setb et0setb tr0mov 20h,#0 ;计数器mov 21h,#99 ;一秒个数mov 30h,#0 ;缓冲数据mov 31h,#0 缓冲数据loop:lcall h;old ;数据转换入口lcall displayajmp loopdisplay:mov r7,#2mov p3,#01hmov a,31hmov dptr,#tabmovc a,@a+dptrmov p2,alcall delaymov p3,#02hmov a,30hmov dptr,#tabmovc a,@a+dptrmov p2,alcall delaymov p3,#0retdelay:mov r5,#50hdjnz r5,$rettt0:mov tl0,#0b0hmov th0,#3chinc 20hretihold:mov a,20hcjne a,#20,lldec 21hmov 20h,#0ll:mov a,21hcjne a,#100,mmmov 21h,#0mm:mov b,#10mov a,21hdiv abmov 31h,amov 30h,brettab:db 0c0h,0f9 h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90hend加两个控制键(一个按下停止,一个按下请零)程序清单在loop处加:loop:jnb p0.0,l1jnb p0.1,l2ajmp l3l1:jnb p0.0,$cpl tr0ajmp l3l2:jnb p0.1,$mov 21h,#0l3:lcall holdlcall displayajmp loop ORG 0000H采用扩展接口,一组二极管由高位到低位依次电亮,另一组由低位到高位依次加一点亮start:mov r7,#08h 代表8个灯mov r6,#01h 第一组的第一个灯亮mov r5,#01h 第二组的第一个灯亮clr p2.0 清零setb p2.1loop:mov p0,r6setb p2.0clr p2.0mov p0,r5clr p2.1lcall delaymov a,r6rl amov r6,amov a,r5rl ainc amov r5,asetb p2.1clr adjnz r7,loopajmp startdelay:mov r4,#250d1:mov r3,#250djnz r3,$djnz r4,d1retend数码管循环显示0到F的数字org 0000hajmp mainorg 000bhajmp tt0org 0030hMAIN:MOV R7,#0Hmov r6,#0mov dptr,#0000hloop:mov a,r6movx @dptr,ainc r6mov r6,acjne a,#16,ll1mov r6,#0ll1:inc dptrdjnz r7,loopmov tmod,#01hmov tl0,#0b0hmov th0,#3chsetb easetb et0setb tr0start:mov r5,#0mov r4,#0moV dptr,#0000hloop1:movx A,@DPTRLCALL DELAYINC DPTRDJNZ R4,LOOP1AJMP STARTDISPLAY:PUSH DPHPUSH DPLMOV DPTR,#TABMOV P1,ALCALL DELAYPOP DPLPOP DPHDELAY:MOV A,R5CJNE A,#20H,DELAYMOV R5,#0RETtt0:mov tl0,#0b0hmov th0,#3chinc r5TAB:DB 03FH,06H,05BH,04FH,066H,06DH,07DH,007HDB 07FH,06FH,077H,07CH,039H,05EH,079H,071HEND串行口扩展键盘显示器按键识别采用扫描法,当检测到有按键按下时显示该键编号清单程序:ORG 0000HAJMP LOOPORG 0100HLOOP:CLR P3.2 ;关闭显示输出MOV A,#0CLR TI ;清零中断标志MOV SBUF,A ;扫描键盘,使所有列线为0JNB TI,$ ;串行输出未完等待JB P3.3,LOOP ;无键闭合返回LCALL DELAY ;有键闭合消抖JB P3.3,LOOP ;抖动返回MOV R0,#8 ;判别是哪一个键按下,共8列MOV R2,#0 ;初始键号为0MOV R1,#0FEHLOOP1:CLR TIMOV SBUF,R1JNB TI,$ ;串行输出未完等待JB P3.3,SS1 ;无键按下转SS1MOV 20H,R2 ;键号送20HLCALL DISP ;显示键号JNB P3.3,$ ;等待键释放SS1: INC R2 ;键号加1MOV A,R1RL AMOV R1,ADJNZ R0,LOOP1 ;8列未扫完,扫描下一列AJMP LOOP ;8列扫完,重新扫描DISP: SETB P3.2 ;开放显示输出MOV A,20H ;取出待显示的数MOV DPTR,#TABMOVC A,@A+DPTR ;查段码表TAB,取出段选码数据CLR TIMOV SBUF,A ;输出段选码JNB TI,$CLR P3.2 ;关显示输出RETDELAY:MOV R4,#0DJNZ R4,$RETTAB: DB 0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H;1~8 END。
单片机程序100范例+详细注释
![单片机程序100范例+详细注释](https://img.taocdn.com/s3/m/43c2aa492e3f5727a5e962ff.png)
100例程序设计范例汇总第一章 (4)【实例1】使用累加器进行简单加法运算: (4)【实例2】使用B寄存器进行简单乘法运算: (4)【实例3】通过设置RS1,RS0选择工作寄存器区1: (4)【实例4】使用数据指针DPTR访问外部数据数据存储器: (4)【实例5】使用程序计数器PC查表: (4)【实例6】IF语句实例: (4)【实例7】SWITCH-CASE语句实例: (4)【实例8】FOR语句实例: (4)【实例9】WHILE语句实例: (5)【实例10】DO...WHILE语句实例: . (5)【实例11】语句形式调用实例: (5)【实例12】表达式形式调用实例: (5)【实例13】以函数的参数形式调用实例: (5)【实例14】函数的声明实例: (5)【实例15】函数递归调用的简单实例: (5)【实例16】数组的实例: (6)【实例17】指针的实例: (6)【实例18】数组与指针实例: (6)【实例19】P1口控制直流电动机实例 (6)第二章 (8)【实例20】用74LS165实现串口扩展并行输入口 (8)【实例21】用74LS164实现串口扩展并行输出口 (10)【实例22】P0I/O扩展并行输入口 (12)【实例23】P0I/O扩展并行输出口 (12)【实例24】用8243扩展I/O端口 (12)【实例25】用8255A扩展I/O口 (14)【实例26】用8155扩展I/O口 (19)第三章 (26)【实例29】与AT24系列EEPROM接口及驱动程序 (26)【实例30】EEPROM(X5045)接口及驱动程序 (30)【实例31】与铁电存储器接口及驱动程序 (33)【实例32】与双口RAM存储器接口及应用实例 (35)【实例33】与NANDFLASH(K9F5608)接口及驱动程序 (35)第四章 (43)【实例34】独立键盘控制 (43)【实例35】矩阵式键盘控制 (44)【实例36】改进型I/O端口键盘 (46)【实例37】PS/2键盘的控制 (49)【实例39】段数码管(HD7929)显示实例 (54)【实例40】16×2字符型液晶显示实例 (55)【实例41】点阵型液晶显示实例 (61)【实例42】LCD显示图片实例 (63)第五章 (70)【实例43】简易电子琴的设计 (70)【实例44】基于MCS-51单片机的四路抢答器 (71)【实例45】电子调光灯的制作 (76)【实例46】数码管时钟的制作 (81)【实例47】LCD时钟的制作 (96)【实例48】数字化语音存储与回放 (103)【实例49】电子标签设计 (112)第六章 (120)【实例50】指纹识别模块 (121)【实例51】数字温度传感器 (121)第七章 (124)【实例53】超声波测距 (124)【实例54】数字气压计 (125)【实例55】基于单片机的电压表设计 (132)【实例56】基于单片机的称重显示仪表设计 (133)【实例57】基于单片机的车轮测速系统 (136)第八章 (138)【实例58】电源切换控制 (138)【实例59】步进电机控制 (140)【实例60】单片机控制自动门系统 (141)【实例61】控制微型打印机 (144)【实例62】单片机控制的EPSON微型打印头 (144)【实例63】简易智能电动车 (145)【实例64】洗衣机控制器 (149)第九章 (152)【实例65】串行A/D转换 (152)【实例66】并行A/D转换 (153)【实例67】模拟比较器实现A/D转换 (154)【实例68】串行D/A转换 (155)【实例69】并行电压型D/A转换 (156)【实例70】并行电流型D/A转换 (156)【实例71】2I C接口的A/D转换 (157)【实例72】2I C接口的D/A转换 (161)【实例73】单片机间双机通信 (164)【实例74】单片机间多机通信方法之一 (166)【实例75】单片机间多机通信方法之二 (171)【实例76】PC与单片机通信 (176)【实例77】红外通信接口 (178)第十一章 (180)【实例79】单片机实现PWM信号输出 (180)【实例80】实现基于单片机的低频信号发生器 (182)【实例81】软件滤波方法 (183)【实例82】FSK信号解码接收 (186)【实例83】单片机浮点数运算实现 (187)【实例84】神经网络在单片机中的实现 (192)【实例85】信号数据的FFT变换 (194)第十二章 (198)【实例86】2I C总线接口的软件实现 (198)【实例87】SPI总线接口的软件实现 (200)【实例88】1-WIRE总线接口的软件实现 (205)【实例89】单片机外挂CAN总线接口 (207)【实例90】单片机外挂USB总线接口 (210)【实例91】单片机实现以太网接口 (214)【实例92】单片机控制GPRS传输 (221)【实例93】单片机实现TCP/IP协议 (223)第十三章 (229)【实例94】读写U盘 (229)【实例95】非接触IC卡读写 (234)【实例96】SD卡读写 (238)【实例97】高精度实时时钟芯片的应用 (242)第十四章 (247)【实例98】智能手机充电器设计 (247)【实例99】单片机控制门禁系统 (248)第一章【实例1】使用累加器进行简单加法运算:MOV A,#02H ;A←2ADD A,#06H ;A←A+06H【实例2】使用B寄存器进行简单乘法运算:MOV A,#02H ; A←2MOV B,#06H ; B←6MUL AB ; BA←A*B=6*2【实例3】通过设置RS1,RS0选择工作寄存器区1:CLR PSW.4 ; PSW.4←0SETB PSW.5 ; PSW.5←1【实例4】使用数据指针DPTR访问外部数据数据存储器:MOV DPTR, #data16 ; DPTR←data16MOVX A, @ DPTR ; A←((DPTR))MOVX @ DPTR, A ; (DPTR)←A【实例5】使用程序计数器PC查表:MOV A, #data ;A←dataMOVC A, @ A+DPTR ; PC←(PC)+1 ,A←((A)+(PC)) 【实例6】if语句实例:void main(){ int a,b,c,min;printf("\n please input three number:");scanf("%d%d%d ",&a,&b,&c);if(a<b&&a<c) printf("min=%d\n",a );else if(b<a&&b<c) printf("min=%d\n",b);else if(c<a&&c<c) printf("min=%d\n",c);else printf("There at least two numbers are equal\n");}【实例7】switch-case语句实例:void main(){ int num; printf("input one number:");scanf("%d",& num);switch(num){ case 1: printf("num =%d\n", num);break;case 2: printf("num =%d\n", num);break;case 3: printf("num =%d\n", num);break;case 4: printf("num =%d\n", num);break;default: printf("The number is out of the range\n", num);}}【实例8】for语句实例:void main(){ for(int a=10;n>0;a --)printf("%d",a);}【实例9】while语句实例:void main(){ int i=0;while(i<=10) i++;}【实例10】do…while语句实例:void main(){ int i=0;do{ i++;}while(i<=10);}【实例11】语句形式调用实例:void main(){ int i=0; while(i<=10) i++; ……Sum(); /*函数调用*/}【实例12】表达式形式调用实例:void main(){ int a,b,i=0; while(i<=10) i++; ……i=4*Sum(a,b); /*函数调用*/}【实例13】以函数的参数形式调用实例:void main(){ int a,b,c,i=0; while(i<=10) i++; ……i= max(c,Sum(a,b)); /*函数调用*/ }【实例14】函数的声明实例:void main(){ int max(int x,int y); /*函数的声明*/ int a,b,c,i=0; while(i<=10) i++; ……i= max(c,Sum(a,b)); /*函数调用*/ }【实例15】函数递归调用的简单实例:void fun(){ int a=1, result,i;for(i=0;i<10;){ i=a+I;result = fun(); /*函数调用*/}return result;}【实例16】数组的实例:void main(){ char num[3] [3]={{ '','#',''},{'#','','#'},{'','#',''}}; /*定义多维数组*/ int i=0,j=0;for(;i<3;i++){ for(;j<3;j++) printf(“%c”,num[i][j]);printf(“/n”);}【实例17】指针的实例:void main(){ int a=3,*p;p=&a; /*将变量a的地址赋值给指针变量p*/printf(“%d,%d”,a,*p); /*输出二者的数值进行对比*/}【实例18】数组与指针实例:void main(){ int i=3,num[3]={1,2,3},*p;p=num; /*将数组num[]的地址赋值给指针变量p*/result =max(p,3); /*函数调用,计算数组的最大值*/}【实例19】P1口控制直流电动机实例sfr p1=0x90;sbit p10=p1^0;sbit p11=p1^1;void main (){int i, m;int j=100;int k=20;// 正快转for (i=0; i<100; i++){P10=1;for (j=0; j<50; j++){m=0;}}P10=0;for (j=0; j<10; j++){m=0}//正慢转for (i=0; i<100; i++) {P10=1;for (j=0; j<10; j++) {m=0}}p10=0;for (j=0; j<50; j++) {m=0}// 负快转for (i=0; i<100; i++) {p11=1;for (j=0; j<50; j++) {m=0;}}p11=0;for (j=0; j<10; j++) {m=0;}// 负慢转for (i=0; i<100; i++) {p11=1;for (j=0;j<10;j++) {m=0;}}p11=0for (j=0; j<50; j++) {m=0;}}第二章【实例20】用74LS165实现串口扩展并行输入口(1)函数声明管脚定义//---------------------------------------库函数声明,管脚定义------------------------------------------ #include<reg52.h>sbit LOAD=P1^7;//用P1^7控制SH/ 管脚(2)串口初始化函数UART_init()//-------------------------------------------------------------------------------------------------------------- // 函数名称:UART_init()// 功能说明:串口初始化,设定串口工作在方式0//-------------------------------------------------------------------------------------------------------------- void UART_init(void){SCON=0x10;//设串行口方式0,允许接收,启动接收过程ES=0;//禁止串口中断}(3)数据接收函数PA()//-------------------------------------------------------------------------------------------------------------- // 函数名称:PA()// 输入参数:无// 输出参数:返回由并口输入的数据// 功能说明:接收八位串行数据//-------------------------------------------------------------------------------------------------------------- unsigned char PA(void){unsigned char PA_data;LOAD=0;//当P1.7输出低电平,74LS165将并行数据装入寄存器//当中LOAD=1;//当P1.7输出高电平,74LS165在时钟信号下进行移位UART_init();//74LS165工作在时钟控制下的串行移位状态while(RI==0);//循环等待RI=0;PA_data=SBUF;return PA_data;//返回并行输入的数据}(1)函数声明管脚定义//---------------------------------------库函数声明,管脚定义------------------------------------------ #include<reg52.h>sbit a7=ACC^7;sbit simuseri_CLK=P1^6;//用P1^6模拟串口时钟sbit simuseri_DATA=P1^5;//用P1^5模拟串口数据sbit drive74165_LD=P1^7;//用P1^7控制SH/ 管脚(2)数据输入函数in_simuseri()//-------------------------------------------------------------------------------------------------------------- // 函数名称:in_simuseri()// 输入参数:无// 输出参数:data_buf// 功能说明:8位同位移位寄存器,将simuseri_DATA串行输入的数据按从低位到// 高位// 保存到data_buf//-------------------------------------------------------------------------------------------------------------- unsigned char in_simuseri(void){unsigned char i;unsigned char data_buf;i=8;do{ACC=ACC>>1;for(;simuseri_CLK==0;);a7= simuseri_DA TA;for(;simuseri_CLK==1;);}while(--i!=0);simuseri_CLK=0;data_buf=ACC;return(data_buf);}(3)数据输出函数PAs()//-------------------------------------------------------------------------------------------------------------- // 函数名称:PAs()// 输入参数:无// 输出参数:PAs _buf,返回并行输入74LS165的数据// 功能说明:直接调用,即可读取并行输入74LS165的数据,不需要考虑74LS165的// 工作原理//--------------------------------------------------------------------------------------------------------------unsigned char PAs(void){unsigned char PAs_buf;drive74165_LD=0;drive74165_LD=1;PAs_buf= in_simuseri();return(PAs_buf);}【实例21】用74LS164实现串口扩展并行输出口单片机串口驱动74LS164的程序主要包括函数声明管脚定义部分、串口初始化函数以及数据发送函数。
(精品)51单片机音乐播放器程序【整理】
![(精品)51单片机音乐播放器程序【整理】](https://img.taocdn.com/s3/m/caec1fd3482fb4daa48d4ba3.png)
(精品)51单片机音乐播放器程序【整理】/*-----------------------------------------------名称:音乐播放日期:2009.5修改:无内容:------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit speaker=P1^2; //定义音乐输出端口,需要连接到对应的喇叭,请参考电路图unsigned char timer0h,timer0l,time;//世上只有妈妈好数据表code unsigned char sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0};// 音阶频率表高八位code unsigned char FREQH[]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,} ;// 音阶频率表低八位code unsigned char FREQL[]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,};/******************************************************************/ /* 延时函数 *//******************************************************************/ void delay(unsigned char t){unsigned char t1;unsigned long t2;for(t1=0;t1<t;t1++){for(t2=0;t2<8000;t2++){;}}TR0=0;}/******************************************************************/ /* 定时器中断函数 *//******************************************************************/ void t0int() interrupt 1{TR0=0;speaker=!speaker;TH0=timer0h;TL0=timer0l;TR0=1;}/******************************************************************/ /* 音乐处理函数 *//******************************************************************/ void song(){TH0=timer0h;TL0=timer0l;TR0=1;delay(time);}/******************************************************************/ /* 主函/******************************************************************/ void main(void){unsigned char k,i;TMOD=1; //置CT0定时工作方式1EA=1;ET0=1;//IE=0x82 //CPU开中断,CT0开中断while(1){i=0;while(i<100){ //音乐数组长度,唱完从头再来k=sszymmh[i]+7*sszymmh[i+1]-1;timer0h=FREQH[k];timer0l=FREQL[k];time=sszymmh[i+2];i=i+3;song();}}}。
单片机程序架构详解篇
![单片机程序架构详解篇](https://img.taocdn.com/s3/m/a103183c178884868762caaedd3383c4bb4cb431.png)
单片机程序架构详解一、前言单片机,也称为微控制器(Microcontroller),是将计算机的体系结构集成到一个芯片上的微型计算机。
由于其体积小、成本低、可靠性高等特点,单片机在工业控制、智能仪表、家用电器等领域得到了广泛应用。
了解单片机的程序架构是编写和优化单片机程序的关键。
二、单片机程序架构概述单片机的程序架构主要由以下几个部分组成:1. 硬件抽象层(HAL):这一层为上层软件提供了一个与硬件无关的接口,使得软件可以独立于硬件进行开发和运行。
HAL层通常包括对单片机各种外设(如GPIO、UART、SPI、PWM等)的操作函数。
2. 系统服务层:这一层提供了系统级的各种服务,如任务调度、内存管理、时间管理等。
这些服务使得上层应用程序可以更加专注于业务逻辑的实现。
3. 应用层:这是最上层,直接面向用户,包含了各种应用程序的逻辑代码。
三、各层详解1. 硬件抽象层(HAL)硬件抽象层(HAL)是单片机程序架构中非常重要的一层,其主要目标是使得硬件相关的操作与具体的硬件实现无关。
这样,当硬件平台发生变化时,只要HAL层设计得当,上层代码就不需要改变。
HAL层通常包括以下内容:* 各种外设寄存器的操作函数:例如,GPIO的输入输出函数、UART的发送接收函数等。
这些函数隐藏了具体的寄存器操作细节,使得开发者只需要关注功能实现而不需要关心底层寄存器的操作。
* 硬件初始化函数:用于在系统启动时对单片机进行初始化,如配置时钟、启动看门狗等。
* 中断处理函数:用于处理单片机的各种中断事件,如定时器溢出、串口接收等。
2. 系统服务层系统服务层提供了单片机操作系统所需的各种服务,如任务调度、内存管理、时间管理等。
这些服务使得上层应用程序可以更加专注于业务逻辑的实现。
以下是一些常见的系统服务:* 任务调度:多任务环境下,任务调度器负责分配CPU时间给各个任务,使得各个任务能够按需运行。
* 内存管理:负责动态内存的分配和释放,如堆和栈的管理。
51单片机唱歌 C51音乐程序[整理]
![51单片机唱歌 C51音乐程序[整理]](https://img.taocdn.com/s3/m/2ded1853b52acfc789ebc97b.png)
51单片机唱歌 C51音乐程序[整理] 51单片机唱歌 C51音乐程序,i nclude <reg52.h> ,i nclude <intrins.h> //本例采用89C52, 晶振为11.0592MHZ //关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;//所以拿出谱子, 试探编吧!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) P1=~P1,delay(m); //等待节拍完成, 通过P1口输出音频(可多声道哦!)TR0=0; //关定时器1}}。
单片机程序大全
![单片机程序大全](https://img.taocdn.com/s3/m/b6b409d35ff7ba0d4a7302768e9951e79b896935.png)
单片机程序大全(以下是一个以“单片机程序大全”为题目的文章范例,依据题目性质并非一个合同或作文的格式。
请注意,这个范例只是为了明示写作格式的变化,并非提供一个实际的单片机程序大全。
)单片机程序大全本文将为大家提供一个全面的单片机程序大全,涵盖了各种常见的单片机应用。
希望本文能够对单片机程序的学习和实践有所帮助。
一、LED灯程序LED灯是一个常见的单片机实验项目。
以下是一个基本的LED灯闪烁程序的代码,使用C语言编写:```c#include <reg51.h>#define LED P0void delay(int time) {int i, j;for (i = 0; i < time; i++) {for (j = 0; j < 10000; j++) {; // 空循环,用于延时}}}void main() {while (1) {LED = 0xFF; // 所有LED灯亮delay(1000); // 延时1秒LED = 0x00; // 所有LED灯灭delay(1000); // 延时1秒}}```二、温度监测程序单片机可以用于温度监测,以下是一个简单的温度监测程序的代码示例,使用C语言编写:```c#include <reg51.h>#define TEMP P1void delay(int time) {int i, j;for (i = 0; i < time; i++) {for (j = 0; j < 10000; j++) {; // 空循环,用于延时}}}void main() {while (1) {if (TEMP > 30) {P0 = 0x01; // 温度过高,亮起警示灯 } else {P0 = 0x00; // 温度正常,灭掉警示灯 }delay(100); // 延时0.1秒}}```三、电机控制程序单片机常用于电机控制,以下是一个电机正反转控制程序的代码示例,使用C语言编写:```c#include <reg51.h>#define MOTOR P2void delay(int time) {int i, j;for (i = 0; i < time; i++) {for (j = 0; j < 10000; j++) {; // 空循环,用于延时}}}void main() {while (1) {MOTOR = 0x01; // 电机正转delay(1000); // 延时1秒MOTOR = 0x02; // 电机反转delay(1000); // 延时1秒}}```以上仅是三个简单的单片机程序示例,单片机的应用非常广泛,包括但不限于LED灯闪烁、温度监测、电机控制等。
单片机程序
![单片机程序](https://img.taocdn.com/s3/m/70d2a3e8ff00bed5b9f31dfe.png)
1、编程将片内 RAM30H 单元开始的15 B 的数据传递到片外 RAM3000H 开始的单元中去。
解: STRAT: MOV R0,#30HMOV R7,#0FHMOV DPTR,#3000HLOOP: MOV A,@R0MOVX@DPTR,AINC R0INC DPTRDJNZ R7,LOOP3、将内部 RAM 40H 开始的 10 个字节的数搬到外面RAM 2000H 处MOV DPTR,#2000HMOV R0,#40HMOV R2,#0AHLOOP:MOV A,@R0MOVX @DPTR,AINC R0INC DPTRDJNZ R2,LOOPSJMP$ENDRET2 、编程将片内 RAM 40H 单元中的内容送到片外RAM2000H 单元中。
解:ORG0100HMOV A, 40HMOV DPTR, #2000HMOVX @DPTR, AEND4、将存于外面 RAM 8000H 开始的 50H 数据传递 0010H 的地区,请编程实现。
MOV DPTR, #8000HMOV R0,#10HMOV R2,#50HLOOP: MOVX A, @DPTR;取数MOVX @R0,A;存数1NC DPTR1NC R0DJNZ R2, LOOPRET5.片内 RAM40H 开始的单元内有10B 二进制数,编程找出此中最大值并存于50H 单元中.解START: MOV R0,#40H;数据块首地点送 R0MOV R7,#09H;比较次数送R7MOV A,@R0;取数送ALOOP:INC R0MOV30H,@R0;取数送30 HCJNE A,30H,NEHT;( A)与( 30H)对比NEXT:JNC BIE1(A)≥ (30H)转 BIR1MOV A,30H;(A)< (30H),大数送 ABIE1:DJNZ R7,LOOP;比较次数减 1,不为 0,持续比较MOV50H,A;比较结束,大数送 50HRET6.片内 RAM30H 开始的单元中有 10B 的二进制数,请编程求它们之和(和<256 ).解ADDIO:MOV R0,30H ADD A,@R0MOV R7,#9DJNZ R7,LOOPMOV A,@R0MOV30H,A LOOP: INC R0RET7、设从内存BLOCK单元开始寄存一无符号数的数据块,其长度为LEN。
单片机程序大全(29页)
![单片机程序大全(29页)](https://img.taocdn.com/s3/m/188edb9d294ac850ad02de80d4d8d15abe2300d7.png)
单片机程序大全(29页)在单片机程序设计领域,有许多常用的程序,可以用于各种不同的应用。
本文将为您介绍一些常见的单片机程序,并提供相应的代码示例。
这些程序将涵盖从基本的输入/输出操作到复杂的控制算法。
无论您是初学者还是有一定经验的开发人员,我们相信本文都会对您有所帮助。
I. LED控制程序LED控制程序是单片机程序设计的基础,也是许多初学者的入门项目。
下面是一个简单的LED控制程序示例:```c#include <reg51.h>void delay(unsigned int milliseconds) {unsigned int i, j;for(i = 0; i < milliseconds; i++) {for(j = 0; j < 1000; j++);}}void main() {while(1) {P1 = 0xFF; // 将P1口的所有引脚设置为高电平(点亮LED)delay(1000); // 延时1秒P1 = 0x00; // 将P1口的所有引脚设置为低电平(熄灭LED)delay(1000); // 延时1秒}}```上述程序通过控制单片机的I/O口,实现了LED的闪烁效果。
其中,`delay`函数用于延时一定的时间,通过循环等待的方式实现。
II. 温度传感器数据采集程序许多实际应用中,我们需要使用温度传感器来采集环境温度数据。
下面是一个简单的温度传感器数据采集程序示例:```c#include <reg51.h>unsigned char readTemperature() {unsigned char temperature;// 温度传感器数据采集代码...// 在此省略实际的数据采集操作,以及与温度传感器通信的代码 // 假设最终采集到的温度数据存储在temperature变量中return temperature;}void main() {unsigned char temperature;while(1) {temperature = readTemperature();// 对温度数据进行处理和显示的代码...// 在此省略实际的数据处理和显示操作,以及与显示设备通信的代码}}```上述程序通过`readTemperature`函数模拟温度传感器的数据采集,并将采集到的温度数据存储在`temperature`变量中。
经典单片机编程100例
![经典单片机编程100例](https://img.taocdn.com/s3/m/fb74674bba68a98271fe910ef12d2af90242a89b.png)
经典单片机编程100例单片机是指具有微处理器内核、存储器和输入输出设备的集成电路芯片。
它广泛应用于各种电子设备中,例如家用电器、汽车电子、工业自动化等领域。
单片机编程是指通过给单片机内部写入特定的指令,使其按照程序逻辑完成特定的功能。
本文将介绍经典的单片机编程实例,帮助读者更好地理解和掌握单片机编程的基本原理和技巧。
1. LED闪烁程序在单片机编程中,最简单的实例之一就是控制LED灯的闪烁。
通过设置相应的IO口为输出模式,并在循环中对该IO口进行高低电平的切换,可以实现LED的闪烁效果。
以下是一个基本的LED闪烁程序示例:```c#include <reg51.h>sbit LED = P1^0;void delay(unsigned int t){while(t--);}void main(){while(1){LED = 0; // 点亮LEDdelay(50000);LED = 1; // 熄灭LEDdelay(50000);}}```上述代码中,通过设置P1口的第0位为1或者0,控制LED的亮灭状态,并在两个状态之间加入适当的延时,从而实现LED的闪烁。
2. 按键控制LED开关在单片机编程中,常常需要通过外部输入设备来控制其他设备的状态。
例如,通过按下按钮来控制LED的开关。
以下是一个简单的按键控制LED开关的程序示例:```c#include <reg51.h>sbit LED = P1^0;sbit Key = P0^0;void delay(unsigned int t){while(t--);}void main(){while(1){if(Key==0) // 如果按键被按下{LED = ~LED; // 取反LED的状态delay(50000); // 延时一段时间,防止按键抖动 while(Key==0); // 等待按键释放}}}```上述代码中,通过检测P0口的第0位,判断是否有按键按下。
单片机操作流程
![单片机操作流程](https://img.taocdn.com/s3/m/2226f27aef06eff9aef8941ea76e58fafbb0457c.png)
单片机操作流程
第一步:点击PROJECT中的NEW PROJECT然后命名(要知道路径) ,保存,选择相对应的芯片型号,确定。
第二步:点击FILE,选NEW,输入程序,保存,需要知道路径名及其后缀。
第三步:在界面左侧窗口中的source group 1上点击右键,add file to group,找到刚保存的源文件,add,close 第四步:界面左侧窗口中的target 1上点击右键,options for target"target 1”第五步:在出现的界面中选择上方的output在“create hex file”前打对勾,确定。
第六步:在界面左侧窗口中的target 1上点击右键built target如提示信息中没有警告及错误即可。
第七步:关闭KEIL窗口,打开编程窗口(必须通讯正常) ,选择正确的芯片型号,点击擦除,然后点击加载,找到刚刚KEIL中编译生成的HEX文件,确定,编程即可。
(其间把芯片正确放入编程器的座上。
)。
单片机程序介绍
![单片机程序介绍](https://img.taocdn.com/s3/m/c5cfadb5690203d8ce2f0066f5335a8102d26635.png)
单片机程序介绍单片机(Microcontroller)是一种集成了微处理器、存储器和各种输入输出接口的集成电路,广泛应用于嵌入式系统中。
单片机程序是指在单片机上运行的一段指令集合,用于控制硬件设备的操作和实现特定功能。
一、单片机程序的基本结构单片机程序通常由以下几个部分组成:1. 引用头文件(Include Header Files):在编写单片机程序时,通常会引用一些头文件,这些头文件包含了一些预定义的函数和常量,方便程序员使用。
比如,可以引用头文件"reg51.h",该头文件包含了对51系列单片机寄存器的定义。
2. 定义宏(Define Macros):在程序中,可以使用宏定义来定义一些常量或者函数。
通过使用宏定义,可以提高程序的可读性和可维护性。
比如,可以使用宏定义"#define LED_PIN P1_0"来定义LED的引脚。
3. 全局变量定义(Global Variable Definition):在程序中,可以定义一些全局变量,这些变量可以在整个程序中被访问和修改。
比如,可以定义一个全局变量int count = 0,用于记录某个事件的次数。
4. 函数声明(Function Declaration):在程序中,可以声明一些函数,这些函数可以在其他函数中被调用。
函数声明的目的是为了告诉编译器函数的存在和函数的参数类型。
比如,可以声明一个函数void delay(unsigned int ms),用于实现延时功能。
5. 主函数(Main Function):主函数是单片机程序的入口函数,程序从主函数开始执行。
在主函数中,可以调用其他函数,实现各种功能。
比如,可以在主函数中调用delay函数实现延时,然后控制LED灯的闪烁。
二、单片机程序的编写步骤编写单片机程序的一般步骤如下:1. 确定需求和功能:首先需要明确程序的需求和功能,确定需要控制的硬件设备和所需的操作。
单片机常用的14个C语言算法
![单片机常用的14个C语言算法](https://img.taocdn.com/s3/m/40773b2f49d7c1c708a1284ac850ad02de80070d.png)
引言概述:在单片机的开发中,C语言是最常用的编程语言之一。
掌握一些常用的C语言算法对于单片机的开发非常重要。
本文将介绍单片机常用的14个C语言算法之二,包括排序算法、查找算法、递归算法、动态规划算法和图算法。
正文内容:一、排序算法1. 冒泡排序:通过不断地交换相邻元素的位置,将大的元素冒泡到数组的末尾。
2. 快速排序:通过选择一个基准元素,将小于基准元素的数移动到基准元素左边,将大于基准元素的数移动到基准元素右边,然后分别对左右两部分递归地进行快速排序。
3. 插入排序:将数组分为已排序和未排序两部分,每次从未排序部分取一个元素,将其插入已排序部分的合适位置。
4. 选择排序:每次从未排序部分选择最小的元素,将其放在已排序部分的末尾。
5. 归并排序:将数组不断划分为更小的子数组,然后将子数组合并为有序数组。
二、查找算法1. 顺序查找:逐个比较数组中的元素,直到找到目标元素或者遍历完整个数组。
2. 二分查找:对于已排序的数组,通过不断将目标值与中间元素比较,并缩小搜索范围,最终找到目标元素的位置。
3. 插值查找:与二分查找类似,不同之处在于确定中间元素的位置时使用插值公式,使得查找范围更接近目标元素。
4. 哈希查找:使用哈希函数将关键字映射到一个唯一的哈希值,通过查找哈希值对应的位置来获取关键字。
5. 递归查找:通过递归地划分问题的规模,从而减小查找范围,最终找到目标元素。
三、递归算法1. 递归定义:在函数的定义中使用函数本身的方式称为递归。
2. 递归函数的特点:包含一个递归结束的条件和一个递归调用的表达式。
3. 递归算法的实现:通过不断把原问题转化为更小规模的子问题,直到满足递归结束的条件。
4. 递归算法的应用:在树、图等数据结构的遍历、搜索等问题中,递归算法被广泛使用。
5. 递归算法的优化:如尾递归优化、记忆化搜索等方法可以避免递归算法中的重复计算。
四、动态规划算法1. 动态规划的思想:将一个问题划分为多个子问题,并保存每个子问题的解,避免重复计算。
51单片机汇编程序
![51单片机汇编程序](https://img.taocdn.com/s3/m/0d87d77c590216fc700abb68a98271fe910eaf1c.png)
51单片机汇编程序1. 简介51单片机是一种常用的8位单片机芯片,具有广泛的应用领域。
51单片机的编程语言主要有汇编语言、C语言和底层汇编语言。
本文主要介绍51单片机的汇编程序。
2. 汇编程序基础2.1 寄存器51单片机的CPU有4个8位寄存器(A、B、DPTR、PSW)和一个16位寄存器(PC)。
在汇编程序中,我们可以使用这些寄存器来进行各种操作。
•A寄存器(累加器):用于存储数据和进行算术运算。
•B寄存器:辅助寄存器,可用于存储数据和进行算术运算。
•DPTR寄存器:数据指针寄存器,用于存储数据存取的地址。
•PSW寄存器:程序状态字寄存器,用于存储程序运行状态信息。
•PC寄存器:程序计数器,用于存储当前执行指令的地址。
2.2 指令集51单片机的指令集包含了多种汇编指令,可以用来进行数据操作、算术运算、逻辑运算、控制流程等。
常用的汇编指令有:•MOV:数据传送指令。
•ADD、SUB:加法和减法运算指令。
•ANL、ORL、XRL:逻辑运算指令。
•MOVX:外部RAM的读写指令。
•CJNE、DJNZ:条件分支指令。
•LCALL、RET:函数调用和返回指令。
2.3 编写一个简单的汇编程序下面是一个简单的汇编程序示例,用于将A寄存器中的数据加1,并将结果存储到B寄存器中。
ORG 0x0000 ; 程序的起始地址MOV A, #0x01 ; 将A寄存器赋值为1ADD A, #0x01 ; 将A寄存器加1MOV B, A ; 将A寄存器的值传送到B寄存器END ; 程序结束在上面的示例中,ORG指令用于指定程序的起始地址,MOV 指令用于将A寄存器赋值为1,ADD指令用于将A寄存器加1,MOV指令用于将A寄存器的值传送到B寄存器,END指令用于标记程序结束。
3. 汇编语言的应用51单片机的汇编语言广泛应用于各种嵌入式系统中,包括智能家居、工业自动化、仪器仪表等领域。
汇编程序具有以下特点:•程序执行效率高:由于汇编语言直接操作硬件,可以精确控制程序的执行流程,提高程序的执行效率。
单片机编程题整理
![单片机编程题整理](https://img.taocdn.com/s3/m/a36c7216ff00bed5b9f31dc6.png)
1.试编写程序,查找在内部RAM的30H~50H单元中是否有0AAH这一数据。
若有,则将51H单元置为“01H”;若未找到,则将51H单元置为“00H”。
START:MOV R0,#30HMOV R2,#20HLOOP: MOV A,@R0CJNE A,#0AAH,NEXTMOV 51H,#01HLJMP EXITNEXT: INC R0DJNZ R2,LOOPMOV 51H,#00HEXIT: RET2. 试编写程序,查找在内部RAM的20H~40H单元中出现“00H”这一数据的次数,并将查找到的结果存入41H 单元。
START: MOV 41H,#0MOV R0,#20HMOV R2,#20HLOOP: MOV A,@R0JNZ NEXTINC 41HNEXT: INC R0DJNZ R2,LOOPRET 3. 一批单字节无符号数,以R0为首地址,R2中为字节数,将这批数进行升序排列。
SORT: MOV A,R0MOV R1,AMOV A,R2MOV R5,ACLR F0DEC R5MOV A,@R1LOOP: MOV R3,AINC R1CLR CMOV A,@R1SUBB A,R3JNC LOOP1SETB F0MOV A,R3XCH A,@R1DEC R1XCH A,@R1INC R1LOOP1: MOV A,@R1DJNZ R5,LOOPJB F0,SORTRET4. 以AT89S51为核心的温度控制器,温度传感器输出的电压与温度为非线性关系,传感器输出的电压已由A/D转换为10位二进制数。
测得的不同温度下的电压值数据构成一个表,表中温度值为y(双字节无符号数),x(双字节无符号数)为电压值数据。
设测得电压值x放入R2R3中,根据电压值x,查找对应的温度值y,仍放入R2R3中。
LTB2:MOVDPTR,#TAB2MOV A,R3CLRCRLCAMOVR3,AXCHA,R2RLCAXCHR2,AADDA,DPLMOVDPL,AMOV A,DPHADDC A,R2MOVDPH,ACLRAOVC A,@A+DPTRMOVR2,ACLRAINCDPTRMOVC A,@A+DPTRMOVR3,ARETTAB2:DW…,… ,…5. 片内RAM中存放一批数据,查找出最大值并存放于首地址中。
单片机常见程序
![单片机常见程序](https://img.taocdn.com/s3/m/928610fb09a1284ac850ad02de80d4d8d15a01df.png)
单片机常见程序单片机(Microcontroller)作为一种嵌入式系统的核心元件,其程序设计是嵌入式系统开发中至关重要的一环。
在单片机常见程序中,包括了很多不同的程序类型,如控制程序、通信程序、驱动程序等。
这些程序以其独特的功能和特点,为嵌入式系统的正常运行提供了必要的支持。
一、控制程序控制程序是单片机常见程序中最基本的类型之一。
它主要用于控制各种外部设备或传感器的运行状态,实现对嵌入式系统行为的控制。
例如,单片机可以通过控制程序来控制电机的启停、风扇的转速、灯光的亮度等。
控制程序通常采用循环结构实现,通过检测外部输入信号,并根据输入信号的变化进行相应的操作和控制。
二、通信程序通信程序是单片机应用中另一个常见的程序类型。
在现代嵌入式系统中,单片机往往需要与其他设备或者系统进行数据交互和通信。
通信程序可以通过串口、CAN总线、以太网等方式来实现数据的传输和通信。
单片机通过通信程序可以与电脑、手机、传感器等设备进行数据交换,实现信息的输入输出、远程监控、智能控制等功能。
三、驱动程序驱动程序是单片机常见程序中的另一个重要类型。
在嵌入式系统中,单片机需要通过驱动程序来控制各类外设的工作。
驱动程序可以包括对按键、LED灯、LCD显示屏、温度传感器等各类设备的初始化、配置和控制操作。
通过合理编写驱动程序,可以使得单片机能够与各类外设无缝衔接,实现功能的完整性和稳定性。
四、中断程序中断程序是单片机常见程序中一种特殊的类型。
在嵌入式系统中,中断程序的作用是及时处理外部设备的中断请求,以提高系统的响应速度和实时性。
中断程序通常用于处理按键中断、定时器中断、串口中断等。
当外部设备发生中断事件时,单片机会立即跳转到相应的中断程序中执行特定的操作,然后再返回到原来的程序中继续执行。
中断程序的编写需要特殊的注意和设计,以确保系统的稳定性和可靠性。
五、算法实现程序除了以上几种常见的程序类型之外,单片机的应用还需要根据实际需求编写各类算法实现程序。
13个简单的单片机程序
![13个简单的单片机程序](https://img.taocdn.com/s3/m/71dfd726763231126edb113a.png)
/************************************************************************ * LED闪烁的简单试验 * * * 连接方法: JP11(P2)和JP1用8PIN排线连接起 来 * * * ************************************************************************ #include <reg51.h> //此文件中定义了51的一些特殊功能寄存器
TH0=(65536-3000)/256; TL0=(65536-3000)%256; TR0=1; ET0=1; EA=1; cntb=0; while(1) {; } } //开启定时0 //开启中断
/************************************************* * * 定时中断 ********************************************************/ 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]; }
void delay(unsigned int i); //声明延时函数 main() { P2 = 0x00; //置P0口为低电平 delay(600); // 延时 P2 = 0xff; //置P0口为高电平 delay(600); // 延时
STM8单片机的指令系统整理_2014年
![STM8单片机的指令系统整理_2014年](https://img.taocdn.com/s3/m/5df662fc541810a6f524ccbff121dd36a22dc45f.png)
STM8指令集1.ADC:带进位加,8位宽数据(15种数据寻址模式同样适用于ADD、SUB、SUBC、MUL、DIV)A9 imm8执行周期:1ADC A,#1当A.7改变时CC.7=1,执行周期:1C9 imm16执行周期:1执行周期:1F9执行周期:190F9执行周期:1执行周期:190E9 imm 执行周期:1执行周期:1执行周期:192C9 imm 执行周期:4执行周期:472D9 imm16执行周期:4执行周期:42.ADD:加法,8位宽数据,与ADC一样的15种寻址方式(汇编手册上有对SP的寻址,实际不行)。
3.XOR ,影响N和Z4.AND:与,8位宽数据,与ADC一样的15种寻址方式5.SUB ,影响6.SBC 带进位减法A=A-R-C,影响V,N和ZC7.BCP BCP A,#imm8 操作:将A与目标,不送入A,影响N和Z8.OR 或,影响N和Z9.CP 操作:将A减目标,不送入A,影响N和Z、C10. LD11. CLR12.CPL 取反或与FF异或(影响NZ,C=1)13.DEC 自减1(影响VNZ)14. INC 自增1(影响VNZ)15. NEG 补码(影响VNZ)16. RLC 逻辑左移(C→b0,b7→C)(影响VZC)18. SLA 算术左移(?)(影响?)19.SLL ?左移(?)(影响?)20.SRA ?右移(?)(影响?)21.SRL ?右移(?)(影响?)22.SWAP ?高低半字节互换(?)(影响?)23.TNZ 测试是否=0或负数(影响NZ)24.25.26.ADDW 8位单片机变16位执行周期:128.BCPL BCPL imm,#x 操作:将imm中的第x位(x=0…7)取反,无论imm写成8位还是16位都会编译成16位901x imm16执行周期:129. BRES BRES imm,#x 操作:将imm中的第x位(x=0…7)清0,无论imm写成8位还是16位都会编译成16位721x imm16执行周期:130.BSET BSET imm,#x 操作:将imm中的第x位(x=0…7)置1,无论imm写成8位还是16位都会编译成16位721x imm16执行周期:131.BTJF BTJF imm,#x,PC_START 操作:判断imm中的第x位(x=0…7),=0跳转到PC_START处,=1执行下一条语句,无论imm写成8位还是16位都会编译成16位。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1KEY-1CHAR & Kepress+1;====== ======= Const =======================MaxNum Equ 10SysStack Equ 07H ;08H..1FH;======== ========= Hardware ==============T ubePort Equ P0Keyport Bit P3.0 ;0:pressed;========== ========= Bit Units ================SysBits0 Equ 20HKeypressed Bit SysBits0.0 ;1:Key Pressed, Inner working bit KeyGet Bit SysBits0.1 ;1:Get A New Key, Outer Info; Bit SysBits0.2 ;1:; Bit SysBits0.3 ;1:; Bit SysBits0.4 ;1:; Bit SysBits0.5 ;1:; Bit SysBits0.6 ;1:; Bit SysBits0.7 ;1:;----------------------------------------- ---------------------SysBits1 Equ 21H; Bit SysBits1.0 ;1:; Bit SysBits1.1 ;1:; Bit SysBits1.2 ;1:; Bit SysBits1.3 ;1:; Bit SysBits1.4 ;1:; Bit SysBits1.5 ;1:; Bit SysBits1.6 ;1:; Bit SysBits1.7 ;1:;============ ======= Byte Units ===================;00H..07H:Reg 0-7;08H..1FH:System Stack;20H..21H:System Bit Units;22H..2FH;-------------------------------------------------------------------------------DisBuf Equ 30H ;Dispplay Buffer;-------------------------------------------------------------------------------Counter Equ 31H ;Counter:0..MaxNum;32H..7FH;=================== ===========================;80H..FFH;================== ==========================Org 0000hAjmp Main;-------------------------------------------------------------------------------Display: Mov A,DisBufMov Dptr,#DisT abMovc A,@A+DptrMov T ubePort,ARet; Char 0, 1, 2, 3, 4, 5, 6, 7, 8, 9DisT ab: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H ;---------------------------------------------- -------------------ReadKey: Jnb Keyport,ReadKey1;Key Press, Check furtherClr Keypressed ;Key ReleasedReadKeyQ: RetReadKey1: Jb KeyGet,ReadKeyQ;New Key Not Processed, QuitJb KeyPressed,ReadKeyQ;Key Not released yet, QuitSetb KeyPressedSetb KeyGetRet;----------------------------------------------------------------------------------InitKey: Clr KeyGetRet;----------------------------------------------------------------------------------CntT oDis: Mov DisBuf,CounterRet;----------------------------------------------------------------------------------InitCounter: Mov Counter,#0Ret;----------------------------------------------------------------------------------IncNum: Inc CounterMov A,CounterCjne A,#MaxNum,$+3Jc IncNumQMov Counter,#0IncNumQ: Ret;----------------------------------------------------------------------------------Main: Mov Sp,#SysS tackACall InitKeyACall InitCounterMainLoop: ACall CntT oDis ;Counter to DisBufACall Display ;Hardware DisplayACall ReadKey ;Read KeyJbc KeyGet,DoKeyAJmp MainLoopDoKey: ACall IncNum ;If Key Pressed, then Inc CounterAjmp MainLoop;===================== ============================END1 Key,2 Chars;================== =================================; Counter,1 Key, 2 Chars; V er 1.0;================================ ================;========== ====== Const =======================MaxNum Equ 100SysStack Equ 07H ;08H..1FH;========================== Hardware ====================== T ubePort Equ P1DisCS Bit P3.0 ;0:Light upKeyport Bit P3.7 ;0:pressed;======== ============ Bit Units ======================== SysBits0 Equ 20HKeypressed Bit SysBits0.0 ;1:Key Pressed, Inner working bit KeyGet Bit SysBits0.1 ;1:Get A New Key, Outer Info; Bit SysBits0.2 ;1:; Bit SysBits0.3 ;1:; Bit SysBits0.4 ;1:; Bit SysBits0.5 ;1:; Bit SysBits0.6 ;1:; Bit SysBits0.7 ;1:;-------------------------------------------------------------------------------SysBits1 Equ 21H; Bit SysBits1.0 ;1:; Bit SysBits1.1 ;1:; Bit SysBits1.2 ;1:; Bit SysBits1.3 ;1:; Bit SysBits1.4 ;1:; Bit SysBits1.5 ;1:; Bit SysBits1.6 ;1:; Bit SysBits1.7 ;1:;========== ===== Byte Units ===============;00H..07H:Reg 0-7;08H..1FH:System Stack;20H..21H:System Bit Units;22H..2FH;-------------------------------------------------------------------------------DisBuf Equ 30H;31H ;Dispplay Buffer;-------------------------------------------------------------------------------Counter Equ 32H ;Counter:0..MaxNum;33H..7FH;==================== =============================;80H..FFH;================ ===================================Org 0000hAjmp Main;-------------------------------------------------------------------------------Display: Setb DisCSMov A,DisBuf+1Mov Dptr,#DisT abMovc A,@A+DptrMov T ubePort,AACall DelayClr DisCSMov A,DisBufMov Dptr,#DisT abMovc A,@A+DptrMov T ubePort,AACall DelayRet; Char 0, 1, 2, 3, 4, 5, 6, 7, 8, 9DisT ab: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H ;----------------------------------------------------------------------------------Delay: Mov R6,#80Delay1: Mov R7,#0Djnz R7,$Djnz R6,Delay1Ret;----------------------------------------------------------------------------------CntT oDis: Mov A,CounterMov B,#10Div ABMov DisBuf,BMov DisBuf+1,ARet;-------------------------------------------------------------------------------ReadKey: Jnb Keyport,ReadKey1;Key Press, Check furtherClr Keypressed ;Key ReleasedReadKeyQ: RetReadKey1: Jb KeyGet,ReadKeyQ;New Key Not Processed, QuitJb KeyPressed,ReadKeyQ;Key Not released yet, QuitSetb KeyPressedSetb KeyGetRet;----------------------------------------------------------------------------------InitKey: Clr KeyGetRet;---------------------------------------------------------------------------------- InitCounter: Mov Counter,#95Ret;----------------------------------------------------------------------------------IncNum: Inc CounterMov A,CounterCjne A,#MaxNum,$+3Jc IncNumQMov Counter,#0IncNumQ: Ret;----------------------------------------------------------------------------------Main: Mov Sp,#SysS tackACall InitKeyACall InitCounterMainLoop: ACall CntT oDis ;Counter to DisBufACall Display ;Hardware DisplayACall ReadKey ;Read KeyJbc KeyGet,DoKeyAJmp MainLoopDoKey: ACall IncNum ;If Key Pressed, then Inc CounterAjmp MainLoop;============ =================================ENDLedPlay ;========= =======LEDPORT EQU P1KEYPORT BIT P3.7;------------------------ledindx data 30hledtab equ 31hlednum data 33h;------------------------ledmax equ 2;========================org 0000hajmp main;------------------------delay: mov r6,#0delay1: mov r7,#0djnz r7,$djnz r6,delay1ret;---------------------------ledplay: mov dpl,ledtabmov dph,ledtab+1ledplayloop: clr amovc a,@a+dptrjz ledplayq;if a=0,quitinc dptrmov p1,aclr a;get led timemovc a,@a+dptrinc dptrmov r6,aacall delay1ajmp ledplayloopledplayq: ret;-----------------------initled: mov ledindx,#0initled1: mov dptr,#ledadrmov a,ledindxrl amov b,amovc a,@a+dptrmov ledtab+1,a;dw 定义为高字节在地地址低字节在高地址mov a,binc amovc a,@a+dptrmov ledtab,aret;------------------------main: mov sp,#07hacall initledmainloop: acall ledplayajmp mainloopjb keyport,mainloopinc ledindxmov a,ledindxcjne a,#ledmax,mainloop1mov ledindx,#0mainloop1:acall initled1ajmp mainloop;========= ============ledadr: dw led0,led1;------------------------------led0: db 01111111b,255db 00111111b,255db 00011111b,255db 00001111b,255db 11111110b,255db 11111100b,255db 11111000b,255db 11110000b,255db 0,255;--------------------------------led1: db 01111111b,255db 00111111b,200db 00011111b,150db 00001111b,100db 11111110b,150db 11111100b,200db 11111000b,255db 11110000b,255db 0,255;----------------------------------end8Dis-No-Bus-Method;================= Const ========================= MaxNum Equ 10;================ Hardware ======================= DatPort Equ p1 ;SegSelect Bit P3.0 ;-_CSSelect Bit P3.1 ;-_;================ Byte Units =====================DisBuf Equ 30H;..37H;Display Buffer;=================================================Org 0000HAJmp Main;================================================= Display: Mov R0,#DisBuf ;R0->DisBufMov R1,#00000001B ;R1=Dis_CS, 1:SelectDisLoop: Mov DatPort,R1 ;DiS_Cs T o Cs PortSetb CSSelectClr CSSelectMov A,@R0 ;A=Dis_CharMov Dptr,#DisT ab ;Use T able change to Dis ModeMovC A,@A+DptrMov DatPort,A;Send it to Dis Mode PortSetb SegSelectClr SegSelectACall Delay ;S tay a whileInc R0 ;NextMov A,R1RL AMov R1,ACjne R0,#DisBuf+8,DisLoopRet;---------------------------------------------------------------------------------- Delay: Mov R6,#8Delay1: Mov R7,#0Djnz R7,$Djnz R6,Delay1Ret;---------------------------------------------------------------------------; Code 00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h ; Char "0", "1", "2", "3", "4", "5", "6", "7" DisT ab: DB 0c0h, 0f9h, 0a4h, 0b0h, 99h, 92h, 82h, 0f8h; Code 08h, 09h, 0ah, 0bh, 0ch , 0dh , 0eh, 0fh ; Char "8", "9", "a", "b", "c" , "d" , "e", "f"DB 80h, 90h, 88h, 83h, 0c6h, 0a1h, 86h, 8eh; Code 10h 11h; Char " " "H"DB 0FFH, 89H;================================================= InitDis: Mov DisBuf+0,#1Mov DisBuf+1,#2Mov DisBuf+2,#3Mov DisBuf+3,#4Mov DisBuf+4,#5Mov DisBuf+5,#6Mov DisBuf+6,#7Mov DisBuf+7,#8Ret;================================================= Main: Mov Sp,#07HACall InitDisMainLoop: ACall Displaymov r5,#10MainLoop1: ACall Displaydjnz r5,MainLoop1mov a,disbuf+7mov disbuf+7,disbuf+6mov disbuf+6,disbuf+5mov disbuf+5,disbuf+4mov disbuf+4,disbuf+3mov disbuf+3,disbuf+2mov disbuf+2,disbuf+1mov disbuf+1,disbuf+0mov disbuf+0,aAJmp MainLoop;=================================================End8DIS-BUS-Method;================= Const ========================= MaxNum Equ 10;================ Hardware ======================= DisSegPort Equ 0000HDisCSPort Equ 2000H;================ Byte Units =====================DisBuf Equ 30H;..37H;Display BufferDecPoint Data 38H;1:Show Decimal Point;=================================================Org 0000HAJmp Main;================================================= Display: Mov R0,#DisBuf ;R0->DisBufMov R1,#00000001B ;R1=Dis_CS, 1:SelectDisLoop: Mov Dptr,#DisCSPort ;BUS MethodMov A,R1Movx @Dptr,AMov B,#11111111B ;No DeciPointAnl A,DecPointJz Display1Mov B,#01111111BDisplay1:Mov A,@R0 ;A=Dis_CharMov Dptr,#DisT ab ;Use T able change to Dis ModeMovC A,@A+DptrMov Dptr,#DisSegPortAnl A,B ;B=11111111B,01111111BMovx @Dptr,AACall Delay ;S tay a whileInc R0 ;NextMov A,R1RL AMov R1,ACjne R0,#DisBuf+8,DisLoopMov Dptr,#DisSegPortMov A,#0FFHMovx @Dptr,ARet;---------------------------------------------------------------------------------- Delay: Mov R6,#8Delay1: Mov R7,#0Djnz R7,$Djnz R6,Delay1Ret;---------------------------------------------------------------------------; Code 00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h; Char "0", "1", "2", "3", "4", "5", "6", "7" DisT ab: DB 0c0h, 0f9h, 0a4h, 0b0h, 99h, 92h, 82h, 0f8h; Code 08h, 09h, 0ah, 0bh, 0ch , 0dh , 0eh, 0fh; Char "8", "9", "a", "b", "c" , "d" , "e", "f"DB 80h, 90h, 88h, 83h, 0c6h, 0a1h, 86h, 8eh; Code 10h 11h; Char " " "H"DB 0FFH, 89H;================================================= InitDis: Mov DisBuf+0,#1Mov DisBuf+1,#2Mov DisBuf+2,#3Mov DisBuf+3,#4Mov DisBuf+4,#5Mov DisBuf+5,#6Mov DisBuf+6,#7Mov DisBuf+7,#8Mov DecPoint,#00000101BRet;================================================= Main: Mov Sp,#07HACall InitDisMainLoop: ACall DisplayMov R5,#10MainLoop1: ACall DisplayDjnz R5,MainLoop1Mov A,DisBuf+7Mov DisBuf+7,DisBuf+6Mov DisBuf+6,DisBuf+5Mov DisBuf+5,DisBuf+4Mov DisBuf+4,DisBuf+3Mov DisBuf+3,DisBuf+2Mov DisBuf+2,DisBuf+1Mov DisBuf+1,DisBuf+0Mov DisBuf+0,AMov A,DecPointRL AMov DecPoint,AAJmp MainLoop;=================================================EndDis&Readkey;;================= Const ===============Dark Equ 10H;KeyCode 10H="0FFH"...数码管全暗;================ Hardware ======================= DisSegPort Equ 0000HDisCSPort Equ 2000HKeyOutPort Equ DisCSPort;0:OutputKeyInPort Equ P1 ;P1.0..P1.3,0:Pressed;================= Bit Units =====================SysBit0 Equ 20HKeyGet Bit SysBit0.0 ;1:Get a new Keykeypress Bit SysBit0.1 ;;================ Byte Units =====================DisBuf Equ 30H;..37H;Display BufferDecPoint Data 38H;1:Show Decimal PointKeyCode Data 39H;=================================================Org 0000HAJmp Main;================================================= Display: Mov R0,#DisBuf ;R0->DisBufMov R1,#00000001B ;R1=Dis_CS, 1:SelectDisLoop: Mov Dptr,#DisCSPort ;BUS MethodMov A,R1Movx @Dptr,AMov B,#11111111B ;No DeciPointAnl A,DecPointJz Display1Mov B,#01111111BDisplay1:Mov A,@R0 ;A=Dis_CharMov Dptr,#DisT ab ;Use T able change to Dis ModeMovC A,@A+DptrMov Dptr,#DisSegPortAnl A,B ;B=11111111B,01111111BMovx @Dptr,AACall Delay ;S tay a whileInc R0 ;NextMov A,R1RL AMov R1,ACjne R0,#DisBuf+8,DisLoopRet;---------------------------------------------------------------------------------- Delay: Mov R6,#8Delay1: Mov R7,#0Djnz R7,$Djnz R6,Delay1Ret;---------------------------------------------------------------------------; Code 00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h ; Char "0", "1", "2", "3", "4", "5", "6", "7" DisT ab: DB 0c0h, 0f9h, 0a4h, 0b0h, 99h, 92h, 82h, 0f8h; Code 08h, 09h, 0ah, 0bh, 0ch , 0dh , 0eh, 0fh; Char "8", "9", "a", "b", "c" , "d" , "e", "f"DB 80h, 90h, 88h, 83h, 0c6h, 0a1h, 86h, 8eh; Code 10h 11h; Char " " "H"DB 0FFH, 89H;-------------------------------------------------;=================================================;Out,A=0:No KeyKeyScan: Mov Dptr,#KeyOutPortClr AMovx @Dptr,AMov A,KeyInPortCpl AAnl A,#00001111BRet;-------------------------------------------------ReadKey: ACall KeyScanJnz ReadKey1ReadkeyQ1: Clr KeyPressReadKeyQ: Ret ;No Key, QuitReadKey1: Jb KeyPress,ReadKeyQSetb KeyPressACall DisplayACall KeyScanJz ReadKeyQ ;No Key, QuitMov R1,#11111110B ;Key OutputMov R0,#0 ;Key X Code ReadKeyLp: Mov Dptr,#KeyOutPortMov A,R1Movx @Dptr,AMov B,#0 ;Y CodeJnb P1.0,ReadKeyOkMov B,#6 ;Y CodeJnb P1.1,ReadKeyOkMov B,#12 ;Y CodeJnb P1.2,ReadKeyOkMov B,#18 ;Y CodeJnb P1.3,ReadKeyOkMov A,R1RL AMov R1,AInc R0Cjne R0,#6,ReadKeyLpSJmp ReadkeyQ1ReadKeyOk: Mov A,BAdd A,R0Mov Dptr,#KeyT abMovc A,@A+DptrSetb KeyGetMov KeyCode,ARet;---------------------------------------------------------------------------- ; KeyCode 0 1 2 3 4 5KeyT ab: DB 10,0,11,12,13,14; KeyCode 6 7 8 9 10 11DB 15,1, 2, 3,16,17; KeyCode 12 13 14 15 16 17DB 18, 4, 5, 6,19,20; KeyCode 18 19 20 21 22 23DB 21, 7, 8, 9,22,23;-------------------------------------------------InitKey: Clr KeyGetClr keypressRet;================================================= InitDis: Mov DisBuf+0,#DarkMov DisBuf+1,#DarkMov DisBuf+2,#DarkMov DisBuf+3,#DarkMov DisBuf+4,#DarkMov DisBuf+5,#DarkMov DisBuf+6,#DarkMov DisBuf+7,#DarkMov DecPoint,#00000000BRet;================================================= Main: Mov Sp,#07HACall InitDisACall InitKeyMainLoop: ACall ReadKeyACall DisplayJBC KeyGet,DoKeyAJmp MainLoopDoKey: acall KeyIntoDisAJmp MainLoop;================================================= ;Left Shift Display BufferKeyIntoDis: mov disbuf+7,aMov DisBuf+7,DisBuf+6Mov DisBuf+6,DisBuf+5Mov DisBuf+5,DisBuf+4Mov DisBuf+4,DisBuf+3Mov DisBuf+3,DisBuf+2Mov DisBuf+2,DisBuf+1Mov DisBuf+1,DisBuf+0Mov DisBuf+0,KeyCodeRet;-------------------------------------------------EndCalculator== =============================================== ; Calculator;================= Const ========================= Dark Equ 10HSysemStack Equ 07H ;08H..1FH;================ Hardware ======================= DisSegPort Equ 0000HDisCSPort Equ 2000HKeyOutPort Equ DisCSPort;0:OutputKeyInPort Equ P1 ;P1.0..P1.3,0:Pressed;================= Bit Units ===================== SysBit0 Equ 20HKeyGet Bit SysBit0.0 ;1:Get a new KeyKeyPress Bit SysBit0.1 ;1:Key PressingNeedCls Bit SysBit0.2 ;1:Need Clr Screen; Bit SysBit0.3 ;1:; Bit SysBit0.4 ;1:; Bit SysBit0.5 ;1:; Bit SysBit0.6 ;1:; Bit SysBit0.7 ;1:;================ Byte Units =====================;00H..07H:Working Reg;08H..1FH:System Stack,24 bytes;20H..21H:System Bit Units;22H..2FH:DisBuf Equ 30H;..35H;Display Buffer;36H,37HDecPoint Data 38H;1:Show Decimal Point KeyCode Data 39HResult Data 3AH;3BH..7FH;================================================= Org 0000HAJmp Main;================================================= Display: Mov R0,#DisBuf ;R0->DisBufMov R1,#00000001B ;R1=Dis_CS, 1:SelectDisLoop: Mov Dptr,#DisCSPort ;BUS MethodMov A,R1Movx @Dptr,AMov B,#11111111B ;No DeciPointAnl A,DecPointJz Display1Mov B,#01111111BDisplay1: Mov A,@R0 ;A=Dis_CharMov Dptr,#DisT ab ;Use T able change to Dis ModeMovC A,@A+DptrMov Dptr,#DisSegPortAnl A,B ;B=11111111B,01111111BMovx @Dptr,AACall Delay ;S tay a whileInc R0 ;NextMov A,R1RL AMov R1,ACjne R0,#DisBuf+6,DisLoopRet;---------------------------------------------------------------------------------- Delay: Mov R6,#8Delay1: Mov R7,#0Djnz R7,$Djnz R6,Delay1Ret;---------------------------------------------------------------------------; Code 00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h ; Char "0", "1", "2", "3", "4", "5", "6", "7" DisT ab: DB 0c0h, 0f9h, 0a4h, 0b0h, 99h, 92h, 82h, 0f8h; Code 08h, 09h, 0ah, 0bh, 0ch , 0dh , 0eh, 0fh; Char "8", "9", "a", "b", "c" , "d" , "e", "f"DB 80h, 90h, 88h, 83h, 0c6h, 0a1h, 86h, 8eh; Code 10h 11h; Char " " "H"DB 0FFH, 89H;-------------------------------------------------AT oDisHex: Mov DisBuf,AAnl DisBuf,#0FHSwap AMov DisBuf+1,AAnl DisBuf+1,#0FHRet;=================================================;Out,A=0:No KeyKeyScan: Mov Dptr,#KeyOutPortClr AMovx @Dptr,AMov A,KeyInPortCpl AAnl A,#00001111BRet;-------------------------------------------------ReadKey: ACall KeyScanJnz ReadKey1ReadkeyQ1: Clr KeyPress ;Key released ReadKeyQ: Ret ;No Key, QuitReadKey1: Jb KeyPress,ReadKeyQSetb KeyPressACall Display ;DelayACall KeyScanJz ReadKeyQ ;No Key, QuitMov R1,#11111110B ;Key OutputMov R0,#0 ;Key X Code ReadKeyLp: Mov Dptr,#KeyOutPortMov A,R1Movx @Dptr,AMov B,#0 ;Y CodeJnb P1.0,ReadKeyOkMov B,#6 ;Y CodeJnb P1.1,ReadKeyOkMov B,#12 ;Y CodeJnb P1.2,ReadKeyOkMov B,#18 ;Y CodeJnb P1.3,ReadKeyOkMov A,R1RL AMov R1,AInc R0Cjne R0,#6,ReadKeyLpSJmp ReadkeyQ1ReadKeyOk: Mov A,BAdd A,R0Mov Dptr,#KeyT abMovc A,@A+DptrSetb KeyGetMov KeyCode,ARet; KeyCode 0 1 2 3 4 5KeyT ab: DB 10,0,11,12,13,14; KeyCode 6 7 8 9 10 11DB 15,1, 2, 3,16,17; KeyCode 12 13 14 15 16 17DB 18, 4, 5, 6,19,20; KeyCode 18 19 20 21 22 23DB 21, 7, 8, 9,22,23;-------------------------------------------------InitKey: Clr KeyGetClr KeyPressRet;================================================= InitDis: Mov R0,#DisBufInitDisLoop: Mov @R0,#DarkInc R0Cjne R0,#DisBuf+6,InitDisLoopMov DecPoint,#00000000BClr NeedClsRet;================================================= InitCalc: Mov Result,#0ResultT oDis: Mov A,ResultMov B,#10Div ABMov DisBuf,BMov DisBuf+1,A;-------------------------------------------------DelT opZero: Mov A,DecPOintJnz DelT opZQMov R0,#DisBuf+4DelT opZLp: Cjne @r0,#Dark,DelT opZDelT opZ1: Dec r0Cjne r0,#DisBuf,DelT opZLpDelT opZQ: RetDelT opZ: Cjne @r0,#0,DelT opZQMov @r0,#DarkSJmp DelT opZ1;-------------------------------------------------DisT oA: Mov R0,#DisBuf+4Mov A,#0 ;A=UDisT oALp0: Cjne @R0,#Dark,DisT oA1Dec R0Cjne R0,#DisBuf,DisT oALp0DisT oA1: Mov B,#10Mul ABAdd A,@R0Dec R0Cjne R0,#DisBuf-1,DisT oA1Ret;================================================= Main: Mov Sp,#SysemStackACall InitDisACall InitKeyACall InitCalc;-------------------------------------------------MainLoop: ACall ReadKeyACall DisplayJBC KeyGet,DoKeyAJmp MainLoopDoKey: Mov A,KeyCodeClr CSubb A,#10Jc KeyIntoDis ;Y es, Left Shift DisBufMov Dptr,#JmpT ab;FuncKey=0,1,...RL AJmp @A+DptrAJmp MainLoopJmpT ab: AJmp NumZero ;NoUseAJmp SetDeCiP ;'.'AJmp DoEqual ;'='AJmp DoPlus ;'+'AJmp MainLoopAJmp MainLoopAJmp MainLoop;=================================================;Left Shift Display BufferKeyIntoDis: Jnb NeedCls,KeyIntoDis1ACall InitDisKeyIntoDis1: ;Mov DisBuf+5,DisBuf+4 ;Number Left ShiftMov A,DisBuf+4Cjne A,#Dark,MainLoopMov DisBuf+4,DisBuf+3Mov DisBuf+3,DisBuf+2Mov DisBuf+2,DisBuf+1Mov DisBuf+1,DisBuf+0Mov DisBuf+0,KeyCodeClr C ;Decimal Point Left ShiftMov A,DecPointRLC AMov DecPoint,AACall DelT opZeroAJmp MainLoop;================================================= NumZero: ACall InitDisACall InitCalcAJmp MainLoop;-------------------------------------------------SetDeCiP: Mov A,DecPointJnz SetDeCiPQMov DecPoint,#1SetDeCiPQ: AJmp MainLoop;-------------------------------------------------DoEqual: AJmp MainLoop;-------------------------------------------------DoPlus: ACall DisT oAAdd A,ResultMov Result,ASetb NeedClsACall ResultT oDisAJmp MainLoop;=================================================End。