单片机实验程序..
- 格式:doc
- 大小:47.00 KB
- 文档页数:10
单片机实验一拆字程序 Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】实验一拆字程序1 实验名称拆字程序2 实验目的掌握汇编语言测试和调试方法。
3 实验内容把7000H的内容拆开,高位送7001H的低位,低位送7002H的低位,7001H、7002H高位清零,本程序应用于把数据送显示缓冲区。
4 硬件连线5 实验步骤(1)PC机开始菜单程序 51JH实验系统 DVCC实验系统 ,进入实验界面。
选中本次实验名称,查看实验目的、内容、硬件连线、步骤。
输入源程序,编译、联接、运行实验程序。
(2)DVCC实验系统①先用存储器读写方法将7000H单元内容置成34H。
按复位键,显示P.,输入7000H,按MEM键,输入34。
②用单步、断点或连续执行程序的方法从其始地址0050H开始运行程序(输入0050后按STEP为单步,按EXEC为连续)。
按RESET后,显示P.,输入0050,按EXEC③按MON键或RESET键退出。
④检查7001H、7002H单元中的内容应为03H、04H。
输入7000H,按MEM键,显示03,按NEXT显示04。
6 实验程序ORG 0050HCWORD: MOV DPTR,#7000HMOVX A,@DPTRMOV B,ASWAP AANL A,#0FHINC DPTRMOVX @DPTR,AINC DPTRMOV A,BANL A,#0FHMOVX @DPTR,ACWORD1: SJMP CWORD1END7 实验拓扑修改源程序,实现将把3000H的内容拆开,高位送3001H的低位,低位送3002H的低位,7001H、7002H高位清零。
用存储器读写方法将3000H单元内容置成76H。
8 实验结果分析向存储器7000H单元写入34H,执行程序,检查拆字后7001H、7002H单元中的内容为03H、04H。
向存储器3000H单元写入76H,执行程序,检查拆字后7001H、7002H单元中的内容为07H、06H。
16位单片机实验程序讲解1、用C实现发光二极管单向循环点亮//=============================================================== //// The information contained herein is the exclusive property of// Sunplus Technology Co. And shall not be distributed, reproduced,// or disclosed in whole in part without prior written permission.//// (C) COPYRIGHT 2001 SUNPLUS TECHNOLOGY CO.// ALL RIGHTS RESERVED//// The entire notice above must be reproduced on all authorized copies.////==============================================================// 工程名称:led1_C.scs// 功能描述: 用C实现发光二极管单向循环点亮// 文件来源:《61板实验教程》"实验一发光二极管单向循环点亮“// 硬件连接:IOA低8位接至SEG接口控制LED的导通// IOB6连至DIG7通过ULN2003A控制8个LED的共阴极电平状态。
// IDE环境:SUNPLUS u'nSPTM IDE 1.8.0//// 涉及的库:// 组成文件:// main.c//// 日期: 2004/8/16//===============================================================#define P_IOA_Data (volatile unsigned int *)0x7000#define P_IOA_Buffer (volatile unsigned int *)0x7001#define P_IOA_Dir (volatile unsigned int *)0x7002#define P_IOA_Attrib (volatile unsigned int *)0x7003#define P_IOB_Data (volatile unsigned int *)0x7005#define P_IOB_Buffer (volatile unsigned int *)0x7006#define P_IOB_Dir (volatile unsigned int *)0x7007#define P_IOB_Attrib (volatile unsigned int *)0x7008#define P_Watchdog_Clear (volatile unsigned int *)0x7012//=============================================================// 函数名称: Delay()// 日期:20040816// 功能描述: 实现延时// 语法格式: void Delay(void);//入口参数: 无// 出口参数: 无// 注意事项: 仅为用户模型//=============================================================void Delay(){ //延时子程序unsigned int i;for(i=0; i<32768; i++){*P_Watchdog_Clear=0x0001; //清WatchDog}}//=============================================================// 函数名称: int main()// 日期:20040816// 功能描述: 发光二极管单向循环点亮// 语法格式: void main(void);// 入口参数: 无// 出口参数: 无// 注意事项: 仅为用户模型//=============================================================int main(){int LedControl = 0x0001;*P_IOA_Dir = 0x00ff; //设置A口低8位为同向低输出*P_IOA_Attrib = 0x00ff;*P_IOA_Data = 0x0000;*P_IOB_Dir=0x0040; //设置B6口为高电平输出,保证LED共阴极接地*P_IOB_Attrib=0x0040;*P_IOB_Data=0x0040;while(1){*P_IOA_Data = LedControl; //送数据到A口LedControl = LedControl << 1;if(LedControl > 0x00FF)LedControl = 0x0001;Delay();}}//=============================================================// main.c 结束//=============================================================2、用C实现发光二极管双向循环点亮//=============================================================== //// The information contained herein is the exclusive property of// Sunplus Technology Co. And shall not be distributed, reproduced,// or disclosed in whole in part without prior written permission.//// (C) COPYRIGHT 2001 SUNPLUS TECHNOLOGY CO.// ALL RIGHTS RESERVED//// The entire notice above must be reproduced on all authorized copies.////==============================================================// 工程名称:led2_C.scs// 功能描述: 用C实现发光二极管双向循环点亮// 文件来源:《61板实验教程》"实验二发光二极管双向循环点亮“// 硬件连接:IOA低8位接至SEG接口控制LED的导通// IOB6连至DIG7通过ULN2003A控制8个LED的共阴极电平状态。
单片机上机实验报告【实验一】端口实验,掌握通过端口编程实现数据输出和输入的方法,并观察结果。
实验内容:1)输出实验:假定4个端口全部连接发光二极管,编程实现所有发光二极管同时亮,延迟一定时间(自定)后,又同时灭,如此循环。
2)输入:从P0口输入某个数据到累加器A,打开观察窗口观察数据是否进入累加器A。
实现方式:通过peripherals实现端口数据观察实验。
程序流程图:将P0到P3端口先赋值为0,调用延迟后,再赋1,然后循环执行。
源代码:ORG 0000H ;程序入口地址LJMP MAIN ;跳转到主程序ORG 0300H ;主程序地址MAIN:MOV P0,#00H;MOV P1 ,#00H;MOV P2 ,#00H;MOV P3 ,#00H ;P0~P3均赋值为0ACALL DEL;调用延迟MOV P0 ,#0FFH;MOV P1 ,#0FFH;MOV P2 ,#0FFH;MOV P3 ,#0FFH;P0~P3均设为1MOV A,P0;将P0口值赋给累加器ACALL DEL;AJMP MAIN;跳转到主程序入口ORG 0200H;延迟程序入口地址DEL:MOV R5,#04H;寄存器实现延迟,F3:MOV R6,#0FFH;若主频为12MHZ则F2:MOV R7,#0FFH;延时为256*256*4F1:DJNZ R7,F1;0.26S,人眼可分辨DJNZ R6,F2;DJNZ R5,F3;RET;从延迟程序返回END;结束3.假设P0口外接一个数码管(共阴),如图,请在数码管上轮流显示数字0~9(采用软件延时)。
程序流程图:将数码管的真值编码0~9依次赋给P0并调用延迟,然后循环运行程序即可。
源代码:ORG 0000H; 程序入口SJMP MAIN; 跳转到主程序ORG 0300H; 主程序入口地址MAIN:MOV P0,#0FCH; 将数码管0的编码赋给P0口ACALL DELAY; 调用延迟,使数码管亮0持续0.33SMOV P0,#60H; show 1ACALL DELAY;MOV P0,#0DAH; show 2ACALL DELAY;MOV P0,#0F2H; show 3ACALL DELAY;MOV P0,#66H; show 4ACALL DELAY;MOV P0,#0B6H; show 5ACALL DELAY;MOVP0,#0BEH; show 6ACALL DELAY;MOV P0,#0E0H; show 7ACALL DELAY;MOV P0,#0FEH; show 8ACALL DELAY;MOV P0,#0F6H; show 9ACALL DELAY;AJMP LOOP; 跳转到主程序入口ORG 0200H; 延迟程序入口DEL:MOV R5,#05H; 采用软件延迟,若主频为12MHz,则DEL1:MOV R6,#0FFH; 定时时间为256*256*5*1uS=0.33S,DEL2:MOV R7,#0FFH; 人眼可分辨。
实验1 跑马灯实验一、实验目的●初步学会Proteus ISIS和uVision2单片机集成开发环境的使用;●初步掌握采用汇编语言与C语言开发单片机系统的程序结构;●掌握80C51单片机通用I/O口的使用;●掌握单片机内部定时/计数器的使用及编程方法以及中断处理程序的编写方法。
二、实验设备及器件●硬件:PC机,HNIST-1型单片机实验系统●软件:Proteus ISIS单片机仿真环境,uVision2单片机集成开发环境三、实验内容●编写一段程序,采用P1口作为控制端口,使与P1口相接的四个发光二极管〔D1、D2、D3、D4〕按照一定的方式点亮。
如点亮方式为:先点亮D1,延时一段时间,再顺序点亮D2……D4,然后又是D4……D1,同时只能有一个灯亮;然后每隔一段时间一次使相邻两个灯亮,三个灯亮,四个灯亮,最后闪烁三次,接着循环变化。
●基于Proteus ISIS仿真环境完成上述功能的仿真。
●基于uVision2单片机集成开发环境与硬件平台完成程序的脱机运行。
四、实验原理图图3.1 跑马灯实验电路原理图电路原理图如上图3.1所示,AT89S52的P1.0~P1.3控制4个发光二极管,发光二极管按照一定次序发光,相邻发光二极管的发光时间间隔可以通过定时器控制,还可以通过软件延时实现。
五、软件流程图与参考程序●主程序流程图如下:●参考程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar aa,num,speed,flag;uchar code table[]={0x0e,0x0d,0x0b,0x07};uchar code table1[]={0x0a,0x05,0x09,0x06};uchar codetable2[]={0x0c,0x09,0x03,0x08,0x01,0x0e,0x0c,0x08,0x00};void delay(uint z)//延时函数{uint x;uchar y;for(x=z;x>0;x--)for(y=200;y>0;y--);}void init()//条件初始化函数{ flag=0;speed=10;//控制跑马灯流水速度TMOD=0x01;//中断方式TH0=(65535-50000)/256;TL0=(65536-50000)%256;//初值EA=1;//翻开总中断ET0=1;//翻开外中断0TR0=1;}void main(){init();//调用初始化函数while(1){if(flag){delay(2000);//调用延时函数for(num=0;num<4;num++)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);}for(num=3;num>0;num--)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);}for(num=0;num<4;num++)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=3;num>0;num--)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=0;num<6;num++)//两个,三个,四个跑马灯依次闪烁{P1=table2[num];delay(2000);}for(num=0;num<5;num++)//闪烁5次{P1=0xff;//全暗delay(2000);P1=0X00;//全亮delay(2000);}speed=speed-3;//变速if(speed==4){speed=10;}}}}void timer0() interrupt 1//中断函数{TH0=(65535-50000)/256;TL0=(65536-50000)%256;aa++;if(aa==speed){aa=0;flag=1;}}六、实验思考题●请用汇编指令完本钱实验内容,深刻理解汇编语言程序设计结构。
实验要求及实验步骤一、实验要求1、预习《单片机技术实验教程》书中第一、二、三章;第三章预习所要做的实验项目,并写预习报告。
2、每位同学必须编好每次实验程序,未编好程序不得上机做实验。
3、上机时,程序调试完后,须由指导老师在机器上检查运行结果,经认可签字后方可退出试验。
二、实验步骤1、路径:双击桌面图标进入Kei l软件集成开发环境。
[最初进入uV2时,只能看到工程管理窗口(左边窗框)、源程序窗口(右边窗框)和输出窗口(下面窗框)。
]2、实验的调试需按下面的步骤来完成:(1)建立一个工程项目文件;(2)工程选择一个目标器件(如AT89C51);(3)创建源文件,输入程序代码并保存;(4)把源文件添加到项目中;(5)为工程项目设置软硬件调试环境;(6)编译连接项目文件;(7)硬件调试或软件调试。
操作步骤:①工程的建立:点击窗口中“【工程】/【新建工程】”选项,然后在弹出的“新建工程”对话框中选择要保存项目文件的路径,在“文件名”文本框输入项目名,然后单击“保存”按钮。
此时左边工程管理窗口中“目标1”文件夹前会变成“+”(注:目标文件夹的前为“+”表示工程建立,否则未建立工程);同时弹出一个对话框,要求选择单片机的型号,在“为目标‘目标1’选择设备”对话框中双击“A tmel”,选择“AT89C51或AT89C52”后单击“确定”按钮。
②源文件的建立(输入设计的模块文件):点击窗口中“【文件】/【新建】”选项或单击工具栏上的按钮,在右边源程序窗口弹出的程序文本框中输入所设计的程序代码,输入完毕后,选择【文件】/【保存】选项,在弹出的“另存”对话框中输入文件名(后缀为.asm),单击”保存”按钮, 保存文件。
③把源文件添加到工程项目中(将模块文件选项入工程):单击左边工程管理窗口中“目标1”文件夹前面的+号,展开里面的内容“源程序组1”。
《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义三.程序清单及程序流程框图ORG 0000H Array LJMP MAINMAIN: MOV R0,#30HMOV R2,#10HCLR AA1: MOV @R0,AINC R0INC ADJNZ R2,A1MOV R0,#30HMOV R1,#40HMOV R2,#10HA2: MOV A, @R0MOV @R1,AINC R0INC R1DJNZ R2, A2MOV R1,#40HMOV DPTR ,#4800HMOV R2, #10HA3: MOV A,@R1MOVX @DPTR ,AINC R1INC DPTRDJNZ R2,A3MOV SP,#60HMOV R2,#10HMOV DPTR ,#4800HPUSH DPLPUSH DPHMOV DPTR,#5800HMOV R3,DPLMOV R4,DPHA4: POP DPHPOP DPLMOVX A,@DPTRINC DPTRPUSH DPLPUSH DPHMOV DPL,R3MOV DPH,R4 MOVX @DPTR,A INC DPTRMOV R3,DPLMOV R4,DPHDJNZ R2,A4MOV R0,#50HMOV DPTR,#5800H MOV R2,#10HA5: MOVX A,@DPTR MOV @R0,AINC R0 INC DPTR DJNZ R2,A5POP DPH POP DPL HERE: LJMP HEREEND《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义三.实验电路四.程序清单及流程图程序一ORG 0000HLJMP MAIN ORG 000BH LJMP IPTO MAIN: MOV SP, #30H MOV TMOD, #01HCLR 00H SETB EA SETB ET0 MOV TH0, #3CH MOV TL0, #0B0H MOV R1, #14H SETB TR0 MOV A, #0feH MOV P1, A NT: JNB 00H, NT RL A MOV P1, ACLR 00H LJMP NT IPTO: MOV TH0,#3CH MOV TL0,#0B0HDJNZ R1, TIOMOV R1, #14HSETB 00HTIO: RETIEND程序二只需将程序一中“RL A”改为“RR A”即可实现其功能。
一、实验目的1. 熟悉单片机的硬件组成和基本工作原理。
2. 掌握单片机最小系统的搭建方法。
3. 学习使用单片机编程软件进行程序编写和调试。
4. 通过实际操作,加深对单片机应用的理解。
二、实验环境1. 实验设备:MCS-51单片机实验板、电源模块、面包板、连接线、LED灯、蜂鸣器、按键等。
2. 软件环境:Keil uVision5、Proteus仿真软件。
三、实验内容1. 点亮LED灯(1)实验目的:掌握单片机I/O口的使用,实现LED灯的点亮。
(2)实验步骤:① 将LED灯的阳极连接到单片机的P1.0口,阴极连接到GND。
② 在Keil uVision5中新建工程,编写程序如下:```cvoid main() {while (1) {P1 = 0xFF; // 点亮LED灯delay(500000); // 延时P1 = 0x00; // 熄灭LED灯delay(500000); // 延时}}③ 将程序编译并下载到单片机中,观察LED灯的点亮效果。
2. 蜂鸣器控制(1)实验目的:掌握单片机I/O口的使用,实现蜂鸣器的控制。
(2)实验步骤:① 将蜂鸣器的正极连接到单片机的P1.1口,负极连接到GND。
② 在Keil uVision5中编写程序如下:```cvoid main() {while (1) {P1 = 0x02; // 使能蜂鸣器delay(100000); // 延时P1 = 0x00; // 禁止蜂鸣器delay(100000); // 延时}}```③ 将程序编译并下载到单片机中,观察蜂鸣器的鸣叫效果。
3. 按键扫描(1)实验目的:掌握单片机I/O口的使用,实现按键的扫描和识别。
(2)实验步骤:① 将两个按键分别连接到单片机的P1.2和P1.3口。
② 在Keil uVision5中编写程序如下:void main() {while (1) {if (P1 & 0x04) { // 检测按键1是否按下// 执行按键1按下后的操作}if (P1 & 0x08) { // 检测按键2是否按下// 执行按键2按下后的操作}}}```③ 将程序编译并下载到单片机中,观察按键的扫描和识别效果。
单片机实训实验报告课题:单片机实训院系:电子信息工程学院班级学号:姓名:指导老师:熊老师、罗老师日期:2011.6.10一、硬件系统1、自制单片机实验板由七部分组成:(1).8路跑马灯(2)动态扫描共阳型数码管(3)4X4矩阵键盘(4)蜂鸣器(5)4路独立键盘(6)温度传感器(7)I2C通信方式的EEPROM芯片24C02二、Keil C u Vision2 简述与使用1.打开 u Vision22.新建工程:菜单【project】→【New Project】选择工程存放的路径,并输入工程文件名,然后点“保存”3.进入器件选择界面树列表框内选择“Atmel”→“AT89C52”,然后点“确定”完成器件选择。
4.编辑源程序:新建文件:菜单【File】→【new…】。
然后输入代码,编辑完成后菜单【File】→【Save】或【Save As…】把代码文件存入硬盘。
C源文件存为.C后缀,汇编源文件存为.a或.src后缀,并存放在同一个工程文件夹下。
5.加入源文件到工程中:在左边浮动窗口【File】选项卡里展开“Target 1”树,在“Source Group 1”上右键单击,弹出菜单,选【Add File to Group“Source Group 1”】,选择需要加入的源文件,点“Add”按钮加入,加入完成后按“Close”关闭。
6.设置编译选项:先选中左边浮动窗口【File】选项卡里“Target1“树节点,然后选菜单【Project】→【Options for Target “Target 1”】。
7.在弹出的“Options for Target “Target 1””对话框中选择[output]选项卡,勾选“Create HEX File”然后按“确定”完成设置。
8.按“F7”开始编译,编译成功后会在工程文件夹内生成.Hex目标文件生成的.hex文件就可以用来对AT89S52芯片进行编程和运行了。
实验一并行输入输出口的使用一、实验目的:学会设计proteus 7仿真电路,学习P1口的使用方法和延时子程序的编写用Keil uVision 3编程实现发光二极管的流水点亮。
二、实验原理:P1口为8位准双向I/O口,它的每一位都可以分别定义为输入线或输出线(作为输入时,口锁存器必须置1)。
P1口作为输出,接8个发光二极管D1~D8经限流电阻分别接至8个引脚。
本实验仿真电路图、流程图如下:三、实验代码:#include<reg51.h>#include<intrins.h> //移位库函数包含于此头文件中void delay(unsigned int d) //定义延时子函数{ while(--d>0);}void main(){ unsigned char i,sel;while(1){ sel=0xfe;for(i=0;i<=8;i++){ P1=sel; //显示变量赋给P1口delay(50000); //延时sel=_crol_(sel,1); //改变显示变量}}}四、实验结论:用while语句实现发光二极管循环流水点亮,从上到下一次点亮。
实验二C51分支程序设计一、实验目的:学习多分支选择结构和switch语句,了解循环的嵌套。
二、实验原理:do while 循环先执行后判断是否循环,switch括号中的表达式的值与某case后的常量表达式的值相同时,就执行它后面的语句,遇到break语句则退出switch语句。
本实验仿真电路图、流程图如下:(仿真电路图)(流程图)三、实验代码:#include <reg51.h>void main(){ char a;do{ P1=0xff;a=P1;a=a&0x03;switch(a){ case 0:P2=0x0e;break;case 1:P2=0x0d;break;case 2:P2=0x0b;break;case 3:P2=0x07;break;}}while(1);}四、实验结论:多分支选择的switch/case语句,可直接处理并行多分支选择问题,从匹配表达式的括号开始执行,不再进行判断。
一1.修改例程一的源程序(1)将A寄存器的初值改为80H(正逻辑,数据位为1表示发光二极管点亮),再对源程序进行简单修改,使程序运行后发光二极管情况与修改前相同。
(2)将LED向左循环移位点亮改为向右循环移位点亮(3)加快LED循环移位点亮的速度$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令INIT: LCALL Init_Device 调用初始设置子程序(1)MOV A,#080H ;赋初始值并在发光二极管上显示该数值CPL AMOV P3,ALOOP: CALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAY(2)RL A ;A寄存器内容右移1位并送1发光二极管显示MOV P3,AAJMP LOOP ;无限循环DELAY: MOV R5,#0H ;延时子程序D1: MOV R6,#00HDJNZ R6,$DJNZ R5,D1RET$include (Init_Device.inc);初始设置子程序文件包含伪指令END(3)可删除几个CALL DELAY语句即可加快循环速度2.将例程二0——F的循环显示改为0——9的循环显示$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令ORG 0000HLJMP INITTAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H ;字符段码表0-7 DB 080H,090H ;字符段码表8-FINIT: lcall Init_Device ;调用初始设置子程序INIT1: MOV R1,#00H ;操作数据初始值MOV A,R1MAIN: MOV DPTR,#TAB ;读取与A中数值对应的显示段码MOVC A,@A+DPTRMOV P5,A ;段码送并行口1显示CALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYINC R1 ;操作数据(R1)增1MOV A,R1CJNE A,#0AH,MAIN;检查操作数据是否大于显示范围(F)SJMP INIT1 ;无限循环DELAY: MOV R5,#0H ;延时子程序D1: MOV R6,#0HDJNZ R6,$DJNZ R5,D1RET$include (Init_Device.inc) ;初始设置子程序文件包含伪指令END二1.例程5程序修改(1)将KEY2、KEY4的功能对调(2)每次停下再启动以后,更改发光二极管点亮的循环方向$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令ORG 0000HLJMP INITIAL ;主程序入口ORG 0003HLJMP STOP ;外中断0服务程序入口,开始键(STAR)ORG 0013HLJMP STAR ;外中断1服务程序入口停止键(STOP)ORG 0100HINITIAL: L CALL Init_Device ;调用初始设置子程序MOV P3,#0FFH ;熄灭全部发光二极管MOV A,#0FFHMOV DPTR,#7F80HMOVX @DPTR,A ;清除数码管2(NUM2)显示MOV A,#0FEH ;点亮发光二极管的初始数据MOV R1,#1H ;发光二极管点亮位置初值MOV R4,#0FHMOV IP,#04H ;设置INT0(开始键STAR)为高优先级MOV TCON,#05H ;外中断采用边沿触发SETB EX0 ;INT1(停止键STOP)开中断SETB EA ;开放中断LOOP: CLR EA ;关闭中断CJNE R4, #0FH, LPRL ACJNE R4,#0FH,LPMOV P3,ACJNE R4,#0FH,LPINC R1CJNE R4,#0FH,LPSETB EALCALL DELAY1LCALL DELAY1LCALL DELAY1LCALL DELAY1CJNE R1,#8H,LOOPMOV R1,#0HSJMP LOOPLP: CLR EACJNE R4,#0F0H,LOOPRR ACJNE R4,#0F0H,LOOPMOV P3,ACJNE R4,#0F0H,LOOPDEC R1CJNE R4,#0F0H,LOOPSETB EALCALL DELAY1LCALL DELAY1LCALL DELAY1LCALL DELAY1CJNE R1,#0H,LPMOV R1,#8HSJMP LP;停止键的中断服务程序STOP: PUSH ACC ;保护A寄存器内容MOV A,R1 ;读取发光二极管点亮位置计数值MOV DPTR,#TABMOVC A,@A+DPTR ;获取发光二极管点亮位置计数值的显示段码MOV DPTR,#7F80HMOVX @DPTR,A ;发光二极管点亮位置计数值的显示数据送显示SETB EX1 ;INT0(启动键STAR)开中断JNZ $ ;等待重新启动条件--A=0MOV A,#0FFHMOVX @DPTR,A ;清除数码管2(NUM2)显示CLR EX1 ;禁止INT0中断(避免程序误动作)POP ACC ;恢复A寄存器内容CLR IE1;清除INT1(停止键STOP)中断标志(避免程序误动作)RETI ;中断返回;启动键的中断服务程序STAR: MOV A,#00H ;设置启动条件--A=0CLR IE0 ;清除INT0(启动键STOP)中断标志(避免程序误动作)PUSH ACCMOV A,R4CPL AMOV R4,APOP ACCRETI ;中断返回TAB: DB 0C0H,0F9H,0A4H,0B0H,099H ;0--4段码DB 092H,082H,0F8H,080H ;5--8段码DELAY1: MOV R6,#0 ;延时子程序D1: MOV R7,#0DJNZ R7,$DJNZ R6,D1RET$include (Init_Device.inc) ;初始设置子程序文件包含伪指令END2.修改例程6,将计数范围由0-F扩展至00-FF(使用定时器/计时器0),并在2位数码管上用10进制数显示计数结果(00-99)$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令DP2 EQU 07F80HDP_L EQU 30H ;低位数值暂存器DP_H EQU 31H ;高位数值暂存器MAIN: LCALL Init_Device ;调用初始设置子程序MOV TMOD,#00000101B ;C/T0工作于方式2MOV A,#0 ;显示初值为0MOV DP_L,AMOV DP_H,ACALL DISPLAY ;调用显示子程序显示初值0MOV TL0,#0 ;C/T0置初值0SETB TR0 ;启动计数器0LOOP: MOV A,TL0 ;读计数器0的计数值CJNE A,#0AH,L1MOV TL0,#0MOV A,#0INC DP_HMOV A,DP_HCJNE A,#0AH,MMMOV DP_H,#0MM: MOV A,#0L1: MOV DP_L,A ;在NUM2显示计数器0的计数值CALL DISPLAY ;调用显示子程序显示计数值SJMP LOOP ;无限次循环;显示子程序DISPLAY: MOV A,DP_L ;读低位显示值CALL DECODE ;调用换码子程序MOV DPTR,#DP2 ;显示段码送NUM2MOVX @DPTR,AMOV A,DP_H ;读高位显示值CALL DECODE ;调用换码子程序MOV P5,ARET;换码子程序DECODE: MOV DPTR,#TABMOVC A,@A+DPTRRETTAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H ;显示段码0-7 DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH ;显示段码8-F$include (Init_Device.inc) ;初始设置子程序文件包含伪指令END三通过对例程8的程序进行修改和上机调试,改变源程序的功能(1)将发送1、2、3、4的ASCII码改为发送A、B、C、D的ASCII码(2)将接收的第2、第3字节数据的显示位置交换$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令NUM2 EQU 07F80H ;NUM2地址NUM3 EQU 07F90H ;NUM3地址NUM4 EQU 07FA0H ;NUM4地址NUM5 EQU 07FB0H ;NUM5地址TIM_L EQU 0FDH ;T/C1低字节计数值TIM_H EQU 0FDH ;T/C1高字节计数值REC_BUF0 EQU 32H ;数据接收缓冲器0REC_BUF1 EQU 34H ;数据接收缓冲器1REC_BUF2 EQU 33H ;数据接收缓冲器2FLAG BIT 01H ;数据发送完成标志ORG 0000HLJMP MAIN ;转主程序ORG 0023HLJMP RECE ;转串行通信中断程序;主程序MAIN: lcall Init_Device ;C8051F02x系列单片机信息头文件包含伪指令MOV A,#0FFHMOV P5,AMOV DPTR,#NUM2MOVX @DPTR,A ;清除数码管NUM1的显示MOV DPTR,#NUM3MOVX @DPTR,A ;清除数码管NUM2的显示MOV DPTR,#NUM4MOVX @DPTR,A ;清除数码管NUM3的显示MOV DPTR,#NUM5MOVX @DPTR,A ;清除数码管NUM4的显示MOV R6,#0 ;通信操作状态寄存器清除MOV SP,#40H ;堆栈栈底设置MOV TMOD,#00100000B ;T/C1方式2MOV TH1,#TIM_H ;T/C1重装填值MOV TL1,#TIM_L ;T/C1计数值SETB TR1 ;启动T/C1MOV SCON0,#01010000B ;串口方式1SETB ES ;串口中断允许SETB E A ;开中断;主循环LOOP: CALL KEYBOARD ;调用案件状态分析子程序CJNE A,#0FFH,L0 ;按键状态发生变化转L0CLR FLAG ;按键状态无变化,清除发送完成标志SJMP LOOPL0: JB FLAG,LOOP ;数据发送完成,返回主循环MOV R7,A ;否则,键值暂存R7MOV A,#043H ;CMOV SBUF0,A ;发送字符C的ASCII码值CALL DELAYMOV A,#04FH ;OMOV SBUF0,A ;发送字符O的ASCII码值CALL DELAYMOV A,#04DH ;MMOV SBUF0,A ;发送字符M的ASCII码值CALL DELAYMOV A,#04BH ;KMOV SBUF0,A ;发送字符K的ASCII码值CALL DELAYMOV A,#40H ;发送数字0的ASCII码值MOV SBUF0,ACALL DELAYMOV A,R7ADD A,#40H ;生成键值的ASCII码值MOV SBUF0,A ;发送键值的ASCII码值SETB FLAG ;置位发送完成标志SJMP LOOP;中断服务程序RECE: JNB TI,REC1 ;非发送转接收处理CLR TI ;否则,清除发送中断标志RETI ;中断返回REC1: PUSH ACC ;保护累加器AMOV A,SBUF0 ;读接收缓冲器CJNE R6,#0,REC2CJNE A,#43H,REC6 ;接收状态为0,进行字符C的过滤处理MOV R6,#1 ;接收状态改为1SJMP REC6REC2: CJNE R6,#1,REC3CJNE A,#4FH,REC5 ;接收状态为1,进行字符O的过滤处理MOV R6,#2 ;接收状态改为2SJMP REC6REC3: CJNE R6,#2,REC4CJNE A,#4DH,REC5 ;接收状态为2,进行字符M的过滤处理MOV R6,#3 ;接收状态改为3MOV R5,#3 ;数据接收计数器设置为3SJMP REC6REC4: CJNE R6,#3,REC6PUSH ACC ;接收状态为3,暂存接收的内容MOV A,#REC_BUF0ADD A,R5MOV R0,A ;生成接收数据存放缓冲器地址POP ACC ;恢复接收数据至A寄存器MOV @R0,A ;保存接收的数据DEC R5 ;接收数据计数器减1CJNE R5,#0,REC6CALL DISPLAY ;接收数据计数器减为0,进行接收结果的显示REC5: MOV R6,#0 ;接收状态恢复为0(就绪状态)REC6: POP ACC ;恢复累加器ACLR RI ;清除接收中断标志RETI ;中断返回KEYBOARD: MOV A,P2 ;读按键状态输入端口RR ARR ARRC A ;KEY1有效键值移入位累加器CJC K1 ;键值无效转KEY2键值的分析MOV A,#1 ;否则,KEY1代码送A寄存器SJMP K5K1: RRC A ;KEY2有效键值移入位累加器CJC K2 ;键值无效转KEY3键值的分析MOV A,#2 ;否则,KEY2代码送A寄存器SJMP K5K2: RRC A ;KEY3有效键值移入位累加器CJC K3 ;键值无效转KEY4键值的分析MOV A,#3 ;否则,KEY3代码送A寄存器SJMP K5K3: RRC A ;KEY4有效键值移入位累加器CJC K4 ;键值无效转按键无效处理MOV A,#4 ;否则,KEY4代码送A寄存器SJMP K5K4: MOV A,#0FFH ;按键无效代码送A寄存器K5: RETDISPLAY: MOV A,REC_BUF2 ;读取接收的第2字节数据SWAP A ;高、低4位交换ANL A,#0FH ;分离高4位有效数值CALL DECODE ;换码MOV DPTR,#NUM2MOVX @DPTR,A ;在数码管NUM2显示第2字节数据高4位数值MOV A,REC_BUF2 ;读取接收的第2字节数据ANL A,#0FH ;提取低4位有效数值CALL DECODE ;换码MOV DPTR,#NUM3MOVX @DPTR,A ;在数码管NUM3显示第2字节数据低4位数值MOV A,REC_BUF1 ;读取接收的第3字节数据SWAP A ;高、低4位交换ANL A,#0FH ;分离高4位有效数值CALL DECODE ;换码MOV DPTR,#NUM4MOVX @DPTR,A ;在数码管NUM4显示第3字节数据高4位数值MOV A,REC_BUF1 ;读取接收的第3字节数据ANL A,#0FH ;提取低4位有效数值CALL DECODE ;换码MOV DPTR,#NUM5MOVX @DPTR,A ;在数码管NUM5显示第3字节数据低4位数值RET;------ DECODE PROGRAM -------DECODE: MOV DPTR,#TABMOVC A,@A+DPTRRET;------ DELAY PROGRAM ------DELAY: MOV R5,#80HD1: MOV R6,#0HDJNZ R6,$DJNZ R5,D1RETTAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8HDB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH$include (Init_Device.inc) ;初始设置子程序文件包含伪指令END。
本实验程序是凌阳SPCE61A单片机的程序代码!希望大家能够把单片机学好,部分程序有C语言版本的,有一部分没有,我认为C语言版本的其实是按照汇编版的改编的,都是大同小异,所以后面一部分中断程序就没有写C语言版本的!望理解^_^//使用汇编语言实现A 口的输出.RAM.CODE.public _main.define P_IOA_Dir 0X7002.define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000.define P_watchdog_clear 0X7012 _main:R1=0x00FF //初始化[P_IOA_Dir] = R1[P_IOA_Attrib] = R1R1 = 0x0000[P_IOA_Data] = R1LP1: [P_IOA_Data] = R1R1 += 1CALL delayR2 = 0X0001 //清狗[P_watchdog_clear] = R2JMP LP1delay: .PROCBP = 0LPN: BP += 1CMP BP,0X9000JNZ LPNRETF.ENDP//使用C语言实现A 口的输出#define P_IOA_Data (volatile unsigned int *)0x7000 #define P_IOA_Dir (volatile unsigned int *)0x7002 #define P_IOA_Attrib (volatile unsigned int *)0x7003 #define P_watchdog_clear (volatile unsigned int *)0X7012 int main (void){unsigned int i = 0 ,j = 0;*P_IOA_Dir = 0xffff;*P_IOA_Attrib = 0xffff;*P_IOA_Data = 0x0000;while (1){for (i = 0;i <= 255;++i){for (j = 0 ; j <= 2222; ++j) //延时,可以更改*P_IOA_Data = i ;*P_watchdog_clear = 0x0001;}}}//使用汇编语言实现A 口作为输入口、B 口作为输出口.RAM.CODE.public _main.define P_IOA_Dir 0X7002 //定义地址.define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000.define P_IOB_Dir 0X7007.define P_IOB_Attrib 0X7008.define P_IOB_Data 0X7005.define P_watchdog_clear 0X7012_main:R1=0x0000 //A口初始化[P_IOA_Dir] = R1[P_IOA_Attrib] = R1[P_IOA_Data] = R1R1=0x00FF //B口初始化[P_IOB_Dir] = R1[P_IOB_Attrib] = R1R1=0x0000[P_IOB_Data] = R1LPP:R1 = [P_IOA_Data] //键盘程序调用取键值CMP R1,0JZ LP2CALL delayR2 = [P_IOA_Data]CMP R1,R2JZ LP2[P_IOB_Data] = R1delay: .PROCBP = 0LPN: BP += 1CMP BP,0X9000JNZ LPNRETF.ENDPLP2: R1 = 0X0001 //清狗[P_watchdog_clear] = R1JMP LPP//使用C 语言实现A 口作为输入口、B 口作为输出口#define P_IOA_Data (volatile unsigned int *)0x7000 #define P_IOA_Dir (volatile unsigned int *)0x7002 #define P_IOA_Attrib (volatile unsigned int *)0x7003 #define P_IOB_Data (volatile unsigned int *)0X7005 #define P_IOB_Dir (volatile unsigned int *)0X7007 #define P_IOB_Attrib (volatile unsigned int *)0X7008 #define P_watchdog_clear (volatile unsigned int *)0X7012 int f (unsigned int t){unsigned int s;t = *P_IOA_Data;if (t == 0 )return t;else{delay();s = *P_IOA_Data;if (t ==s)return t;elsereturn 0;}}void delay (void){unsigned int m;for(m = 0;m<100; ++m){*P_watchdog_clear = 0x0001;}}int main (void){unsigned int i,t;*P_IOA_Dir = 0x0000; // //A口初始化*P_IOA_Attrib = 0x0000;*P_IOA_Data = 0x0000;*P_IOB_Dir = 0x00FF; //B口初始化*P_IOB_Attrib = 0x00FF;*P_IOB_Data = 0x0000;while (1){t = *P_IOA_Data; //取键值i = f(t); //返回键值if (i == 0)*P_IOB_Data = i;else{*P_IOB_Data = i;}*P_watchdog_clear = 0x0001;}}//使用汇编语言实现A 口的输出//系统时钟.RAM.CODE.public _main.define P_IOA_Dir 0X7002 .define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000 .define P_SystemClock 0X7013 .define P_watchdog_clear 0X7012_main:R1 = 0X0000 //24.576MHZ[P_SystemClock] = R1R1=0x00FF //初始化[P_IOA_Dir] = R1[P_IOA_Attrib] = R1R1 = 0x0000[P_IOA_Data] = R1LP1: [P_IOA_Data] = R1CALL delayCALL delayR1 = 0XFFFF[P_IOA_Data] = R1CALL delayCALL delaydelay: .PROCBP = 0xFFFFLPN: BP -= 1JNZ LPNRETF.ENDPR2 = 0X0001 //清狗[P_watchdog_clear] = R2JMP LP1//系统时钟//使用C语言实现A 口的输出#define P_IOA_Data (volatile unsigned int *)0x7000 #define P_IOA_Dir (volatile unsigned int *)0x7002 #define P_IOA_Attrib (volatile unsigned int *)0x7003 #define P_SystemClock (volatile unsigned int *)0X7013 #define P_watchdog_clear (volatile unsigned int *)0X7012 int main (void){unsigned int i,j;*P_IOA_Dir = 0x00FF;*P_IOA_Attrib = 0x00FF;*P_IOA_Data = 0x0000;*P_SystemClock = 0x0000;while (1){for (i = 0;i < 2222;++i)for (j = 0;j < 22;++j){*P_IOA_Data = 0x0000 ;*P_watchdog_clear = 0x0001;}for (i = 0;i < 2222;++i)for (j = 0;j < 22;++j){*P_IOA_Data = 0xFFFF ;*P_watchdog_clear = 0x0001;}}}//使用汇编语言定时器TimerA.RAM.CODE.public _main.define P_IOB_Dir 0x7007.define P_IOB_Attrib 0x7008.define P_IOB_Data 0x7005.define P_watchdog_clear 0x7012.define P_TimerA_Data 0x700A.define P_TimerA_ctrl 0x700B_main:R1=0x0FFF //B口初始化同相低电平输出[P_IOB_Dir] = R1[P_IOB_Attrib] = R1R1=0x0000[P_IOB_Data] = R1R1 = 0x0215 // 输入256HZ 输出1秒占空比8/16[P_TimerA_ctrl] = R1R1 = 0xFFEF //计数初值[P_TimerA_Data] = R1LP1:R2 = 0x0001 //清狗[P_watchdog_clear] = R2 JMP LP1//使用C语言定时器TimerA#define P_IOB_Data (volatile unsigned int *)0X7005 #define P_IOB_Dir (volatile unsigned int *)0X7007#define P_IOB_Attrib (volatile unsigned int *)0X7008#define P_watchdog_clear (volatile unsigned int *)0X7012#define P_TimerA_Data (volatile unsigned int *)0X700A #define P_TimerA_ctrl (volatile unsigned int *)0X700Bint main (void){*P_IOB_Dir = 0x0F00; //B口初始化同相低电平输出*P_IOB_Attrib = 0x0F00;*P_IOB_Data = 0x0000;*P_TimerA_ctrl = 0x0215; // 输入256HZ 输出1秒占空比8/16*P_TimerA_Data = 0xFFEF; //计数初值while (1){*P_watchdog_clear = 0x0001;}}// 使用汇编语言A/D转换.RAM.CODE.public _main.define P_IOA_Dir 0X7002 //定义地址.define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000.define P_IOB_Dir 0X7007.define P_IOB_Attrib 0X7008.define P_IOB_Data 0X7005.define P_watchdog_clear 0X7012.define P_ADC_MUX_Ctrl 0X702B.define P_ADC_Ctrl 0X7015.define P_ADC_MUX_Data 0X702C_main:R1=0x0000 //A口初始化悬浮输入口[P_IOA_Dir] = R1[P_IOA_Data] = R1R1=0x00FF[P_IOA_Attrib] = R1[P_IOB_Dir] = R1 //B口初始化同相低电平输出口[P_IOB_Attrib] = R1R1=0x0000[P_IOB_Data] = R1R1=0x0001 //选择通道LINE_IN为IOA0[P_ADC_MUX_Ctrl] = R1R1=0x0001 //允许A/D转换[P_ADC_Ctrl] = R1ZH:R1 = [P_ADC_MUX_Data] //判断是否转换完成? 读取P_ADC_MUX_Data的值TEST R1,0x8000JZ ZHR1 = [P_ADC_MUX_Data]R1 = R1 LSR 4R1 = R1 LSR 2[P_IOB_Data] = R1R1 = 0X0001 //清狗[P_watchdog_clear] = R1JMP ZH// 使用C语言A/D转换#define P_IOA_Data (volatile unsigned int *)0x7000#define P_IOA_Dir (volatile unsigned int *)0x7002#define P_IOA_Attrib (volatile unsigned int *)0x7003#define P_IOB_Data (volatile unsigned int *)0X7005#define P_IOB_Dir (volatile unsigned int *)0X7007#define P_IOB_Attrib (volatile unsigned int *)0X7008#define P_watchdog_clear (volatile unsigned int *)0X7012#define P_ADC_MUX_Ctrl (volatile unsigned int *)0X702B#define P_ADC_Ctrl (volatile unsigned int *)0X7015#define P_ADC_MUX_Data (volatile unsigned int *)0X702Cint main (void){unsigned int i ;unsigned int j ;*P_IOA_Dir = 0x0000 ; //A口初始化悬浮输入口*P_IOA_Data = 0x0000 ;*P_IOA_Attrib = 0x00FF ;*P_IOB_Dir = 0x00FF ; //B口初始化同相低电平输出口*P_IOB_Attrib = 0x00FF ;*P_IOB_Data = 0x0000 ;*P_ADC_MUX_Ctrl = 0x0001; //选择通道LINE_IN为IOA0*P_ADC_Ctrl = 0x0001 ; //允许A/D转换for(i = 0;i < 5;++i) ; //等待while(1){i = *P_ADC_MUX_Data ; //判断是否转换完成? 读取P_ADC_MUX_Data的值i = i & 0x8000 ;if(i == 0);else{j = *P_ADC_MUX_Data;j >>= 6 ; //右移6位*P_IOB_Data = j ;}*P_watchdog_clear = 0X0001 ; //清狗}}//使用汇编语言实现A 口作为输入口、B 口作为输出口触键唤醒.RAM.CODE.public _main.define P_IOA_Dir 0X7002 //定义地址.define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000.define P_IOB_Dir 0X7007.define P_IOB_Attrib 0X7008.define P_IOB_Data 0X7005.define P_watchdog_clear 0X7012.define P_INT_Ctrl 0X7010.define P_IOA_Latch 0X7004.define P_SystemClock 0X7013.define P_INT_Clear 0X7011_main:R1=0x00FD //设置IOA1为带下拉电阻的输入口,其他IOA口都设置为输出口[P_IOA_Dir] = R1[P_IOA_Attrib] = R1R1=0x0000[P_IOA_Data] = R1R1=0x00FF //B口初始化初始化IOB口为同相低电平输出口[P_IOB_Dir] = R1[P_IOB_Attrib] = R1R1=0x0000[P_IOB_Data] = R1INT OFFR1 = 0X0080 //开启唤醒中断[P_INT_Ctrl] = R1R1 = 0X0000 //熄灭灯[P_IOB_Data] = R1R1 = [P_IOA_Latch] //锁存IOA数据[P_IOA_Data]INT IRQR1 = 0X0007 //睡眠[P_SystemClock] = R1LP2: R1 = 0X0001 //清狗[P_watchdog_clear] = R1JMP LP2.TEXT.PUBLIC _IRQ3_IRQ3:INT OFFPUSH R1,R4 TO [SP]R1 = 0X0080 //是否是触键唤醒TEST R1,[P_INT_Ctrl]JZ EXITR1 = 0XFFFF //点亮8颗灯[P_IOB_Data] = R1EXIT:R1 = 0X0080 //清中断[P_INT_Clear] = R1POP R1,R4 FROM [SP]INT IRQRETI.END//使用C 语言实现A 口作为输入口、B 口作为输出口#define P_IOA_Data (volatile unsigned int *)0x7000#define P_IOA_Dir (volatile unsigned int *)0x7002#define P_IOA_Attrib (volatile unsigned int *)0x7003#define P_IOB_Data (volatile unsigned int *)0X7005#define P_IOB_Dir (volatile unsigned int *)0X7007#define P_IOB_Attrib (volatile unsigned int *)0X7008#define P_watchdog_clear (volatile unsigned int *)0X7012#define P_INT_Ctrl (volatile unsigned int *)0X7010#define P_IOA_Latch (volatile unsigned int *)0X7004#define P_SystemClock (volatile unsigned int *)0X7013#define P_INT_Clear (volatile unsigned int *)0X7011int main(void){unsigned int i ;ASM (" INT OFF ") ;*P_IOA_Dir = 0x00FD ; //设置IOA1为带下拉电阻的输入口,其他IOA口都设置为输出口*P_IOA_Attrib = 0x00FD;*P_IOA_Data = 0x0000;*P_IOB_Dir = 0x00FF ; //B口初始化初始化IOB口为同相低电平输出口*P_IOB_Attrib = 0x00FF;*P_IOB_Data = 0x0000;*P_INT_Ctrl = 0X0080; //开启唤醒中断*P_IOB_Data = 0X0000; //熄灭灯i = *P_IOA_Latch ; //锁存IOA数据ASM (" INT IRQ ") ; //开中断*P_SystemClock = 0X0007; //睡眠while(1){*P_watchdog_clear = 0X0001 ; //清狗}}unsigned int t;void IRQ3(void)__attribute__((ISR));void IRQ3(void){t = *P_INT_Ctrl ;if (t == 0X0080 ){*P_IOA_Data = 0XFFFF ;*P_INT_Clear = 0X0080;}else*P_INT_Clear = 0X0080;}//使用汇编语言:IRQ6 中断.DEFINE P_IOA_DATA 0x7000.DEFINE P_IOA_DIR 0x7002.DEFINE P_IOA_ATTRI 0x7003.DEFINE P_IOB_DATA 0x7005.DEFINE P_IOB_DIR 0x7007.DEFINE P_IOB_ATTRI 0x7008.DEFINE P_INT_CTRL 0x7010.DEFINE P_INT_CLEAR 0x7011.DEFINE P_WatchDog_Clear 0x7012.DEFINE P_Timebase_setup 0x700e.RAM.VAR G_Time1.VAR G_Time2.CODE.PUBLIC _main_main:INT OFFR1 = 0xFFFF //设置IOA口为同相高电平输出口[P_IOA_ATTRI] = R1[P_IOA_DIR] = R1[P_IOA_DATA] = R1R1 = 0xFFFF //设置IOB口为同相高电平输出口[P_IOB_ATTRI] = R1[P_IOB_DIR] = R1[P_IOB_DATA] = R1R1 = 0x0003[P_Timebase_setup] =R1R1 = 0x0003 //开中断IRQ6_C_Tmb1和IRQ6_C_Tmb2 [P_INT_CTRL] = R1R1 = 0x0000[G_Time1] = R1[G_Time2] = R1INT I RQL_Loop:R1 = 0x0001[P_WatchDog_Clear] = R1JMP L_Loop.TEXT.PUBLIC _IRQ6_IRQ6:PUSH R1,R5 to [sp] //压栈保护R1 = 0x0001TEST R1,[P_INT_CTRL] //比较是否为IRQ6_C_Tmb2的中断源JNZ L_IRQ6_C_Tmb2 //是,则转至对应程序段L_IRQ6_C_Tmb1: //否,则进入IRQ6_C_Tmb1程序段;R2 = [G_Time1]R2 += 0x0001[G_Time1] = R2CMP R2,64 //比较是否为1秒;JBE L_LED1_OFF //小于等于则LED灭;R1 = 0xfff0 //大于则LED亮;[P_IOA_DATA] = R1CMP R2,128 //比较是否为两秒;JBE L_LED1_RET //小于等于则LED继续亮;R2 = 0x000 //否则,G_Time1单元清零,返回中断;[G_Time1] =R2JMP L_LED1_RETL_LED1_OFF:R1 = 0xFFFF[P_IOA_DATA] = R1L_LED1_RET:R1 = 0x0002[P_INT_CLEAR] = R1R1 = 0x0001[P_WatchDog_Clear] = R1POP R1,R5 FROM [sp]RETIL_IRQ6_C_Tmb2:R2 = [G_Time2]R2 += 0x0001[G_Time2] = R2CMP R2,64 //比较是否为0.5秒;JBE L_LED2_OFF //小于等于则LED灭;R1 = 0xfff0 //大于则LED亮;[P_IOB_DATA] = R1CMP R2,128 //比较是否为1秒;JBE L_LED2_RET //小于等于则LED继续亮;R2 = 0x0000 //否则,G_Time2单元清零,返回中断;[G_Time2] = R2JMP L_LED2_RETL_LED2_OFF:R1 = 0xFFFF[P_IOB_DATA] = R1L_LED2_RET:R1 = 0x0001[P_INT_CLEAR] = R1POP R1,R5 from [sp] RETI//使用汇编语言IRQ4.define P_IOA_DATA 0x7000.define P_IOA_DIR 0x7002.define P_IOA_ATTRI 0x7003.define P_IOB_DATA 0x7005.define P_IOB_DIR 0x7007.define P_IOB_ATTRI 0x7008.define P_INT_CTRL 0x7010.define P_INT_CLEAR 0x7011.define P_watchdog_clear 0x7012.RAM.VAR G_Time1.VAR G_Time2,G_Time4.CODE.public _main_main:INT OFFR1 = 0xFFFF //IOA口为同相高电平输出口;[P_IOA_ATTRI] = R1[P_IOA_DIR] = R1R1 = 0x0000[P_IOA_DATA] = R1R1 = 0x0070 //开中断IRQ4_4KHz、IRQ4_2KHz和IRQ4_1KHz[P_INT_CTRL] = R1R1 = 0x0000[G_Time1] = R1[G_Time2] = R1[G_Time4] = R1INT IRQL_Loop:R1 = 0x0001 //清狗等待中断[P_watchdog_clear] = R1JMP L_Loop.TEXT.PUBLIC _IRQ4_IRQ4:PUSH R1,R5 to [sp] //压栈保护;R1 = 0x0010TEST R1,[P_INT_CTRL] //比较是否为1KHz的中断源;JNZ LED2kHZ_OFF //是,则转至对应程序段;R1 = 0x0020TEST R1,[P_INT_CTRL] //否,则比较是否为2KHz的中断源;JNZ IRQ4_2k //是,则转至对应程序段;L_IRQ4_4k: //否,则进入4KHz程序段;R2 = [G_Time4]R2 += 0x0001[G_Time4] = R2CMP R2,1024 //比较JBE LED4kHZ_OFF //小于等于则LED灭;R1 = 0x00f0 //大于则LED亮;[P_IOA_DATA] = R1CMP R2,2048 //比较JBE LED2kHZ_OFF //小于等于则LED继续亮;R2 = 0x0000 //否则,G_Time4单元清零,返回中断;[G_Time4] = R2JMP LED2kHZ_OFFLED4kHZ_OFF:R1 = 0x0000[P_IOA_DATA] = R1LED2kHZ_OFF:R1 = 0x0040POP R1,R5 from [sp]RETIIRQ4_2k:R2 = [G_Time2]R2 += 0x0001[G_Time2] = R2CMP R2,1024 //比较JBE LED2kHZ_OFF //小于等于则LED灭;R1 ^= 0x000C //大于则LED亮;[P_IOA_DATA] = R1CMP R2,2048 //比较;JBE LED2kHz_RET //小于等于则LED继续亮;R2 = 0x0000 //否则,G_Time2单元清零,返回中断;[G_Time2] = R2JMP LED2kHz_RETLED2kHZ_OFF:R1 = 0x0000[P_IOA_DATA] = R1LED2kHz_RET:R1 = 0x0020POP R1,R5 from [sp]RETILED2kHZ_OFF:R2 = [G_Time1]R2+ = 0x0001[G_Time1] = R2CMP R2,1024 //比较;JBE LED1kHZ_OFF //小于等于则LED灭;R1 = 0x0003 //大于则LED亮;[P_IOA_DATA] = R1CMP R2, 2048 //比较;JBE LED1kHz_RET //小于等于则LED继续亮;R2 = 0x0000 //否则,G_Time1单元清零,返回中断;[G_Time1] = R2JMP LED1kHz_RETLED1kHZ_OFF:R1 = 0x0000[P_IOA_DATA] = R1LED1kHz_RET:R1 = 0x0010POP R1,R5 from[sp] RETI//使用汇编语言外部中断EXT1、EXT2.define P_IOA_Dir 0X7002 //定义地址.define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000.define P_IOB_Dir 0X7007.define P_IOB_Attrib 0X7008.define P_IOB_Data 0X7005.define P_FeedBack 0X7009.define P_INT_Ctrl 0x7010.define P_INT_clear 0x7011.define P_Timebase_setup 0x700E.define P_watchdog_clear 0X7012.RAM.CODE.PUBLIC _main_main:INT OFFR1 = 0xFFFF //IOA口为同相低电平输出[P_IOA_Attrib] = R1[P_IOA_Dir] = R1R1 = 0x0000[P_IOA_Data] = R1R1 = 0x0000 //IOB2 、IOB3 口为上拉电阻输入[P_IOB_Attrib] = R1[P_IOB_Dir] = R1R1 = 0x0001[P_IOB_Data] = R1R1 = 0X000C //设置IOB 口为特殊功能[P_FeedBack] = R1R1 = 0X0300 //开启IRQ3_EXT1,IRQ3_EXT2 中断[P_INT_Ctrl] = R1INT IRQLP1:R1 = 0X0001[P_watchdog_clear] = R1JMP LP1//外部中断.TEXT.PUBLIC _IRQ3_IRQ3:INT OFFPUSH R1,R4 TO [SP]R1 = 0X0200 //是否是EXT2 中断TEST R1,[P_INT_Ctrl]JNZ IRQ3_EXT2 // 是否是EXT2,是则跳转到EXT2R1 = 0X0100TEST R1,[P_INT_Ctrl]JNZ IRQ3_EXT1 // 是否是EXT1,是则跳转到EXT1R1 = 0X0380[P_INT_clear] = R1POP R1,R4 FROM [SP]RETIIRQ3_EXT1:R1 = 0X00F0[P_IOA_Data] = R1R1 = 0X0100[P_INT_clear] = R1POP R1,R4 FROM [SP]INT IRQRETIIRQ3_EXT2:R1 = 0X000F[P_IOA_Data] = R1R1 = 0X0200[P_INT_clear] = R1 POP R1,R4 FROM [SP] INT IRQRETI//使用汇编语言外部中断IRQ0 1 2.define P_IOA_Dir 0X7002 //定义地址.define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000.define P_IOB_Dir 0X7007.define P_IOB_Attrib 0X7008.define P_IOB_Data 0X7005.define P_FeedBack 0X7009.define P_INT_Ctrl 0x7010.define P_INT_clear 0x7011.define P_watchdog_clear 0X7012.define P_TimerA_Data 0x700A.define P_TimerA_ctrl 0x700B.define P_TimerB_Data 0x700C.define P_TimerB_ctrl 0x700D.RAM.CODE.PUBLIC _main_main:INT OFFR1 = 0xFFFF //IOA口为同相低电平输出[P_IOA_Attrib] = R1[P_IOA_Dir] = R1R1 = 0x0000[P_IOA_Data] = R1R1 = 0xFFFF //IOB口为同相低电平输出[P_IOB_Attrib] = R1[P_IOB_Dir] = R1R1 = 0x0000[P_IOB_Data] = R1R1 =0x0034 //4096hz[P_TimerA_ctrl] = R1R1 = 0xDFFF[P_TimerA_Data] = R1R1 =0x0004 //4096hz[P_TimerB_ctrl] = R1R1 = 0xEFFF[P_TimerB_Data] = R1R1 = 0x5400 //开启IRQ3_EXT1,IRQ3_EXT2 中断[P_INT_Ctrl] = R1INT IRQLP1:R1 = 0X0001[P_watchdog_clear] = R1JMP LP1//外部中断.TEXT.PUBLIC _IRQ0_IRQ0:INT OFFPUSH R1,R4 TO [SP]R1 = 0x4000 // 中断[P_INT_clear] = R1POP R1,R4 FROM [SP]INT IRQRETI.TEXT.PUBLIC _IRQ1_IRQ1:INT OFFPUSH R1,R4 TO [SP]R1 = [P_IOA_Data]R1 ^= 0x000F[P_IOA_Data] = R1R1 = 0x1000[P_INT_clear] = R1POP R1,R4 FROM [SP]INT IRQRETI.TEXT.PUBLIC _IRQ2_IRQ2:INT OFFPUSH R1,R4 TO [SP]R1 = [P_IOB_Data]R1 ^= 0x000F[P_IOB_Data] = R1R1 = 0x0400[P_INT_clear] = R1POP R1,R4 FROM [SP]INT IRQRETI目前做了这么多实验,实验程序共享给大家!希望大家能够把单片机学好!^_^ ^_^ ^_^ ^_^ ^_^。
《单片机C语言程序设计》实验报告
一、实验目的和要求
1、掌握protues7.10的安装及操作,掌握电路搭建方法,掌握仿真方法。
2、掌握keil uvision5的安装及操作,掌握新建工程项目,调试运行方法。
二、实验内容和原理
1、运行文件名为歌曲的实例,打开“歌曲.DSN”,运行给出的例子。
详细
操作过程参考《单片机实验一参考文档》P1和P2的描述。
2、参考《单片机实验一参考文档》中的P2-P4关于“三、protues软件
的界面与操作介绍”中的描述,了解protues软件的界面与操作。
3、使用protues软件绘制“流水灯”的原理图,并通过调试。
详细过程
参考《单片机实验一参考文档》的P4-P11,熟悉protues的使用。
4、使用Keil uVision5完成上述“流水灯”的程序设计。
步骤如下:
①新建工程项目,并选择好芯片
②建立c源程序文件
③编写流水灯程序文件,添加文件到当前项目组中及编译文件
④检查并修改源程序中的错误
三、主要仪器设备
Protues硬件仿真调试软件
Keil编程软件
四、操作方法与实验步骤
1、根据实验一新建工程操作,新建工程。
2、根据实验原理图链接Protues仿真电路图。
3、根据实验要求编写C程序。
4、通过Protues仿真调试,修改程序。
五、实验结果与分析。
1 用P0实现流水灯左移实验,利用软件延时。
#include"at89x51.h"void delay(void);main(){P1=0x01;for(;;){if(P1==0x00){P1=0x01;delay();}else {P1=P1<<1;delay();}}}void delay(){unsigned char i,j;for(i=0;i<250;i++){for(j=0;j<250;j++);}}2 用P0实现流水灯闪烁实验,利用软件延时。
#include"at89x51.h"void delay(void);main(){for(;;){P1=~P1;delay();}}void delay(){unsigned char i,j;for(i=0;i<255;i++)for(j=0;j<255;j++);}3 实现按键按下,LED闪烁,否则LED亮的现象。
#include"at89x51.h"void delay(void);main(){for(;;){if(P3_0==1){P1=0xff;}else{P1=~P1;delay();}}}void delay(){unsigned char i,j;for(i=0;i<250;i++){for(j=0;j<250;j++);}}4 利用中断实现,按1次按键,P0口显示数据减1的效果。
#include"at89x51.h"void delay(void);main(){EA=1;EX0=1;IT0=1;for(;;){}}void jian() interrupt 0{P0--;}5 参照LCD1602.C,实现在LCD第一行中间显示自己姓名字母,第二行初显示学号。
#include"at89x51.h"#include"lcd_1602.c"main(){LCD_Initial();for(;;){GotoXY(7,0);Print("LZ");GotoXY(0,1);Print("07331007");}}6 实现控制P2口接的数码管循环显示0~9的现象。
矿产资源开发利用方案编写内容要求及审查大纲
矿产资源开发利用方案编写内容要求及《矿产资源开发利用方案》审查大纲一、概述
㈠矿区位置、隶属关系和企业性质。
如为改扩建矿山, 应说明矿山现状、
特点及存在的主要问题。
㈡编制依据
(1简述项目前期工作进展情况及与有关方面对项目的意向性协议情况。
(2 列出开发利用方案编制所依据的主要基础性资料的名称。
如经储量管理部门认定的矿区地质勘探报告、选矿试验报告、加工利用试验报告、工程地质初评资料、矿区水文资料和供水资料等。
对改、扩建矿山应有生产实际资料, 如矿山总平面现状图、矿床开拓系统图、采场现状图和主要采选设备清单等。
二、矿产品需求现状和预测
㈠该矿产在国内需求情况和市场供应情况
1、矿产品现状及加工利用趋向。
2、国内近、远期的需求量及主要销向预测。
㈡产品价格分析
1、国内矿产品价格现状。
2、矿产品价格稳定性及变化趋势。
三、矿产资源概况
㈠矿区总体概况
1、矿区总体规划情况。
2、矿区矿产资源概况。
3、该设计与矿区总体开发的关系。
㈡该设计项目的资源概况
1、矿床地质及构造特征。
2、矿床开采技术条件及水文地质条件。