数码管动态扫描实验
一、实验目的
学习计数器的设计、分析合测试方法。
学习硬件扫描显示电路的设计方法。
二、实验仪器
1、PC机
2、SW-51PROC单片机综合实验平台
三、实验内容
编写一段程序,用单片机P0口和P2口的I/O输出去控制8位的数码管显示,实现如下功能:使数码管上显示1、2、3、4、5、6、7、8。
四、实验步骤:
1、用Protues设计数码管动态扫描显示电路;
2、在KeilC51中编写识别程序,通过后与Protues联合调试;
3、启动仿真,观察数码管显示是否正确;
4、用Protues设计脉冲计数电路,仿真调试、运行程序并查看效果。
五、电路设计及调试:
1、实验电路:
2、程序设计与调试:①实验程序:
【12345678】
#include<reg52.h>
#define uintunsigned int
#define ucharunsigned char
uchar codeDisplsy[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};
uchar codeTemble[]={0,1,2,3,4,5,6,7};
void delay(uint z)
{
uchar t;
while(z--) for(t=120;t>0;t--);
}
void main()
{
uchar i;
P0=0xff;
P1=0;
while(1)
{
if(i==8)
i=0;
P1=Temble[i];
P0=~Displsy[i+1];
i++;
delay(2);
}
}
【脉冲计时】
#include<reg52.h>
#define uintunsigned int
#define ucharunsigned char
uchar codeDisplay[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar codeTemble[]={0,1,2,3,4,5,6,7};
uchar Flag;
uint Num;
void delay(uint z)
{
uchar t;
while(z--) for(t=120;t>0;t--);
}
voidTest2(void)
{
TR1 = 1;
while(1)
{
Num = TH1;
Num = Num << 8;
Num |= TL1;
P1 = 7;
P0 = ~Display[Num%10];
delay(3);
P1 = 6;
P0 = ~Display[Num%100/10];
delay(3);
P1 = 5;
P0 = ~Display[Num%1000/100];
delay(3);
P1 = 4;
P0 = ~Display[Num%10000/1000];
delay(3);
P1 = 3;
P0 = ~Display[Num%100000/10000];
delay(3);
P1 = 2;
P0 = ~Display[Num%1000000/100000];
delay(3);
P1 = 1;
P0 = ~Display[Num%10000000/1000000];
delay(3);
P1 = 0;
P0 = ~Display[Num%100000000/1000000];
delay(3);
}
}
void main()
{
TMOD = 0x50;
TH1 = 0x00;
TL1 = 0x00;
EA = 1;
ET1 = 1;
TR1 = 0;
while(1)
{
Test2();
}
}
②调试:
③实验结果:
1、数字1~8分别显示在8个数码管上,显示无闪烁。
2、定时/计数器T1统计脉冲的个数,统计结果动态实时的显示在数码管上。
七、实验总结
专业知识有一定的提高且提高我的综合能力以便在今后社会生活中不但要学会运用所学的知识来解决实际问题而且要不断的通过这次课程设计让我了解了MCS-C51在实际生活中的一些应用单片机步进电机电路的设计及工作原理。让我在学习单片机理论知识同时让我明白了要在实际生活中学会应用提高了我的动手能力要手脑并用。本次设计是通过使用PROTEL软件来进行设计让我熟悉的掌握了此软件的基本操作。本来有些遗忘的知识点通过查参考资料让我对旧的知识有所巩固同时也明白了原来疑惑的地方。让我的专业知识有一定的提高且提高我的综合能力以便在今后社会生活中不但要学会运用所学的知识来解决实际问题而且要不断的
第二篇:4数码管动态扫描显示
1.利用动态扫描方法在六位数码管上显示出稳定的87654321.
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code tablewe[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uint numdu,numwe,a;/*用uint 或int时只能65536-(1000~5000),用uchar和char则不会*/ void main()
{numdu=8;
numwe=0;
a=0;
EA=1;
ET1=1;
TR1=1;
TMOD=0x10;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
while(1)
{ if(a==1)
{a=0;
P0=tabledu[numdu];
numdu--;
if(numdu==0)
numdu=8;
P2=tablewe[numwe];
numwe++;
if(numwe==8)
numwe=0;
}
}
}
void time1() interrupt 3
{TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
a++;
}
2.用动态扫描方法和定时器0在数码管的前三位显示出秒表,精确到1%秒,即后两位显示1%秒,一直循环下去。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint temp,aa=0,bai,shi,ge; /*不能用uchar或char,可用uint或int*/
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void display(uchar bai,uchar shi,uchar ge);
void delay(uint z);
void init();
void main()
{
init();//初始化子程序
while(1)
{
display(bai,shi,ge);
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar bai,uchar shi,uchar ge)
{
P2=0x7f;
P0=table[bai]+0x80;
delay(5);
P2=0xbf;
P0=table[shi];
delay(5);
P2=0xdf;
P0=table[ge];
delay(5);
}
void init()
{
temp=0;
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
aa++;
if(aa==1) /*放主函数中达不到此效果*/
{
aa=0;
temp++;
if(temp==1000)
{
temp=0;
}
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
}
}
3、利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”。到此保持住。
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uint temp,c,aa=0,bb=0,shiwan,wan,qian,bai,shi,ge,flag=0,flag1=0; /*不能用uchar或char,可用uint或int*/
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x76,0x79,0x38,0x3f,0};
void display(uchar shiwan,uchar wan,uchar qian,uchar bai,uchar shi,uchar ge); void delay(uint z);
void init();
void main()
{
init();
while(1)
{if(flag1!=1)
display(7,6,5,bai,shi,ge);
else
display(16,17,18,18,19,20);
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar shiwan,uchar wan,uchar qian,uchar bai,uchar shi,uchar ge) {
P2=0x7f;
P0=table[shiwan];
delay(1);
P2=0xbf;
P0=table[wan];
delay(1);
P2=0xdf;
P0=table[qian];
delay(1);
P2=0xef;
P0=table[bai];
delay(1);
P2=0xf7;
P0=table[shi];
delay(1);
P2=0xfb;
P0=table[ge];
delay(1);
}
void init()
{ c=0xfe;
P3=c;
temp=432;
TMOD=0x11;
TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;
ET0=1;
TR0=1;
TH1=(65536-50000)/256; TL1=(65536-50000)%256; ET1=1;
TR1=1;
}
void timer0() interrupt 1 {
TH0=(65536-50000)/256; TL0=(65536-50000)%256; bb++;
if(flag!=1)
{if(bb==10) {
bb=0;
c=_crol_(c,1); P3=c;
}
}
else
{if(bb%4==0) P3=~P3; if(bb==60) {TR0=0; P3=0xff; flag1=1; }
}
}
void timer1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
aa++;
if(aa==2) {
aa=0;
temp--;
bai=temp/100;
shi=temp%100/10; ge=temp%10;
if(temp==398)
{
TR0=0;
TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1;
flag=1;
bb=0;
P1=0xff;
TR1=0;
} }
}