单片机C51开发遇到的器件修改问题

灯塔引路 2013-12-07 10:14:46
我想请教一个问题,我设计了一个电路图,但是不知道如何去改,所以就来请教一些各位,希望各位能为我解惑。
只会基于Proteu和keil联编实现的。
电路图如下:


详细放大图


详细各器件名:


实现代码如下:

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit r2=P1^2; //设置方波P1.2输出-->十位数
sbit r3=P1^3; //设置方波P1.3输出-->个位数
unsigned char code table[]={0x40, 0xf9, 0x24, 0x30,
0x19, 0x12, 0x02, 0x78,
0x00, 0x10, 0x08, 0x03,
0x46, 0x21, 0x06, 0x0e};
uint num=60;
void delay(uint z);
void init();
void timeover(void);
void main(){ //r2为真时LED十位数亮,r3为真时LED个位数亮
init();
TR0=1; //启动定时
while(1){
r2=0;
r3=1;
P0=table[num%10];
delay(5000);
r3=0;
r2=1;
P0=table[num/10];
delay(5000);
if(TF0){
timeover();
TF0=0;
}
}
}
void init()
{
//uint i;
TMOD=0x01; //设置定时器/计数器的工作方式1
TH1=0x59; //设置初值为高字节 //关于频率的计算,开始算出来的默认值是
//23870us,经过进一步的计算得出23000的初值
TL1=0xd8; //设置初值为低字节
IE=0x00; //禁止中断

}

void delay(uint z){
while(z--){_nop_();}
}

void timeover(void){
TR0=0;
TH1=0x59;
TL1=0xd8;
num--;
if(num == -1)
num = 60;
TR0=1;
}


上述代码是可以实现的,但问题是:我上面的电路图用的是npn 但是我现在没有npn只有pnp我只能用pnp代替 上面的npn 那我的电路图和代码应该如何去修改呢?我希望路过的都能进来给我解解惑。

...全文
357 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
灯塔引路 2013-12-10
  • 打赏
  • 举报
回复
引用 7 楼 KenZhang1031 的回复:
如图修改,但是程序的控制电平要和原来相反,原来是p1.2和p1.3为高电平可使三极管导通,修改后是低电平才导通。
表示赞赏
灯塔引路 2013-12-10
  • 打赏
  • 举报
回复
如果代码改成定时中断应该怎样改
#include<reg51.h>
#include<intrins.h>

#define uchar unsigned char 
#define uint unsigned int
void init();
void action(); 
void delay(uint);
void time0over(void);
uint num=60;
sbit rect_wave2=P1^2;
sbit rect_wave3=P1^3;
uchar code table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void main()
{      
   init();
   while(1)
   {
      	rect_wave2=0;  //打开0端
        rect_wave3=1;  //关闭1端 表示个位数字的变化
        P0=table[num%10];
        delay(3000); time0over();
		}
}
void action()
{
        rect_wave2=0;  //打开0端
        rect_wave3=1;  //关闭1端 表示个位数字的变化
        P0=table[num%10];
        delay(5000); 
        TR0=1;
        rect_wave3=0;
        rect_wave2=1;
        P0=table[num/10]; //关闭2端 表示十位数字的变化
        delay(5000);
}

void timer1int(void) interrupt 1   //采用定时中断计数0 
{		  
          TR0=0;
		  //init();
          action();
          TR0=1;
		  
}


void time0over(void){  
        TH1=0x59;
        TL1=0xd8;
        num--;
        if(num == -1)
           num = 60;
}


void init()  //寄存器初始化
{
   
      TMOD=0x01; //设置定时器/计数器的工作方式1(16位)
      IE=0x82;   //启动中断EA,用定时器0----开启定时中断?
      TCON=0x20; //开启全部定时标示为TF1 TR1 TF0 TR0
      TH0=0x59;  //设置初值为高字节
      TL0=0xd8;  //
	 
}


void delay(uint i){
 
 while(i--)
    {_nop_();_nop_();_nop_();_nop_();_nop_(); }
 }
就是这个不知道如何去改 如果用这段代码 不知怎的 就定在60 不动啦
Mr. Code 2013-12-09
  • 打赏
  • 举报
回复

如图修改,但是程序的控制电平要和原来相反,原来是p1.2和p1.3为高电平可使三极管导通,修改后是低电平才导通。
灯塔引路 2013-12-09
  • 打赏
  • 举报
回复
小弟 我笨拙 不知代码应该如何改 这并不是代码的问题 改后 无数字显示
Fighting959800 2013-12-09
  • 打赏
  • 举报
回复
引用 4 楼 flame13 的回复:
你用npn的三极管控制的共阳数码管,如果用pnp控制的话,改用共阴极数码管就可以了,代码只需要改成共阴极的显示代码,其他不变
flame13 2013-12-07
  • 打赏
  • 举报
回复
你用npn的三极管控制的共阳数码管,如果用pnp控制的话,改用共阴极数码管就可以了,代码只需要改成共阴极的显示代码,其他不变
灯塔引路 2013-12-07
  • 打赏
  • 举报
回复
要文件的 可以留邮箱 我发给你研究一下。
灯塔引路 2013-12-07
  • 打赏
  • 举报
回复
引用 1 楼 wangfan027 的回复:
你把r2=1改成r2=0,把r2=0改成r2=1试试 r3也一样改
这肯定是不行的 你收要改变软件 但那个端口输出就 翻过来啦。重点是哪个pnp 和npn 的器件。
dceacho 2013-12-07
  • 打赏
  • 举报
回复
你把r2=1改成r2=0,把r2=0改成r2=1试试 r3也一样改

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧