找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 81|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机的某个P口不足8位怎么办

[复制链接]
跳转到指定楼层
楼主
在单片机开发过程中,单片机的引脚不足,我们首先想到的是需要更换单片机,譬如用51单片机的P3口驱动一位数码管作静态显示,但缺少P35,其它完整的8位端口也没有,这时候也并不是没有办法解决,我们可以用其它P口的某一位来替换。本文提供了一种解决这个问题的方法。   按照数码管与单片机的接口,a~g、dp接单片机的P30~P37,字段码还采用标准的字段码,由于缺少P35,也就是缺少f段的数据码,这时候可以用P17代替,观察0~9的数字,发现数字1、2、3、7的f段不亮,因此在显示这几个数字时,P17输出1(熄灭),而显示其它数字时,P17输出0(亮)。
  1. /* ch4-12.c - 七段数码管驱动程序  *///==声明区============================================#include<reg52.h>           //包含单片机寄存器定义的头文件
  2. #define SEG P3                            //宏定义,用标识符SEG代替P0
  3. #define uint unsigned int         //宏定义,用uint代替unsigned int#define uchar unsigned char        //宏定义,uchar代替unsigned char        
  4. //0~9的共阳数码管段码表code uchar  TAB2[10]={0xc0, 0xf9, 0xa4, 0xb0, 0x99,                                                 0x92, 0x82, 0xf8, 0x80, 0x90};sbit PD5=P1^7;void delay(uint ms);           // 声明延迟函数 //==主程序区========================================
  5. void main(void)                                //主程序开始 {            uchar i;                    //声明无符号整数变量i        while(1)                                 //无穷循环,程序一直跑            for(i=0;i<10;i++)        //显示0-9,共10次            {                          SEG=TAB2[i];        //共阳数码管显示数字0~9                  if((1 == i)||(2 == i)|| (3 == i)||(7 == i))                        PD5 = 1;                   else                           PD5 =0;                   delay(500);            //延迟500*1m=0.5秒          }                                    //for循环结束 }                                                    //主程序结束                                         
  6. //==子程序区==========================================/* 延迟函数,延迟约x*1ms */void delay(uint x)                   //延迟函数开始 {            uint i,j;                           //声明无符号整数变量i,j         for(i=0;i<x;i++)           //计数x次,延迟x*1ms           for(j=0;j<120;j++);  //计数120次,延迟1ms }                                                   //延迟函数结束
复制代码

可见即使没有完整的8位端口也可以驱动数码管作静态显示,硬件有不足可以用软件来弥补。如果想显示其他字符,也可以作类似的改动。

51hei图片_20250901220615.jpg (14.97 KB, 下载次数: 0)

51hei图片_20250901220615.jpg

51hei图片2.png (30.35 KB, 下载次数: 0)

51hei图片2.png

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1064915 发表于 2025-9-2 09:19 | 只看该作者
  1.     /* ch4-12.c - 七段数码管驱动程序  */
  2.     //==声明区============================================
  3.     #include<reg52.h>           //包含单片机寄存器定义的头文件
  4.     #define SEG P3              //宏定义,用标识符SEG代替P0
  5.     #define uint unsigned int          //宏定义,用uint代替unsigned int
  6.     #define uchar unsigned char        //宏定义,uchar代替unsigned char
  7.     //0~9的共阳数码管段码表
  8.     code uchar  TAB2[10]={0xc0, 0xf9, 0xa4, 0xb0, 0x99,0x92, 0x82, 0xf8, 0x80, 0x90};
  9.     sbit PD5=P1^7;
  10.     void delay(uint ms);           // 声明延迟函数
  11.     //==主程序区========================================
  12.     void main(void)                                //主程序开始
  13.     {
  14.             uchar i;                    //声明无符号整数变量i
  15.             while(1)                                 //无穷循环,程序一直跑
  16.                 for(i=0;i<10;i++)        //显示0-9,共10次
  17.                 {
  18.                       SEG=TAB2[ i];        //共阳数码管显示数字0~9
  19.                       PD5=  TAB2[ i]&(0x01<<5);
  20.                        delay(500);            //延迟500*1m=0.5秒
  21.                       SEG=0xff;
  22.                       PD5 = 1;
  23.               }                               //for循环结束
  24.     }                                        //主程序结束
  25.     //==子程序区==========================================
  26.     /* 延迟函数,延迟约x*1ms */
  27.     void delay(uint x)                   //延迟函数开始
  28.     {            uint i,j;                           //声明无符号整数变量i,j
  29.              for(i=0;i<x;i++)           //计数x次,延迟x*1ms
  30.                for(j=0;j<120;j++);  //计数120次,延迟1ms
  31.     }                                                   //延迟函数结束
复制代码


回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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