1、 《单片机实验》报告 实验名称 分支程序设计实验 指导教师 刘冬生 专业班级 电子1103班 姓名 XXXXXX 学号 XXXXXXXXXXX 联系方式 XXXXXXXXXXX 一、任务要求 熟练掌握KeilC环境下汇编语言程序的调试方法,加深对汇编语言指令、机器码、寻址方式等基本内容的理解,掌握分支程序和简单程
2、序的设计与调试方法,了解并行IO口的使用 1. 设有8bits符号数X存于外部RAM单元,按以下方式计算后的结果Y也存于外部RAM单元,请按要求编写程序。 2. 利用51系列单片机设计一个24小时制电子时钟,电子时钟的时、分、秒数值分别通过P0、P1、P2端口输出(以压缩BCD码的形式)。P3.0为低电平时开始计时,为高电平时停止计时。 提高部分(选做): a. 实现4位十进制加、减1计数,千位、百位由P1口输出;十位、个位由P2口输出。利用P3.7状态选择加、减计数方式。 b. 利用P3口低四位状态控制开始和停止计数,控制方式自定。 思考题: 1.实现多分
3、支结构程序的主要方法有哪些?举例说明。 2.在编程上,十进制加1计数器与十六进制加1计数器的区别是什么?怎样用十进制加法指令实现减1计数? 二、设计思路 1.分段函数设计 第一个任务相当于一个分段函数程序,根据变量X的值所处的区间进行相应的计算。可利用比较转移指令CJNE来判断X是否等于临界值20、40,若不等,再根据执行CJNE指令后的进位位CY的值来判断X与临界值的的大小关系,易知CY=0则X大于临界值,CY=1则X小于临界值;如此,再进行相应的计算。另外若乘方运算结果大于255,高八位与低八位应分开存储;本次除法采用右移一位来处理,未考虑余数。 2. 24小时制时钟程序
4、首先构建一个三重循环实现“一秒延时”,循环体利用NOP指令(单字节指令,1µs)经多次循环达到延时一秒的效果。再利用已经构建好的“一秒延时”部分,设计计时系统:秒(0-59)、分(0-59)、时(0-23)。需要注意的是,在小时、分、秒达到59时,下一次应该为零。程序运行时修改P3.0的值可以实现暂停和继续的功能。 三、资源分配 1.分段函数 假设该8位无符号数的地址2000H分配给它,把片外地址2001H和2002H分配给经分段函数计算得到的结果Y。按位取反计算结果存于2001H单元,乘方计算中结果的高、低八位分开存储于2001H-2002H单元,除法运算结果放在2001H
5、中。寄存器A,B存放在乘除运算中所得的中间结果。 2.二十四小时制时钟 工作寄存器R0、R1、R2分别用于秒、分、时循环次数的计数,R5-R7用于“一秒延时”循环中的循环次数设定。秒、分、时数值分别由P2、P1、P0端口输出。 四、流程图 1.分段函数 开始 将C置零取出外部数据 是否大于20 取反并存储结果 是否小于40 平方并存储结果 除以2并存储结果 结束 否 否 是 是 2.二十四小时制时钟 开始 P3.0=1? 等待 端口初始化,输出端口置0;计数R0、R1、R2置1 延时1秒,P2←R2,R
6、2加1,并转化为十进制 R6=60H? R2置1,P2置0,P1←R1 R1加1,并转化为十进制 R1=60H? R2、R1置1,P2、P1置0, P0←R0, R0加1,并转化为十进制 R0=24H? 是 否 否 否 否 是 是 是 五、源代码 (含文件头说明、资源使用说明、语句行注释) 1.分段函数 clr c ; 清零 mov dptr ,#2000h ; 取外部数据 movx a ,@dptr // mov a ,#1h cjne a,#14h ,cmp20 ; 与20比较大小 qu
7、fan: cpl a ; inc dptr movx @dptr ,a sjmp jieshu cmp20: jc qufan cjne a ,#28h , cmp40 ; 与40比较大小 sq: mov r7, a ; 平方 mov b , r7 mul ab inc dptr movx @dptr ,a mov a, b inc dptr movx @dptr ,a sjmp jieshu cmp40: jnc sq chu2: rr a ; 除以2(右
8、移一位) inc dptr movx @dptr ,a sjmp jieshu jieshu: nop end 2.二十四小时制时钟 start: mov r0,#01h ; 寄存器初始化 mov r1,#01h mov r2,#01h mov p0 ,#00h ; 端口初始化 mov p1 ,#00h mov p2 ,#00h mov a ,#0 // setb p3.0 ; 设置、判断p3.0 clr p3.0 jb p3.0 ,$ onesec: mov
9、r7 , #10 ; 1秒延时 del1: mov r6 ,#200 nop del2: mov r5,#248 del3: djnz r5 ,del3 djnz r6 ,del2 djnz r7 ,del1 mov p2 ,r2 ; 把秒数送入p2 mov a,r2 add a,#01h da a mov r2 ,a cjne r2 ,#60h ,onesec ; 判断r2是否计到60,跳转 onemin: mov r2 ,#01h ; 把r2,p2初始化,开始分钟计数
10、 mov p2 ,#00h mov p1 ,r1 mov a ,r1 add a ,#01h da a mov r1 ,a cjne r1 ,#60h, onesec ; 判断r1是否计到60,跳转 hour: mov r2 ,#01h ; 把r2,p2,r1,p1初始化,开始小时计数 mov p2 ,#00h mov r1 ,#01h mov p1 ,#00h mov p0 ,r0 mov a ,r0 add a ,#01h da a mov r0 ,a cjne r0
11、 ,#24h ,onesec ; 判断r0是否计到24,跳转 sjmp start end 六、程序测试方法与结果、软件性能分析 1.分段函数 X=01H X=1EH X=31H 功能分析:该程序可正常执行要求的3项功能 2.二十四小时制时钟 功能分析:该程序运行后可按正确的二十四小时制时钟进行计时,程序功能完整可靠。 【思考题】 ●实现多分支结构程序的主要方法有哪些?举例说明。 答:一是利用条件转移指令实现,如DJNZ,JNC等等,二是利用分支表来实现,如分支地址 表、转移指令表、地址偏移量表。 ●在编程上,十进制加1计数器与
12、十六进制加1计数器的区别是什么?怎样用十进制加法指令实现减1计数? 答:十进制加一后需要在计算结果的基础上进行修正,运用DA指令,而十六进制加一指令 所得结果即为最终结果,无需进行修正。 用十进制加法指令实现减1计数,可通过以下代码实现: ADD A , #63H DA A 其中专业理论知识内容包括:保安理论知识、消防业务知识、职业道德、法律常识、保安礼仪、救护知识。作技能训练内容包括:岗位操作指引、勤务技能、消防技能、军事技能。 二.培训的及要求培训目的 安全生产目标责任书 为了进
13、一步落实安全生产责任制,做到“责、权、利”相结合,根据我公司2015年度安全生产目标的内容,现与财务部签订如下安全生产目标: 一、目标值: 1、全年人身死亡事故为零,重伤事故为零,轻伤人数为零。 2、现金安全保管,不发生盗窃事故。 3、每月足额提取安全生产费用,保障安全生产投入资金的到位。 4、安全培训合格率为100%。 二、本单位安全工作上必须做到以下内容: 1、对本单位的安全生产负直接领导责任,必须模范遵守公司的各项安全管理制度,不发布与公司安全管理制度相抵触的指令,严格履行本人的安全职责,确保安全责任制在本单位全面落实,并全力支持安全工作。 2、保证公司各项安全管理制
14、度和管理办法在本单位内全面实施,并自觉接受公司安全部门的监督和管理。 3、在确保安全的前提下组织生产,始终把安全工作放在首位,当“安全与交货期、质量”发生矛盾时,坚持安全第一的原则。 4、参加生产碰头会时,首先汇报本单位的安全生产情况和安全问题落实情况;在安排本单位生产任务时,必须安排安全工作内容,并写入记录。 5、在公司及政府的安全检查中杜绝各类违章现象。 6、组织本部门积极参加安全检查,做到有检查、有整改,记录全。 7、以身作则,不违章指挥、不违章操作。对发现的各类违章现象负有查禁的责任,同时要予以查处。 8、虚心接受员工提出的问题,杜绝不接受或盲目指挥; 9、发生事故,应立即报告主管领导,按照“四不放过”的原则召开事故分析会,提出整改措施和对责任者的处理意见,并填写事故登记表,严禁隐瞒不报或降低对责任者的处罚标准。 10、必须按规定对单位员工进行培训和新员工上岗教育; 11、严格执行公司安全生产十六项禁令,保证本单位所有人员不违章作业。 三、 安全奖惩: 1、对于全年实现安全目标的按照公司生产现场管理规定和工作说明书进行考核奖励;对于未实现安全目标的按照公司规定进行处罚。 2、每月接受主管领导指派人员对安全生产责任状的落






