}
}
}
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
GPIO_DIG=DisplayData[i];//发送段码 j=10;
//扫描间隔时间设定
while(j--);
GPIO_DIG=0x00;//消隐
4、实验连线
将程序下载到单片机中,可以看到各数码管按照顺序从0~F依次显示,实验完成。
30
动态数码管实验
31
实验七NE555脉冲发生器
一、实验目的
1.学习了解ne555用作定时器构成的时基电路。
2.通过学习ne555内部结构以及单片机定时/计数器功能编写相关程序。 4.再次熟悉使用1602液晶显示器。
二、实验要求
编写相关程序,使得在1602显示脉冲频率,调节电位器可改变频率。
三、实验内容
1、 ne555定时器
ne555的内部结构可等效成23个晶体三极管.17个电阻。两个二极管组成了比较器、RS触发器。等多组单元电路。特别是由三只精度较高5k电阻构成了一个电阻分压器。为上、下比较器提供基准电压.所以称之为555。 ne555属于cmos工艺制造。
由555定时器和外接元件R1、R2、C构成多谐振荡器,脚2与脚6直接相连。电路没有稳态,仅存在两个暂稳态,电路亦不需要外接触发信号,利用电源通过R1、R2向C充电,以及C通过R2向放电端Dc放电,使电路产生振荡。电容C在2/3Vcc和1/3Vcc之间充电和放电,从而在输出端得到一系列的矩形波,对应的波形如图7-1所示。
图7-1 ne555定时器的电路结构与震荡波形图
32
2、程序设计
1) NE555:out →P3.5 —— T1的输入端 作为计数器输入
定时器T1做计数器,工作方式1(16位定时器),由TR1打开计数器
2) 每1秒内,输入脉冲的个数 —— 由T0提供时间基准
定时器T0做定时器,工作方式1(16位定时器),由TR0打开定时器 ——TMOD=0x51;
3) //--设置定时器T0的初值:例如晶振为12MHZ时定时50ms,需要20倍频
输出--//
TH0=0x3C; TL0=0xB0;
4) //开放中断、定时器T0、计数器T1 5) 中断函数void Timer0() interrupt 1 {}
——提供倍频、1秒时间到的信息。如果1秒时间到,则提供主函数的计算/显示频率的标识:例如用TR0=0信号//停止定时器
6) 中断函数void Timer1() interrupt 3 {}
——计数到65536,未到计算频率的时机,脉冲数+65536
7) 主函数扫描标识TR0:计算/显示频率。 3、程序代码 #include
#define uchar unsigned char #define uint unsigned int #define ulong
unsigned long
HZ\
//--声明全局函数--//
void TIMER_Configuration(); //初始化定时器
//--定义全局变量--//
ulong Freq; //用来存放要显示
//--定义LCD显示的文字--// uchar
code
EN_CHAR1[16]={\ 的频率值
ulong TimeCount; //用于计算1S钟的
CYMOMETER \
uchar code EN_CHAR2[16]={\ void main()
33
{
//--显示要写的字母--// for(i=0;i<16;i++) { }
LcdWriteData(EN_CHAR1[i]);
uchar i, freqValue[6]; LcdInit();
TIMER_Configuration();
freqValue[0]='0'+Freq00000/10
0000;
freqValue[1]='0'+Freq0000/100
00;
freqValue[2]='0'+Freq000/1000;
freqValue[3]='0'+Freq00/100;
freqValue[4]='0'+Freq0/10;
//--显示求得的数值--// for(i=0;i<5;i++)//从最高位
freqValue[5]='0'+Freq;
LcdWriteCom(0xc0);//第二行显示 for(i=0;i<16;i++) { } while(1) {
if(TR0==0) //当计数LcdWriteData(EN_CHAR2[i]);
开始查找不为0的数开始显示(最低位为0显示0)
{
if(freqValue[i]==0x30) {
freqValue[i]=0x20;
器停下的时候,表明计数完毕
{
Freq = Freq + TL1;
34
//读取TL的值
Freq = Freq + (TH1 * 256);
//若为0则赋值空格键
} else {
break;
//读取TH的值
LcdWriteCom(0xc8); //--求频率的个十百千万
十万位--//