OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 356|回复: 8

STC51笔记之--IO独立配置

[复制链接]

  离线 

8

主题

188

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2017-5-21
在线时间
193 小时
发表于 2017-9-26 19:39:17 | 显示全部楼层 |阅读模式
正点原子公众号
今天给大家介绍一下STC51单片机的IO独立配置。
平常我们的IO端口配置都是放在MIAN函数中或独立放置于各个模块中,最近做项目发现在进行程序修改和模块中的IO重新配置时一个个的文件去查找和修改觉得特别麻烦,所以就把所有模块进行重新修订,把IO配置独立于模块,使模块移植起来更方便快捷些。
进入正题:以下是一个温度和水位控制并进行数码管显示的IO配置。
IO.H
/*
配置单片机IO
将单片机的IO按自己的需求和名称进行重新定义
如此可以使各个模块统一调用
端口        序号                                                       
                7                        6                        5                        4                        3                        2                        1                        0
                                               
1        推挽        推挽        准双向        准双向        推挽        高阻        开漏        准双向
2                                                               
3        准双向        准双向        准双向        准双向        推挽        高阻        推挽        推挽
4                                                               
5        高阻        高阻        推挽        准双向        高阻        高阻        高阻        高阻

                                               

P1M0 =0xCA;
P1M1 =0x06;

P3M0 =0x0B;
P3M1 =0x04;

P5M0 =0x20;
P5M1 =0xCF;



//使用芯片:STC15W413AS  SOP20
*/
#ifndef        __IO_H
#define        __IO_H

//#include        "config.h"


//led显示IO定义
//位码
sbit                led_wei_1=P1^3;                 //第1位数字        PP
sbit                led_wei_2=P1^6;                        //第2位数字        PP
sbit                led_wei_3=P1^7;                        //第3位数字        PP
sbit                led_wei_4=P3^3;                        //第4位数字        PP
//段码
sbit         led_point=P3^6;                        //小数点        STD
sbit        led_duan_1=P1^0;                // STD
sbit        led_duan_2=P1^4;                //        STD
sbit        led_duan_3=P1^5;                //        STD
sbit        led_duan_4=P3^4;                //        STD
sbit        led_duan_5=P3^5;                //        STD
sbit        led_duan_6=P3^7;                //        STD
sbit        led_duan_7=P5^4;                //        STD

//18B20温度检测IO定义  OD
sbit DQ=P1^1;                                        //QD,检测温度

//水位检测IO定义
sbit ShuiWei_low=P1^2;      //下水位  HR
sbit ShuiWei_high=P3^2;                        //上水位  HR

//电磁阀IO定义        STD
sbit diancifa=P5^5;

//报警信号                PP
sbit baojin=P3^0;

//水泵信号   PP
sbit beng=P3^1;

//extern bit pp_off=0,pp_on=1,std_on=0,std_off=1,od_off=0,od_on=1;
extern bit pp_off,pp_on,std_on,std_off,od_off,od_on,hr_on,hr_off,flag_off,flag_on;
void io_mode(void);
#endif


在上面的H文件中主要是对IO进行重新定义,由于51单片机不能将IO直接做为参数传递,我们通过重新定义用函数调用来达到值传递的目的。

IO.C
/*
配置单片机IO
将单片机的IO按自己的需求和名称进行重新定义
如此可以使各个模块统一调用
端口        序号                                                       
                7                        6                        5                        4                        3                        2                        1                        0
                                               
1        推挽        推挽        准双向        准双向        推挽        高阻        开漏        准双向
2                                                               
3        准双向        准双向        准双向        准双向        推挽        高阻        推挽        推挽
4                                                               
5        高阻        高阻        推挽        准双向        高阻        高阻        高阻        高阻

                                               

P1M0 =0xCA;
P1M1 =0x06;

P3M0 =0x0B;
P3M1 =0x04;

P5M0 =0x20;
P5M1 =0xCF;



//使用芯片:STC15W413AS  SOP20
*/

#include "io.h"                        //IO引脚定义

bit pp_off=0,pp_on=1;
bit std_on=0,std_off=1;
bit od_off=0,od_on=1;
bit hr_on=0,hr_off=1;
bit flag_off=0,flag_on=1;

void io_mode(void)
{
//IO模式初始化
P1M0 =0xCA;
P1M1 =0x06;
P3M0 =0x0B;
P3M1 =0x04;
P5M0 =0x20;
P5M1 =0xCF;

//位码输出关闭,如此实现关闭显示
led_wei_1=pp_off;                 //第1位数字        PP 关闭
led_wei_2=pp_off;                        //第2位数字        PP 关闭
led_wei_3=pp_off;                        //第3位数字        PP 关闭
led_wei_4=pp_off;                        //第4位数字        PP         关闭

}


51单片机程序中最混乱的是各种端口直接读写0和1,如果IO比较多,你看着看着就不知道一个P3^3=0是什么意思了。IO.C就对IO初始化配置包括IO的输入输出模式及各模式下的0是什么意思,1是什么意思进行了重新定义。方便我们写程序和看程序时一眼就清楚程序所要表达的意思。
由于时间的关系,今天就写这么多了,下次写个IO配置中的输入输出模式设置P1M0 =0xCA1M1 =0x06;对应的含义及怎样快速配置IO输入输出模式。


IO配置.rar

1.34 KB, 下载次数: 25

回复

使用道具 举报

  离线 

2

主题

149

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
471
金钱
471
注册时间
2013-6-5
在线时间
65 小时
发表于 2017-9-28 20:39:32 | 显示全部楼层
怎么说,配置IO最好不要用这个方法,要考虑在不知道其他io的状态下对指定IO的配置。
回复 支持 反对

使用道具 举报

  离线 

8

主题

188

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2017-5-21
在线时间
193 小时
 楼主| 发表于 2017-9-29 20:52:41 来自手机 | 显示全部楼层
zhxzhx 发表于 2017-9-28 20:39
怎么说,配置IO最好不要用这个方法,要考虑在不知道其他io的状态下对指定IO的配置。

你那是相对于多模块分工设计理念吧?一般51里分工设计使用不多把?
回复 支持 反对

使用道具 举报

  离线 

2

主题

149

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
471
金钱
471
注册时间
2013-6-5
在线时间
65 小时
发表于 2017-10-6 16:55:43 | 显示全部楼层
l6931639 发表于 2017-9-29 20:52
你那是相对于多模块分工设计理念吧?一般51里分工设计使用不多把?

好的习惯要养成以后改可不好改。
回复 支持 反对

使用道具 举报

  离线 

8

主题

188

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2017-5-21
在线时间
193 小时
 楼主| 发表于 2017-10-8 01:33:06 来自手机 | 显示全部楼层
zhxzhx 发表于 2017-10-6 16:55
好的习惯要养成以后改可不好改。

作为我这种业余爱好者来说项目一般都不会涉及分工问题,即使由别人编写部分程序也不会对我这样造成影响,因为核心统筹和硬件规划是我来做的。如果由此造成缺陷,那肯定是沟通和设计的问题了。所以我认为这种方式适合我自己。
回复 支持 反对

使用道具 举报

  离线 

2

主题

149

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
471
金钱
471
注册时间
2013-6-5
在线时间
65 小时
发表于 2017-10-11 03:53:34 | 显示全部楼层
l6931639 发表于 2017-10-8 01:33
作为我这种业余爱好者来说项目一般都不会涉及分工问题,即使由别人编写部分程序也不会对我这样造成影响, ...

即便是一个人,也要考虑代码的影响尽量不要扩散出去,否则很不好发现

#define        Pin0                0x01        //IO引脚 Px.0
#define        Pin1                0x02        //IO引脚 Px.1
#define        Pin2                0x04        //IO引脚 Px.2
#define        Pin3                0x08        //IO引脚 Px.3
#define        Pin4                0x10        //IO引脚 Px.4
#define        Pin5                0x20        //IO引脚 Px.5
#define        Pin6                0x40        //IO引脚 Px.6
#define        Pin7                0x80        //IO引脚 Px.7
#define        PinAll        0xFF        //IO所有引脚

#define P0n_standard(bitn)                        P0M1 &= ~(bitn),        P0M0 &= ~(bitn)        //00 标准
#define P0n_push_pull(bitn)                        P0M1 &= ~(bitn),        P0M0 |=  (bitn)        //01 推挽
#define P0n_pure_input(bitn)                P0M1 |=  (bitn),        P0M0 &= ~(bitn)        //10 输入
#define P0n_open_drain(bitn)                P0M1 |=  (bitn),        P0M0 |=  (bitn)        //11 开漏
回复 支持 反对

使用道具 举报

  离线 

8

主题

188

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2017-5-21
在线时间
193 小时
 楼主| 发表于 2017-10-11 18:04:31 来自手机 | 显示全部楼层
zhxzhx 发表于 2017-10-11 03:53
即便是一个人,也要考虑代码的影响尽量不要扩散出去,否则很不好发现

#define        Pin0                0x01        //IO引脚 Px.0 ...

你的这样定义很不错
回复 支持 反对

使用道具 举报

  离线 

8

主题

188

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2017-5-21
在线时间
193 小时
 楼主| 发表于 2017-10-30 00:13:42 | 显示全部楼层
zhxzhx 发表于 2017-10-11 03:53
即便是一个人,也要考虑代码的影响尽量不要扩散出去,否则很不好发现

#define        Pin0                0x01        //IO引脚 Px.0 ...

#define Pxn_standard(x,bitn)                         P##x##M1 &= ~(bitn) ,                         P##x##M0 &= ~(bitn)        //00 标准
#define Pxn_push_pull(x,bitn)                 P##x##M1 &= ~(bitn),        P##x##M0 |=  (bitn)        //01 推挽
#define Pxn_pure_input(x,bitn)                P##x##M1 |=  (bitn),        P##x##M0 &= ~(bitn)        //10 输入
#define Pxn_open_drain(x,bitn)                P##x##M1 |=  (bitn),        P##x##M0 |=  (bitn)        //11 开漏
回复 支持 反对

使用道具 举报

  离线 

8

主题

188

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2017-5-21
在线时间
193 小时
 楼主| 发表于 2017-11-3 20:54:27 | 显示全部楼层
本帖最后由 l6931639 于 2017-11-3 21:43 编辑

谢谢!!!!!!
回复 支持 反对

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-20 21:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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