流水灯.docx
- 文档编号:27996806
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:27
- 大小:277.82KB
流水灯.docx
《流水灯.docx》由会员分享,可在线阅读,更多相关《流水灯.docx(27页珍藏版)》请在冰豆网上搜索。
流水灯
汇编语言程序:
BITSEQU20H
TENEQU21H
TEMPEQU22H
START:
MOVTEMP,#0
STLOP:
ACALLDISPLAY;调用显示子程序
INCTEMP;计数器加1
MOVA,TEMP;
CJNEA,#100,NEXT;判断计数器是否满100
MOVTEMP,#0;满100清零从新开始
NEXT:
LJMPSTLOP;不满就循环执行
DISPLAY:
MOVA,TEMP;将TEMP中的十六进制数转换成十进制
MOVB,#10;
DIVAB
MOVTEN,A;十位在A
MOVBITS,B;个位在B
MOVDPTR,#NUMTAB;指定查表起始地址
MOVR0,#4;
DPL1:
MOVR1,#250;
DPLOP:
MOVA,BITS;取个位数
MOVCA,@A+DPTR;查个位的7段数码管
MOVP1,A;送出个位的7段代码
CLRP2.0;开个位显示
ACALLDELAY1ms;显示162ms
SETBP2.0;关闭个位显示
MOVA,TEN;取十位显示
MOVCA,@A+DPTR;查十位数的7段代码
MOVP1,A;送出十位的7段代码
CLRP2.1;开十位显示
ACALLDELAY1ms;显示162ms
SETBP2.1;关闭十位显示
DJNZR1,DPLOP
DJNZR0,DPL1
RET
DELAY1ms:
MOVR7,#80
DJNZR7,$
RET
NUMTAB:
DB03fh,006H,05bH,04fH,066H,06dH,07dH,007H,07fH,06fH,077H,07cH,039H,05eH,079H,071H
end
C语言程序:
#include
unsignedintdulatable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
voiddelay(unsignedintz);
voidmain()
{
unsignedintx,z,l;
while
(1)
{
for(x=0;x<10;x++)
{
for(z=0;z<10;z++)
{
for(l=0;l<10;l++)
{P2=0xfe;
P1=dulatable[z];
delay
(1);
P2=0xfd;
P1=dulatable[x];
delay
(1);
}
}
}
}
}
voiddelay(unsignedintz)
{
unsignedinty;
for(;z>0;z--)
for(y=1000;y>0;y--);
}
实验一:
流水灯实验
51单片机,P1口外接8个发光二极管,共阴极接法,如图所示。
要求分别用C语言和汇编语言编写程序,实现如下功能:
P1.0亮,其余全灭;然后p1.1亮其余全灭;再P1.2亮其余全灭;再P1.3亮其余全灭;如此向下,直到P1.7亮其余全灭。
之后再P1.0亮其余全灭,循环不停。
(采用基本的延时程序即可,延时时间自定,不需要采用定时器)
汇编语言:
ORG0000H
LJMPMAIN
ORG0030H
main:
lp:
movP1,#00000001B
lcalldelay
movP1,#00000010B
lcalldelay
movP1,#00000100B
lcalldelay
movP1,#00001000B
lcalldelay
movP1,#00010000B
lcalldelay
movP1,#00100000B
lcalldelay
movP1,#01000000B
lcalldelay
movP1,#10000000B
lcalldelay
sjmplp
delay:
movr7,#90h
del1:
movr6,#0ffh
del0:
nop
nop
djnzr6,del0
djnzr7,del1
ret
end
C语言:
#include
#include
voiddelay(intx)
{inti;
while(x--)
for(i=0;i<148;i++);
}
voidmain()
{inti,a;
while
(1)
{a=0x01;
for(i=0;i<8;i++)
{P1=a;
a=_crol_(a,1);
delay(200);
}
}
}
实验二:
外部中断触发实验
51单片机,P2口外接8个发光二极管,共阳极接法,如图所示。
要求分别用C语言和汇编语言编写程序,实现如下功能:
主程序里让所有二极管全亮。
一旦外部中断0端口有低电平触发,则让P2.0、P2.2,P2.4,P2.6熄灭,并维持一段时间。
之后再回到主程序,点亮所有的二极管。
(维持时间才有普通延时即可,时间自定,不需要采用定时器。
)
C语言:
#include
voiddelay(unsignedy);
voidmain()
{EA=1;
EX0=1;
while
(1)
P2=0x00;
}
voidexter0()interrupt0
{P2=0x55;
delay(500);
}
voiddelay(unsignedy)
{intz;
for(;y>0;y--)
for(z=0;z<1000;z++);
}
汇编语言:
ORG0000H
LJMPMAIN
ORG0003H
LJMPINT
ORG0030H
MAIN:
SETBEA
SETBEX0
MOVP1,#00H
LJMPMAIN
INT:
MOVP1,#55H
CALLDELAY
RETI
DELAY:
MOVR7,#60
DL1:
MOVR5,#60
DL2:
MOVR6,#248
DJNZR6,$
DJNZR5,DL2
DJNZR7,DL1
RET
END
实验三:
定时器中断实验
51单片机,P2口外接8个发光二极管,4个共阳极接法,4个共阴极接法,如图所示。
要求分别用C语言和汇编语言编写程序,实现如下功能:
让P2.0—P2.3四盏灯亮,而P2.4—P2.7四盏灯灭;间隔1秒钟后,P2.0—P2.3四盏灯灭,而P2.4—P2.7四盏灯亮;间隔1秒钟后,P2.0—P2.3四盏灯亮,而P2.4—P2.7四盏灯灭。
如此向下循环。
请采用定时器1完成上述功能。
C语言:
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharnum;
voidmain()
{
P2=0x00;
TMOD=0x00;
TH0=(8192-4607)/32;
TL0=(8192-4607)%32;
EA=1;
ET0=1;
TR0=1;
while
(1)
{
if(num==200)
{
num=0;
P2=~P2;
}
}
}
voidT0_time()interrupt1
{
TH0=(8192-4607)/32;
TL0=(8192-4607)%32;
num++;
}
汇编语言:
ORG0000H
LJMPMAIN
ORG001BH
LJMPTIME1
ORG0030H
MAIN:
MOVTMOD,#10H
MOVTH1,#3CH
MOVTL1,#0B0H
SETBTR1
LP:
MOVP2,#00H
LCALLTIME1
MOVP2,#0FFH
LCALLTIME1
SJMPLP
TIME1:
MOVR3,#14H
LP1:
MOVTH1,#3CH
MOVTL1,#0B0H
LP2:
JBCTF1,LP3
SJMPLP2
LP3:
DJNZR3,LP1
RET
END
实验四:
点阵模块实验
下图为8*8点阵内部结构及引脚图
内部结构
引脚图
51单片机与8*8点阵的连接关系如下,请用C语言编程,显示静态的数字2.3.4.。
。
。
9中的一个,至于哪一个,自己确定。
实验报告中要附上实验结果图片,即证明你的确调试出来了结果。
51单片机与点阵模块的接线图。
C语言:
#include
voiddelay(intx)
{inty=5;
for(;x>0;x--);
for(;y>0;y--);
}
voidmain()
{
while
(1)
{
P1=0xdf;
P2=0x72;
delay
(2);
P1=0xef;
P2=0x52;
delay(2;
P1=0xf7;
P2=0x52;
delay
(2);
P1=0xfb;
P2=0x52;
delay
(2);
P1=0xfd;
P2=0x5e;
delay
(2);
}
}
数字电压表
1.实验任务
利用单片机STC89C52与ADC0809设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码显示。
2.现有元件
模数转换器ADC0804,STC89C52单片机,两个共阳极数码管。
3.硬件设计
3.1模数转换器ADC0809与单片机STC89C52的连接
(1)ADC0809规格及引脚分配图如下图3-1所示:
图3-1ADC0809引脚图
(2)STC89C52各个引脚分布如下图3-2所示:
图3-2STC89C52引脚图
(3)硬件连线
(a)把“单片机系统”区域中的P3.0与”模数转换模块ADC0809“区域中的ST端子用导线相连接。
(b)把“单片机系统”区域中的P3.1与”模数转换模块ADC0809“区域中的ALE端子用导线相连接。
(c)把“单片机系统”区域中的P3.2与”模数转换模块ADC0809“区域中的OE端子用导线相连接。
(d)把“单片机系统”区域中的P3.6与”模数转换模块ADC0809“区域中的EOC端子用导线相连接。
(e)把“单片机系统”区域中的P3.7与”模数转换模块ADC0809“区域中的CLK端子用导线相连接。
(f)把“模数转换模块ADC0809”区域中的ADDA、ADDB、ADDC端子用导线连接到单片机的VCC端子上。
把“模数转换模块ADC0809”区域中IN7与外接输入电压相连。
(g)把“单片机系统”区域中的P2.0-P2.7连接到“模数转换模块ADC0809”区域中D0D1D2D3D4D5D6D7端子上。
(h)把“单片机系统”区域中的P1.0-P1.7连接到“数码管”区域中ABCDEFG端子上。
把“单片机系统”区域中的P0.0-P0.1连接到“数码管”区域中12端口。
4.电路原理图
图4电路原理图
5.程序设计内容
由于ADC0809在进行A/D转换时需要CLK信号,而此时ADC0809的CLK是接在单片机的P3.7口,也就是要求从P3.7输出CLK信号供ADC0809使用。
因此产生CLK信号的方法就要用软件来产生。
6.C语言源程序
#include
sbitALE=P3^1;
sbitST=P3^0;
sbitEOC=P3^2;
sbitOE=P3^6;
sbitCLK=P3^7;
sbitwexuan1=P0^0;
sbitwexuan2=P0^1;
//sbitIN1=P0^5;
//sbitIN2=P0^6;
//sbitIN3=P0^7;
unsignedintcodetable[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90};//段码表
unsignedintn=0,flag1=1;flag=1,ad_data,num1=0,num2=0;
voiddelay(xms)
{
unsignedintx,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
voiddisplay()//2位数码管显示
{
floata;
a=(float)ad_data/256*5*1000;
num1=(int)a/1000;
num2=(int)a/100-num1*10;
P1=table[num1];
wexuan1=1;
delay
(1);
wexuan1=0;
P1=0xff;
P1=0x7f;//小数点
wexuan1=1;
delay
(1);
wexuan1=0;
P1=0xff;
P1=table[num2];
wexuan2=1;
delay
(1);
wexuan2=0;
P1=0xff;
}
voidinit()
{
ST=0;
ALE=0;
OE=0;
CLK=0;
//_EOC=1;
TMOD=0x12;IP=0x09;
TH0=(65536-22)/256;
TL0=(65536-22)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;
ET0=1;ET1=1;
TR0=1;TR1=1;
EX0=1;//打开外部中断
IT0=1;//从高到低的负跳变有效
P0=0x00;
}
voidstart()//inta,intb,intc)//选择通道
{
//IN1=a;IN2=b;IN3=c;
ALE=0;ALE=1;
ST=0;ST=1;
ALE=0;ST=0;
display();
delay(10);
}
intread()
{
unsignedintdat;
P2=0xff;
OE=1;
display();
dat=P2;
OE=0;
return(dat);
}
voidmain()
{
init();
while
(1)
{ST=0;
ST=1;
ST=0;
if(n==20)
{
flag=1;
//display();
//start();
//while(EOC==0);//转换结束(EOC=1)读出数据后显示
//_EOC=0;
ad_data=read();
flag=0;
display();
//
n=0;
//display();
//_EOC=1;
}
display();//显示的是if中的电压值
}
}
voidINTR_0()interrupt0
{
while
(1){
ad_data=read();
flag=0;
display();}
}
voidtimer0()interrupt1//输出500kHz方波
{
CLK=~CLK;
}
voidtimer1()interrupt3
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
n++;
flag1=0;
}
#include
#defineucharunsignedchar
uchartab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};
ucharnub[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7e,0x81,0x81,0x81,0x81,0x7e,0x00,
0x00,0x01,0x41,0x41,0xff,0x01,0x01,0x00,
0x00,0x41,0x83,0x85,0x89,0x91,0x61,0x00,
0x00,0x42,0x81,0x91,0x91,0x91,0x6e,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
ucharr_cnt,l_cnt,numb,tcount;
voidint_t0()interrupt1
{TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
P1=tab[r_cnt];
P2=nub[numb];
numb++;
r_cnt++;
if(r_cnt==8)
{r_cnt=0;
numb=l_cnt;}
tcount++;
if(tcount==40)
{tcount=0;
l_cnt++;
if(l_cnt==40)
l_cnt=0;
else
numb=l_cnt;
}
}
main()
{
l_cnt=0;
r_cnt=0;
numb=0;
tcount=0;
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
IE=0x82;
while
(1);
}
R_CNTEQU31H;列码R_NCT=31H单元
NUMBEQU32H;行码NUMB=32H单元
TCOUNTEQU33H;拉幕计数值TCOUNT=33H单元
ORG00H;程序起始地址
LJMPSTART
ORG0BH;中断入口地址
LJMPINT_T0
ORG30H;子程序入口地址
START:
;主程序开始
MOVR0,#00H;每列的行码起始序号置0
MOVR_CNT,#00H;列:
初值00送到31H单元
MOVNUMB,#00H;行:
初值00送到32H单元
MOVTCOUNT,#00H;计数单元初值置0
MOVTMOD,#01H;计数定时器选用16位的计数器,工作在方式1
MOVTH0,#(65536-5000)/256;定时5ms。
定时器高位初值为236
MOVTL0,#(65536-5000)MOD256;定时器低位初值为120
SETBTR0;启动C/T的定时器T0
MOVIE,#82H;CPU开中断
SJMP$;中断等待
INT_T0:
MOVTH0,#(65536-5000)/256;定时5ms,设置定时器T0高位初值为236
MOVTL0,#(65536-5000)/256;定时器T0低位初值为120
MOVDPTR,#TAB;读列码表首地址,放入DPTR
MOVA,R_CNT;读列码偏移地址,放入A中
MOVCA,@A+DPTR;基址变址寻址将寻到的列码数据放入A中
MOVP1,A;将列码数据送P3口输出
MOVDPTR,#NUB;装入显示数据的地址
MOVA,NUMB;显示幕次的偏移地址
MOVCA,@A+DPTR;寻到数据的行码地址
MOVP2,A;将该地址值输出
INCNUMB;行码地址加1
NEXT1:
INCR_CNT;扫描列码地址加1
MOVA,R_CNT;把列地址放入A中
CJNEA,#8,NEXT2;A不等于8,转子程序NEXT2,否则往下执行
MOVR_CNT,#00H;就把列码置0
MOVNUMB,R0;行码地址送存储单元格中
NEXT2:
INCTCOUNT;拉幕计数序号加1
MOVA,TCOUNT;将幕次序号送A中
CJNEA,#40,NEXT4;此序号不等于40转Next4,否则往下执行
MOVTCOUNT,#00H;把拉幕时序归0
INCR0;行码起始地址加1
CJNER0,#40,NEXT3;行码自加次数不满11字符×8行/字符=88行就转Next3
MOVR0,#00H;不然就把行码置0
NEXT3:
MOVNUMB,R0;送新的一幕行码起始位给R0
NEXT4:
RETI;中断返回
TAB:
;列码码表
DB7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH;列扫描从右至左
NUB:
;行码码表,字符数据
DB00H,00H,00H,00H,00H,00H,00H,00H;NULL
db00h,7eh,81h,81h,81h,81h,7eh,00h;0
db00h,01h,41h,41h,0ffh,01h,01h,00h;1
db00h,41h,83h,85h,89h,91h,61h,00h;2
db00h,42h,81h,91h,91h,91h,6eh,00h;3
DB00H,00H,00H,00H,00H,00H,00H,00H;NULL
END
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 流水