基于STC89C52的时钟系统Word文档格式.docx
- 文档编号:18397879
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:24
- 大小:54.44KB
基于STC89C52的时钟系统Word文档格式.docx
《基于STC89C52的时钟系统Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于STC89C52的时钟系统Word文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。
3、3数码显示模块
本温度控制系统选用的显示部分由7段LED数码管并列组成动态驱动是将所有数码管的8个显示笔划"
a,b,c,d,e,f,g,dp"
的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据。
4、软件程序设计原理
把数字时钟设计作为一个项目时,应该对单片机应用系统的开发过程有一个比较深入的了解。
整个开发过程包括三个部分:
总体设计;
硬件设计调试;
软件设计调试。
软件设计调试由流程图(先粗后细),分配I/O,内存,编程,编辑,汇编,仿真调试等7部分组成。
在教学中可以先通过几个简单程序的编写,熟悉程序的设计过程。
第一个程序设计要求在仿真器的个位上显示“5”字,程序
如下:
movp2,#0efh;
显示位数
movp0,#0a7h;
显示“5”
sjmp$
end
第二个程序:
让“F”循环移位,每秒移位一位,熟悉延时子程序的应用。
loop:
movp2,#0efhdelay:
movr3,#0ffh
movp0,#047hdelay1:
movr4,#0ffh
acalldelaydelay2:
nop
movp2,#0dfhnop
movp0,#047hnop
acalldelaydjnzr4,delay2
:
djnzr3,delay1
ret
延时子程序如右方所示end
完整程序见网址
通过以上程序的设计,使设计者对软件调试过程有了一定的了解后。
下一步进行数字时钟的设计。
此软件程序由主程序、动态显示子程序、定时器中断服务程序和延时子程序组成。
系统初始化后,启动T0,定时时间为50ms,然后累加20次的方法定时1s,计满60s就让分单元加1,秒单元清零,循环往复,直至显示59min59s后全部清零,重新开始计数。
笔者用四位数码管个位,十位代表秒显示,从零开始计数,百位,千位代表分显示,十位和百位中间用小数点闪烁显示。
下面是一个完整的数字时钟显示程序框图。
根据框图设计一个完整的数字时钟显示程序,然后在KeilC51环境中,进行一个项目的建立,输入源文件。
源文件程序可登陆下载。
调试软件
5、程序代码
//按4X4键盘的E键进入设定状态
//D键是减设定键
//C按键加设定键
#include"
reg52.h"
#include<
stdlib.h>
//包含随机函数rand()的定义文件
#include<
intrins.h>
//包含_nop_()函数定义的头文件
#defineOP_READ0xa1//器件地址以及读取操作,0xa1即为10100001B
#defineucharunsignedchar
#defineOP_WRITE0xa0//器件地址以及写入操作,0xa1即为10100000B
sbitSDA=P3^5;
//将串行数据总线SDA位定义在为P3.5引脚
sbitSCL=P3^4;
//将串行时钟总线SDA位定义在为P3.4引脚
sbitRW=P2^1;
sbitRS=P2^0;
sbitE=P2^2;
sbitBEEP=P3^6;
bitat=0;
uchardisplay_buffer1[16];
//显示缓冲区
ucharcodeshen[]={"
Hello!
!
"
};
ucharcodeword[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x20};
uchardispbuf[8],h,m,s,counter,counter1=0,y,mo,d,t=1;
/*****************************************************
函数功能:
延时1ms
(3j+2)*i=(3×
33+2)×
10=1010(微秒),可以认为是1毫秒
***************************************************/
voiddelay1ms()
{
unsignedchari,j;
for(i=0;
i<
10;
i++)
for(j=0;
j<
33;
j++)
;
}
延时若干毫秒
入口参数:
n
voiddelaynms(unsignedcharn)
{
unsignedchari;
n;
delay1ms();
/*********************************************************/
voidbeep()//蜂鸣器响一声函数
unsignedchari;
for(i=0;
25;
delaynms
(2);
BEEP=!
BEEP;
//BEEP取反
}
BEEP=1;
//关闭蜂鸣器
delaynms(100);
//延时
voidstart()
//开始位
SDA=1;
//SDA初始化为高电平“1”
SCL=1;
//开始数据传送时,要求SCL为高电平“1”
_nop_();
//等待一个机器周期
SDA=0;
//SDA的下降沿被认为是开始信号
SCL=0;
//SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
/***************************************************
结束数据传送
voidstop()
//停止位
//SDA初始化为低电平“0”_n
//结束数据传送时,要求SCL为高电平“1”
//SDA的上升沿被认为是结束信号
SDA=0;
SCL=0;
从AT24Cxx读取数据
出口参数:
x
unsignedcharReadData()
//从AT24Cxx移入数据到MCU
unsignedcharx;
//储存从AT24Cxx中读出的数据
for(i=0;
i<
8;
i++)
SCL=1;
//SCL置为高电平
x<
<
=1;
//将x中的各二进位向左移一位
x|=(unsignedchar)SDA;
//将SDA上的数据通过按位“或“运算存入x中
SCL=0;
//在SCL的下降沿读出数据
}
return(x);
//将读取的数据返回
向AT24Cxx的当前地址写入数据
y(储存待写入的数据)
//在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0
bitWriteCurrent(unsignedchary)
bitack_bit;
//储存应答位
i++)//循环移入8个位
SDA=(bit)(y&
0x80);
//通过按位“与”运算将最高位数据送到S
//因为传送时高位在前,低位在后
_nop_();
//等待一个机器周期
//在SCL的上升沿将数据写入AT24Cxx
//将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲
y<
=1;
//将y中的各二进位向左移一位
//发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,
//以让SDA线转由接收设备(AT24Cxx)控制
//根据上述规定,SCL应为高电平
ack_bit=SDA;
//接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节
//若送高电平,表示没有接收到,传送异常
//SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
returnack_bit;
//返回AT24Cxx应答位
向AT24Cxx中的指定地址写入数据
add(储存指定的地址);
dat(储存待写入的数据)
voidWriteSet(unsignedcharadd,unsignedchardat)
//在指定地址addr处写入数据WriteCurrent
start();
//开始数据传递
WriteCurrent(OP_WRITE);
//选择要操作的AT24Cxx芯片,并告知要对其写入数据
WriteCurrent(add);
//写入指定地址
WriteCurrent(dat);
//向当前地址(上面指定的地址)写入数据
stop();
//停止数据传递
delaynms(4);
//1个字节的写入周期为1ms,最好延时1ms以上
从AT24Cxx中的当前地址读取数据
x(储存读出的数据)
unsignedcharReadCurrent()
WriteCurrent(OP_READ);
//选择要操作的AT24Cxx芯片,并告知要读其数据
x=ReadData();
//将读取的数据存入x
returnx;
//返回读取的数据
从AT24Cxx中的指定地址读取数据
set_addr
x
unsignedcharReadSet(unsignedcharset_addr)
//在指定地址读取
WriteCurrent(set_addr);
return(ReadCurrent());
//从指定地址读出数据并返回
voiddelay()
uchari;
255;
i++);
/*******写命令**********/
voidlcd_wmc(uchari)
P0=i;
RS=0;
RW=0;
E=0;
delay();
E=1;
/*******写数据***********/
voidlcd_wmd(uchari)
RS=1;
/*******初始化液晶*******/
voidlcd_init()
lcd_wmc(0x01);
//清屏幕指令,将以前的显示内容清除
lcd_wmc(0x38);
//显示模式设置:
16×
2显示,5×
7点阵,8位数据接口
lcd_wmc(0x0c);
lcd_wmc(0x06);
光标右移,字符不移
lcd_wmc(0xc9);
7;
lcd_wmd(shen[i]);
lcd_wmc(0xc0);
/*******更新缓冲区子程序*******/
voidnewbuf()
{uchartmp2;
WriteSet(0x33,s);
WriteSet(0x34,m);
WriteSet(0x35,h);
WriteSet(0x36,y);
WriteSet(0x37,mo);
WriteSet(0x38,d);
WriteSet(0x39,t);
display_buffer1[0]='
2'
display_buffer1[1]='
0'
display_buffer1[2]=y/10;
//+0x30;
display_buffer1[3]=y%10;
display_buffer1[4]='
_'
;
display_buffer1[5]=mo/10;
display_buffer1[6]=mo%10;
display_buffer1[7]='
display_buffer1[8]=d/10;
display_buffer1[9]=d%10;
display_buffer1[10]='
'
display_buffer1[11]='
tmp2=display_buffer1[2];
tmp2=word[tmp2];
display_buffer1[2]=tmp2;
tmp2=display_buffer1[3];
display_buffer1[3]=tmp2;
tmp2=display_buffer1[5];
display_buffer1[5]=tmp2;
tmp2=display_buffer1[6];
display_buffer1[6]=tmp2;
tmp2=display_buffer1[8];
display_buffer1[8]=tmp2;
tmp2=display_buffer1[9];
display_buffer1[9]=tmp2;
switch(t%16)
{
case1:
{display_buffer1[12]='
M'
display_buffer1[13]='
o'
display_buffer1[14]='
n'
}break;
case2:
T'
u'
e'
case3:
W'
d'
case4:
h'
case5:
F'
r'
i'
case6:
S'
a'
t'
case7:
default:
break;
}
dispbuf[0]=s%10;
dispbuf[1]=s/10;
dispbuf[3]=m%10;
dispbuf[4]=m/10;
dispbuf[6]=h%10;
dispbuf[7]=h/10;
/*******显示子程序**********/
voiddisp1(uchardispadd)
uchari=0;
lcd_wmc(dispadd
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STC89C52 时钟 系统