# C51 **Repository Path**: Batrits/c51 ## Basic Information - **Project Name**: C51 - **Description**: C51单片机汇编学习 - **Primary Language**: Assembly - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-30 - **Last Updated**: 2026-01-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AT89C51汇编 #### 介绍 51单片机汇编学习。 如有问题,欢迎指正。 #### 📂资源导航 | 资源类型 | 文件 | 内容简介 | | :----------- | :----------------------------------------------------------- | :----------------------------- | | **实验代码** | [Experiment.md](./Experiment.md)或者[Experiment.pdf](./Experiment.pdf) | 51单片机汇编一些实验题目和代码 | | **习题作答** | [Homework](./Homework.md) | 51单片机一些习题与解答 | #### 🧪部分实验 **例:采用P1口连接8个LED灯,模拟0%-100%的进度条,从0%开始,每隔200ms增加一个单位,LED依次点亮,到100%后清零。在此基础上,采用外部中断0作为暂停/继续按键,按键按下,LED停止增长,再次按下,继续增长。** ```assembly ORG 0000H SJMP MAIN ORG 0003H SJMP INTP ORG 0030H MAIN: SETB IT0 SETB EX0 SETB EA MOV P1,#00H MOV A,#01H SETB F0 LOOP: JNB F0,LOOP LCALL DELAY ORL P1,A RL A CJNE A,#80H,LOOP LCALL DELAY MOV P1,#0FFH LCALL DELAY MOV P1,#00H MOV A,#01H SJMP LOOP INTP: CPL F0 RETI DELAY: MOV R7,#2 DELAY1: MOV R6,#200 DELAY2: MOV R5,#250 DELAY3: DJNZ R5,DELAY3 DJNZ R6,DELAY2 DJNZ R7,DELAY1 RET END ``` **例: 添加一个按键作为输入,通过外部中断检测按键输入次数,按键短按,计次+1,通过LED灯显示结果,按键长按(超过2S),计次清0;** ```assembly ORG 0000H SJMP MAIN ORG 0003H SJMP INTP ORG 0030H MAIN: SETB IT0 SETB EX0 SETB EA MOV A,#00H MOV P1,#00H LOOP: MOV R1,#00H JB P3.2,LOOP LCALL DELAY2S CJNE R1,#1,LOOP LCALL ZERO SJMP LOOP INTP: INC A MOV P1,A INC R1 RETI ZERO: CLR A MOV P1,A MOV R1,#00H RET DELAY2S: MOV R7,#20 DELAY1: MOV R6,#200 DELAY2: MOV R5,#250 DELAY3: DJNZ R5,DELAY3 DJNZ R6,DELAY2 DJNZ R7,DELAY1 RET END ``` #### 📚部分习题 **例:当(SP)=60H,(A)=50H,(B)=33H,(60H)=20H,执行以下程序: XCH A, 60H MOV 60H, B ADD, A, 60H PUSH A PUSH B 执行完上述程序后,(SP)=? (A)=? (B)=? (60H)=?** 1. XCH A, 60H =>(SP)=60H, **(A)=20H**,(B)=33H,**(60H)=50H** 2. MOV 60H, B =>(SP)=60H, (A)=20H,(B)=33H,**(60H)=33H** 3. ADD, A, 60H =>(SP)=60H,**(A)=53H**,(B)=33H,(60H)=33H 4. PUSH A =>**(SP)=61H**,(A)=53H,(B)=33H,(60H)=33H 5. PUSH B =>**(SP)=62H**,(A)=53H,(B)=33H,(60H)=33H **结果**:**(SP)=62H,(A)=53H,(B)=33H,(60H)=33H** **例:80C51有几个中断源?分别是什么?** | 中断源 | 入口地址 | | :---------------------: | :-------: | | **外部中断0 (INT0)** | **0003H** | | **定时器/计数器0 (T0)** | **000BH** | | **外部中断1 (INT1)** | **0013H** | | **定时器/计数器1 (T1)** | **001BH** | | **串行口中断** | **0023H** | #### 🤝欢迎贡献 发现错误或有改进建议?欢迎: 1. 提交 **Issue** 反馈问题 2. 发起 **Pull Request** 贡献代码 3. 在 **Discussions** 分享学习心得 **贡献方向**: - 添加新的实验项目 - 完善代码注释 - 补充理论知识讲解 - 优化文档结构