单片机课程设计 电子钟教程文件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机课程设计电子

中北大学
单片机课程设计说明书
数字钟设计
1 设计任务与要求 (1)
1.1设计任务 (1)
1.2设计要求 (1)
2单片机简介 (2)
2.1单片机的发展历程 (2)
3系统设计思路和方案 (3)
3.1系统总体方案 (3)
3.2硬件简介 (4)
3.2.1硬件选择 (4)
3.2.2 51单片机的构成 (4)
3.2.3 STC89C52RC引脚功能说明 (5)
3.2.4 LED简介 (6)
3.3 Keil调试 (8)
4、系统实物图 (10)
5、课程设计体会 (10)
参考文献 (11)
附录A (13)
附录B (14)
附录C (15)
1 设计任务与要求
1.1设计任务
本课题应完成以下设计内容:
1)硬件设计
设计数字钟的电路原理图,用PROTEL绘制硬件电路。

制作实物。

2)软件设计
(1)时、分、秒的设置及显示;
(2)画出程序框图;
(3)调试与分析。

用PROTEUS仿真。

3)课程设计说明书
1.2设计要求
本课程设计的基本要求是使学生全面掌握单片机控制系统设计的基本理论,熟悉掌握MCS-51 系列单片机的编程方法,具体要求:本例利用AT89C51的定时器和6位7段数码管,设计一个电子时钟。

显示格式为“XX XX XX”,由左向右分别是:时、分、秒。

2单片机简介
2.1单片机的发展历程
单片机是微型计算机的一个重要分支,也是一种非常活跃和颇具生命力的机种,特别适用于工业控制领域。

1971年微处理器研制成功不久,就出现了单片机,但最早的单片机是1位的,处理能力有限。

单片机的发展共分四个阶段:第一阶段是初级阶段,功能非常简单;第二阶段是低性能阶段, 16位定时器/计数器,片内ROM、RAM容量加大,直到现在仍被广泛应用,是目前应用数量较多的单片机。

、32位单片机推出阶段,以满足不同的用户需要。

纵观单片机几十年的发展历程,单片机的今后发展方向将向多功能、高性能、高速度、低功耗、低价格、外围电路内装化以及内存储器容量增加和FLASH存储器化方向发展。

2.2实用价值与理论意义
在单片机模块里比较常见,数字时钟是一种用0数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更高的使用寿命,新词得到了广泛的应用。

数字时钟是采用数字电路实现对时、分、秒数字显示的计时装置,广泛用于个人家庭、车站、码头、办公室等公用场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字时钟的精度远远超过老式钟表,钟表的数字化给人们的生产生活带来了极大的方
便,而且大大地扩展了钟表原先的报时功能。

因此研究数字时钟及扩大其应用有着非常现实的意义。

3系统设计思路和方案
3.1系统总体方案
图3.1整体设计思路
针对要实现的功能,拟采用AT89C51单片机进行设计,AT89C51单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结构。

这样,既能做到经济合理又能实现预期的功能。

在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。

程序可分为闹钟的声音程
序、显示程序、闹钟显示程序、调时显示、定时程序。

运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。

3.2硬件简介
3.2.1硬件选择
(1)单片机的选择选用STC89C52单片机,并配备12MHz晶振,复位电路采用上电复位。

(2)显示电路选择采用软件译码动态显示,P3.0-P3.3作数码管的位选口。

P1.0-P1.6作数码管的段选口。

考虑直接用单片机I/O口作位选时驱动功率不够,
(3)电源选择采用直流3V电源供电。

(4)STC89C52是一种带8K字节闪烁可编程可檫除只读存储器(FPEROM-
Flash
Programable and Erasable Read Only Memory )的低电压,高性能COMOS8的微处理器,俗称单片机。

该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

3.2.2 51单片机的构成
STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。

主要特性如下:
1、增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任
意选择,指令代码完全兼容传统8051.
2、工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)
3、工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工
作频率可达48MHz
4、用户应用程序空间为8K字节
5、片上集成512字节RAM
6、通用I/O口(32个),复位后为:P1/P2/P3/P4是准双向口/弱上
拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作
为I/O口用时,需加上拉电阻。

7、ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,
无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程
序,数秒即可完成一片
8、具有EEPROM功能
9、具有看门狗功能
10、共3个16位定时器/计数器。

即定时器T0、T1、T2
11、外部中断4路,下降沿中断或低电平触发电路,Power Down模式
可由外部中断低电平触发中断方式唤醒
12、通用异步串行口(UART),还可用定时器软件实现多个UART
13、工作温度范围:-40~+85℃(工业级)/0~75℃(商业级)
14、PDIP封装
3.2.3 STC89C52RC引脚功能说明
VCC(40引脚):电源电压
VSS(20引脚):接地
RST(9引脚):复位输入。

当输入连续两个机器周期以上高电平时为有效,用来完成单片机单片机的复位初始化操作。

看门狗计时完成后,RST引脚输出96个晶振周期的高电平。

特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。

DISRTO默认状态下,复位高电平有效。

ALE/(30引脚):地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。

在Flash编程时,此引脚()也用作编程输入脉冲。

(29引脚):外部程序存储器选通信号()是外部程序存储器选通信号。

当AT89C51RC从外部程序存储器执行外部代码时,在每个机器周期被激活两次,而访问外部数据存储器时,将不被激活。

/VPP(31引脚):访问外部程序存储器控制信号。

为使能从0000H到FFFFH的外部程序存储器读取指令,必须接GND。

注意加密方式1时,将内部锁定位RESET。

为了执行内部程序指令,应该接VCC。

在Flash编程期间,也接收12伏VPP电压。

XTAL1(19引脚):振荡器反相放大器和内部时钟发生电路的输入端。

XTAL2(18引脚):振荡器反相放大器的输入端。

图3.2 STC89C52RS
3.2.4 LED简介
LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。

图2.7(a)是共阴和共阳极数码管的内部电路图,它们的发光原理是一样的,只是它们的电源极性不同而已。

将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。

以共阴式为例,如把阴极接地,在相应段的阳极接上正电源,该段即会发光。

当然,LED的电流通常较小,一般均需在回路中接上限流电阻。

假如我们将"b"和"c"段接上正电源,其它端接地或悬空,那么"b"和"c"段发光,此时,数码管显示将显示数字“1”。

而将"a"、"b"、"d"、"e"和"g"段都接上正电源,其它引脚悬空,此时数码管将显示“2”。

其它数字的显示原理与此类同。

LED的7段数码管利用单只LED组合排列成“8”字型的数码管,分别引出它们的电极,点亮相应的点划来显示出0-9的数字。

在这次的设计中采用的均是共阴极的LED显示,当I/O口输出为高电平的时候,对应段就被点亮。

LED数码管的结构图如图2.4(b)所示。

(a)
(b)
图3.3 LED分类结构图和结构图
这次设计的显示部分采用AT89C51单片机动态扫描完成,在多数的应用场合中,我们并不希望使用多I/O端口的单片机,原则上是使用尽量少引脚的器件。

在没有富余端口的情况下,应通过优化设计程序和扩展电路达到预期的目的。

动态扫描的频率有一定的要求,频率太低,LED将出现闪烁现象。

如频率太高,由于每个LED点亮的时间太短,LED的亮度太低,肉眼无法看清,所以一般均取几个ms左右为宜,这就要求在编写程序时,选通某一位LED使其点亮并保持一定的时间,程序上常采用的是调用延时子程序。

3.3 Keil调试
启动Keil软件,选择“Project”菜单下的“New Project”命令,输入项目的文件名,选择存储路径,点击“保存”按钮。

在“Select Device”窗口中选择“Atmel”下的“AT89C51”芯片,单击“确定”按钮。

展开“Project Workspace”窗口中的“Target 1”, 右击“Target 1”,选择“Options for Target ’Target 1’”,选择“Target”选项在Keil (MHZ)右边输入“12m”。

选择“Debug”选项,选择“Use Keil Monitor-51 Driver”。

单击“Settings”按钮,串口选择“COM1”,波特率选择“38400”,单击“OK”按钮。

右击“Source Group 1”,选择“Add files to Group ‘Source Group 1’,在文件类型中选择“Asm Source file”,找到将要编译的程序,单击“ADD”按钮,然后再单击“CLOSE”按钮。

单击“Rebuild all target files”,在“Build”窗口中观察编译结果,根据提示修改程序,直到没有错误出现。

4、系统实物图
图4.1 系统实物图
5、课程设计体会
这次电子技术课程设计,我很用心的去完成,当总原理图绘好的那一刻,心里有说不出的满足感。

从这次课程设计中,我真正学到了很多有用的知识。

拿到课题后,我首先将《单片机原理与应用及C51程序设计》中有关本次设计的内容复习了一遍,比如七段译码显示器、计数器、振荡器等等。

然后根据设计要求,我去图书馆查阅了相关的资料,对整体框架做了一个初步的了解。

做完准备工作后就正式开始设计与绘图。

先要将没每一功能模块设计出来,再整体排版、连接。

这次设计让我熟练掌握了课本上的一些理论知识,在这次课程设计中,反复查找资料,发现电路中的错误和改善电路中的错误,让我将课本上的理论知识重新过了一遍。

回过头来一想,其实设计这些电路也并不是很困难,而且还十分有意思,特别是用protues将电路图模拟成功后很有成就感。

课程设计是一个学习新知识、巩固加深所学课本理论知识的过程,它培养了我们综合运用知识的能力,独立思考和解决问题的能力。

它不仅加深了我对单片机课程的理解,还让我感受到了设计电路的乐趣。

在这次设计中,我一点也不怕麻烦,反复设计、绘图与修改,就是希望能把这次课程设计做好。

因此对我来说,这次课程设计是非常有意义的。

参考文献
[1]杨文龙.单片机原理及应用[M].西安:西安电子科技大学出版社,1993
[2]胡汉才.单片机原理及系统设计[M].北京:清华大学出版社,2003
[3]杨忠煌,黄博俊,李文昌.单芯片8051实务与应用[M].北京:中国水利水电出版社,2001
[4]王守中,51单片机开发入门与典型实例[M].人民邮电出版社
[5]徐爱钧,单片机原理与应用:基于Proteus虚拟仿真技术[M].北京:机械工
业出版社,2010.7
[6]周润景,基于PROTEUS的电路及单片机设计与仿真(第二版)[M].北京:北
京航空航天大学出版社,2009.12
[7] 肖洪兵. 跟我学用单片机[M]. 北京:北京航空航天大学出版社,2002.8
[8] 何立民. 单片机高级教程[M].第1版.北京:北京航空航天大学出版社,2001
[9] 赵晓安. MCS-51单片机原理及应用[M]. 天津:天津大学出版社,2001.3
[10] 李广第.单片机基础.第1版[M].北京:北京航空航天大学出版社,1999
[11] 孙涵芳. MCS-51/96系列单片机原理及应用(修订版)[M].北京航空航天
大学出版社,1994
[12] 李朝青. 单片机原理及接口技术(第3版)[M]. 北京航空航天大学出版社,2005
[13] 夏继强. 单片机实验与实践教程[M]. 北京:北京航空航天大学出版社,2001
[14]陈小虎.电工实习(I)[M].北京:中国电力出版社,1996
[15]焦辎厚.电子工艺实习教程[M].哈尔滨:哈尔滨工业大学出版社,1993
[16]宋春荣.通用集成电路速查手册[M].山东科学技术出版社,1995
[17]高吉祥.电子技术基础实验与课程设计[M].电子工业出版社,2002
硬件原理图
PROTEUS仿真运行结果
软件设计流程图
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dis_bit1=P2^7;//定义数码管控制口
sbit dis_bit2=P2^6;//定义数码管控制口
sbit dis_bit3=P2^4;//定义数码管控制口
sbit dis_bit4=P2^3;//定义数码管控制口
sbit dis_bit5=P2^1;//定义数码管控制口
sbit dis_bit6=P2^0;//定义数码管控制口
sbit led1_bit=P2^2;//定时LED的控制口
sbit led2_bit=P2^5;//定时LED的控制口
sbit s1_bit=P1^0; //定义S1控制口
sbit s2_bit=P1^1; //定义S2控制口
sbit s3_bit=P1^2; //定义S3控制口
sbit speak=P3^7; //定义蜂鸣器控制口
#define smg_data P0//定义数码管数据口
void delay_50us(uint t);//延时50*T微妙函数的声明void display1(uchar dis_data);//数码管1显示子程序void display2(uchar dis_data);//数码管2显示子程序void display3(uchar dis_data);//数码管3显示子程序
void display4(uchar dis_data);//数码管4显示子程序
void display5(uchar dis_data);//数码管5显示子程序
void display6(uchar dis_data);//数码管6显示子程序
void init_t0();//定时器0初始化函数
void dis_led();//LED处理函数
void judge_s1();//S1按键处理函数
void judge_s2();//S2按键处理函数
void judge_s3();//S3按键处理函数
void dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1);//显
示子程序
void dis_san(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar
s1,uchar san);//闪烁显示子程序
void judge_dis();//显示处理函数
void judge_clock();//显示处理函数
//共阳数码管断码表
const unsigned char tabl1[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
// 0 1 2 3 4
5
0x82,0xf8,0x80,0x90,0x86,0x87,0xFF,
//6 7 8 9 E T B
0xc6,0xa1,0x8e,0xb6}; // C D F 三
uchar t0_crycle;
uchar hour_count,minute_count,second_count,msecond_count; uchar clock_hour,clock_minute;
uchar clock_en;//闹钟关闭和开启的标志,1开启,0关闭
uchar flag1,zancun1,zancun2,zancun3;//,flag2;
uchar clock_flag;
uint speak_count;
//主程序
void main()
{
P3=0x00;
flag1=0;
zancun3=0;
speak=1;//关闭蜂鸣器
speak_count=0;
clock_hour=0;
clock_minute=0;
clock_flag=0;
clock_en=0;//开机时默认关闭闹钟
init_t0();
TR0=1;//
//接下来开始编写让数码管显示的程序
while(1)
{
judge_dis();//显示处理
judge_s1();
judge_s2();
judge_s3();
judge_clock();//闹钟处理程序
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)/256;
t0_crycle++;
if(t0_crycle==2)// 0.1秒
{
t0_crycle=0;
msecond_count++;
if(msecond_count==10)//1秒
{
msecond_count=0;
second_count++;
if(second_count==60)
{
second_count=0;
minute_count++;
if(minute_count==60) {
minute_count=0;
if(hour_count==24)
{
hour_count=0;
}
}
}
}
}
}
//显示处理函数
void judge_dis()
{
if(flag1==0)
{
dis(hour_count/10,hour_count%10,minute_count/10, minute_count%10,second_count/10,second_count%10);
dis_led();
}
if(flag1!=0)
{
switch(flag1)
{
case 1:
dis(5,10,11,1,12,12);//显示SET1
led1_bit=1;
break;
case 2:
dis(5,10,11,2,12,12);//显示SET2
break;
case 3:
dis(5,10,11,3,12,12);//显示SET3
break;
case 4:
dis(5,10,11,4,12,12);//显示SET4
break;
case 5:
dis(5,10,11,5,12,12);//显示SET5
break;
case 6:
dis_san(zancun1/10,zancun1%10,zancun2/10, zancun2%10,12,12,1);
break;
case 7:
dis_san(zancun1/10,zancun1%10,zancun2/10, zancun2%10,12,12,2);
break;
case 8:
dis_san(zancun1/10,zancun1%10,zancun2/10,
zancun2%10,12,12,3);
break;
case 9://进入修改时间,时间分位个位闪烁 dis_san(zancun1/10,zancun1%10,zancun2/10, zancun2%10,12,12,4);
break;
case 10://进入修改闹钟,闹钟小时十位闪烁
dis_san(zancun1/10,zancun1%10,zancun2/10, zancun2%10,12,zancun3,1);
break;
case 11://进入修改闹钟,闹钟小时个位闪烁
dis_san(zancun1/10,zancun1%10,zancun2/10, zancun2%10,12,zancun3,2);
break;
case 12://进入修改闹钟,闹钟小时十位闪烁
dis_san(zancun1/10,zancun1%10,zancun2/10, zancun2%10,12,zancun3,3);
break;
case 13://进入修改闹钟,闹钟小时个位闪烁
dis_san(zancun1/10,zancun1%10,zancun2/10, zancun2%10,12,zancun3,4);
break;
case 14://进入修改闹钟的开关
dis_san(zancun1/10,zancun1%10,zancun2/10, zancun2%10,12,zancun3,6);
default:
break;
}
}
}
//S1按键处理函数
void judge_s1()
{
s1_bit=1;//置IO为1,准备读入收据
if(s1_bit==0)//判断是否有按键按下
{
delay_50us(1);// 延时,去除机械抖动 if(s1_bit==0)
{
switch(flag1)
{
case 0:
flag1=1;
break;
case 1:
flag1=2;
break;
case 2:
flag1=3;
case 3:
flag1=4;
break;
case 4:
flag1=5;
break;
case 5:
flag1=0;
break;
case 6://在修改时间小时十位下按S1键 flag1=7;
break;
case 7:
flag1=8;
break;
case 8:
flag1=9;
break;
case 9:
flag1=6;
break;
case 10:
flag1=11;
break;
case 11:
flag1=12;
break;
case 12:
flag1=13;
break;
case 13:
flag1=14;
break;
case 14:
flag1=10;
break;
default:
break;
}
while(s1_bit==0)
{
judge_dis();
}//等待按键释放
}
}
}
//S2按键处理函数
void judge_s2()
{
s2_bit=1;//置IO为1,准备读入收据 if(s2_bit==0)//判断是否有按键按下
{
delay_50us(1);// 延时,去除机械抖动
if(s2_bit==0)
{
switch (flag1)
{
case 1: //在显示SET1状态下按S2件,进入修改时间
flag1=6;
zancun1=hour_count;
zancun2=minute_count;
break;
case 2://在显示SET2状态下按S2,进入设置闹钟 zancun1=clock_hour;
zancun2=clock_minute;
flag1=10;
break;
case 6://修改时钟小时十位状态下按S2件
hour_count=zancun1;
minute_count=zancun2;
second_count=0;
flag1=0;
break;
case 7://修改时钟小时个位状态下按S2件
hour_count=zancun1;
minute_count=zancun2;
second_count=0;
flag1=0;
break;
case 8://修改时钟分钟十位状态下按S2件 hour_count=zancun1;
minute_count=zancun2;
second_count=0;
flag1=0;
break;
case 9://修改时钟分钟个位状态下按S2件 hour_count=zancun1;
minute_count=zancun2;
second_count=0;
flag1=0;
break;
case 10:
clock_hour=zancun1;
clock_minute=zancun2;
clock_en=zancun3;
flag1=0;
break;
case 11:
clock_hour=zancun1;
clock_minute=zancun2;
clock_en=zancun3;
flag1=0;
break;
case 12:
clock_hour=zancun1;
clock_minute=zancun2;
clock_en=zancun3;
flag1=0;
break;
case 13:
clock_hour=zancun1;
clock_minute=zancun2;
clock_en=zancun3;
flag1=0;
break;
case 14:
clock_hour=zancun1;
clock_minute=zancun2;
clock_en=zancun3;
flag1=0;
break;
default:
break; }
while(s2_bit==0)
{
judge_dis();
}//等待按键释放
}
}
}
//S3按键处理函数
void judge_s3()
{
s3_bit=1;//置IO为1,准备读入收据
if(s3_bit==0)//判断是否有按键按下
{
delay_50us(1);// 延时,去除机械抖动
if(s3_bit==0)
{
switch (flag1)
{
case 6://修改时间小时的十位数
zancun1+=10;
if(zancun1>=24)zancun1=zancun1%10;
break;
case 7://修改时间小时的个位数
zancun1=zancun1/10*10+(zancun1%10+1)%10; if(zancun1>=24)zancun1=20;
break;
case 8://修改时间分钟的十位数
zancun2+=10;
if(zancun2>=60)zancun2-=60;
break;
case 9://修改时间分钟的个位数
zancun2=zancun2/10*10+(zancun2%10+1)%10; break;
case 10://修改闹钟小时的十位数
zancun1+=10;
if(zancun1>=24)zancun1=zancun1%10;
break;
case 11://修改闹钟小时的个位数
zancun1=zancun1/10*10+(zancun1%10+1)%10; if(zancun1>=24)zancun1=20;
break;
case 12://修改闹钟分钟的十位数
zancun2+=10;
if(zancun2>=60)zancun2-=60;
break;
case 13://修改闹钟分钟的个位数
zancun2=zancun2/10*10+(zancun2%10+1)%10; break;
case 14:
zancun3^=1;
break;
default:
break;
}
while(s3_bit==0)
{
judge_dis();
}//等待按键释放
}
}
}
//显示处理函数
void judge_clock()
{
if(clock_hour==hour_count && clock_minute==minute_count) {
if(clock_en==1 && clock_flag==0)
{
speak_count=0;//开启蜂鸣器
clock_flag=1;
speak_count=0;
}
}
else
{
clock_flag=0;
}
if(clock_flag==1 && speak_count<400)
{
if(msecond_count<=5)
{
speak=0;
speak_count++;
}
else
{
speak=1;
}
}
else
{
speak=1;
}
}
////闪烁显示子程序
void dis_san(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1,uchar san)
{
if(san==1)
{
if(msecond_count<5)
{
}
}
else
{
display1(s6);
}
if(san==2)
{
if(msecond_count<5) {
display2(s5);
}
}
else
{
display2(s5);
}
if(san==3)
{
if(msecond_count<5) {
display3(s4); }
}
else
{
}
if(san==4)
{
if(msecond_count<5) {
display4(s3);
}
}
else
{
display4(s3);
}
if(san==6)
{
if(msecond_count<5) {
display6(s1);
}
}
else
{
display6(s1);
}
display5(s2);
// display6(s1);
}
//时钟显示程序
void dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1) {
display1(s6);
display2(s5);
display3(s4);
display4(s3);
display5(s2);
display6(s1);
}
void init_t0()
{
TMOD=0x01;//设定定时器工作方式1,定时器定时50毫秒
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//允许定时器0中断
t0_crycle=0;//定时器中断次数计数单元
}
//LED处理函数
void dis_led()
{
if(msecond_count<5)
{
led1_bit=1;
led2_bit=1;
}
else
{
led1_bit=0;
led2_bit=0;
}
}
//功能:把数据1显示在数码管1上
void display6(uchar dis_data)
{
smg_data=tabl1[dis_data];//送显示断码 dis_bit6=0;//锁存数据
delay_50us(40);
dis_bit6=1;
}
//功能:把数据1显示在数码管1上
void display5(uchar dis_data)
{
smg_data=tabl1[dis_data];//送显示断码 dis_bit5=0;//锁存数据
delay_50us(40);
dis_bit5=1;
}
//功能:把数据1显示在数码管1上
{
smg_data=tabl1[dis_data];//送显示断码 dis_bit4=0;//锁存数据
delay_50us(40);
dis_bit4=1;
}
//功能:把数据1显示在数码管1上
void display3(uchar dis_data)
{
smg_data=tabl1[dis_data];//送显示断码 dis_bit3=0;//锁存数据
delay_50us(40);
dis_bit3=1;
}
//功能:把数据1显示在数码管1上
void display1(uchar dis_data)
{
smg_data=tabl1[dis_data];//送显示断码 dis_bit1=0;//锁存数据
delay_50us(40);
dis_bit1=1;
}
//功能:把数据1显示在数码管1上
{
smg_data=tabl1[dis_data];//送显示断码 dis_bit2=0;//锁存数据
delay_50us(40);
dis_bit2=1;
}
//函数名称:void delay_50US(unsigned int t)
//功能:延时50*t(us)
void delay_50us(uint t)
{
unsigned char j;
for(;t>0;t--)
{
for(j=19;j>0;j--);
}
}。

相关文档
最新文档