实验23
NE555硬件振荡器计数实验
利用NE555可以组成相当多的应用电路,甚至多达数百种应用电路,在各类书刊中均有介绍,例如家用电器控制装置、门铃、报警器、信号发生器、电路检测仪器、元器件测量仪、定时器、压频转换电路、电源应用电路、自动控制装置及其它应用电路都有着广泛的应用,这是因为NE555巧妙地将模拟电路和数字电路结合在一起的缘故。在本机中组成一个硬件振荡器,通过W2调节输出频率。由JP80输出,可以给单片机做计数实验。
NE555的外形图:

相关原理:

程序运行的照片:

1、接8位数码管的数据线。将数码管部份的数据口
JP5接到CPU部份的P0口JP51.
2、接8位数码管的显示位线。将数码管部份的显示位口
JP8接到CPU部份的P2口JP52.
3、用一条1PIN线连接555部分的JP80和CPU部分的P3.5
程序流程图:

汇编语言参考程序:
a_bit equ 20h ;个位寄存器
b_bit equ 21h ;10位寄存器
c_bit equ 22h ;百位寄存器
d_bit equ 23h
e_bit equ 24h
f_bit equ 25h
org 0000h
ajmp star
org 0080h
star: ;初始化把所有的位全部清零
mov a,#00h
mov a_bit,a
mov b_bit,a
mov c_bit,a
mov d_bit,a
mov e_bit,a
mov f_bit,a
stlop: acall display ;调用显示
jb p3.5,stlop ;监测键盘,如果p3.2按下那么执行显示
we: acall display ;显示保持!
acall d1ms ;延时1ms避免键盘误动作
jnb p3.5,we ;如果p3.2还没有放开继续延时
count: ;计算数据部分
inc a_bit ;个位加1
mov a,a_bit
cjne a,#10,stlop ;如果在10以内显示
mov a_bit,#00h ;如果到了10则清除
inc b_bit ;10位加1
mov a,b_bit
cjne a,#10,stlop ;如果在10以内显示
mov b_bit,#00h ;如果到了10则清除
inc c_bit ;百位加1
mov a,c_bit
cjne a,#10,stlop
mov c_bit,#00h
inc d_bit
mov a,d_bit
cjne a,#10,stlop
mov d_bit,#00h
inc e_bit
mov a,e_bit
cjne a,#10,stlop
mov e_bit,#00h
inc f_bit
mov a,f_bit
cjne a,#10,stlop
mov f_bit,#00h
ajmp stlop
display: ;显示
mov dptr,#numtab ;送数据表
mov a,a_bit ;送个位数据
MOVC A,@A+DPTR ;查表
mov p0,a ;送p0口显示
clr p2.6 ;选中第一个数码管
acall d1ms ;显示1ms
setb p2.6 ;关闭显示
mov a,b_bit ;送10位数据
MOVC A,@A+DPTR ; 查表
mov p0,a ;送p0口显示
clr p2.5 ;选中第二个数码管
acall d1ms ;显示1ms
setb p2.5 ;关闭显示
mov a,c_bit
MOVC A,@A+DPTR
mov p0,a
clr p2.4
acall d1ms
setb p2.4
mov a,d_bit
MOVC A,@A+DPTR
mov p0,a
clr p2.3
acall d1ms
setb p2.3
mov a,e_bit
MOVC A,@A+DPTR
mov p0,a
clr p2.2
acall d1ms
setb p2.2
mov a,f_bit
MOVC A,@A+DPTR
mov p0,a
clr p2.1
acall d1ms
setb p2.1
ret
D1MS: ;数码管延时
MOV R7,#2
DJNZ R7,$
RET
;数码管代码表
numtab: db
28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h
;0 1 2 3 4 5 6 7 8 9
end
c语言参考程序:
#include <AT89X55.H>
#include <string.h> //头文件
#include<intrins.h>
#define uchar unsigned char //宏定义,为方便编程
#define uint unsigned int
#define SELECT P2 //宏定义,将P2口定义为数码管选择位
#define DIGI P0
uchar
digivalue[]={0x28,0x7e,0x0a2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60};
//显示的数字数组,依次为0,1,..,9
uchar
gewei=0,shiwei=0,baiwei=0,qianwei=0,wanwei=0;
//定义位变量
uint num=0;
void delay() //跳变延迟函数
{
uchar ii=250;
while(ii--);
}
void init()
{
TMOD=0x50;
TH1=0xff;
TL1=0xff;
TR1=1;
ET1=1;
EA=1;
}
void display()
{
if(num>65500)
num=0;
wanwei=num/10000; //位之间的关系
qianwei=num%10000/1000;
baiwei=num%1000/100;
shiwei=num%100/10;
gewei=num%10;
SELECT=0x7f; //个位数码管位选择
DIGI=digivalue[gewei];
delay();
SELECT=0xbf;
DIGI=digivalue[shiwei];
delay();
SELECT=0xdf;
DIGI=digivalue[baiwei];
delay();
SELECT=0xef;
DIGI=digivalue[qianwei];
delay();
SELECT=0xf7;
DIGI=digivalue[wanwei];
delay();
SELECT=0xfb;
DIGI=digivalue[0];
delay();
SELECT=0xfd;
DIGI=digivalue[0];
delay();
SELECT=0xfe;
DIGI=digivalue[0];
}
char code SST516[3] _at_ 0x003b; //仿真器入口
main()
{
init(); //初始化串口,并打开接收与发送
while(1)
{
display();
}
}
void timer1(void) interrupt 3
{
TH1=0xff;
TL1=0xff;
num+=1;
} |