数码之家

 找回密码
 立即注册
搜索
查看: 4320|回复: 9

[C51] 继续书本上的例子51单片机仿真的并行输入输出接口

[复制链接]
发表于 2020-12-17 19:44:07 | 显示全部楼层 |阅读模式
本帖最后由 玛德陛下 于 2020-12-17 20:37 编辑





KEIL C51 代码


proteus 加载了HEX 后



电路 有反应。



包含的 REG51.H

讲一下自己对代码的理解

#include <reg51.h>  预处理,啥是预处理我也不明白,reg51.h 是个头文件,头文件也不明白,这个头文件里面是对C51 特殊功能寄存器的定义,给16进制的地址码起了一个好记的名字
void main (void)
{
        unsigned char i;  无符号字节 变量 ,存储种类省略为默认auto , 存储器类型为data ,
        P1= 0xff;          P1为 reg51.h头文件里定义的变量 ,地址为P1口地址,这里给P1变量赋值,实际将P1口全置1

        for(;;) 无限循环
        {
                i=P1;   i 变量赋值,实际是读P1口
                P0=i;  i对P0赋值,实际是写P0口
        }
}


/*--------------------------------------------------------------------------
REG51.H

Header file for generic 80C51 and 80C31 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __REG51_H__
#define __REG51_H__

/*  BYTE Register  */     reg51.h的内容,
sfr P0   = 0x80;  sfr 特殊功能寄存器 定义,直接定义给的地址,在RAM 的80H-FFH的地址
sfr P1   = 0x90;
sfr P2   = 0xA0;
sfr P3   = 0xB0;
sfr PSW  = 0xD0;
sfr ACC  = 0xE0;
sfr B    = 0xF0;
sfr SP   = 0x81;
sfr DPL  = 0x82;
sfr DPH  = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0  = 0x8A;
sfr TL1  = 0x8B;
sfr TH0  = 0x8C;
sfr TH1  = 0x8D;
sfr IE   = 0xA8;
sfr IP   = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;


/*  BIT Register  */
/*  PSW   */
sbit CY   = 0xD7; 51可以进行位操作,对可以进行位操作的RAM单元也进行了编址。特殊功能位也一起进行的编址,取值00-FF,
sbit AC   = 0xD6;
sbit F0   = 0xD5;
sbit RS1  = 0xD4;
sbit RS0  = 0xD3;
sbit OV   = 0xD2;
sbit P    = 0xD0;

/*  TCON  */
sbit TF1  = 0x8F;
sbit TR1  = 0x8E;
sbit TF0  = 0x8D;
sbit TR0  = 0x8C;
sbit IE1  = 0x8B;
sbit IT1  = 0x8A;
sbit IE0  = 0x89;
sbit IT0  = 0x88;

/*  IE   */
sbit EA   = 0xAF;
sbit ES   = 0xAC;
sbit ET1  = 0xAB;
sbit EX1  = 0xAA;
sbit ET0  = 0xA9;
sbit EX0  = 0xA8;

/*  IP   */
sbit PS   = 0xBC;
sbit PT1  = 0xBB;
sbit PX1  = 0xBA;
sbit PT0  = 0xB9;
sbit PX0  = 0xB8;

/*  P3  */
sbit RD   = 0xB7;
sbit WR   = 0xB6;
sbit T1   = 0xB5;
sbit T0   = 0xB4;
sbit INT1 = 0xB3;
sbit INT0 = 0xB2;
sbit TXD  = 0xB1;
sbit RXD  = 0xB0;

/*  SCON  */
sbit SM0  = 0x9F;
sbit SM1  = 0x9E;
sbit SM2  = 0x9D;
sbit REN  = 0x9C;
sbit TB8  = 0x9B;
sbit RB8  = 0x9A;
sbit TI   = 0x99;
sbit RI   = 0x98;

#endif







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 10家元 +200 收起 理由
aacyxjz + 20
有点不烧 + 20 謝謝分享
weizaisifang + 20 謝謝分享
锰子 + 20
超级女生 + 20 謝謝分享
zzqqzzz + 20
hfsp + 20 謝謝分享
moontree + 20 謝謝分享
人艰不拆了 + 20
lrm888 + 20

查看全部打赏

发表于 2020-12-17 21:01:41 来自手机浏览器 | 显示全部楼层
楼主不玩新唐的n76e003了?
回复 支持 反对

使用道具 举报

发表于 2020-12-17 21:07:32 | 显示全部楼层
羡慕楼主啥都会玩啊
回复 支持 反对

使用道具 举报

发表于 2020-12-17 21:38:11 | 显示全部楼层
为什么不使用P0低电平下拉点亮发光管
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-17 21:58:01 来自手机浏览器 | 显示全部楼层
触景情伤 发表于 2020-12-17 21:01
楼主不玩新唐的n76e003了?

先将51基本的做一遍仿真再来76003实做。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-17 21:58:37 来自手机浏览器 | 显示全部楼层
xzcgl 发表于 2020-12-17 21:38
为什么不使用P0低电平下拉点亮发光管

嗯,下次我改下电路试试。
回复 支持 反对

使用道具 举报

发表于 2020-12-18 08:35:43 | 显示全部楼层
玛德陛下 发表于 2020-12-17 21:58
嗯,下次我改下电路试试。

尽量使用低电平驱动,单片机的拉高能力有限,而且在某些涉及电平转换的地方,比如你要用3.3v控制5v器件的时候拉低驱动更好
回复 支持 反对

使用道具 举报

发表于 2020-12-18 09:34:04 | 显示全部楼层
高电平驱动很容易让你的单片机挂掉。
回复 支持 反对

使用道具 举报

发表于 2020-12-19 11:24:26 | 显示全部楼层
高科技啊。能汇编的都是高手:loveliness:
回复 支持 反对

使用道具 举报

发表于 2020-12-19 17:24:00 | 显示全部楼层
其实直接P0=P1;应该就可以,其实就是用寄存器A来传递P1的值。当然,楼主的代码中间值i也可能会被编译器优化掉成P0=P1.具体要看汇编
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-29 13:56 , Processed in 0.093600 second(s), 10 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表