标题: 51单片机的某个P口不足8位怎么办 [打印本页]

作者: yyq007    时间: 2025-9-1 22:09
标题: 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

作者: joyb    时间: 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.     }                                                   //延迟函数结束
复制代码







欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1