单片机大作业(共15页).doc

上传人:飞****2 文档编号:13716080 上传时间:2022-04-30 格式:DOC 页数:15 大小:78KB
返回 下载 相关 举报
单片机大作业(共15页).doc_第1页
第1页 / 共15页
单片机大作业(共15页).doc_第2页
第2页 / 共15页
点击查看更多>>
资源描述

《单片机大作业(共15页).doc》由会员分享,可在线阅读,更多相关《单片机大作业(共15页).doc(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上大连理工大学本科设计报告题目:基于SPI、I2C总线的模数转换数字显示系统的设计课程名称:单片机原理及应用实验学院(系): 电信学部 专 业: 自动化 班 级: 电自1102 学 号: 学生姓名: 邓成米 成 绩: 20 年 月 日题目:1 设计要求 使用AD转换芯片TLC549CP对模拟电压进行数字转换,将转换结果处理为3位的十进制数(0255)并通过ZLC7290B进行显示,并可设置上下限阈值进行超值报警。2 设计分析及系统方案设计20H开始的单元:存放N个TLC549CP采集的数据;40H47H显示缓冲区; 程序结构为分支结构3系统电路图 VCC8位数码管(共阴

2、极)ZLG7290BSDASCL/RSTAT89C51 P1.0 P1.1 P1.7 P3.5 P1.2 P1.3 P1.4蜂鸣器RET+ TLC549CPVcc RET+CLK ANIN DAT RET/CS GND Vcc W2 ANINJK1594 外围接口模块硬件电路功能描述(1) AT89C51 :程序运行,信号处理与输出,进行逻辑运算。(2) ZLG7290B:数字显示。(3) TLC549CP:采集模拟量并传输至单片机中。(4) 蜂鸣器:发声报警。5 主程序中主要变量定义变量名称RAM单元/寄存器功能R708H数据的字节数R040H单片机内部数据块的起始地址R210H外围模块内部

3、寄存器首地址R370H外围模块写地址6系统软件中各个子程序的功能描述子程序名称入口参数出口参数功能 描述TLC549A20H读取32个数据ADJUST20HA滤波BCD_CONTAR3转换为十进制CFAR3将A中数据拆分DELAY延时CMPAR6上下限比较WRNBYT显示子程序7主程序程序流程图主程序建立显示缓冲区读R6到A并调用CMP,若超过阈值则发声报警且数码管进行闪烁采集TLC549CP的N个数据存放于20H开始的单元中调ADJUST进行数据滤波调延时子程序将A中数据保存在R6调BCD_CONT,将A中的数据拆分、查表并送显示缓冲区的低两位,以备显示用调WRNBYT,将显示缓冲区中的数据

4、写入ZLG7290B,以十进制方式显示8程序清单;*;*;*宏定义*;*专心-专注-专业SDABIT P1.0SCLBIT P1.1WSLAEQU 070HRSLAEQU 071HDATBIT P1.3CLKBIT P1.2CSBIT P1.4CUNTEQU 20HSHIFTEQU 05HSH_SEGEQU 50H;数码管闪烁数据 区SDA_KEQU 55H;键值存储缓冲区SDA_K_SEQU 65H;键值字型码存储缓冲区COUNT_KEQU 62H;按键输入计数器MAXEQU 61H;标志位MAXMINEQU 60H;标志位MINMAX_YZEQU 63H;阈值上线MIN_YZEQU 64H

5、;阈值下线ADDREQU 20H;数据缓冲区首地址DISDAEQU 40H;源数据块首地址DISCUNTEQU 08H;写入数据个数;*;*启动设置*;*ORG8000HLJMP8100HORG8003HLJMPINT_7290ORG8100HSTART:MOVSP,#68HCLRP1.7LCALLDELAYSETBP1.7SETBEASETBEX0SETBIT0;*定时器初始化*MOVTMOD,#10HMOVTL1,#33HMOVTH1,#0FEHSETBTR1;*建立变量缓冲区*MOVDISDA+3,#12HMOVDISDA+4,#00HMOVDISDA+5,#1AHMOVDISDA+6,

6、#7AHMOVDISDA+7,#0EEH;*各变量初始化*MOVMAX,#00HMOVMIN,#00HMOVCOUNT_K,#00HSETBF0MOVSDA_K,#03HMOVSDA_K+1,#02HMOVSDA_K+2,#01HMOVMAX_YZ,#64HMOVMIN_YZ,#10H;*;*主循环*;*LOOP:LCALLTLC549MOVR6,ALCALLADJUSTPUSHACCMOVA,R6CJNEA,MIN_YZ,NEXT_minNEXT_min:POPACCJCBUZZMIN;小于下限则报警MOVR5,MINCJNER5,#01H,N_STOP_SHLCALLSTOP_SH;停止数

7、码管闪烁MOVMIN,#00HN_STOP_SH:JBP1.5,YZ_SETCLRF0LCALLSHOW_SET_ADAJMPN_SH_KYZ_SET:LCALLSHOW_SET_KJBF0,SET_YZN_SH_K:PUSHACCMOVA,R6CJNEA,MAX_YZ,NEXT_maxNEXT_max:POPACCJNCBUZZMAX;高于上限则报警MOVR5,MAXCJNER5,#01H,LOOPLCALLSTOP_SH;停止数码管闪烁MOVMAX,#00HSJMPLOOP;*;*子函数*;*;*蜂鸣器子程序MIN*BUZZMIN:PUSH01HPUSH00HMOVR0,#00HMOVR1

8、,MINCJNER1,#00H,BUZZ_T0LCALLSHANSHUO;启动数码管闪烁MOVMIN,#01HBUZZ_T0:JNBTF1,$CLRTF1MOVTL1,#33HMOVTH1,#0FDHCPLP1.6DJNZR0,BUZZ_T0POP00HPOP01HLJMPN_STOP_SH;*蜂鸣器子程序MAX*BUZZMAX:PUSH01HPUSH00HMOVR0,#00HMOVR1,MAXCJNER1,#00H,BUZZ_T1LCALLSHANSHUO;启动数码管闪烁MOVMAX,#01HBUZZ_T1:JNBTF1,$CLRTF1MOVTL1,#33HMOVTH1,#0FEHCPLP1

9、.6DJNZR0,BUZZ_T1POP00HPOP01HLJMPLOOP;*ADC值显示*SHOW_SET_AD:LCALLBCD_CONTMOVR7,#DISCUNT;设定数据个数MOVR0,#DISDA;设定源数据首地址MOVR2,#10H;设定内部地址MOVR3,#WSLA;设定外围器件地址LCALLWRNBYTRET;*阈值设置*SET_YZ:PUSH05HPUSHACCMOVA,SDA_K+2MOVB,#64HMULABMOVR5,AMOVA,SDA_K+1MOVB,#0AHMULABADDA,R5ADDA,SDA_KJBP3.3,SETMAXMOVMIN_YZ,AAJMPBACKS

10、ETMAX:MOVMAX_YZ,ABACK:POPACCPOP05HLJMPN_SH_K;*键值显示*SHOW_SET_K:PUSHACCMOVDPTR,#LEDSEGMOVR7,#03HMOVR0,#SDA_K_SMOVR1,#SDA_KCLRACHAXUN:MOVA,R1MOVCA,A+DPTRMOVR0,AINCR0INCR1DJNZR7,CHAXUNMOVR7,#03H;设定数据个数MOVR0,#SDA_K_S;设定源数据首地址MOVR2,#10H;设定内部地址MOVR3,#WSLA;设定外围器件地址LCALLWRNBYTPOPACCRET;*闪烁子程序*SHANSHUO:MOVSH_

11、SEG,#70HMOVSH_SEG+1,#07HMOVR7,#02H;设定数据个数MOVR0,#50H;设定源数据首地址MOVR2,#07H;设定内部地址MOVR3,#WSLA;设定外围器件地址LCALLWRNBYTRET;*停止闪烁子程序*STOP_SH:MOVSH_SEG,#70HMOVSH_SEG+1,#00HMOVR7,#02H;设定数据个数MOVR0,#50H;设定源数据首地址MOVR2,#07H;设定内部地址MOVR3,#WSLA;设定外围器件地址LCALLWRNBYTRET;*TLC549程序*TLC549:PUSH00HPUSH07HMOVR7,#CUNTMOVR0,#ADDR

12、LOOP2:LCALLTLC549_ADCMOVR0,AINCR0DJNZR7,LOOP2POP07HPOP00HRETADJUST:PUSH00HPUSH02HPUSH03HPUSH07HMOVR7,#CUNTMOVR0,#ADDRCLRAMOVR2,ALOOP3:CLRCADDCA,R0JNCLOOP4INCR2LOOP4:INCR0DJNZR7,LOOP3MOVR3,AMOVA,R2MOVR7,#SHIFTLOOP5:CLRCMOVA,R2RRCAMOVR2,AMOVA,R3RRCAMOVR3,ADJNZR7,LOOP5POP07HPOP03HPOP02HPOP00HRET;*TLC54

13、9_ADC程序*TLC549_ADC:PUSH07HCLRACLRCLKMOVR7,#08HCLRCSLOOP1:SETBCLKNOPNOPNOPNOPMOVC,DATRLCACLRCLKNOPNOPDJNZR7,LOOP1SETBCSSETBCLKPOP07HRET;*BCD_COUNT程序*BCD_CONT:PUSH07HPUSH06HPUSH05HPUSH02HMOVB,#64HDIVABMOVR7,AMOVR2,BMOVA,R2MOVB,#0AHDIVABMOVR6,AMOVR5,BMOVA,R7LCALLCFMOVDISDA+2,R3MOVA,R6LCALLCFMOVDISDA+1,

14、R3MOVA,R5LCALLCFMOVDISDA+0,R3POP02HPOP05HPOP06HPOP07HRET;*LEDSEG:DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4HDB0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH;*;*拆分程序*CF:PUSH02HPUSHDPHPUSHDPLMOVDPTR,#LEDSEGMOVR2,AANLA,#0FHMOVCA,A+DPTRMOVR3,AMOVA,R2SWAPAANLA,#0FHMOVCA,A+DPTRMOVR4,APOPDPLPOPDPHPOP02HRET;*中断程序*INT_7290:

15、PUSH00HPUSH02HPUSH03HPUSH04HPUSH07HPUSH05HMOVR7,#04H;设定数据个数MOVR0,#28H;设定源数据首地址MOVR2,#00H;设定内部地址MOVR3,#WSLA;设定外围器件地址MOVR4,#RSLA;设定外围器件地址LCALLRDADDNOPMOVA,29HDECACJNEA,#0AH,NEXT_RNEXT_R:JNCBACK1JBF0,BACK1MOVR5,COUNT_KCJNER5,#03H,NEXT_INEXT_I:JNCCLRASJMPOPCLRA:MOVCOUNT_K,#00HOP:MOVR5,COUNT_KCJNER5,#00H

16、,NEXT_4MOVSDA_K,ASJMPRETURN1NEXT_4:CJNER5,#01H,NEXT_5MOVSDA_K+1,ASJMPRETURN1NEXT_5:CJNER5,#02H,RETURN1CJNEA,#03H,NEXT_SNEXT_S:JNCCLRSDA2SJMPTSCLRSDA2:CLRATS:MOVSDA_K+2,ASETBF0RETURN1:MOVA,COUNT_KINCAMOVCOUNT_K,ABACK1:POP05HPOP07HPOP04HPOP03HPOP02HPOP00HRETI;*延时子程序*DELAY:PUSH00HPUSH01HMOVR0,#00HDELAY

17、1:MOVR1,#00HDJNZR1,$DJNZR0,DELAY1POP01HPOP00HRET;【附录一】由汇编语言编制的I2C通讯子程序;【提 示】下列程序是在系统时钟为12MHZ(或11.0592MHZ),即NOP指令为1微秒左右。;(1)带有内部单元地址的多字节写操作子程序 WRNBYT;*;通用的I2C通讯子程序(多字节写操作);入口参数R7字节数,R0:源数据块首地址;R0原数据块首地址;R2从器件内部子地址;R3:外围器件地址(写);相关子程序WRBYT、STOP、CACK、STA;*WRNBYT:PUSHPSWPUSHACCWRADD:MOVA,R3;取外围器件地地址(包含r/

18、w=0)LCALLSTA;发送起始信号S LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件的应答信号JBF0,WRADD;如果应MOVA,R2LCALLWRBYT;发送内部寄存器首地址LCALLCACK;检测外围器件的应答信号JBF0,WRADD;如果应答不正确返回重来 WRDA:MOVA,R0LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件的应答信号JBF0,WRADD;如果应答不正确返回重来INCR0DJNZ R7,WRDALCALLSTOP POPACCPOPPSWRET ;*;(2)带有内部单元地址的多字节读操作子程序 RDADD ;*;通用的I2C

19、通讯子程序(多字节读操作);入口参数R7字节数;;R0目标数据块首地址;R2从器件内部子地址;;R3器件地址(写);R4器件地址(读);相关子程序WRBYT、STOP、CACK、STA、MNACK ;*RDADD: PUSHPSW;从PCF8563的02H单元读入7个参数PUSHACC;存放于20H-26H单元RDADD1:LCALLSTA MOVA,R3;取器件地址(写)LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件的应答信号JBF0,RDADD1;如果应答不正确返回重来MOVA,R2;取内部地址LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件的应答信号

20、JBF0,RDADD1;如果应答不正确返回重来LCALLSTAMOVA,R4;取器件地址(读)LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件的应答信号JBF0,RDADD1;如果应答不正确返回重来RDN:LCALLRDBYT MOVR0,ADJNZR7,ACKLCALLMNACKLCALLSTOPPOPACCPOPPSWRETACK:LCALLMACKINCR0SJMPRDN ;(3)I2C各个信号子程序;*;启动信号子程序S ;*STA:SETBSDA;启动信号SSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPCLRSDANOP;产生4.7US延时NOPN

21、OPNOPNOP CLRSCLRET ;*;停止信号子程序P ;*STOP:CLRSDA ;停止信号PSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPSETBSDANOP;产生4.7US延时NOPNOPNOPNOPCLRSCLCLRSDARET ;*;应答信号子程序 MACK;*MACK:CLRSDA;发送应答信号ACKSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPCLRSCLSETBSDARET;*;非应答法信号子程序MNACK;*MNACK:SETBSDA;发送非应答信号NACKSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPCLRSCLC

22、LRSDARET;*;应答检测子程序CACK;*CACK:SETBSDA;应答位检测子程序SETBSCL CLRF0MOVC,SDA;采样SDAJNCCEND;应答正确时转CENDSETBF0;应答错误时F0置一CEND:CLRSCLRET;*;发送一个字节子程序WRBYT;*WRBYT:PUSH06HMOVR6,#08H;发送一个字节子程序 WLP:RLCA ;(入口参数A)MOVSDA,CSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPCLRSCLDJNZR6,WLPPOP06HRET;*;接收一个字节子程序RDBYT ;*RDBYT: PUSH06HMOVR6,#08H;

23、接收一个字节子程序RLP:SETBSDASETBSCL; *NOP;!产生大于15微秒的延时!NOP ;注意这是专门为ZLG7290NOP ;添加的20微秒延时部分NOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOP; *MOVC,SDAMOVA,R2RLCAMOVR2,ACLRSCLDJNZR6,RLP ;(出口参数R2)POP06HRET ;*END9系统调试运行结果说明、分析所出现得问题,设计体会与建议 调节滑动变阻器,数码管上会显示当前的adc值;当高于200时数码管闪烁并高音报警,小于50时会闪烁并低音报警,调回则无报警状态。在阈值内数码管会有些许闪动,原因是停止闪烁指令重复写入导致的。设计体会:要考虑上下限比较的嵌套逻辑,注意不要冲突。还有注意Cy位的判断。6 结论及设计体会基本完成第二等级的实验要求。本次实验我所选的要求并不难,闪烁以及发声子程序以前也都设计过,所以只需注意阈值的确定就可完成所需功能,不过单片机编程还是挺有乐趣的,考验了我们的逻辑思维能力,如何用最少的资源完成所需功能。通过此次实验还是学到了很多参考文献MCS-51单片机应用实验教程-陈育斌

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁