搜索
bottom↓
回复: 16

wo是菜鸟求助:单片机驱动数码管段码可以随便的使用几个口驱动吗(P0 P1 P2 P3)如何设置

[复制链接]

出0入0汤圆

发表于 2013-6-26 20:17:30 | 显示全部楼层 |阅读模式
水平低,只会模仿,高手莫怪。
做的定时器,原来使用的是P1接数码管abcdefg.
现在我想把单片机直接焊接在数码管上,这样的话引脚接口就不能一一对应了,想改程序改变接口的,可是程序里面没段码定义引脚,只有位码的。
这样就难了,不知道如何改啊?
水平低,说的不知道大家能不能看明白?
文化低,不会说,想到啥说啥,前辈莫怪,谢谢了。
我就是想做个定时开关,使用AT89C2051单片机,或者STC15F104E单片机,可以定时开、定时关。
电路越简单越好,因为自己焊工差、再加上视力差,挺难的,但是我就是喜欢折腾这些小玩意啊,就这一点点爱好,不能埋没了啊,呵呵!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2013-6-26 20:46:59 | 显示全部楼层
曾经做过,把每个字符写成一个函数,然后再调用就可以了,就算对不上也没关系

出0入0汤圆

发表于 2013-6-26 21:09:48 | 显示全部楼层
单片机P0 p1 p2 p3都可以 但是p0口必须加上拉电阻。。我不太明白你的意思,你是说数码管的七段一些断接了p0 一些段又接P1 P2 P3吗?没人会这么做 这样控制很难的 最好7断数码都选择一个P0或P1 P2 再定义一个字符数组 一个个送给这些口。

出0入0汤圆

发表于 2013-6-26 21:30:50 | 显示全部楼层
为什么不用芯片驱动呢

出0入0汤圆

发表于 2013-6-26 22:36:20 | 显示全部楼层
怎么接都行,接完了自己编码就OK了

出0入0汤圆

发表于 2013-6-26 22:43:12 | 显示全部楼层
IO口随便那个都行

出0入0汤圆

发表于 2013-6-26 23:33:10 来自手机 | 显示全部楼层
大哈欠E 发表于 2013-6-26 21:09
单片机P0 p1 p2 p3都可以 但是p0口必须加上拉电阻。。我不太明白你的意思,你是说数码管的七段一些断接了p0 ...

段选不在同一个口也很简单的!没你想的那么难

出0入0汤圆

发表于 2013-6-27 00:14:15 | 显示全部楼层
可以随便接,后面定义数组显示码,用查表方式就可以了

出0入0汤圆

发表于 2013-6-27 08:06:25 | 显示全部楼层
HeP028 发表于 2013-6-26 23:33
段选不在同一个口也很简单的!没你想的那么难

虚心求教,我新手。

出0入0汤圆

发表于 2013-6-27 08:40:02 | 显示全部楼层
IO口怎么样都行,但是直接用IO口驱动不起来

出0入0汤圆

发表于 2013-6-27 09:32:21 | 显示全部楼层
任意8个IO口都可以 只是要改下程序而已
比如你原来段码显示数字0,如果只用P1,那么程序里一般有个TABLE[]={0X0F,..};// 0X0F代表0点亮对应的abcdf..
只是用P1 程序写成P1=0X0F,
使用任意IO时候写成
if需要(显示0)
{
   P1.n = 1;  // 数码管a脚对应的IO置1 点亮a灯
   p2.n =  0;// 数码管b脚对应的IO置0 灭b灯
.
   .......
  .......//// 数码管f脚对应的IO置1 点亮f
}
if(显示1)
{
   P1.n = 0;  // 数码管a脚对应的IO置0 灭b灯
   p2.n =  1;// 数码管b脚对应的IO置1 点亮a灯
.。
。。
}

另外这个数码管还需要驱动电路,一个单片机驱动1个数码管可以,但是多个就不行了,因为单片机IO口能供出的电流有限

出0入0汤圆

发表于 2013-6-27 16:59:40 | 显示全部楼层
大哈欠E 发表于 2013-6-27 08:06
虚心求教,我新手。

给你举例吧:
  1.        
  2.         SBIT LCD1602dataPortO = PORTC^4;
  3.         SBIT LCD1602dataPort1 = PORTC^3;
  4.         SBIT LCD1602dataPort2 = PORTC^2;
  5.         SBIT LCD1602dataPort3 = PORTC^1;
  6.         SBIT LCD1602dataPort4 = PORTC^0;
  7.         SBIT LCD1602dataPort5 = PORTD^7;
  8.         SBIT LCD1602dataPort6 = PORTD^6;
  9.         SBIT LCD1602dataPort7 = PORTD^5;

  10. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  11. * Function          :       
  12. * Description         :        函数功能、性能描述
  13. * Calls                 :        被本函数调用的函数清单
  14. * Called By         :        调用本函数的函数清单
  15. * Table accessed:        被访问的表(数据库操作用)
  16. * Tabled Updated:        被修改的表(数据库操作用)
  17. * Input                 :        输入参数、取值说明与关系
  18. * Output                 :        输出参数、类型说明
  19. * Return                 :        函数返回值说明
  20. * Others                 :        (Screen sequence)  
  21. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  22. void LCD1602WriteConversionData(unsigned char WriteData)
  23. {
  24.         if (WriteData & 0x01)        {LCD1602dataPortO = 1;}        else{LCD1602dataPortO = 0;}
  25.         if (WriteData & 0x02)        {LCD1602dataPort1 = 1;}        else{LCD1602dataPort1 = 0;}
  26.         if (WriteData & 0x04)        {LCD1602dataPort2 = 1;}        else{LCD1602dataPort2 = 0;}
  27.         if (WriteData & 0x08)        {LCD1602dataPort3 = 1;}        else{LCD1602dataPort3 = 0;}
  28.         if (WriteData & 0x10)        {LCD1602dataPort4 = 1;}        else{LCD1602dataPort4 = 0;}
  29.         if (WriteData & 0x20)        {LCD1602dataPort5 = 1;}        else{LCD1602dataPort5 = 0;}
  30.         if (WriteData & 0x40)        {LCD1602dataPort6 = 1;}        else{LCD1602dataPort6 = 0;}
  31.         if (WriteData & 0x80)        {LCD1602dataPort7 = 1;}        else{LCD1602dataPort7 = 0;}
  32. }
复制代码

出0入0汤圆

 楼主| 发表于 2013-6-27 21:29:43 | 显示全部楼层
受教了,谢谢大家,目前我的水平就是只会改改引脚仿制别人的作品。
我看到杜洋做的迷你定时器,就是把数码管直接焊接在单片机引脚上,限流电阻都没有加。
不知道论坛让不让发链接,还是不冒险了
杜洋的文章名是,大家一艘就能找到《DoClock系列 mini48家用定时器》

出0入0汤圆

 楼主| 发表于 2013-6-28 10:22:24 | 显示全部楼层
另外就是我手上的晶振跟原作者的不一样在哪里设置呢?
keil软件输出选项有个晶振频率填写处,我的默认是24
设置这里可以吗?

出0入0汤圆

 楼主| 发表于 2013-6-28 23:51:16 来自手机 | 显示全部楼层
大家看看这个程序哪里有问题?
按设置键无效

#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uint b;
uchar c,e;
char h,m;
uchar gewei,shiwei,baiwei,qianwei;//a为模式标
志,
//mswc为模式选择完成标
志,gewei,shiwei,baiwei,qianwei
//为个位寄存器,十位寄存器,百位寄存器,
千位寄存器
sbit qian =P3^7;
sbit bai =P3^5;
sbit shi =P3^4;
sbit ge =P3^1;
sbit out =P3^3;
sbit set =P3^2;//设置键
sbit up =P3^0;//加
sbit md =P1^7;//秒点
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
void delay(uchar z);
void display();
void delay(uchar z)
        {
          uint x,y;
             for(x=z;x>0;x--)
                for(y=74;y>0;y--);
         }
         void main()//定时模式
        {
                                    out=0;
              EA=1;
              EX0=1;//开set键中断
              ET0=1;//开定时器0做计时基准
              TMOD=0x02;
              TH0=(256-240);
              TL0=(256-240);
              b=0;
              c=0;
              e=1;//在定时模式中第一次按SET键
时个位闪烁
              m=0;
              h=0;
              h=qianwei*10+baiwei;
              m=shiwei*10+gewei;
              TR0=0;
              while(1)
                      {
                              if(up==1)//按下SET键时的
显示程序根据按下的次序显示
                                      {
                                              switch(e)
                                                      {
                                                              case 0://
定时进行中的显示
display();
break;
                                                              case 1://
个位闪烁
02/06/2011 14:22:14 PAGE 2
P1=table[gewei];
ge=1;
shi=0;
bai=0;
qian=0;
delay(250);
ge=0;
shi=0;
bai=0;
qian=0;
delay(250);
break;
                                                              case 2://
十位闪烁
P1=table[shiwei];
ge=0;
shi=1;
bai=0;
qian=0;
delay(250);
ge=0;
shi=00;
bai=0;
qian=0;
delay(250);
break;
                                                              case 3:
P1=table[baiwei];
ge=0;
shi=0;
bai=1;
qian=0;
delay(250);
ge=0;
shi=0;
bai=0;
qian=0;
delay(250);
break;
                                                              case 4:
P1=table[qianwei];
ge=0;
shi=0;
bai=0;
qian=1;
delay(250);
ge=0;
shi=0;
bai=0;
qian=0;
delay(250);
break;
                                                      }
                                      }
                              if(up==0)//当UP键按下时
                              {
                                      delay(10);
                                      if (up==0)
                                              while(!up);
                                              switch(e)
                                                      {
                                                              case 1:
gewei++;
                                                                      if
(gewei>9)
gewei=1;
break;
                                                              case 2:
shiwei++;
                                                                      if
(shiwei>5)
shiwei=1;
break;
                                                              case 3:
baiwei++;
                                                                      if
(baiwei>9)
baiwei=1;
break;
                                                              case 4:
qianwei++;
                                                                      if
(qianwei>9)
qianwei=1;
break;
                                                      }
                                                      h=
(qianwei*10+baiwei);
                                                      m=
(shiwei*10+gewei);
                              }
                      }
      }
          void EX0_set()interrupt 0//set键
      {
                      EX0=0;
                      delay(10);
                      if(set==0)
                              {
                                      while(!set);
                                      TR0=0;
                                      e=e++;
                                      if(e>4)
                                              {
                                                      e=0;
                                                      TR0=1;//第五
次按SET键则开始定时
                                                                  out=1;
                                              }
                              }
                              EX0=1;
      }
       void t0_time() interrupt 1
       {
              b=b++;
              if(b>=1250)
                      {
                              b=0;
                              c=c++;
                      }
                              if(c>=120)
                                      {
                                              c=0;
                                               m=m--;
                                      }
                                      if(m==0)
                                              if(h==0)
                                                      {          //当定
时时间到后关闭定时器1,显示00:00不闪烁
                                                              ET0=0;
                                                              TR0=0;
                                                              P1=table
[0];
                                                              md=0;
                                                              while(1)
                                                              {
out=0;
ge=1;
shi=1;
bai=1;
qian=1;//全亮,继电器动作,整个程序将停
在这里。
                                                              }
                                                      }
                                      if(m<0)
                                              {
                                                      m=59;
                                                      h=h--;
                                              }
      }
      void display()
              {
                              P1=0xff;//消隐
                              ge=1;
                              shi=0;
                              bai=0;
                              qian=0;
                              P1=table[m%10];//gewei
                              delay(2);
                              P1=0xff;
                              ge=0;
                              shi=1;
                              bai=0;
                              qian=0;
                              P1=table[m/10];//shiwei
                              delay(2);
                              P1=0xff;
                              ge=0;
                              shi=0;
                               bai=1;
                              qian=0;
                              P1=table[h%10];//baiwei
                              delay(2);
                              P1=0xff;
                              ge=0;
                              shi=0;
                              bai=0;
                              qian=1;
                              P1=table[h/10];//qianwei
                              delay(2);
                              md=c%2;
                              delay(2);
              }

出0入0汤圆

 楼主| 发表于 2013-6-28 23:57:22 来自手机 | 显示全部楼层
试验用单片机是STC89C52RC
使用8兆晶振

出0入0汤圆

 楼主| 发表于 2013-6-29 15:56:42 | 显示全部楼层
不知道怎么回事?设置好后时间不走。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 12:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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