电路:
一般的单片机 和 TTL集成电路芯片,都是灌电流能力强,拉电流能力极弱。
为此,应该用输出低电平,来带动负载。
而你的电路,是用高电平带动LED发光的,仿真,也许还行;实际的电路,LED是不会亮的。
我有我自己写的一个程序,根号 开方连续运算1602显示
#include<reg52h>#include<mathh>
#define uint unsigned int
#define uchar unsigned char
uchar temp,z,fuhao; //z,fuhao
char zifu1[8]={0},zifu2[8]={0},zifu[20];
uchar cuowu[]={"cuo wu"};
uchar keyshu=0,shu0,genhao=251,n=0; ///
double shu1=0,shu2=0,shu=0; //
sbit EN = P1^6;
sbit RS = P1^4;
sbit RW = P1^5;
sbit duan = P2^6;
sbit wei = P2^7;
sbit gen= P3^0;
sbit fang = P3^1;
double z_s(uchar p);
void s_z(double b);
void s_z2(double b);
void s_z1(long zheng);
void ten(unsigned int t) //
{
uchar i;
for(;t>0;t--)
for(i=0;i<120;i++);
}
//
uchar jianpan()
{
z='N'; //,'N'
P3=0xfe; //
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0) //
{
ten(10);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:z=7;
break;
case 0xde:z=8;
break;
case 0xbe:z=9;
break;
case 0x7e:z='+';
break;
}
while(temp!=0xf0) //
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd; //
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0) //
{
ten(10);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:z=4;
break;
case 0xdd:z=5;
break;
case 0xbd:z=6;
break;
case 0x7d:z='-';
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0; //
}
}
}
P3=0xfb; //
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0) //
{
ten(10);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:z=1;
break;
case 0xdb:z=2;
break;
case 0xbb:z=3;
break;
case 0x7b:z='';
break;
}
while(temp!=0xf0) //
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7; //
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0) //
{
ten(10);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:z='=';
break;
case 0xd7:z=0;
break;
case 0xb7:z='';
break;
case 0x77:z='/';
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0; //
}
}
}
while(fang==0)
{
if(fang==0)
{
ten(5);
if(fang==0)
{
z='^';
}
while(fang==0); //
}
}
while(gen==0)
{
if(gen==0)
{
ten(5);
if(gen==0)
{
z=251;
}
while(gen==0); //
}
}
return z;
}
void mingling(uchar a)
{
P0=a;
RS=0;
EN=0;
ten(10);
EN=1;
ten(10);
EN=0;
}
void shuju(uchar a)
{
P0=a;
RS=1;
EN=0;
ten(10);
EN=1;
ten(10);
EN=0;
}
void chushihua()
{
RW=0;
duan=0;
wei=0;
mingling(0x38); //:16,5,8
ten(20);
mingling(0x0f); //
ten(20);
mingling(0x06); //:,
ten(20);
mingling(0x01); //,
ten(20);
}
//
void zifuchuan(uchar a)
{
while(a)
{
shuju(a);
a++;
}
}
////////////////////
////////
////////////////////
double z_s(uchar p)
{
char i=0,j=0;
double num=0,xiao=0,x=0,y=0;
while((p!='')&&p) //
{
num=num10+(p-'0');
p++;
}
for(p++,i++,j=0;p;j++,i++,p++)
xiao=xiao10+(p-'0');
for(;j>0;j--)
xiao=01;
num=num+xiao;
return num;
}
void s_z1(long zheng)
{
char j=0,a[20]={0};
if(zheng==0)
{
shuju('0');
return;
}
else if(zheng<0)
{
zheng=0-zheng;
shuju('-');
}
while(zheng>=1)
{
a[j]=zheng%10+'0';
zheng=zheng/10;
j++;
}
for(j=j-1;j>=0;j--)
{
shuju(a[j]);
}
}
void s_z2(double b)
{
long num;
b=b-floor(b);
if(b>000000009)
{
shuju('');
num=(long)(b1000000);
s_z1(num);
}
}
///////D'D///////
void s_z(double b)
{
long num;
if(b==0)
{
shuju('0');
return;
}
else if(b<0)
{
b=fabs(b);
shuju('-');
}
num=(long)b;
s_z1(num);
s_z2(b);
}
//////////////////////////////////////
//LCD//
/////////////////////////////////
void weizhi(uchar x,uchar y)
{
if(y==0)
mingling(0x40+x);
else mingling(0x40+0x80+x);
}
void shuju1( unsigned x,unsigned char y,unsigned char dat)
{
weizhi( x, y );
shuju(dat);
}
//////
void main()
{
uchar i=0;
chushihua();
while(1)
{
while(1)
{
if((jianpan()!='N')&&(z>=0&&z<=9||z==''))
{
if(keyshu<=19)
{
if(z=='')
shuju('');
else
shuju(z+'0');
}
zifu1[keyshu]=z+'0';
keyshu++; shu0++;
}
else if(z=='+'||z=='-'||z==''||z=='/'||z=='^'||z==251||z=='=')
{
shu1=z_s(zifu1);
shu0=shu1;
shu=shu1;
loop:
shu1=shu;
mingling(0x01);
s_z(shu1);
if(z!='=')shuju(z); //
if(z==251)
{
shu1=sqrt(shu1);
shu=shu1; //
while(1)
{
if(jianpan()=='+'||z=='-'||z==''||z=='/'||z=='^'||z=='=')
{
if(z!='=')shuju(z);
break;
}
}
}
keyshu=0; //
//shuju(fuhao+'0');
fuhao=z;
break;
}
}
while(1)
{
if(z==251)break;
if(z=='=')break;
if((jianpan()!='N')&&(z>=0&&z<=9||z==''))
{
if(keyshu<=19)
{
if(z=='')
shuju('');
else
shuju(z+'0');
}
zifu2[keyshu]=z+'0';
keyshu++;
}
else if(z=='+'||z=='-'||z==''||z=='/'||z=='='||z==251)
{
shu2=z_s(zifu2);
break;
}
if(z==251)
{
shu2=sqrt(shu2); //
while(1)
{
if(jianpan()=='+'||z=='-'||z==''||z=='/'||z=='^'||z=='=')
{
if(z!='=')shuju(z);
break;
}
}
}
}
if(fuhao=='^')
shu=pow(shu1,shu2);
if(fuhao=='+')
shu=shu1+shu2;
if(fuhao=='-')
shu=shu1-shu2;
if(fuhao=='')
shu=shu1shu2;
if(fuhao=='/')
shu=shu1/shu2;
if((shu2==0&&fuhao=='/'))
{
weizhi(0,1);
zifuchuan(cuowu);
}
if(z=='=')
{
shuju('=');
weizhi(0,1);
s_z(shu);
while(1)
{
if(jianpan()=='+'||z=='-'||z==''||z=='/'||z=='^'||z==251)break;
}
}
shu1=0;
shu2=0;
for(i=0;i<8;i++)
zifu1[i]=0;
for(i=0;i<8;i++)
zifu2[i]=0; //
if(z=='+'||z=='-'||z==''||z=='/'||z=='^'||z==251)
goto loop;
}
}
呵呵呵,你走运了,我做过课后作业,有问题以再问我
带调时间的数字钟
定时器1s触发中断一次,计时+1,主程序负责传输时间到led及检测按键,其他见注释。
左面有器件列表,这个是protenus仿真
ORG 0000H
AJMP MAIN
ORG 000BH
LJMP T0INT
ORG 001BH
LJMP T1INT
ORG 0100H
MAIN: MOV TMOD,#51H ;T0定时器方式1,T1计数器方式1
MOV TCON,#54H ;开定时计数器,T1边沿触发
MOV TH0,#4BH ;(65536-19453)1085=50MS,晶振110592MHZ
MOV TL0,#0FFH ;去掉了装载初值用的机器周期
MOV TH1,#0FFH ;满10溢出,1S
MOV TL1,#0F6H
MOV IE,#8AH ;开中断
MOV R7,#04H ;预置13:58:00 的时
MOV R2,#13H
MOV A,R2
LCALL DISPLAY
MOV R7,#02H ;预置13:58:00 的分
MOV R1,#58H
MOV A,R1
LCALL DISPLAY
CHECKKEY:LCALL KEY1
LCALL KEY2
LCALL KEY3
LCALL KEY4
AJMP CHECKKEY
;;;;;;;;;;中断;;;;;;;;;;;;;;;;;;;;;;
T0INT: MOV TH0,#4BH
MOV TL0,#0FDH
CPL P20
RETI
T1INT: MOV TH1,#0FFH
MOV TL1,#0F6H
PUSH ACC
CPL P21
MOV A,R0 ;R0计秒钟,通过A调整为BCD码
ADD A,#1
DA A
MOV R0,A
CJNE R0,#60H,MIAO
MOV R0,#00H
MOV A,R1 ;R1计分钟,通过A调整为BCD码
ADD A,#1
DA A
MOV R1,A
CJNE R1,#60H,FEN
MOV R1,#00H
MOV A,R2 ;R2计时钟,通过A调整为BCD码
ADD A,#1
DA A
MOV R2,A
CJNE R2,#24H,SHI
MOV R2,#00H
SHI: MOV R7,#04H
MOV A,R2
LCALL DISPLAY
FEN: MOV R7,#02H
MOV A,R1
LCALL DISPLAY
MIAO: MOV R7,#01H
MOV A,R0
LCALL DISPLAY
POP ACC
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;显示
;A--显示BCD码,R7--选择数码管
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISPLAY:MOV P1,R7
MOV SCON,#0
MOV SBUF,A
JNB TI,$
CLR TI
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;按键检测与执行程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY1: JB P00,DONE1 ;检测P00口按键,若没按下,则结束
LCALL DELAY ;延时去抖
JB P00,DONE1 ;再次检测,若没按下,则结束
JNB P00,$ ;等待按键松开
CPL EA ;开关定时中断
DONE1: RET
KEY2: JB EA,DONE2 ;若EA=1,则调时间按键无效
JB P01,DONE2 ;检测P00口按键,若没按下,则结束
LCALL DELAY ;延时去抖
JB P01,DONE2 ;再次检测,若没按下,则结束
MOV A,R2 ;R2计时钟+1,通过A调整为BCD码
ADD A,#1
DA A
CJNE A,#24H,CHECK2
MOV A,#00H
CHECK2: MOV R2,A
MOV R7,#04H ;显示改后的时间
MOV A,R2
LCALL DISPLAY
DONE2: RET
KEY3: JB EA,DONE3
JB P02,DONE3
LCALL DELAY
JB P02,DONE3
MOV A,R1 ;R1计分钟+1,通过A调整为BCD码
ADD A,#1
DA A
CJNE A,#60H,CHECK3
MOV A,#00H
CHECK3: MOV R1,A
MOV R7,#02H ;显示改后的时间
MOV A,R1
LCALL DISPLAY
DONE3: RET
KEY4: JB EA,DONE4
JB P03,DONE4
LCALL DELAY
JB P03,DONE4
MOV A,R0 ;R0计秒钟+1,通过A调整为BCD码
ADD A,#1
DA A
CJNE A,#60H,CHECK4
MOV A,#00H
CHECK4: MOV R0,A
MOV R7,#01H ;显示改后的时间
MOV A,R0
LCALL DISPLAY
DONE4: RET
;;;;;;;;DELAY;;;;;;;;;;;;;;;;;;
DELAY: MOV R4,#0FFH
DL: MOV R5,#0FFH
DJNZ R5,$
DJNZ R4,DL
RET
END
以上就是关于51单片机跑马灯电路图(左右来回循环),8个led灯分别接在P2口,c程序、仿真图如下。电路并未出现预期效果全部的内容,包括:51单片机跑马灯电路图(左右来回循环),8个led灯分别接在P2口,c程序、仿真图如下。电路并未出现预期效果、51单片机控制下的简易计算器仿真图和程序、求单片机数字钟的设计程序及电路仿真图!急!急!急!急!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)