单片机源程序 WPS文字 文档

合集下载

单片机源程序 WPS文字 文档

单片机源程序  WPS文字 文档

;数据采集系统第1小题;硬件连接:电位器接IN0; ADC0809的EOC口接P3.2; KEY/LED_CS接CS0; ADC0809_CS接CS1;操作手册:1、开机--默认显示学号H08210(在采集状态下,后两位显示当前通道号); 2、使用实验箱最下面一层6个按键操作; 3、按键功能从左至右依次为:设定、加一、减一、换位、确定、运行; 4、点击“设定”键,默认第一位闪烁,配合“加一”“减一”键可对本位进行设置; 5、点击“换位”键,可依次向右循环,对每一位进行设定,共四位可以设定; 6、点击“确定”保存当前设定值; 7、点击“运行”键,以当前设定值为最大值运行采集; 8、需要对其他通道参数进行设定请再次点击“确定”找到需要设定的通道,并重复上述操作步骤即可OUTBIT EQU 8002H ;位控制器OUTSEG EQU 8004H ;段控制器IN EQU 8001H ;键盘读入口CS0809 EQU 9000HSHUJU EQU 51H ;通道数据存储区ORG 0000HLJMP STARTORG 0020HSTART:MOV 25H,#00H;****************************; 参数设定;****************************MOV 30H,#12H;学号MOV 31H,#00HMOV 32H,#08HMOV 33H,#02HMOV 34H,#01HMOV 35H,#00HMOV 36H,#00H;参数1设定值MOV 40H,#01HMOV 41H,#00HMOV 42H,#00HMOV 43H,#00H;参数2设定值MOV 44H,#02HMOV 45H,#00HMOV 46H,#00HMOV 47H,#00H;参数3设定值MOV 48H,#03HMOV 49H,#00HMOV 4AH,#00HMOV 4BH,#00H;参数4设定值MOV 4CH,#04HMOV 4DH,#00HMOV 4EH,#00HMOV 4FH,#00HMOV 50H,#00HMOV SHUJU,#01H ;默认显示通道数;****************************; 主程序;****************************X1:MOV R0,#30H ;默认状态显示LCALL XIAN1LCALL TESTKEYJNB 20H.0,X1 ;如果没有键按下继续显示学号X2:MOV 25H,#00H ;有键按下则显示相应通道数据MOV A,SHUJUMOV B,#04HMUL ABADD A,#3CHMOV R0,ALCALL XIAN2LCALL TESTKEYJNB 20H.0,X2 ;没有键按下,继续显示通道1数据LCALL PAN ;有键按下,调用判断子程序CJNE R5,#05H,QD1 ;判断R5是否为5LJMP SDQD1:LJMP S44SD:SETB 20H.1MOV 36H,#00HMOV A,SHUJUMOV B,#04HMUL ABADD A,#3CH ;选择数据通道ADD A,36HMOV R0,AMOV 70H,@R0 ;将闪烁值保存至70H单元中H1:MOV A,SHUJUMOV B,#04HMUL ABADD A,#3CHADD A,36HMOV R0,A ;R0指向闪烁寄存字节处JB 20H.1,S1MOV @R0,#10HSETB 20H.1LJMP DS1S1:MOV @R0,70H ;将闪烁字节值显示出来CLR 20H.1DS1:MOV A,SHUJUMOV B,#04HMUL ABADD A,#3CHMOV R0,A ;R0指向显示首区LCALL XIAN2LCALL TESTKEYJNB 20H.0,H1LCALL PANCJNE R5,#02H,S11 ;如果不是“换位”键,则跳转到“加减”按键进行判断MOV A,SHUJUMOV B,#04HMUL ABADD A,#3CHADD A,36HMOV R0,AMOV @R0,70HINC 36HHW1:MOV A,SHUJU ;换位MOV B,#04HMUL ABADD A,#3CHADD A,36HMOV R0,AMOV 70H,@R0MOV A,36HCJNE A,#04H,H1MOV 36H,#00HLJMP HW1S11:CJNE R5,#04H,S22 ;加1 INC 70HMOV A,70HCJNE A,#0AH,H1MOV 70H,#00HLJMP H1S22:CJNE R5,#03H,S33 ;减1 DEC 70HMOV A,70HCJNE A,#0FFH,H2MOV 70H,#09HH2:LJMP H1S33:CJNE R5,#01H,H2 ;确定1 MOV A,SHUJUMOV B,#04HMUL ABADD A,#3CHADD A,36HMOV R0,AMOV @R0,70HLJMP X2S44:CJNE R5,#01H,W1 ;确定2 INC SHUJUMOV A,SHUJUCJNE A,#05H,L22MOV SHUJU,#01HLJMP X2W1:CJNE R5,#00H,L22YX:LCALL CJ1 ;采集LCALL TESTKEYJB 20H.0,L22LJMP YX ; 运行L22:LJMP X2TESTKEY:MOV DPTR,#8002H MOV A,#00HMOVX @DPTR,AMOV DPTR,#8001HMOVX A,@DPTRANL A,#01HCJNE A,#01,B1CLR 20H.0LJMP FH ;返回B1:SETB 20H.0FH:RETPAN:MOV R4,#0FEHMOV R5,#0FFHNEXT:MOV DPTR,#8002HMOV A,R4MOVX @DPTR,AMOV DPTR,#8001HMOVX A,@DPTRANL A,#01HCJNE A,#01H,QDZMOV A,R4RL AMOV R4,AINC R5LJMP NEXTQDZ:INC R5MOV 30H,R5LOOP:LCALL TESTKEYJB 20H.0,LOOPRETXIAN1:MOV R2,#20H ;显示1 MOV R3,#06HL1:MOV DPTR,#8002H ;位选MOV A,R2MOVX @DPTR,ARR AMOV R2,AMOV A,@R0MOV DPTR,#TABMOVC A,@A+DPTRMOV DPTR,#8004H ;段选MOVX @DPTR,ALCALL DELAY1INC R0DJNZ R3,L1RETXIAN2:MOV R2,#20H ;显示2 SETB 21H.0MOV R3,#06HL12:MOV DPTR,#8002H ;位选MOV A,R2MOVX @DPTR,ARR AMOV R2,ACLR 21H.0L44:MOV A,@R0MOV DPTR,#TABMOVC A,@A+DPTRMOV DPTR,#8004H ;段选MOVX @DPTR,ALCALL DELAY2JB 21H.0,H11MOV R0,#4FHSETB 21H.0H11:INC R0DJNZ R3,L12RETCJ1:LCALL PXS ;调系数MOV DPTR,#9000H ;采集MOV A,#00HMOVX @DPTR,AJNB P3.2,$MOVX A,@DPTRLCALL ZH1MOV R0,#60HLCALL XIAN2MOV P1,#80HRETPXS:MOV A,SHUJU ;判系数MOV B,#04HMUL ABADD A,#3CHMOV R0,AMOV R1,AMOV A,@R0SW AP AINC R0ADD A,@R0MOV 53H,AINC R0MOV A,@R0SW AP AINC R0ADD A,@R0MOV 54H,AMOV A,53HANL A,#0F0HMOV 25H,#01HINC R1MOV A,@R1SW AP AINC R1ADD A,@R1MOV 53H,AINC R1MOV A,@R1SW AP AADD A,#00MOV 54H,A DYYQ:MOV 57H,#02HMOV 58H,#55HMOV 55H,#00HMOV 56H,#00HMOV 22H,#00HMOV R0,#0FFH LOOP5:INC R0CLR CMOV A,56HADD A,58HDA AMOV 56H,AMOV A,55HADDC A,57HDA AMOV 55H,ACLR CMOV A,56HSUBB A,54HMOV 22H.0,CMOV A,55HSUBB A,53HMOV 22H.1,CMOV R2,22HCJNE R2,#00,NEXT5MOV A,56HCJNE A,54H,NEXT5INC R0NEXT5:MOV C,22H.1JC LOOP5MOV 22H,#00HCLR CMOV B,R0RETZH1: MUL ABMOV 66H,BMOV 67H,AMOV 68H,#03HMOV 69H,#0E8HMOV R0,#0FFHLOOP1:INC R0 ;判定千位MOV A,67HMOV 2BH,67HSUBB A,69HMOV 67H,AMOV A,66HMOV 2AH,66HSUBB A,68HMOV 66H,ANEXT1:JNC LOOP1MOV 60H,R0MOV 66H,2AHMOV 67H,2BHMOV 22H,#00H ;判定百位CLR CMOV 68H,#00HMOV 69H,#64HMOV R0,#0FFHLOOP2:INC R0MOV A,66HCJNE A,#00H,BW1MOV A,67HMOV 2BH,67HSUBB A,69HMOV 67H,ALJMP NEXT2BW1:MOV A,67HSUBB A,69HMOV 67H,AMOV A,66HSUBB A,68HMOV 66H,ALJMP LOOP2NEXT2:JNC LOOP2MOV 61H,R0MOV 67H,2BHMOV 22H,#00H ;判定十位CLR CMOV 69H,#0AHMOV R0,#0FFHLOOP3:INC R0MOV A,67HMOV 2BH,67HSUBB A,69HMOV 67H,ANEXT3:JNC LOOP3MOV 62H,R0MOV 63H,2BHMOV A,25HCJNE A,#01H,JS1MOV 63H,62HMOV 62H,61HMOV 61H,60HMOV 60H,#00HJS1:RETDELAY1:MOV R6,#06D1:MOV R7,#180DJNZ R7,$DJNZ R6,D1RETDELAY2:MOV R6,#06D2:MOV R7,#180DJNZ R7,$DJNZ R6,D2RETTAB:DB 3FH,06H,5BH,4FHDB 66H,6DH,7DH,07HDB 7FH,6FH,77H,7CHDB 39H,5EH,79H,71HDB 00H,73H,76H。

MCS-51单片机实验源程序

MCS-51单片机实验源程序

MCS-51单片机实验源程序仅供参考。

没有最好,只有更好!希望大家设计出更好的程序来。

软件实验一求一组数据的最大〔小〕值/*软件实验的目的:熟悉单片机常用的根本程序〔算法〕,调试时观察变量〔含数组〕值的变化,从而理解程序的功能,了解变量〔含数组〕在单片机存储器中的具体位置。

*/int a[]={-1,2,-30,40,-500,600,-7000,8000,-32750,32765}; //任意给出10个int型数〔围:-32768~+32767〕,放在数组a中void main(){unsigned char i;int ma*,min;ma*=min=a[0]; //ma*,min先取该组数据的第一个for(i=1;i<10;i++){if(a[i]>ma*) ma*=a[i];if(a[i]<min) min=a[i];}while(1); //没有什么要做了,则用该语句作为main函数的结尾,无限循环}附调试截图:注意:由于是纯软件实验〔单片机没有进展实际的输入与输出〕,有些变量要声明为全局变量〔如上面的数组a〕,否则可能会被Keil软件编译时优化掉〔即:一些语句没有真正生..成执行代码〕,导致无法观察到正确结果。

软件实验二二进制〔十六进制〕数转换为BCD数//按流程图,编写程序如下:*define uchar unsigned charvoid main(){uchar *=0*A5; //设二进制数为1010 0101,在Keil中只能用十六进制0*A5或十进制165〔不能直接用二进制形式〕uchar a[3];a[2]=*/100;*=*%100;a[1]=*/10;*=*%10;a[0]=*;while(1);}//或者用for循环语句,先取出个位*define uchar unsigned charvoid main(){uchar *=0*A5;uchar i,a[3];for(i=0;i<3;i++){a[i]=*%10;*=*/10;}while(1);}软件实验三二进制〔十六进制〕数转换为ASCII码//将0-9、A-F的ASCII码做成表格〔数组〕放到程序存储器ROM中*define uchar unsigned charuchar code ascii[]={"0123456789ABCDEF"}; //ASCII码表放ROM中/*上句赋值也可写成{0*30,0*31,0*32,0*33,0*34,0*35,0*36,0*37,0*38,0*39, 0*41,0*42,0*43,0*44,0*45,0*46} *//* 还可写成{48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70} *//* 还可写成{'0','1','2','3','4','5','6','7','8','9','A','B','C','D', 'E','F'} */void main(){uchar *=0*5A; //设二进制数为0101 1010,在Keil中只能用十六进制0*5A或十进制90〔不能直接用二进制形式〕uchar cc,a[2];cc=* & 0*0f; //取*的低4位1010〔即A〕a[0]=ascii[cc]; //查表,a[0]存*低4位对应十六进制数〔即A〕的ASCII码cc=(*>>4)& 0*0f; //取*的高4位0101〔即5〕a[1]=ascii[cc]; //查表,a[1]存*高4位对应十六进制数〔即5〕的ASCII码while(1);}硬件实验一并行口输入、输出//P2做输出口,接8只LED,编写程序,使LED循环点亮〔流水灯〕*include<reg51.h>*include<intrins.h> //部函数_crol_,_cror_等的头文件void Delay(unsigned int *) //延时函数,在12MHz晶振下,延时约* ms {unsigned char i;while(*--)for(i=0;i<123;i++);}void main(){char a=0*fe;while(1){P2=a;Delay(500); //在12MHz晶振下,延时约500msa=_crol_(a,1); //循环左移,_cror_为循环右移}}//P3.2和P3.3做输入口,分别接两个拨动开关到GND;P2.7~P2.4做输出口,接4只LED,用来指示两个开关的闭合状态组合*include<reg51.h>void main(){char a;while(1){a=P3; //读入P3口状态a=a&0*0C; //a中只保存P3.3、P3.2的值,其余位清零if(a==0*0C) P2=0*7F; //P3.3=1开,P3.2=1开,则P2.7=0亮if(a==0*08) P2=0*bF; //P3.3=1开,P3.2=0合,则P2.6=0亮if(a==0*04) P2=0*dF; //P3.3=0合,P3.2=1开,则P2.5=0亮if(a==0*00) P2=0*EF; //P3.3=0合,P3.2=0合,则P2.4=0亮}}//用一个共阳七段数码管循环显示0-9和A-F,每个数显示0.5s*include<reg51.h>sbit P1_0=P1^0;char code TABLE[]={0*c0,0*f9,0*a4,0*b0,0*99,0*92,0*82,0*f8,0*80,0*90,0*88,0*83,0*c6,0*a1,0*86,0*8e}; //共阳数码管段码〔放在程序存储器ROM中〕void Delay(unsigned int *) //延时函数,在12MHz晶振下,延时约* ms {unsigned char i;while(*--)for(i=0;i<123;i++);}void main(){ char j;P1_0=0; //位选信号while(1){for(j=0;j<16;j++){P0=TABLE[j];Delay(500);}}}硬件实验二外部中断//通过外部中断0(下降沿触发),启动或关闭流水灯,即上电复位时不亮,按一次INT0〔P3.2〕引脚的按钮,流水灯开启,再按一次,灯熄灭*include<reg51.h>*include<intrins.h> //部函数_crol_,_cror_等的头文件bit LED=0; //位变量LED用于记录流水灯的状态,0为关闭,1为开启void Delay(unsigned int *) //延时函数,在12MHz晶振下,延时约* ms {unsigned char i;while(*--)for(i=0;i<123;i++);}void INT0_srv(void) interrupt 0 //INT0中断号为0{Delay(10); //延时10ms,去抖动if(INT0==0) LED=!LED; //每次中断时切换LED开启或关闭}void main(){char a=0*fe;IT0=1; //下降沿触发E*0=1; //允许INT0中断EA=1;while(1){if(LED) //开启{P2=a;Delay(500); //在12MHz晶振下,延时约500msa=_crol_(a,1); //循环左移,_cror_为循环右移}else //关闭{P2=0*ff;}}}//通过外部中断0(低电平触发),启动或关闭流水灯,即上电复位时不亮,按一次INT0〔P3.2〕引脚的按钮,流水灯开启,再按一次,灯熄灭*include<reg51.h>*include<intrins.h> //部函数_crol_,_cror_等的头文件bit LED=0; //位变量LED用于记录流水灯的状态,0为关闭,1为开启void Delay(unsigned int *) //延时函数,在12MHz晶振下,延时约* ms{unsigned char i;while(*--)for(i=0;i<123;i++);}void INT0_srv(void) interrupt 0 //INT0中断号为0{Delay(10); //延时10ms,去抖动if(INT0==0) LED=!LED; //每次中断时切换LED开启或关闭while(INT0==0); //如P3.2(INT0)还是0,则等待,变为1后才从中断返回}void main(){char a=0*fe;IT0=0; //低电平触发E*0=1; //允许INT0中断EA=1;while(1){if(LED) //开启{P2=a;Delay(500); //在12MHz晶振下,延时约500msa=_crol_(a,1); //循环左移,_cror_为循环右移}else //关闭{P2=0*ff;}}}硬件实验三定时计数器//用单片机部定时器方式计时,实现每一秒钟P2口输出状态发生一次反转。

单片机实验一 WORD版WORD

单片机实验一 WORD版WORD

实验一 Keil C软件使用与闪烁灯一、实验目的熟悉使用keil C软件二、实验内容安装keil C软件并成功注册三、实验仪器、设备计算机、keil C软件四、实验步骤1.打开安装文件KEIL c51v802.exe,根据提示进行下一步操作,一直到安装完成。

Keil C的安装步骤1注意:一定不要修改默认的C:\KEIL安装目录否则后面的注册将不能顺利注册!Keil C的安装步骤22.点击finish后,打开桌面上的Keil uVision3,进入Keil C。

点击文件(FILE)——许可证管理(License Management),在弹出的对话框中复制计算机的CID码。

选择许可证管理(License Management)注册管理界面3.打开软件注册机,芯片类型选择C51,勾选External CID co,将刚才复制的计算机CID 码输入进去,点击生成(Generate),将得到的LIC0码进行复制,将复制的LIC码返回Keil C 中进行添加,点击添加LIC,若出现LIC过期的情况,再点击注册机生成新的LIC重复此步奏,最后显示*** LIC Added Sucessfully ***并且有效期没有红色为注册成功。

KEIL C注册机Keil C注册与破解4. 驱动安装。

直接安装CH340USB转串口驱动安装程序.EXE,然后把USB 转串口线插到电脑的USB 口上,打开设备管理器,在端口COM和LPT选项下查看是否有USB-SERIAL CH340这一项,并且记住相对应的COM号。

驱动安装5. 打开keilC软件,点击“Project | New Project…”新建工程文件。

弹出一个名为“Create New Project”先选择一个合适的文件夹来存放工程文件,比如“F:\RZ-2009实验程序”,然后在文件名输入框里输入新建keil C工程的文件名这里我们输入FLASHLED。

然后点保存按钮这时keil C软件会弹出让您选择单片机型号这里我们选择AT89S52(STC单片机也选择这个)。

单片机新手教学教案 含流程图及程序(优秀版)word资料

单片机新手教学教案 含流程图及程序(优秀版)word资料

单片机新手教学教案含流程图及程序(优秀版)word资料//赋值实例:用单片机控制第一个灯亮#include<reg52.h> //包含51单片机寄存器定义的头文件 void main(void) { }//闪烁实例:用单片机控制一个灯闪烁#include<reg52.h> //包含单片机寄存器的头文件 /**************************************** 函数功能:延时一段时间*****************************************/void delay(void) //两个void 意思分别为无需返回值,没有参数传递 {unsigned int i; //定义无符号整数,最大取值范围65535for(i=0;i<20000;i++) //做20000次空什么也不做,等待一个机器周期 }/******************************************************* 函数功能:主函数 (C 语言规定必须有也只能有1void main(void) {while(1) //无限循环{delay(); //延时一段时间 delay(); //延时一段时间 } }//流水实例1:使用P0口流水点亮8位LED #include<reg52.h> //包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/void delay(void) Array {unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}/***************************************函数功能:主函数***************************************void main(void){ while(1){ P0=0xfe; //第一个灯亮delay(); //调用延时函数P0=0xfd; //第二个灯亮delay(); //调用延时函数P0=0xfb; //第三个灯亮delay(); //调用延时函数P0=0xf7; //第四个灯亮delay(); //调用延时函数P0=0xef; //第五个灯亮delay(); //调用延时函数P0=0xdf; //第六个灯亮delay(); //调用延时函数P0=0xbf; //第七个灯亮delay(); //调用延时函数P0=0x7f; //第八个灯亮delay(); //调用延时函数}}//流水实例2:用自增运算控制P0口8位LED流水花样#include<reg52.h> //包含单片机寄存器的头文件/******************************************************函数功能:延时一段时间******************************************************/void delay(void){unsigned int i;for(i=0;i<20000;i++);}/******************************************************函数功能:主函数******************************************************/void main(void){unsigned char i;for(i=0;i<255;i++) //注意i的值不能超过255{P0=i; //将i的值送P0口delay(); //调用延时函数}}//流水实例3:用右移运算流水点亮P1口8位LED#include<reg52.h> //包含单片机寄存器的头文件/*****************************函数功能:延时一段时间*****************************/void delay(void){unsigned int n;for(n=0;n<30000;n++);}/*****************************函数功能:主函数*****************************/void main(void){unsigned char i;while(1){P0=0xff;delay();for(i=0;i<8;i++)//设置循环次数为8{P0=P0>>1; //每次循环P1的各二进位右移1位,高位补0delay(); //调用延时函数}}}//开关实例:用if语句控制P0口8位LED的点亮效果#include<reg52.h> //包含单片机寄存器的头文件/*****************************函数功能:主函数*****************************/void main(void){while(1){if(S1==0) //如果按键S1按下P0=0x0f; //P0口高四位LED点亮if(S2==0) //如果按键S2按下P0=0xf0; //P0口低四位LED点亮}}//开关实例3:用swtich语句的控制P0口8位LED的点亮状态#include<reg52.h> //包含单片机寄存器的头文件/*****************************函数功能:延时一段时间*****************************/void delay(void){ unsigned int n;for(n=0;n<10000;n++);}/*****************************函数功能:主函数*****************************/void main(void){ unsigned char i;i=0; //将i初始化为0while(1){ if(S1==0) //如果S1键按下{ delay(); //延时一段时间if(S1==0) //如果再次检测到S1键按下i++; //i自增1if(i==9) //如果i=9,重新将其置为1i=1;}switch(i) //使用多分支选择语句{ case 1: P0=0xfe; //第一个LED亮break;case 2: P0=0xfd; //第二个LED亮break;case 3:P0=0xfb; //第三个LED亮break;case 4:P0=0xf7; //第四个LED亮break;case 5:P0=0xef; //第五个LED亮break;case 6:P0=0xdf; //第六个LED亮break;case 7:P0=0xbf; //第七个LED亮break;case 8:P0=0x7f; //第八个LED亮break;default: //缺省值,关闭所有LEDP0=0xff;}}}课堂教学设计表课程名称语文设计者单位(学校)授课班级一(1)班)物资供应计划工作流程生产过程组织设计流程生产过程各职能模块配合流程生产制程控制流程退货返工返工返工劳动定额管理程序说明:完善劳动生产定额管理,对于一车间这样的装备制造型车间尤为重要。

单片机的汇编源程序

单片机的汇编源程序

例2.1将数据寄存器DPTR中的字无符号数除以4,商放在DPTR中,余数放到B中。

程序段如下:MOV A,#3 ;取最低2位的逻辑尺03H送AANL A,DPL ;取DPTR的最低2位即余数MOV B,A ;余数送BCLR C ;清进位CYMOV A,DPH ;高8位送ARRC A ;高8位除以2,其最低位移入CY中MOV DPH,A ;高8位除以2的结果送DPHMOV A,DPL ;低8位送ARRC A ;低8位除以2,并将CY 移入A的最高位MOV DPL,A ;低8位除以2的结果送DPLCLR C ;将除以2的结果再除以2MOV A,DPHRRC AMOV DPH,AMOV A,DPLRRC AMOV DPL,A例2.2将R7中的无符号数乘以10,结果放在R6和R7中(R6放高位)。

程序段如下:MOV R6,#0 ;清0 R6CLR C ;清进位MOV A,R7 ;低8位乘以2RLC AMOV R7,A ;存回R7MOV R5,A ;低8位乘以2暂存R5MOV A,R6 ;高8位乘以2RLC AMOV R6,A ;存回R6MOV R4,A ;高8位乘以2暂存R4MOV A,R7 ;乘以4RLC AMOV R7,AMOV A,R6RLC AMOV R6,AMOV A,R7 ;乘以8RLC AMOV R7,AMOV A,R6RLC AMOV R6,AMOV A,R7 ;乘以8和乘以2相加ADD A,R5MOV R7,AMOV A,R6ADDC A,R4MOV R6,A仿照例2.1的方法此例的程序段如下: MOV A,#80H ;取R7的最高位的逻辑尺ANL A,R7 ;取R7的最高位RL A ;移至最低位MOV R4,A ;暂存R4MOV A,#0E0H ;取R7的最高3位的逻辑尺ANL A,R7 ;取R7的最高3位 RL A ;移至最低3位RL ARL AMOV R6,A ;暂存R6MOV A,R7 ;低8位乘以8CLR CRLC AMOV R5,A ;暂存低8位乘以2 CLR CRLC ACLR CRLC AADD A,R5 ;乘以8和乘以2相加MOV R7,AMOV A,R6ADDC A,R4MOV R6,A例3.1将内部RAM 40H单元中一压缩BCD数转换为二进制数。

单片机 文档

单片机 文档

1.如图所示,采用外部中断0,中断申请从INT0输入,并采用了去抖动电路(P230~P232)。

当P1.0~P1.3的任何一位输出为0时,相应的发光二极管就会发光。

当开关S闭合(即S 在1的位置)时,发出中断请求。

中断服务程序的矢量地址为0003H。

ORG 0000HAJMP MAIN ;上电,转向主程序ORG 0003H ;外部中断0入口地址AJMP INSER ;转向中断服务程序ORG 0030H ;主程序MAIN: SETB EX0 ;允许外部中断0中断SETB IT0 ;选择边沿触发方式SETB EA ;CPU开中断SJMP $ ;等待中断ORG 0200H ;中断服务程序INSER:MOV A,#0F0HMOV P1,A ;P1.4~P1.7为输入的准备动作MOV A,P1 ;取开关数SWAP A ;A的高、低四位互换MOV P1,A ;输出驱动LED发光RETI ;中断返回END2. 如图5-15所示,此中断电路可实现系统的故障显示。

当系统的各部分正常工作时,四个故障源的输入均为低电平,显示灯全不亮。

当有某个部分出现故障时,则相应的输入线由低电平变为高电平,相应的发光二极管亮。

源程序如下:ORG 0000HAJMP MAIN ;上电,转向主程序ORG 0003H ;外部中断0入口地址AJMP INSER ;转向中断服务程序MAIN:ANL P1,#55H ;P1.0,P1.2,P1.4,P1.6为输入P1.1,P1.3,P1.5,P1.7为输出SETB EX0 ;允许外部中断0中断SETB IT0 ;选择边沿触发方式SETB EA ;CPU开中断HERE:SJMP HERE ;等待中断INSER:JNB P1.0,L1 ;查询中断源,( P1.0)=0,转L1SETB P1.7 ;是P1.0引起的中断,使相应的二极管亮L1:JNB P1.2,L2 ;继续查询SETB P1.5L2:JNB P1.4,L3SETB P1.3L3:JNB P1.6,L4SETB P1.1L4:RETIEND水塔的水位控制ORG 0030HMAIN: SETB EASETB EX0HERE:SETB P1.0 SETB P1.1 SJMP HEREORG 0200H INSER: CLR P1.0SETB P1.1 ACALL DELAY CPL P1.0CPL P1.1ACALL DELAY RETIDELAY: MOV R0,#200 L1: MOV R1,#12 L2: NOPDJNZ R1,L2 DJNZ R0,L1 RETENDORG 0000HAJMP MAINORG 0030HMAIN: CLR P1.0CLR P1.1LOOP:JnB P3.2,L1CLR P1.0LL:JNB P3.3,L2CLR P1.1SJMP LOOPL1:SETB P1.0SJMP LLL2:SETB P1.1SJMP LOOPEND如图所示:P3.2和P3.3上各接有一只按键,要求它们分别按下K1或K2时,分别使P1口为0或FFH。

单片机源程序

第5章【例】从片外数据存储器1000H、1001H地址单元中的数据作“与”运算,并把结果放到片内30H单元中。

程序如下:ORG 0000HLJMP MAINORG 0050HMAIN: MOV DPTR,#1000H ;设置指针初值MOVX A,@DPTR ;取1000H单元中的数据MOV R0,A ;保存到A中INC DPTR ;指针加1MOVX A,@DPTR ;取1001H单元中的数据ANL A,R0 ;两个数据相与MOV 30H,A ;把结果存到30H单元中SJMP $END【例】比较两个无符号数大小,设两个无符号数分别存放在内部RAM的30H和31H单元中,比较大小后把大数存到32H中。

程序如下:ORG 0000HLJMP MAINORG 1000HMAIN: CLR C ;保证前面的操作不会对后面结果有影响MOV A,30H ;取30H单元中的数据到累加器中SUBB A,31H ;30H单元中的数减去31H单元中的数,两数大小比较JC DATA2 ;条件判断MOV 32H,30H ;30H单元中的数大WAIT: SJMP $DATA2: MOV 32H,31H ;31H单元中的数大SJMP WAITEND【例】 利用散转指令编写程序,根据30H 单元中变量X 的内容转入相应的分支。

X=0时执行Y=0+0;X=1时执行Y=1+1;X=2时执行Y=2+2。

并将结果存入31H 单元中。

程序如下:ORG 0000HLJMP MAINORG 1000H MAIN: MOV A,30HMOV DPTR,#TAB ; 散转程序入口地址RL A ; 每个入口地址均为2个字节 JMP @A+DPTRWAIT: SJMP $TAB: AJMP X0AJMP X1AJMP X2 X0: MOV A,#0RL AMOV 31H,ALJMP WAIT X1: MOV A,#1RL AMOV 31H,ALJMP WAIT X2:MOV A,#2RL AMOV 31H,ALJMP WAIT END 【例】有一数据块从片内RAM 的30H 单元开始存入,设数据块长度为10个单元。

单片机程序模板

单片机程序模板通常包含以下部分:1. 头文件包含:包含程序所需的头文件,如标准库头文件、硬件相关头文件等。

2. 宏定义:定义程序中使用的宏,如常量、位掩码等。

3. 数据类型定义:定义程序中使用的自定义数据类型。

4. 全局变量声明:声明程序中使用的全局变量。

5. 函数原型声明:声明程序中使用的函数。

6. 主函数:程序的入口点,通常包含程序的初始化、循环和退出部分。

7. 函数定义:定义程序中使用的函数。

8. 中断服务程序:定义程序中使用的中断服务程序。

以下是一个简单的单片机程序模板示例:c#include <stdint.h>#include "my_hardware.h"#define LED_PIN 5typedef struct {uint32_t value;} my_data_type;my_data_type my_global_variable;void my_function(uint32_t arg);int main() {// Initialize hardwaremy_hardware_init();// Set LED pin as outputmy_hardware_set_pin_mode(LED_PIN, OUTPUT);// Initialize global variablemy_global_variable.value = 0;// Call functionmy_function(10);// Main loopwhile (1) {// Toggle LEDmy_hardware_toggle_pin(LED_PIN);// Delaymy_hardware_delay_ms(100);}return 0;}void my_function(uint32_t arg) {// Do something with the argumentmy_global_variable.value += arg;}这个模板包含以下部分:头文件包含:包含标准库头文件<stdint.h>和硬件相关头文件"my_hardware.h"。

51单片机C语言源代码例程附带电路图

闪烁灯[实验要求]点亮与单片机P1.0口相连的发光二极管,延时0.2S,然后熄灭,延时0.2S,再点亮,如此循环下去。

[实验目的]初步了解单片机IO口输出高低电平的作用,延时函数的时间估算。

[硬件电路][源代码]#include<reg51.h>/**********************************************************上面这行是一个"文件包含"处理。

所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来这里的程序虽然只写了一行,但C编译器在处理的时候却要处理几十或几百行,这里包含reg51.h的目的在于本程序要使用P1这个符号,而P1是在reg51.h这个头文件中定义的。

大家可以在编译器目录下面用记事本打开这个文件看看。

*********************************************************/sbit P1_0=P1^0; //定义IO口这步的目的是让编//译器知道P1_0代表的就是单片机的P1.0口void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k; //定义3个无符号字符型变量。

for(i=20;i>0;i--) //三个FOR循环用来延时,这里为for(j=20;j>0;j--) //什么是0.2S大家可以用WAVE for(k=248;k>0;k--); //高断点仿真一下,就可知道大概 } //是0.2S了。

void main(void) //每一个C语言程序有且只有一个主函数,{while(1) //循环条件永远为真,以下程序一直执行下去。

{P1_0=0; // I/O口P1.0输出低电平,小灯被点亮。

delay02s(); //延时经过0.2秒。

P1_0=1; // I/O口P1.0输出高电平,小灯熄灭。

单片机程序源代码完整版.doc

void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=120;j>0;j--);
}
void main()
{
uint i;
while(1)
{
P1=0xff;
delay(500);
for(i=0;i<4;i++)
{
P1=table[i];
delay(500);
{uint j;
for(j=0;j<120;j++);
}
}
void main()
{
while(1)
{
P0=0xfe;
while(P0!=0x7f)
{
//P1=temp;
//delayms(500);
P0=_crol_(P0,1);
delayms(250);
}
temp=0x7f;
while(P0!=0xfe)
利用89c51单片机的端口控制8个LED(D0~D7)循环点亮,刚开始时D0点亮,延时片刻后,接着D1点亮,然后依次点亮D2->D3->D4->D5 ->D6->D7,然后再点亮D7->D6->D5->D4 ->D3->D2->lt;reg52.h>
#include <intrins.h>
}
for(i=3;i>0;i--)
{
P1=table[i-1];
delay(500);
}
}
}
任务四:复杂广告灯的设计
利用89c51单片机的端口实现8个LED(D0~D7)复杂广告灯的控制,要求显示规律为:正向流水->反向流水->隔灯闪烁3次->高四盏、低四盏闪烁2次->隔两盏闪烁3次,再重复循环。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;数据采集系统第1小题;硬件连接:电位器接IN0; ADC0809的EOC口接P3.2; KEY/LED_CS接CS0; ADC0809_CS接CS1;操作手册:1、开机--默认显示学号H08210(在采集状态下,后两位显示当前通道号); 2、使用实验箱最下面一层6个按键操作; 3、按键功能从左至右依次为:设定、加一、减一、换位、确定、运行; 4、点击“设定”键,默认第一位闪烁,配合“加一”“减一”键可对本位进行设置; 5、点击“换位”键,可依次向右循环,对每一位进行设定,共四位可以设定; 6、点击“确定”保存当前设定值; 7、点击“运行”键,以当前设定值为最大值运行采集; 8、需要对其他通道参数进行设定请再次点击“确定”找到需要设定的通道,并重复上述操作步骤即可OUTBIT EQU 8002H ;位控制器OUTSEG EQU 8004H ;段控制器IN EQU 8001H ;键盘读入口CS0809 EQU 9000HSHUJU EQU 51H ;通道数据存储区ORG 0000HLJMP STARTORG 0020HSTART:MOV 25H,#00H;****************************; 参数设定;****************************MOV 30H,#12H;学号MOV 31H,#00HMOV 32H,#08HMOV 33H,#02HMOV 34H,#01HMOV 35H,#00HMOV 36H,#00H;参数1设定值MOV 40H,#01HMOV 41H,#00HMOV 42H,#00HMOV 43H,#00H;参数2设定值MOV 44H,#02HMOV 45H,#00HMOV 46H,#00HMOV 47H,#00H;参数3设定值MOV 48H,#03HMOV 49H,#00HMOV 4AH,#00HMOV 4BH,#00H;参数4设定值MOV 4CH,#04HMOV 4DH,#00HMOV 4EH,#00HMOV 4FH,#00HMOV 50H,#00HMOV SHUJU,#01H ;默认显示通道数;****************************; 主程序;****************************X1:MOV R0,#30H ;默认状态显示LCALL XIAN1LCALL TESTKEYJNB 20H.0,X1 ;如果没有键按下继续显示学号X2:MOV 25H,#00H ;有键按下则显示相应通道数据MOV A,SHUJUMOV B,#04HMUL ABADD A,#3CHMOV R0,ALCALL XIAN2LCALL TESTKEYJNB 20H.0,X2 ;没有键按下,继续显示通道1数据LCALL PAN ;有键按下,调用判断子程序CJNE R5,#05H,QD1 ;判断R5是否为5LJMP SDQD1:LJMP S44SD:SETB 20H.1MOV 36H,#00HMOV A,SHUJUMOV B,#04HMUL ABADD A,#3CH ;选择数据通道ADD A,36HMOV R0,AMOV 70H,@R0 ;将闪烁值保存至70H单元中H1:MOV A,SHUJUMOV B,#04HMUL ABADD A,#3CHADD A,36HMOV R0,A ;R0指向闪烁寄存字节处JB 20H.1,S1MOV @R0,#10HSETB 20H.1LJMP DS1S1:MOV @R0,70H ;将闪烁字节值显示出来CLR 20H.1DS1:MOV A,SHUJUMOV B,#04HMUL ABADD A,#3CHMOV R0,A ;R0指向显示首区LCALL XIAN2LCALL TESTKEYJNB 20H.0,H1LCALL PANCJNE R5,#02H,S11 ;如果不是“换位”键,则跳转到“加减”按键进行判断MOV A,SHUJUMOV B,#04HMUL ABADD A,#3CHADD A,36HMOV R0,AMOV @R0,70HINC 36HHW1:MOV A,SHUJU ;换位MOV B,#04HMUL ABADD A,#3CHADD A,36HMOV R0,AMOV 70H,@R0MOV A,36HCJNE A,#04H,H1MOV 36H,#00HLJMP HW1S11:CJNE R5,#04H,S22 ;加1 INC 70HMOV A,70HCJNE A,#0AH,H1MOV 70H,#00HLJMP H1S22:CJNE R5,#03H,S33 ;减1 DEC 70HMOV A,70HCJNE A,#0FFH,H2MOV 70H,#09HH2:LJMP H1S33:CJNE R5,#01H,H2 ;确定1 MOV A,SHUJUMOV B,#04HMUL ABADD A,#3CHADD A,36HMOV R0,AMOV @R0,70HLJMP X2S44:CJNE R5,#01H,W1 ;确定2 INC SHUJUMOV A,SHUJUCJNE A,#05H,L22MOV SHUJU,#01HLJMP X2W1:CJNE R5,#00H,L22YX:LCALL CJ1 ;采集LCALL TESTKEYJB 20H.0,L22LJMP YX ; 运行L22:LJMP X2TESTKEY:MOV DPTR,#8002H MOV A,#00HMOVX @DPTR,AMOV DPTR,#8001HMOVX A,@DPTRANL A,#01HCJNE A,#01,B1CLR 20H.0LJMP FH ;返回B1:SETB 20H.0FH:RETPAN:MOV R4,#0FEHMOV R5,#0FFHNEXT:MOV DPTR,#8002HMOV A,R4MOVX @DPTR,AMOV DPTR,#8001HMOVX A,@DPTRANL A,#01HCJNE A,#01H,QDZMOV A,R4RL AMOV R4,AINC R5LJMP NEXTQDZ:INC R5MOV 30H,R5LOOP:LCALL TESTKEYJB 20H.0,LOOPRETXIAN1:MOV R2,#20H ;显示1 MOV R3,#06HL1:MOV DPTR,#8002H ;位选MOV A,R2MOVX @DPTR,ARR AMOV R2,AMOV A,@R0MOV DPTR,#TABMOVC A,@A+DPTRMOV DPTR,#8004H ;段选MOVX @DPTR,ALCALL DELAY1INC R0DJNZ R3,L1RETXIAN2:MOV R2,#20H ;显示2 SETB 21H.0MOV R3,#06HL12:MOV DPTR,#8002H ;位选MOV A,R2MOVX @DPTR,ARR AMOV R2,ACLR 21H.0L44:MOV A,@R0MOV DPTR,#TABMOVC A,@A+DPTRMOV DPTR,#8004H ;段选MOVX @DPTR,ALCALL DELAY2JB 21H.0,H11MOV R0,#4FHSETB 21H.0H11:INC R0DJNZ R3,L12RETCJ1:LCALL PXS ;调系数MOV DPTR,#9000H ;采集MOV A,#00HMOVX @DPTR,AJNB P3.2,$MOVX A,@DPTRLCALL ZH1MOV R0,#60HLCALL XIAN2MOV P1,#80HRETPXS:MOV A,SHUJU ;判系数MOV B,#04HMUL ABADD A,#3CHMOV R0,AMOV R1,AMOV A,@R0SW AP AINC R0ADD A,@R0MOV 53H,AINC R0MOV A,@R0SW AP AINC R0ADD A,@R0MOV 54H,AMOV A,53HANL A,#0F0HMOV 25H,#01HINC R1MOV A,@R1SW AP AINC R1ADD A,@R1MOV 53H,AINC R1MOV A,@R1SW AP AADD A,#00MOV 54H,A DYYQ:MOV 57H,#02HMOV 58H,#55HMOV 55H,#00HMOV 56H,#00HMOV 22H,#00HMOV R0,#0FFH LOOP5:INC R0CLR CMOV A,56HADD A,58HDA AMOV 56H,AMOV A,55HADDC A,57HDA AMOV 55H,ACLR CMOV A,56HSUBB A,54HMOV 22H.0,CMOV A,55HSUBB A,53HMOV 22H.1,CMOV R2,22HCJNE R2,#00,NEXT5MOV A,56HCJNE A,54H,NEXT5INC R0NEXT5:MOV C,22H.1JC LOOP5MOV 22H,#00HCLR CMOV B,R0RETZH1: MUL ABMOV 66H,BMOV 67H,AMOV 68H,#03HMOV 69H,#0E8HMOV R0,#0FFHLOOP1:INC R0 ;判定千位MOV A,67HMOV 2BH,67HSUBB A,69HMOV 67H,AMOV A,66HMOV 2AH,66HSUBB A,68HMOV 66H,ANEXT1:JNC LOOP1MOV 60H,R0MOV 66H,2AHMOV 67H,2BHMOV 22H,#00H ;判定百位CLR CMOV 68H,#00HMOV 69H,#64HMOV R0,#0FFHLOOP2:INC R0MOV A,66HCJNE A,#00H,BW1MOV A,67HMOV 2BH,67HSUBB A,69HMOV 67H,ALJMP NEXT2BW1:MOV A,67HSUBB A,69HMOV 67H,AMOV A,66HSUBB A,68HMOV 66H,ALJMP LOOP2NEXT2:JNC LOOP2MOV 61H,R0MOV 67H,2BHMOV 22H,#00H ;判定十位CLR CMOV 69H,#0AHMOV R0,#0FFHLOOP3:INC R0MOV A,67HMOV 2BH,67HSUBB A,69HMOV 67H,ANEXT3:JNC LOOP3MOV 62H,R0MOV 63H,2BHMOV A,25HCJNE A,#01H,JS1MOV 63H,62HMOV 62H,61HMOV 61H,60HMOV 60H,#00HJS1:RETDELAY1:MOV R6,#06D1:MOV R7,#180DJNZ R7,$DJNZ R6,D1RETDELAY2:MOV R6,#06D2:MOV R7,#180DJNZ R7,$DJNZ R6,D2RETTAB:DB 3FH,06H,5BH,4FHDB 66H,6DH,7DH,07HDB 7FH,6FH,77H,7CHDB 39H,5EH,79H,71HDB 00H,73H,76H。

相关文档
最新文档