完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
今天给大家介绍一下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定义 //位码 ***it led_wei_1=P1^3; //第1位数字 PP ***it led_wei_2=P1^6; //第2位数字 PP ***it led_wei_3=P1^7; //第3位数字 PP ***it led_wei_4=P3^3; //第4位数字 PP //段码 ***it led_point=P3^6; //小数点 STD ***it led_duan_1=P1^0; // STD ***it led_duan_2=P1^4; // STD ***it led_duan_3=P1^5; // STD ***it led_duan_4=P3^4; // STD ***it led_duan_5=P3^5; // STD ***it led_duan_6=P3^7; // STD ***it led_duan_7=P5^4; // STD //18B20温度检测IO定义 OD ***it DQ=P1^1; //QD,检测温度 //水位检测IO定义 ***it ShuiWei_low=P1^2; //下水位 HR ***it ShuiWei_high=P3^2; //上水位 HR //电磁阀IO定义 STD ***it diancifa=P5^5; //报警信号 PP ***it baojin=P3^0; //水泵信号 PP ***it 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 ) |
|
相关推荐
8个回答
|
|
怎么说,配置IO最好不要用这个方法,要考虑在不知道其他io的状态下对指定IO的配置。
|
|
|
|
|
|
|
|
好的习惯要养成以后改可不好改。
|
|
|
|
作为我这种业余爱好者来说项目一般都不会涉及分工问题,即使由别人编写部分程序也不会对我这样造成影响,因为核心统筹和硬件规划是我来做的。如果由此造成缺陷,那肯定是沟通和设计的问题了。所以我认为这种方式适合我自己。
|
|
|
|
即便是一个人,也要考虑代码的影响尽量不要扩散出去,否则很不好发现
#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 开漏 |
|
|
|
你的这样定义很不错
|
|
|
|
#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 开漏 |
|
|
|
谢谢!!!!!!
|
|
|
|
只有小组成员才能发言,加入小组>>
2981 浏览 9 评论
2692 浏览 16 评论
3214 浏览 1 评论
8449 浏览 16 评论
3782 浏览 18 评论
6962浏览 6评论
求助,请问MS51FB9AE带隙电压能作为侦测的基准电压吗?
7457浏览 3评论
6959浏览 3评论
支持UART-to-BLE透传的新唐NuTool – BLE ATCMD开发工具推荐
5805浏览 3评论
9376浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-25 01:51 , Processed in 0.688044 second(s), Total 84, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号