51单片机设计的简易的计算器
1、硬件仿真图
硬件部分比较简单,当键盘按键按下时它的那一行、那一列的端口为低电平。因此,只要扫描行、列端口是否都为低电平就可以确定是哪个键被按下。
2、主程序流程图
程序的主要思想是:将按键抽象为字符,然后就是对字符的处理。将操作数分别转化为字符串存储,操作符存储为字符形式。然后调用compute()函数进行计算并返回结果。具体程序及看注释还有流程图。
3、Altium Designer画的PCB图
4、程序源代码
#include #include
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar operand1[9], operand2[9];
uchar operator;
void delay(uint);
uchar keyscan();
void disp(void);
void buf(uint value);
uint compute(uint va1,uint va2,uchar optor);
uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0xff};
uchar dbuf[8] = {10,10,10,10,10,10,10,10};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar keyscan()
{
uchar skey;
P1 = 0xfe;
while((P1 & 0xf0) != 0xf0)
{
delay(3);
while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xee: skey = '7'; break;
case 0xde: skey = '8'; break;
case 0xbe: skey = '9'; break;
case 0x7e: skey = '/'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0)
;
}
}
P1 = 0xfd;
while((P1 & 0xf0) != 0xf0)
{
delay(3);
while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xed: skey = '4'; break;
case 0xdd: skey = '5'; break;
case 0xbd: skey = '6'; break;
case 0x7d: skey = '*'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0)
;
}
}
P1 = 0xfb;
while((P1 & 0xf0) != 0xf0)
{
delay(3);
while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xeb: skey = '1'; break;
case 0xdb: skey = '2'; break;
case 0xbb: skey = '3'; break;
case 0x7b: skey = '-'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0)
;
}
}
P1 = 0xf7;
while((P1 & 0xf0) != 0xf0)
{
delay(3);
while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xe7: skey = '$'; break;
case 0xd7: skey = '0'; break;
case 0xb7: skey = '='; break;
case 0x77: skey = '+'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0)
;
}
}
return skey;
}
void main()
{
uint value1, value2, value;
uchar ckey, cut1 = 0, cut2 = 0;
uchar operator;
uchar i, bool = 0;
init:
buf(0);
disp();
value = 0;
cut1 = cut2 = 0;
bool = 0;
for(i = 0;i < 9;i++)
{
operand1[i] = '\0';
operand2[i] = '\0';
}
while(1)
{
ckey = keyscan();
if(ckey != '#')
{
if(isdigit(ckey))
{
switch(bool)
{
case 0:
operand1[cut1] = ckey;
operand1[cut1+1] = '\0';
value1 = atoi(operand1);
cut1++;
buf(value1);
disp();
break;
case 1:
operand2[cut2] = ckey;
operand2[cut2+1] = '\0';
value2 = atoi(operand2);
cut2++;
buf(value2);
disp();
break;
default: break;
}
}
else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/')
{
bool = 1;
operator = ckey;
buf(0);
dbuf[7] = 10;
disp();
}
else if(ckey == '=')
{
value = compute(value1,value2,operator);
buf(value);
disp();
while(1)
{
ckey = keyscan();
if(ckey == '$')
goto init;
else
{
buf(value);
disp();
}
}
}
else if(ckey == '$')
{ goto init;}
}
disp();
}
}
uint compute(uint va1,uint va2,uchar optor)
{
uint value;
switch(optor)
{
case '+' : value = va1+va2; break;
case '-' : value = va1-va2; break;
case '*' : value = va1*va2; break;
case '/' : value = va1/va2; break;
default : break;
}
return value;
}
void buf(uint val)
{
uchar i;
if(val == 0)
{
dbuf[7] = 0;
i = 6;
}
else
for(i = 7; val > 0; i--)
{
dbuf[i] = val % 10;
val /= 10;
}
for( ; i > 0; i--)
dbuf[i] = 10;
}
void disp(void)
{
uchar bsel, n;
bsel=0x01;
for(n=0;n<8;n++)
{
P2=bsel;
P0=table[dbuf[n]];
bsel=_crol_(bsel,1);
delay(3);
P0=0xff;
}
}
扩展资料:
PROTEUS 是单片机课堂教学的先进助手
PROTEUS不仅可将许多单片机实例功能形象化,也可将许多单片机实例运行过程形象化。前者可在相当程度上得到实物演示实验的效果,后者则是实物演示实验难以达到的效果。
它的元器件、连接线路等却和传统的单片机实验硬件高度对应。这在相当程度上替代了传统的单片机实验教学的功能,例:元器件选择、电路连接、电路检测、电路修改、软件调试、运行结果等。
课程设计、毕业设计是学生走向就业的重要实践环节。由于PROTEUS提供了实验室无法相比的大量的元器件库,提供了修改电路设计的灵活性、提供了实验室在数量、质量上难以相比的虚拟仪器、仪表,因而也提供了培养学生实践精神、创造精神的平台
随着科技的发展,“计算机仿真技术”已成为许多设计部门重要的前期设计手段。它具有设计灵活,结果、过程的统一的特点。可使设计时间大为缩短、耗资大为减少,也可降低工程制造的风险。相信在单片机开发应用中PROTEUS也能茯得愈来愈广泛的应用。
使用Proteus 软件进行单片机系统仿真设计,是虚拟仿真技术和计算机多媒体技术相结合的综合运用,有利于培养学生的电路设计能力及仿真软件的操作能力;
在单片机课程设计和全国大学生电子设计竞赛中,我们使用 Proteus 开发环境对学生进行培训,在不需要硬件投入的条件下,学生普遍反映,对单片机的学习比单纯学习书本知识更容易接受,更容易提高。
实践证明,在使用 Proteus 进行系统仿真开发成功之后再进行实际制作,能极大提高单片机系统设计效率。因此,Proteus 有较高的推广利用价值。
参考资料来源:百度百科-protues
计算器需要输入输出。输入可以用串口输入或者键盘输入,输出也可以用串口输出或者数码管、液晶屏,单片机将输入运算后通过输入显示出结果。
我以前做过4x4键盘控制电动机转速,用数码管显示电机转速的程序,程序如下:AD EQU 30H
RTR EQU 31H
LTR EQU 32H
STR EQU 33H
BW EQU 34H
BWS EQU 35H
SHW EQU 36H
SHWS EQU 37H
GW EQU 38H
GWS EQU 39H
WSHR EQU 3AH;WSHR=BWS*100+SHWS*10+GWS
sz EQU 3BH;数字与代码对应程序的数字变量
xsm EQU 3CH;数字与代码对应程序的代码变量
TODH EQU 3DH;计算的10进位数的高位*电机的要求转速高位
TODL EQU 3EH;计算的10进位数的低位*电机的要求转速低位
TODHT EQU 3FH;测试后电机的实际转速高位
TODLT EQU 40H;测试后电机的实际转速低位
PCK EQU 41H;pc口当前的状态植
TOH EQU 42H;定时器高位数
T0L EQU 43H;定时器低位数
pink1 EQU 44H;电机转动1/4圈定时器1的奇数次数
pink2 EQU 45H
VTIMES EQU 46H;速度显示次数
T1H EQU 47H
T1L EQU 48H
TESTK DATA 49H ;高电平脉冲的个数
TTH0 EQU 1AH
TTL0 EQU 4BH
SUBNOW EQU 4CH
ORG 0000H
LJMP MAIN
ORG 03H
AJMP INTR0;中段0,用来计算电机转速
ORG 0BH
MOV A,PCK
ANL A,#00000111B
MOV PCK,A
MOV A,#00000110B
CJNE A,PCK,INTT0LF
LJMP INTT0L;
ORG 1BH;pwm停转子程序
AJMP INTT0H
ORG 0040H
;**************************定时器中断子程序****************************
;****电机停止程序
INTT0H:
mov th0,TOH
mov tl0,T0L
SETB TR0;定时器0开始计数
CLR TR1;定时器1禁止计数
INC pink1
MOV DPTR,#7F02H; b地址
MOV A, #00000000B;电机停止运动
MOVX @DPTR,A
reti
;****电动机正转子程序
INTT0L:
mov th1,T1H
mov tl1,T1L
SETB TR1;定时器1开始计数
CLR TR0;定时器0禁止计数
MOV DPTR,#7F02H; b地址
MOV A, #11001100B;C口输出片选号灯
MOVX @DPTR,A
reti
;****电动机反转
INTT0LF:
mov th1,T1H
mov tl1,T1L
SETB TR1;定时器1开始计数
CLR TR0;定时器0禁止计数
MOV DPTR,#7F02H; b地址
MOV A, #10101100B;C口输出片选号灯
MOVX @DPTR,A
reti
;*************************计算电机转速************************
;R2R3R4R5/ R6R7=R4R5余R2R3////(R2R3R4/R7)=(R2)R3R4 余数R7
INTR0:
MOV R2,#00H
MOV R3,#0EH
MOV R4,#0A6H
MOV R7,pink1
MOV pink1,#0
MOV A,#10
CLR CY
SUBB A,R7
JNB CY,OUTINT0
LCALL NDIV31
MOV TODHT, R3
MOV TODLT,R4
MOV R6,TODH
MOV R7,TODL
CLR CY
MOV A,R4
SUBB A,R7
MOV SUBNOW,A
JB CY,ADV
LCALL SUBV
JMP OUTINT0
ADV:
LCALL ADDV
OUTINT0:
LCALL JSW;计算各位的数值毫时大大约600个始周期 ;MOV TODLT,TOH
;LCALL JSW;计算各位的数值毫时大大约600个始周期
RETI;***********************************************************************************************
;***************************************************************************************************
;***************************************************************************************************
COMP_M:
MOV A,#0FDH
SUBB A,TOH
JNB CY,OUT_PMM
MOV TOH,#0FDH
MOV T1H,#85
OUT_PMM:
RET
;***************加速子程序**********************
ADDV:
CLR EA
CLR TR1
CLR TR0
MOV R1,SUBNOW
MOV R0,#10000000B
FRT:
MOV A,R0
RL A
MOV R0,A
MOV A,R1
ANL A,R0
JZ FRT
MOV A,TOH
ADD A,R0
JC VMAX
MOV TOH,A
MOV A,T1H
SUBB A,R0
MOV T1H,A
JMP TXT
VMAX:
MOV TOH,#0FDH
MOV T1H,#85
TXT:
SETB TR0
SETB TR1
SETB EA
RET
;************减加速子程序*************************
SUBV:
CLR EA
CLR TR1
CLR TR0
MOV R1,SUBNOW
MOV R0,#10000000B
FRT1:
MOV A,R0
RL A
MOV R0,A
MOV A,R1
ANL A,R0
JZ FRT1
MOV A,TOH
SUBB A,R0
JC VMAX1
MOV TOH,A
MOV A,T1H
ADD A,R0
MOV T1H,A
JMP TXT1
VMAX1:
MOV TOH,#85
MOV T1H,#0FDH
TXT1:
SETB TR0
SETB TR1
SETB EA
RET
;*****************************主程序**************************************
MAIN:
MOV BW,#7DH
MOV SHW,#7DH
MOV GW,#7DH
MOV BWS,#0
MOV SHWS,#0
MOV GWS,#0
MOV SP,#0A0H
MOV TOH,#0A1h;******************************************************************
MOV T0L,#0h;******************************************************************
MOV T1H,#0E1h;*******************************************************************
MOV T1L,#37h;*******************************************************************
MOV TMOD,#00H;定时器0在模式1下工作
MOV RTR,#00110110B
MOV LTR,#00101101B
MOV PCK,#00H
MOV TODHT,#2
MOV TODLT,#25H
MOV TODH,#0
MOV TODL,#0
;LCALL JSTIM;计算总值TODH;TODL
MOV pink2,#0
MOV pink1,#0
SETB EX0
SETB IT0
START:
MOV DPTR,#7F00H; 状态字地址
MOV A, #00111111B;设A,B,C口均为输出
MOVX @DPTR,A
LCALL DISPLAY;显示
LCALL KEYSC;扫描键盘
;MOV TESTK,#44H;************************************************TEST*************************************************
ACALL DISPKEYV ;确定键盘
;LCALL JSTIM;计算总值TODH;TODL
;LCALL JSW;计算各位的数值毫时大大约600个始周期
LCALL JSEHW;计算各个代码******************************
JMP START
;*************************键盘扫描程序**************************
KEYSC:
MOV TESTK,#0
mov p1,#0FH ;p10-3输出1,作为输入位
mov a ,p1
ANL A,#0FH
CJNE A,#0FH,DELAY
RET
DELAY: ACALL DELAY1 ; 延时去键抖
mov a ,p1
ANL A,#0FH
CJNE A,#0FH,HAVE
RET
HAVE:
MOV A,#0EFH ;行扫描码
NEXT:
MOV B,A
MOV P1,A
MOV A,p1
ANL A,#0FH ;检测列
CJNE A,#0FH,YES
MOV A,B
RL A
CJNE A,#0FEH,NEXT
YES: orl a,#0f0h ;高四位置1
CPL A
mov r2,#00h
MOV R2,A ;存列码
MOV A,B ;取行码,
CPL A
ORL A,R2 ;列码+行码=键植
MOV AD,#00H
MOV TESTK,A
RET
;****************************确定键盘程序******************************
DISPKEYV:MOV A,TESTK
KEY0:CJNE A,#11H,KEY1
acall WORD0
KEY1:CJNE A,#12H,KEY2
acall WORD1
KEY2:CJNE A,#14H,KEY3
acall WORD2
KEY3:CJNE A,#18H,KEY4
acall WORD3
KEY4:CJNE A,#21H,KEY5
acall WORD4
KEY5:CJNE A,#22H,KEY6
acall WORD5
KEY6:CJNE A,#24H,KEY7
acall WORD6
KEY7:CJNE A,#28H,KEY8
acall WORD7
KEY8:CJNE A,#41H,KEY9
acall WORD8
KEY9:CJNE A,#42H,KEY10
acall WORD9
KEY10:CJNE A,#44H,KEY11
acall WORD10
KEY11:CJNE A,#48H,KEY12
acall WORD11
KEY12:CJNE A,#81H,KEY13
acall WORD12
KEY13:CJNE A,#82H,KEY14
acall WORD13
KEY14:CJNE A,#84H,KEY15
acall WORD14
KEY15:
CJNE A,#88H,PASS
AJMP WORD15
PASS:RET
WORD0:
lCALL MOVE
MOV A,#0
MOV GWS,A
LCALL JSTIM;计算总值TODH;TODL
MOV R0,TESTK
TSTK0:
LCALL KEYSC
MOV A,R0
CJNE A,TESTK,OUT0
JMP TSTK0
OUT0:
MOV R0,#0
RET
WORD1:
lCALL MOVE
MOV A,#1
MOV GWS,A
LCALL JSTIM;计算总值TODH;TODL
MOV R0,TESTK
TSTK1:
LCALL KEYSC
MOV A,R0
CJNE A,TESTK,OUT1
JMP TSTK1
OUT1:
MOV R0,#0
RET
WORD2:
lCALL MOVE
MOV A,#2
MOV GWS,A
LCALL JSTIM;计算总值TODH;TODL
MOV R0,TESTK
TSTK2:
LCALL KEYSC
MOV A,R0
CJNE A,TESTK,OUT2
JMP TSTK2
OUT2:
MOV R0,#0
ACALL JSEHW;计算各个位的显示代码
RET
WORD3:
lCALL MOVE
MOV A,#3
MOV GWS,A
LCALL JSTIM;计算总值TODH;TODL
MOV R0,TESTK
TSTK3:
LCALL KEYSC
MOV A,R0
CJNE A,TESTK,OUT3
JMP TSTK3
OUT3:
MOV R0,#0
ACALL JSEHW;计算各个位的显示代码
RET
WORD4:
lCALL MOVE
MOV A,#4
MOV GWS,A
LCALL JSTIM;计算总值TODH;TODL
MOV A,TESTK
TSTK4:
LCALL KEYSC
CJNE A,TESTK,OUT4
JMP TSTK4
OUT4:
ACALL JSEHW;计算各个位的显示代码
RET
WORD5:
lCALL MOVE
MOV A,#5
MOV GWS,A
LCALL JSTIM;计算总值TODH;TODL
MOV A,TESTK
TSTK5:
LCALL KEYSC
CJNE A,TESTK,OUT5
JMP TSTK5
OUT5:
ACALL JSEHW;计算各个位的显示代码
RET
WORD6:
lCALL MOVE
MOV A,#6
MOV GWS,A
LCALL JSTIM;计算总值TODH;TODL
MOV A,TESTK
TSTK6:
LCALL KEYSC
CJNE A,TESTK,OUT6
JMP TSTK6
OUT6:
ACALL JSEHW;计算各个位的显示代码
RET
WORD7:
lCALL MOVE
MOV A,#7
MOV GWS,A
LCALL JSTIM;计算总值TODH;TODL
MOV A,TESTK
TSTK7:
LCALL KEYSC
CJNE A,TESTK,OUT7
JMP TSTK7
OUT7:
ACALL JSEHW;计算各个位的显示代码
RET
WORD8:
lCALL MOVE
MOV A,#8
MOV GWS,A
LCALL JSTIM;计算总值TODH;TODL
MOV A,TESTK
TSTK8:
LCALL KEYSC
CJNE A,TESTK,OUT8
JMP TSTK8
OUT8:
ACALL JSEHW;计算各个位的显示代码
RET
WORD9:
lCALL MOVE
MOV A,#9
MOV GWS,A
LCALL JSTIM;计算总值TODH;TODL
MOV A,TESTK
TSTK9:
LCALL KEYSC
CJNE A,TESTK,OUT9
JMP TSTK9
OUT9:
ACALL JSEHW;计算各个位的显示代码
RET
WORD10:
CLR EA
CLR ET0
CLR TR0
mov th0,TOH
mov tl0,T0L
MOV PCK,#00000110B
SETB EA;打开所有中断
SETB ET0;定时器允许中断
SETB TR0;定时器0开始计数
CLR TR1;定时器1禁止计数
SETB ET1;定时器1允许中断
RET
WORD11:
CLR EA
CLR ET0
CLR TR0
mov th0,TOH
mov tl0,T0L
MOV PCK,#00000101B
SETB EA;打开所有中断
SETB ET0;定时器允许中断
SETB TR0;定时器0开始计数
CLR TR1;定时器1禁止计数
SETB ET1;定时器1允许中断
RET
WORD12:
LCALL ADDV
MOV TODLT,TOH
LCALL JSW;计算各位的数值毫时大大约600个始周期
MOV A,TESTK
TSTK12:
LCALL KEYSC
CJNE A,TESTK,OUT12
JMP TSTK12
OUT12:
RET
WORD13:
LCALL SUBV
MOV TODLT,TOH
LCALL JSW;计算各位的数值毫时大大约600个始周期
MOV A,TESTK
TSTK11:
LCALL KEYSC
CJNE A,TESTK,OUT11
JMP TSTK11
OUT11:
RET
WORD14:
CLR ET0;使能定时器0中断
CLR ET1;使能定时器1中断
CLR EA;使能总中断
CLR TR1;关闭T1计时
CLR TR0;关闭T0计时
MOV PCK,#00H
MOV BW,#7DH
MOV SHW,#7DH
MOV GW,#77H
RET
WORD15:JB EA,MID15
MOV BWS,#0
MOV SHWS,#0
MOV GWS,#0
JMP OUT15
MID15:
CLR EA
MOV A,TESTK
TSTK15:
LCALL KEYSC
CJNE A,TESTK,OUT15
JMP TSTK15
MOV TODLT,TOH
LCALL JSW;计算各位的数值毫时大大约600个始周期
OUT15:
SETB EA
RET
;***********************计算各个代码******************************
JSEHW:
MOV SZ,BWS
ACALL js
MOV BW,xsm
MOV SZ,SHWS
ACALL js
MOV SHW,xsm
MOV SZ,GWS
ACALL js
MOV GW,xsm
RET
js:
mov a,sz
js0:cjne a,#0,js1
mov xsm,#7dh
js1:cjne a,#1,js2
mov xsm,#14h
js2:cjne a,#2,js3
mov xsm,#6eh
js3:cjne a,#3,js4
mov xsm,#3eh
js4:cjne a,#4,js5
mov xsm,#17h
js5:cjne a,#5,js6
mov xsm,#3bh
js6:cjne a,#6,js7
mov xsm,#7bh
js7:cjne a,#7,js8
mov xsm,#00011100B
js8:cjne a,#8,js9
mov xsm,#7fh
js9:cjne a,#9,js10
mov xsm,#3fh
js10:ret
;***************************计算各位的数值毫时大大约600个始周期**************************************
JSW:;(R2R3R4/R7)=(R2)R3R4 余数R7
MOV R2,#0
MOV R3,TODHT
MOV R4, TODLT
MOV R7,#100
LCALL NDIV31
MOV BWS,R4
MOV A,R7;
MOV R4,A
MOV R3,#0
MOV R2,#0
MOV R7,#10
LCALL NDIV31
MOV SHWS,R4
MOV GWS,R7
RET
;***************************计算十进制结果****************************
JSTIM:
MOV TODL,#0
MOV TODH,#0
MOV A,GWS
MOV B,#1
ACALL JSHL
MOV A,SHWS
MOV B,#10
ACALL JSHL
MOV A,BWS
MOV B,#100
ACALL JSHL
RET
JSHW:
JB OV,JSGW
CLR OV
RET
JSGW:
INC TODH;TEST DATE
RET
JSHL:
MUL AB
MOV R1,B
ADD A,TODL
MOV TODL,A
MOV A,B
ADDC A,TODH
MOV TODH,A
ACALL JSHW
RET
;*****************************单字节的除法*********************
;****************************(R2R3R4/R7)=(R2)R3R4 余数R7
NDIV31 :MOV A,R2
MOV B,R7
DIV AB
MOV R2,B
MOV B,#10H
NDV311 :CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV F0,C
CLR C
SUBB A,R7
JB F0,NDV312
JC NDV313
NDV312 :MOV R2,A
INC R4
NDV313 :DJNZ B,NDV311
CLR OV
JZ NDV314
SETB OV
NDV314 :XCH A,R2
MOV R7,A
RET
;*******************双字节减法***(R3R4-R6R7)=(R3R4)*******
NSUB :MOV A,R4
CLR C
SUBB A,R7
MOV R4,A
MOV A,R3
SUBB A,R6
MOV R3,A
RET
DELAY1:
MOV R5,#10
D1: MOV R6,#250
DJNZ R6, $
DJNZ R5,D1
RET
DELAY_BS:
MOV R5,#5
D2: MOV R6,#99
D3: MOV R7,#99
DJNZ R7, $
DJNZ R6,D3
DJNZ R5,D2
RET
;*****************************显示器显示子程序***********************************
DISPLAY:
MOV DPTR,#7F01H;
MOV A, BW;
MOVX @DPTR,A
MOV DPTR,#7F03H; c地址
MOV A, #00011000B;C口输出片选号灯
MOV R0,PCK;pck=********
ORL A,R0;a=***11***
MOV R0,#00011111B;a=00011***
ANL A,R0
MOVX @DPTR,A
ACALL D_40ms
MOV DPTR,#7F01H;
MOV A, SHW;
MOVX @DPTR,A
MOV DPTR,#7F03H; c地址
MOV A,#00101000B
ORL A,R0
MOV R0,#00101111B
ANL A,R0
MOVX @DPTR,A
ACALL D_40ms
MOV DPTR,#7F01H;
MOV A, GW;
MOVX @DPTR,A
MOV DPTR,#7F03H; c地址
MOV A, #00110000B;C口输出片选号灯
ORL A,R0
MOV R0,#00110111B
ANL A,R0
MOVX @DPTR,A
ACALL D_40ms
mov a,#0ffh
MOVX @DPTR,A
RET
D_40ms:
MOV R7,#10
DELAYBB:
MOV R6,#10
NOP
DELAYNN:
DJNZ R6,DELAYNN; 2X198+2=398
DJNZ R7,DELAYBB; (398+2)X200+1=80ms
RET
;****************************各个位移位自程序***************************
MOVE:
MOV A,SHWS
MOV BWS,A
MOV A,GWS
MOV SHWS,A
RET
END
用C51比较简单,容易实现。
multisim如何设计一个简单的单片机呢?
1、在网上查找电路图:当Multisim中没有某个芯片时,可以在互联网上搜索该芯片的电路图。许多芯片的电路图都可以在厂商的官方网站或其他电子设计社区中找到。找到电路图,可以将其导入Multisim中,以便进行仿真和设计。2、添加替代芯片:Multisim中没有特定的芯片,可以寻找与之相同或相似功能的芯片,将其添...
如何自己做一个最简单的单片机?希望各位大神能把制作要用的元器件的个...
复位电路:上电复位对于单片机来说是必不可少的,复位电路只需要一个10uf电解电容以及一个10k下拉电阻,如果测试时需要手动复位的机制可以加一个轻触开关,RST端接单片机的RST引脚即可,电路图如下:晶振电路:晶振电路也很简单,即一个无源晶体振荡器加上两个起振电容,起振电容的大小根据晶振的频率决定,...
请教一个简单的单片机电路设计
发光二极管按照点阵方式排列既可以,通过点阵方式连接编程控制点亮,否则单片机管脚不够用,也可以用三极管放大电流串联,不过100多个LED个人感觉不怎么好。发声装置要编程,查一下每个音调频率,然后组合成音乐即可,主要还是要编程。开关接单片机的外部中断,图案的亮灭只要在程序中控制就好,当音调改变时候给LED...
下面是一个单片机设计的部分电路图,求讲解什么意思?
第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。第7~14脚:D0~D7为8位双向数据端。第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。图中的4到14脚只有标签没线的,表示连接到单片机上对应标签的引脚。
用单片机设计制作一个模拟的十字路口交通信号灯控制系统。
独立式实际上就是一组独立的按键,这些按键可直接与单片机的I\/O口连接,即每个按键独占一条口线,这种接法简单。矩阵式键盘也称行列式键盘,因为键的数目较多,所以键按行列组成矩阵。本设计中键盘数目较少,且为安装方便,因此在本设计中采用独立式接法。 按从一个键到键的功能被执行主要应包括两项工作:一是键的识别...
如何用单片机做一个简单的倒计时器?
TMOD=0X11;\/\/选择为定时器0模式,工作方式1,仅用TR0打开启动。TH0=0Xd8;\/\/给定时器赋初值,定时10ms TL0=0Xf0;ET0=1;\/\/打开定时器0中断允许 EA=1;\/\/打开总中断 TR0=1;\/\/打开定时器-->启动定时器中断!ET1=1;TR1=1;TH1=(65536-250)\/256; \/\/FC TL1=(65536-250)%256;} \/ 函...
单片机简易电子琴程序
1. 实验任务 (1. 由4X4组成16个按钮矩阵,设计成16个音。 (2. 可随意弹奏想要表达的音乐。 2. 电路原理图 图4.22.1 3. 系统板硬件连线 (1. 把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上; (2. 把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4...
用单片机设计一个时钟,可显示时和分,可以调时间,也要有闹钟功能,要有设...
tmp=tmp<<1;} void main( ){ unsigned char z,s=00,m=00,h=00;给时钟初始值 while(1){ for(z=0;z<100;z++){ tmp=0x01;P2=tab[h\/10];小时显示 disp();P2=tab[h%10];disp();P2=tab[m\/10];分钟显示 disp();P2=tab[m%10];disp();P2=tab[s\/10];秒显示 disp();P2=...
1.设计单片机最小系统(其具体到器件) 2.写出硬件的工作原理 画出软件...
单片机:一片AT89S51\/52或其他51系列兼容单片机 特别注意:对于31脚(EA\/Vpp),当接高电平时,单片机在复位后从内部ROM的0000H开始执行;当接低电平时,复位后直接从外部ROM的0000H开始执行.这一点是初学者容易忽略的.复位电路:一、复位电路的用途 单片机复位电路就好比电脑的重启部分,当电脑在使用中出现...
设计一个单片机输入显示系统,要求每按一下按键数码管显示数据加1(数码...
设计一个单片机输入显示系统,要求每按一下按键数码管显示数据加1(数码管初始值为0,9加1 后显示0)。 我来答 1个回答 #活动# 《请回答2022》答题瓜分现金奖池 好学者百科 2022-12-14 · 百度认证:北京惠企网络技术有限公司官方帐号 好学者百科 科技生活门户网站,探索发现百科全书。 向TA提问 关注 ...
王管二陈: 下面是我以前用来显示9999秒倒计时的原程序,仅供学习,版权所有,侵权不究. #include <REGX51.H> #include <./stdint.h> #include <ABSACC.H> #include<AT89X51.H> #include <INTRINS.H> //------------------------------ #define TH_10MS (...
鹿泉市19618287055: 怎么利用51单片机做一个简单计算器? - ?
王管二陈: 你是要程序?自己写吧,又不难,用C语言写+、-、*、%不就可以,用lcd1602显示就行
鹿泉市19618287055: 求一个基于51单片机的计算器程序 - ?
王管二陈: /QQ 296750363 按键...
鹿泉市19618287055: 求一个用51单片机结合数码管和举证键盘做的一个C语言的计算器 不用有小数点 只要普通加减乘除四则运 - ?
王管二陈: 用51单片机结合数码管和距阵键盘做一个计算器,用proteus仿真来做比较容易实现,还有一个现成的计算器用的矩阵按键,正好有+ - * ÷ 四个按键,很漂亮.再用一个8位一体的共阴数码管显示,就是一个不错的计算器.仿真图如下.
鹿泉市19618287055: 我想用51单片机,矩阵键盘,lcd1602写个简易计算器程序?
王管二陈: C语言的语句可以这样写 #include<stdio.h> void main() { float fxx; unsigned char str[10]; fxx = 12.5; sprintf(str,"%8.2f\n",fxx); //将12.5转换成8.2(2位小数)格式以ASCII方式存储到str字符串中 .......... } 由于1620液晶模块支持ASCII码,所以只要将str中的内容送到1602就行了.至于1602的操作我就不写了(其实我也没用过,但知道怎么用,应该不难)
鹿泉市19618287055: 51单片机做简易计算器 - ?
王管二陈: hex就是十六进制的代码 你完全可以用代码转换写成汇编啊 或者直接反汇编做成bin文件
鹿泉市19618287055: 利用51单片机制作LCM显示的简单计算器程序 C的 - ?
王管二陈: 楼主,我给你一个代码,你参考一下和验证一下! 用51单片机做的简单计算器的程序./**********************按键处理*******************/void KeyDeal(unsigned char Key){ if(Key!=0) //判断 有无按键按下.{switch(Key) { //以下定义0~9的数字...
鹿泉市19618287055: 我在用51单片机设计简易计算器,目前只能进行最大五位正整数的加减乘除的运算.怎样才能设计出负数运算 - ?
王管二陈: 一种方法,所有数据均按正整数计算,正负号单独处理,如两个数相减,先判断是被减数大,还是减数大,如果减数大,则将减数和被减数对调后相减,结果前面加负号,乘除法,则异号相乘除,结果为负 另一种方法,直接利用C语言的库函数,数据类型按浮点型进行计算,结果是有正负和小数的,然后将其转化为字符串进行显示即可
鹿泉市19618287055: 用51单片机制作简易计算器要那些器材??
王管二陈: LED或LCD屏,按键,外观看你,一片51芯片,晶振,电路板,导线若干,焊接用的东西,编程器,电脑,够全得了.
鹿泉市19618287055: 求51单片机,用1602lcd显示的简易计算器的程序.除了加减乘除,还要有开平方和平方的 - ?
王管二陈: 电路图:把8位数据线接到单独一个P*口上,其他CS,RS,WR,RD分别接到另一个数据口上,再就是电源和地接上.程序:需要你提供IC型号的,不同的IC指令不同