数字显示电子钟显示不全是怎么回事

数字显示电子钟显示不全是怎么回事,第1张

原因如下:

1、供电不足可能会产生显示不全或显示比划乱的现象。解决办法:换电池试试。

2、如果是液晶的,可能是导电橡胶接触不好。

3、如果是数码管的,则可能是数码管坏了或驱动电路坏了,要送去修理。

相关内容解释

电子钟亦称数显钟(数字显示钟) ,是一种用数字电路技术实现时、分、秒计时的装置,与机械时钟相比,直观性为其主要显著特点,且因非机械驱动,具有更长的使用寿命,相较石英钟的石英机芯驱动,更具准确性。

电子钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及车站、码头、剧院、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大地方便。相对于其他时钟类型,它的特点可归结为"两强一弱 ":比机械钟强在观时显著,比石英钟强在走时准确,但是它的弱点为显时较为单调。电子钟更为方便快捷,实用。

/============================================================
1602液晶显示DS1302时钟
=============================================================/
#include <AT89x51h>
#include <stringh>
#include < intrinsh >
#define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;
#define LCM_RW P2_1 //定义引脚
#define LCM_RS P2_0
#define LCM_E P2_2
#define LCM_Data P0
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
#define uchar unsigned char
sbit T_CLK=P1^0;
sbit T_IO =P1^1;
sbit T_RST=P1^2;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit LED=P1^4; //背光灯输出 (因本实验板无此功能 所以此项功能用P14LED灯作为指示)
sbit system=P3^2; //模式 对应实验板K1按键
sbit TimerUp=P3^3; //时间减 对应实验板K2按键
sbit TimerDown=P3^4; //时间加 对应实验板K3按键
sbit BEEP=P3^6; //蜂鸣器
void Set(uchar,uchar); //根据选择调整相应项目
void RTInputByte(uchar); //输入 1Byte /
uchar RTOutputByte(void); //输出 1Byte /
void W1302(uchar, uchar); //向DS1302写入一个字节
uchar R1302(uchar); //从DS1302读出一个字节
void Set1302(uchar ); //设置时间
void KeySound(); //按键音
void ClockSound(); //闹铃蜂鸣声
uchar id,msec,model,LedTime,d;
bit a,b; //闪烁标志位
uchar inittime[7]={0x50,0x59,0x23,0x24,0x07,0x05,0x09}; //初始化后设置为:09年7月24日星期5 23点59分50秒
void Out_LCM(void); //显示屏幕
void model0(void); //显示输出
void model1(void);
void model2(void);
void model3(void);
void model4(void);
void model5(void);
void model6(void);
void id_case1_key(); //项目调整
void Modset(); //模式键处理
void WriteDataLCM(uchar WDLCM);
void WriteCommandLCM(uchar WCLCM,BuysC);
uchar ReadStatusLCM(void);
void LCMInit(void);
void OutputInformation(uchar X, uchar Y, uchar DData);
void DisplayListChar(uchar X, uchar Y, uchar code DData);
void Delay5Ms(void);
void Delay400Ms(void);
void systemsetup(void); //进入系统设置
uchar code systemp[]={"Systemsetup"}; //字符串输出(系统设定)
uchar code TIMER[]={"Time"}; //字符串输出(时间)
uchar code DATE[]={"Date"}; //字符串输出(日期)
uchar code alarmclock[]={"Clock"}; //字符串输出(闹铃)
uchar code lamp[]={"Lamp"}; //字符串输出(背光灯)
uchar code reset[]={"Reset"}; //字符串输出(时间归零)
uchar code exit[]={"Exit"}; //字符串输出(退出)
uchar code set[]={"Set"}; //字符串输出(设置)
uchar code sec[]={"sec"}; //字符串输出(秒)
uchar code ClockSet[]={"ClockSet"}; //字符串输出(闹铃设置)
uchar code ClockOn[]={"ON"}; //字符串输出(ON)
uchar code ClockOff[]={"OFF"}; //字符串输出(OFF)
void timesetup(void); //时间设置
void datesetup(void); //日期设置
void alarmclockset(void); //闹铃设置
void lampsetup(void); //背光灯设置
void timereset(void); //时间清零
//
void delay1(int ms)
{
unsigned char y ;
while(ms--)
{
for(y = 0 ; y<250 ; y++)
{
_nop_() ;
_nop_() ;
_nop_() ;
_nop_() ;
}
}
}
/ 延时子程序/
void delay11(uchar x)
{ uchar j;
while((x--)!=0)
{ for(j=0;j<125;j++)
{;}
}
}
//--------------------------------------------------
//--------------------------------------------------
void delay0(uchar x) //x014MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
//
void beep() //蜂鸣器响一声函数
{
unsigned char i;
for (i=0;i<100;i++)
{
delay0(4);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
delay11(250); //延时
}
void main(void)
{
LED=0; //打开LED ,低电平有效,外接9012驱动
Delay400Ms(); //启动等待,等LCM讲入工作状态
Delay400Ms();
LCMInit(); //LCM初始化
TMOD=0x01; //16位定时
TH0=0x3c; //50ms
TL0=0xb0;
EA=1;
TR0=1;
ET0=1;

while(1)
{
if(TimerDown==0) //左移键按下后把背光灯打开
{Delay5Ms();
if(TimerDown==0)
{KeySound(); //蜂鸣声
LED=0; //打开背光灯
LedTime=R1302(0xc1)/1610+R1302(0xc1)%16;} //取出背光灯时间并转换为十进制数
}
b=1; //模式键是否动作标志。为1时不动作,为0时动作。
Modset(); //调用模式键处理程序判断按键是否按下。
if(b==0)
{
KeySound(); //蜂鸣声
LED=0; //打开背光灯
systemsetup(); //进入系统设置模式
LedTime=R1302(0xc1)/1610+R1302(0xc1)%16; //取出背光灯时间并转换为十进制数
}
if((LED==0)&&LedTime==0) //延时间是否到
LED=1; //关闭背光灯
if(R1302(0xc3)==1) //闹铃是否打开,0xc3为读闹铃寄存器地址。
{if((R1302(0x85)==R1302(0xc5))&&(R1302(0x83)==R1302(0xc7))) //判断闹铃时间是否到,
ClockSound(); //发出闹铃蜂鸣声,无按键动作蜂鸣一分钟。
}
model0(); //输出显示屏幕
}
}
void KeySound() //按键音
{
beep(); //开蜂鸣声
}
void ClockSound() //闹铃蜂鸣声
{
if(a==0)
{
beep();
}
}
void Modset() //模式键处理
{ if(system==0)
{
Delay5Ms();
if(system==0)
{while(system==0);
KeySound(); //蜂鸣声
a=0;msec=0;b=0; //a、msec为闪烁标志,按键有动作时清零,不闪烁。
} //b为模式键确认动作。其它程判断b是否为零时来确定模式键是否动作。
}
}
void systemsetup(void) //系统设置
{
model=1;
while(model!=0)
{
Out_LCM();
if (TimerUp==0) //设置项目左移
{Delay5Ms();
if(TimerUp==0)
{a=0;msec=0;KeySound();//蜂鸣声
if(model--==1) //6种系统设置项目
model=6;
}
while(TimerUp==0);
}
if (TimerDown==0) //设置项目右移
{
Delay5Ms();
if(TimerDown==0)
{a=0;msec=0;KeySound();//蜂鸣声
if(model++==6)
model=1;
}
while(TimerDown==0);
}
b=1; //模式键是否动作标志。为1时不动作,为0时动作。
Modset(); //调用模式键处理程序判断按键是否按下。
if(b==0)
{KeySound(); //蜂鸣声
switch(model) //进入进个项目设置
{
case 1:
timesetup(); break; //时间设置
case 2:
datesetup();break; //日期设置
case 3:
alarmclockset();break;//闹铃设置
case 4:
lampsetup();break; //背光灯设置
case 5:
timereset();break; //时间清零
case 6:
model=0;break; //退出系统设置
}
}
}
}
void timesetup() //时间调整
{
id=6;
while(model==1) //model为1时进入时间调整
{
b=1;
Modset();
if(b==0)
{KeySound(); //蜂鸣声
if(id++==9) //69为时分秒调。
id=6;
}
id_case1_key(); //调用按键处理
Out_LCM(); //显示输出
}
}
void datesetup() //对日期进行调整
{
id=1;
while(model==2) //model为2时进入日期调整
{b=1;
Modset(); //模式键是否动作
if(b==0)
{KeySound(); //蜂鸣声
if(id++==5) //15为年月日星期 exit
id=1;
}
id_case1_key(); //日期调整
Out_LCM(); //显示输出
}
}
void alarmclockset(void) //闹铃调整
{id=12;
while(model==3) //进入闹铃设置
{b=1;
Modset(); //模式键是否动作
if(b==0)
{KeySound(); //蜂鸣声
if(R1302(0xc3)%16==0)
{id=0;model++;} //0xc2为闹铃开关寄存器。当为关时按下模式键时将退出闹铃设置,当开时进入闹铃时间设置

else if(id++==15) //1215为闹铃开关和时间设置 exit
id=12;
}
id_case1_key(); //调整
Out_LCM(); //显示输出
}
}

void lampsetup(void) //背光灯时间设置
{id=10; //背光灯存储空间DS1302(0xc0)
while(model==4) //model为3时进入背光灯调整
{b=1;
Modset(); //模式键是否动作
if(b==0)
{KeySound(); //蜂鸣声
if(id++==11) //10为背光灯 exit
id=10;
}
id_case1_key();
Out_LCM(); //显示输出
}
}
void timereset() //时间清零
{
Set1302(inittime); //清时间
W1302(0x90,0xa5); //打开充电二级管 一个二级管串联一个2K电阻
model++;
}
//对相应的项目进行加、减调整。
void id_case1_key() //按键处理
{
if (TimerUp==0) //增加
{
Delay5Ms();
if(TimerUp==0)
{a=0;msec=0;KeySound(); //蜂鸣声
if((id==9)||(id==5)||(id==11)||(id==15)) //当ID为9、5时按下加、减键将退出调整
{ model++; //退出时间、日期设置
id=0;
}
else
Set(id,1);
}
while(TimerUp==0);
}
if (TimerDown==0) //减少
{
Delay5Ms();
if(TimerDown==0)
{a=0;msec=0;KeySound(); //蜂鸣声
if((id==9)||(id==5)||(id==11)||(id==15)) //当ID为9、5时按下加、减键将退出调整
{ model++; //退出时间、日期设置
id=0;
}
else
Set(id,0); //调用DS1302写入函数
}
while(TimerDown==0);
}
}

void timer_1(void) interrupt 1 //中断入口,闪烁
{
TH0=0x3c; //50ms定时
TL0=0xb0;
if(msec++==10) //500ms
{msec=0;a=~a; //闪烁标志反转
if(a==0) //1秒后背光时间减一秒。
LedTime--;
}
}
//根据选择调整相应项目并写入DS1302
void Set(uchar sel,uchar sel_1)
{
uchar address,item;
uchar max,min;
if(sel==1) {address=0x8c; max=99;min=0;} //年
if(sel==2) {address=0x88; max=12;min=1;} //月
if(sel==3) {address=0x86; max=31;min=1;} //日
if(sel==4) {address=0x8a; max=7; min=1;} //星期
if(sel==6) {address=0x84; max=23;min=0;} //小时
if(sel==7) {address=0x82; max=59;min=0;} //分钟
if(sel==8) {address=0x80; max=59;min=0;} //秒
if(sel==10) {address=0xc0; max=59;min=0;} //背光时间,最长1分钟
if(sel==12) {address=0xc2; max=1;min=0;} //闹铃开关寄存器
if(sel==13) {address=0xc4; max=23;min=0;} //闹铃时寄存器
if(sel==14) {address=0xc6; max=59;min=0;} //闹铃分寄存器
item=R1302(address+1)/1610+R1302(address+1)%16;
if (sel_1==0) item++; else item--;
if(item>max) item=min;
if(item<min) item=max;

W1302(0x8e,0x00); //允许写 *** 作
W1302(address,item/1016+item%10); //写入DS1302 //转成BCD码
W1302(0x8e,0x80); //写保护,禁止写 *** 作
}
//屏幕显示
void Out_LCM(void)
{ switch(model)
{
case 0: model0(); break;
case 1: model1(); break;
case 2: model2(); break; //在不同的条件下显示不同的字符
case 3: model3(); break;
case 4: model4(); break;
case 5: model5(); break;
case 6: model6(); break;
}
}
/model为零时第一行显示时间,不为零时显示system setup/
void model0()
{
DisplayListChar(0,0,TIMER); //显示固定字符串(Time)
OutputInformation(13,0,0x20); //不显示
OutputInformation(4,0,0x20); //不显示
OutputInformation(4,1,0x20); //不显示
OutputInformation(15,1,0x20); //不显示
OutputInformation(7,1,0x2f); //显示固定字符 "/"
OutputInformation(10,1,0x2f); //显示固定字符 "/"
OutputInformation(13,1,0x2f); //显示固定字符 "/"
DisplayListChar(0,1,DATE); //显示固定字符串Date(日期)
if(a==1) //冒号闪烁
{OutputInformation(7,0,0x3a); OutputInformation(10,0,0x3a);}
else
{OutputInformation(7,0,0x20); OutputInformation(10,0,0x20);}
/model为零时第二行显示日期,不为零显示设置项目/

OutputInformation(5,1,R1302(0x8d)/16+0x30); //显示年
OutputInformation(6,1,R1302(0x8d)%16+0x30);

OutputInformation(8,1,R1302(0x89)/16+0x30); //显示月
OutputInformation(9,1,R1302(0x89)%16+0x30);

OutputInformation(11,1,R1302(0x87)/16+0x30); //显示日
OutputInformation(12,1,R1302(0x87)%16+0x30);
OutputInformation(14,1,R1302(0x8b)%16+0x30); //显示星期
OutputInformation(5,0,R1302(0x85)/16+0x30); //显示小时
OutputInformation(6,0,R1302(0x85)%16+0x30);

OutputInformation(8,0,R1302(0x83)/16+0x30); //显示分钟
OutputInformation(9,0,R1302(0x83)%16+0x30);

OutputInformation(11,0,R1302(0x81)/16+0x30); //显示秒
OutputInformation(12,0,R1302(0x81)%16+0x30);
}

/model不为零时显示系统设置/
//model为1时time闪烁,按下模式键后进入时间调整
void model1()
/判断ID的值来显示项目/
{ OutputInformation(0,0,0x20); //不显示
OutputInformation(1,0,0x20);
DisplayListChar(2,0,systemp); //第一行显示system setup
if(id==0) //为0时显示TIME date lalcak
{OutputInformation(9,1,0x20); //不显示
OutputInformation(4,1,0x20); //不显示
OutputInformation(15,1,0x20); //不显示
DisplayListChar(5,1,DATE); //显示date
DisplayListChar(10,1,alarmclock);//显示lalcak

if(a==1)
{OutputInformation(0,1,0x20); //不显示
OutputInformation(1,1,0x20); //不显示
OutputInformation(2,1,0x20); //不显示
OutputInformation(3,1,0x20); //不显示
}
else
DisplayListChar(0,1,TIMER); //显示time
}
else
{ //id不为零进入时间调整项目
OutputInformation(3,1,0x3a); //显示固定字符 ":"
OutputInformation(6,1,0x3a); //显示固定字符 ":"
OutputInformation(9,1,0x20); //不显示
OutputInformation(10,1,0x20); //不显示
OutputInformation(0,1,0x20); //不显示

基于AT89c51的简易时钟设计
摘要:本电子钟是采用电子电路实现对时、分进行数字显示的计时装置,广泛的应用于生活中。电子时钟主要是利用电子技术奖时钟电子化、数字化,拥有时间精确、体积小、界面友好、课扩展性能强等特点,被广泛应用于生活和工作当中。当今市场上的电子时钟品类繁多,外形小巧别致。电子时钟数字化了时间显示。在此基础上,人们可以根据不同场合的要求,在时钟上加置其他功能,
本设计由以下几个部件组成:单片机AT89C51、四个八段码共阴极数码管显示、四个微动按钮等其它组件。在启动后开始从00时00分显示。可以手动校准时间,秒使用两个发光二极管的闪烁来提现,本设计设计简单易于实现。
关键词:AT89C51、倒计时。LED
Simple clock design based on AT89c51
Abstract: This clock is the use of electronic circuits to achieve the hours, minutes, digital display of timing devices, widely used in life Electronic clock main prize is the use of electronic technology electronic clock, digital, with a time accurate, small, friendly interface, expanded its performance and other characteristics, are widely used in life and on the job The market today, many kinds of electronic clock, compact and chic Digital electronic time clock display On this basis, one can according to the requirements of different occasions, plus set the clock on the other features
This design consists of the following components: microcontroller AT89C51, four eight out code common cathode LED display, four buttons, and other micro-components After starting 00 points from 00 shows You can manually calibrate the time, in seconds using two LEDs blink to mention is, the design is simple design easy to implement
Keywords: AT89C51, countdown LED
目 录
摘要 1
关键词 1
Simple clock design based on AT89c51 2
目录 3
第一章引言 4
11 时钟的概述 5
第二章电路工作原理分析 5
21 系统的硬件构成及功能 5
22硬件连接方式 6
第三章: 芯片介绍 6
31 MCS- 51介绍 6
34 LED数码管显示 10
341 LED数码管介绍 10
342 LED数码管编码方式 11
343 LED数码管显示方式和典型应用电路 12
第四章 部分电路介绍 13
41单片机的最小应用系统 13
411 单片机的时钟电路 13
412 复位电路和复位状态 14
413总线结构 17
42此设计显示电路 18
44看门狗电路 19
45 按键模块 19
第五章程序设计 19
第六章 原理图和印制板图的设计 20
( 一 ) 原 理 图 的 设 计 和 网 络 表 的 生 成 20
(二)PCB的制作和设计 21
第七章 原理图的protues仿真 23
71PROTUES介绍 23
72原理图仿真步骤 26
总 结 27
谢 辞 28
参考资料及文献 29
附录一:原理图 30
附录二:PCB 31
附录三 仿真 32
附录四:程序清单 33
第一章引言
数字钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。尽管目前市场上已有现成的数字钟集成电路芯片出售,价格便宜、使用也方便,但鉴于单片机的定时器功能也可以完成数字钟电路的设计,因此进行数字钟的设计是必要的。在这里我们将已学过的比较零散的数字电路的知识有机的、系统的联系起来用于实际,来培养我们的综合分析和设计电路,写程序、调试电路的能力。
单片机具有体积小、功能强可靠性高、价格低廉等一系列优点,不仅已成为工业测控领域普遍采用的智能化控制工具,而且已渗入到人们工作和和生活的各个角落,有力地推动了各行业的技术改造和产品的更新换代,应用前景广阔。
11 时钟的概述
20世纪末,电子技术获得了飞速的发展。在其推动下,电子产品几乎渗透到了社会的各个领域,有力的推动和提高了社会生产力的发展和信息化程度,同时也使现代电子产品性能进一步提升,产品更新换代的节奏也越来越快。
电子钟是采用电子电路实现对时、分、秒进行数字显示的计时装置,广泛的应用于生活中。电子时钟主要是利用电子技术奖时钟电子化、数字化,拥有时间精确、体积小、界面友好、课扩展性能强等特点,被广泛应用于生活和工作当中。当今市场上的电子时钟品类繁多,外形小巧别致。电子时钟数字化了时间显示。在此基础上,人们可以根据不同场合的要求,在时钟上加置其他功能,比如定时闹钟,万年历,环境温度,温度检测,环境空气质量检测,USB扩展功能等。
本设计电子时钟主要功能为:具有时间显示和手动校对功能,24小时制。
本设计任务“
1:用4位LED数码管实时显示时钟计时功能;最小显示时间为00时00分,最大显示时间为23时59分;
2:能方便的校准小时和分钟。
3:了解单片机的基础知识;
4;掌握proteus的基本原理和使用方法;
5:掌握数码管和LED的显示的方法;
6:掌握单片机定时器的基本原理;
7:掌握单片机定时器的基本原理;
8:掌握绘图软件Proell99se的使用方法;
9:绘制程序流程图和编写出程序;
10:画出电路原理图并仿真运行

第二章电路工作原理分析
21 系统的硬件构成及功能
本设计由以下几个部件组成:单片机AT89C51、四个八段码共阴极数码管显示、四个微动按钮等其它组件。在启动后开始从00时00分显示。可以手动校准时间,秒使用两个发光二极管的闪烁来提现,本设计设计简单易于实现。
图1 99秒计时器系统原理框图
22硬件连接方式
数码管使用动态显示,P0口作为四个八位共阴数码管的段选输出端,为提高单片机输出能力 P0口作为输出口接了8个47K的电阻作为上拉电阻;P2口是四个八位共阴数码管和两个发光二极管的位选端,显示是事位和分位,四个微动开关做的按键分别连P10,P11,P12,P13完成时和分的加减调整。硬件连接如下:
41单片机的最小应用系统
单片计算机是一个最小的应用系统,但由于应用系统中有一些功能器件无法集成到芯片内部,如晶振、复位电路等,需要在片外加接相应的电路。对于片内无程序存储器的单片机,还应该配置片外程序存储器。
411 单片机的时钟电路
MCS-51单片机内部的振荡电路是一个高增益反相放大器,引线XTAL1和XTAL2分别是放大器的输入端和输出端。单片机内部虽然有振荡电路,但要形成时钟,外部还需附加电路。MCS-51单片机的时钟产生方式有两种。
(1) 内部时钟方式
利用其内部的振荡电路在XTAL1和XTAL2引线上外接定时元件,内部振荡电路便产生自激振荡,用示波器可以观察到XTAL2输出的时钟信号。最常用的是在XTAL1和XTAL2之间连接晶体振荡器与电容构成稳定的自激震荡器,如图3-1所示。
晶体可在12~12MHz之间选择。MCS-51单片机在通常应用情况下,使用振荡频率为6MHz的石英晶体,而12Hz频率的晶体主要是在高速串行通信情况下才使用。C1和C2可在20~100pF之间取值,一般取30pF左右。
(2) 外部时钟方式
在由单片机组成的系统中,为了各单片机之间时钟信号的同步,应当引入惟一的合用外部振荡脉冲作为各单自片机的时钟。外部时钟方式中是把外部振荡信号源直接接入XTAL1或XTAL2。由于HMOS和CHMOS单片机外部时钟进入的引线不同,其外部振荡信号源接入的方式也不同。HMOS型单片机由XTAL2进入,外部振荡信号接至XTAL2,而内部反相放大器的输入端XTAL1应接地,如图3-2所示。由于XTAL2端的逻辑电平不是TTL的,故还要接一上接电阻。CHMOS型单片机由XTAL1进入,外部振荡信号接至XTAL1,而XTAL2可不接地,如图3-3所示。
图3-1内部时钟电路 图3-2HMOS型外部时钟电路 图3-3外部时钟电路
412 复位电路和复位状态
MCS-51单片机的复位是靠外部电路实现的。MCS-51单片机工作后,只要在它的RST引线上加载10ms以上的高电平,单片机就能够有效地复位。
(1) 复位电路
MCS-51单片机通常采用上电自动复位和按键复位两种方式。最简单的复位电路如图3-4所示。上电瞬间,RC电路充电,RST引线端出现正脉冲,只要RST端保持10ms以上的高电平,就能使单片机有效地复位。
图 3-4 简单的复位电路
在实际的应用系统中,为了保证单片机可靠地工作,常采用“看门狗”监视单片机的运行。采用MAX690的复位电路如图3-5所示,该电路具有上电复位和监视MCS-51单片机的P33的输出功能。一旦P33不输出高低电平交替变化的脉冲,MAX690就会自动产生一复位信号使单片机复位。
图3-5 MAX690组成的复位电路
(2) 复位状态
复位电路的作用是使单片机执行复位 *** 作。复位 *** 作主要是把PC初始化为0000H,使单片机从程序存储器的0000H单元开始执行程序。程序存储器的0003H单元即MCS-51单片机的外部中断0的中断处理程序的入口地址。留出的0000H~0002H 3个单元地址,仅能够放置一条转移指令,因此,MCS-51单片机的主程序的第一条指令通常情况下是一条转移指令。
除PC之外,复位还对其他一些特殊功能的寄存器有影响,它们的复位状态如表3-6所示。
由表3-6可知,除SP=07H,P0~P3 4个锁存器均为FFH外,其他所有的寄存器均为0。此外,单片机的复位不影响片内RAM的状态(包括通用寄存器Rn)。
表3-6 寄存器的复位状态
寄存器 复位状态 寄存器 复位状态
PC 0000H TMOD 00H
ACC 00H TCON OOH
PSW 00H TL0 00H
SP 07H TH0 00H
DPTR 0000H TL1 00H
P0~P3 FFH TH1 00H
IP Xxx00000B SCON 00H
IE 0xx00000B PCON 0xx00000B
P0、P1、P2、P3共有4个8位并行I/O口,它们引线为:P00~P07、P10~P17、
P20~P27、P30~P37,共32条引线。这32条引线可以全部用做I/O线,也可将其中部分用做单片机的片外总线。
① 控制线
A、ALE地址锁存允许
当单片机访问外部存储器时,输出信号ALE用于锁存P0口输出的低8位地址A7~A0。ALE的输出频率为时钟振荡频率的1/6。
B、 程序存储器选择
=0,单片机只访问外部程序存储器。对内部无程序存储器的单片机8031, 必须接地。 =1,单片机访问内部程序存储器,若地址超过内部程序存储器的范围,单片机将自动访问外部程序存储器。对内部有程序存储器的单片机, 应接高电平。
C、 片外程序存储器的选通信号。此信号为读外部程序存储器的选通信号。
D、RST复位信号输入
② 电源及时钟
VSS地端接地线,VCC电源端接+5V,XTAL1和XTAL2接晶振或外部振荡信号源。
图3-7 片外3总线结构
413总线结构
单片机的引线除了电源、复位、时钟输入、用户I/O口外,其余引线都是为实现系统扩展则设置的,这些引线构成了单片机外部的3总线形式,如图3-7所示。
① 地址总线
地址总线宽度为16位,由P0口经地址锁存器提供低8位地址(A7~A0),P2口直接提供高8位地址(A15~A8)。
由口的位结构可知,MCS-51单片机在进行外部寻址时,P0口的8根引绠低8位地址和8位数据的复用线。P0口首先将低8位的地址发送出去,然后再传送数据,因此要用锁存器将先送出的低8位地址锁存。MCS-51常用74LS373或8282做地址锁存器。
② 数据总线
数据总线宽度为8位,由P0口提供。
③ 控制总线
MCS-51用于外部扩展的控制总线除了它自身引出的控制线RES、 、ALE、 外,还有由P3口的第二功能引线:外部中断0和外部中断1输入线 和 ,以及外部RAM或I/O端口的读选通和写选通信号 和 。
34 MCS—51单片机的最小应用系统
构成最小应 MCS—51单片机的最小应用系统
用系统时只要将单片机接上外部的晶体或时钟电路和复位电路即可,如图3-8所示,这样构成的最小系统简单可靠,其特点是没有外部扩展,有可供用户选用的大量I/O线。
42此设计显示电路
数码管使用动态显示,P0口作为四个八位共阴数码管的段选输出端,因为P0口作为输出口接了8个47K的电阻作为上拉电阻;P2口四个八位共阴数码管的位选端,显示是两位时间的事时位和两位的分位。
43电源电路
由于该系统需要稳定的5 V电源,因此设计时必须采用能满足电压、电流和稳定性要求的电源。该电源采用三端集成稳压器LM7805。它仅有输人端、输出端及公共端3个引脚,其内部设有过流保护、过热保护及调整管安全保护电路,由于所需外接元件少,使用方便、可靠,因此可作为稳压电源。图4为电源电路连接图。
 
44看门狗电路
系统中把P16作为看门狗的“喂狗”信号;将MAX813的 RESET与单片机的复位信号RST连接。由于单片机每执行一次程序,就会给看门狗器件一个复位信号,这样也可以用手工方式实现复位。当按键按下时,SW-SPST就会在MAX813 引脚产生一个超过200ms的低电平,其实看门狗器件在16s 时间内没有复位,使7引脚输出一个复位信号的作用是相同的,其连接图如图6所示。
45 按键模块
下图为按键模块电路原理图,S1为时加,s2为时减,S3为分钟加调控键,S4是分钟减调控键。
LED_BIT_1 EQU 30H ; 存放8位数码管的段码
LED_BIT_2 EQU 31H
LED_BIT_3 EQU 32H
LED_BIT_4 EQU 33H
LED_BIT_5 EQU 34H
LED_BIT_6 EQU 35H
LED_BIT_7 EQU 36H
LED_BIT_8 EQU 37H ; 存放初始密码
SECOND EQU 60H
MINUTE EQU 61H
HOUR EQU 62H
TCNT EQU 63H
ORG 00H ;初始化程序 ,设置初始密码
SJMP START
ORG 0BH
LJMP INT_T0
START:
MOV DPTR,#TABLE
MOV HOUR,#0
MOV MINUTE,#0
MOV TCNT,#0
MOV TMOD,#01H
MOV TH0,#03ch ;定时50毫秒
MOV TL0,#03ch
MOV IE,#082H
SETB TR0

MOV LED_BIT_1,#00H ;段码存储区清0
MOV LED_BIT_2,#00H
MOV LED_BIT_3,#00H
MOV LED_BIT_4,#00H
MOV LED_BIT_5,#00H
MOV LED_BIT_6,#00H
MOV LED_BIT_7,#79H
MOV LED_BIT_8,#73H
MOV TMOD,#01H
MOV TH0,#0fdh
MOV TL0,#0fdh
MOV IE,#82H

A1:
LCALL DISPLAY ;调用时间显示

JNB P10,S1
JNB P11,S2
JNB P12,S3
JNB P13,S4

LJMP A1
S1: LCALL DLY_S ;去抖动
JB P10,A1
INC HOUR ;秒值加1
MOV A, HOUR
CJNE A,#24,J00 ;判断是否加到60秒
MOV HOUR,#0
LJMP A1
S2: LCALL DLY_S
JB P11,A1
K01: DEC HOUR ;SHI-
MOV A,HOUR
CJNE A,#0,J01 ;判断是否-0分
MOV HOUR,#24
LJMP A1
S3: LCALL DLY_S
JB P12,A1
K02: INC MINUTE ;小时值加1
MOV A,MINUTE
CJNE A,#60,J02 ;判断是否加到24小时
MOV MINUTE,#0
LJMP A1
S4: LCALL DLY_S
JB P13,A1
K03: DEC MINUTE ;小时值加1

MOV A,MINUTE
CJNE A,#0,J03 ;判断是否加到24小时
MOV MINUTE,#59
LJMP A1
J00: JB P10,A1 ;等待按键抬起
LCALL DISPLAY
SJMP J00
J01: JB P11,A1
LCALL DISPLAY
SJMP J01
J02: JB P12,A1
LCALL DISPLAY
SJMP J02
J03: JB P13,A1
LCALL DISPLAY
SJMP J03
INT_T0: MOV TH0,#3ch ;定时器中断服务程序
MOV TL0,#3ch ;对秒,分钟和小时的计数
INC TCNT
MOV A,TCNT
CJNE A,#20,RETUNE ;计时1秒
INC SECOND
MOV TCNT,#0
MOV A,SECOND
CJNE A,#60,RETUNE
INC MINUTE
MOV SECOND,#0
MOV A,MINUTE
CJNE A,#60,RETUNE
INC HOUR
MOV MINUTE,#0
MOV A,HOUR
CJNE A,#24,RETUNE
MOV HOUR,#0
MOV MINUTE,#0
MOV SECOND,#0
MOV TCNT,#0
RETUNE: RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DIS3闹铃设置子程序

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DIS3
DISPLAY: ;显示时间控制子程序
MOV A,SECOND ;显示秒
MOV B,#10
DIV AB
CLR P26
MOVC A,@A+DPTR
MOV P0,A
LCALL DLY_S
SETB P26
MOV A,B
CLR P27
MOVC A,@A+DPTR
MOV P0,A
LCALL DLY_S
SETB P27
CLR P25
MOV P0,#40H ;显示分隔符
LCALL DLY_S
SETB P25
MOV A,MINUTE ;显示分钟
MOV B,#10
DIV AB
CLR P23
MOVC A,@A+DPTR
MOV P0,A
LCALL DLY_S
SETB P23
MOV A,B
CLR P24
MOVC A,@A+DPTR
MOV P0,A
LCALL DLY_S
SETB P24
CLR P22
MOV P0,#40H ;显示分隔符
LCALL DLY_S
SETB P22
MOV A,HOUR ;显示小时
MOV B,#10
DIV AB
CLR P20
MOVC A,@A+DPTR
MOV P0,A
LCALL DLY_S
SETB P20
MOV A,B
CLR P21
MOVC A,@A+DPTR
MOV P0,A
LCALL DLY_S
SETB P21
RET
TABLE: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;延时
DLY_S: MOV R6,#5 ;延时程序
D1: MOV R7,#100
DJNZ R7,$
DJNZ R6,D1
RET
DLY_L: MOV R5,#50
D2: MOV R6,#100
D3: MOV R7,#100
DJNZ R7,$
DJNZ R6,D3
DJNZ R5,D2
RET
END
第五章程序设计
程序只要完成了初始化,计时,在计时过程中判断按键情况,做相应处理。流程如下。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/13045495.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-29
下一篇 2023-05-29

发表评论

登录后才能评论

评论列表(0条)

保存