秒表-六位数码管有效显示

秒表-六位数码管有效显示
秒表-六位数码管有效显示

?/************************************************************************** ?* 标题: 秒表-六位数码管有效显示(C51)

?* 作者: wentao https://www.360docs.net/doc/528176220.html,

? https://www.360docs.net/doc/528176220.html,

?* 日期: 2007.3.3

?* 软件: Keil C51 V8.02

?* 芯片: AT89X51

?* 说明: 实验板实测通过,数码管为8位共阳

?* 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!

?**************************************************************************/?

?#include

?#include

?#define uchar unsigned char

?

?void delay_ms(uchar ms); // 延时毫秒@12M,ms最大值255

?void key_scan(); // 按键扫描

?void key_to(); // 按键处理

?

?uchar code dis_code[11] = {0xc0,0xf9,0xa4,0xb0,0x99, //段码表

?// 0 1 2 3 4 对应内容

? 0x92,0x82,0xf8,0x80,0x90,0xbf};

?// 5 6 7 8 9 -

?

?uchar data dis[8]; // dis[0]为百分之一秒值,dis[1]为十分之一秒值

?// dis[2],dis[5]为'-'段码的偏移量

?// dis[3]为秒个位值,dis[4]为秒十位值

?// dis[6]为分个位值,dis[7]为分十位值

?

?uchar data dot = 0; // 百分之一秒计数器(0.00s-0.99s)

?uchar data sec = 0; // 秒计数器(00s-59s)

?uchar data min = 0; // 分计数器(00m-99m)

?

?uchar data dis_b; // dis_b为位码选通数码管

?uchar data dis_r; // dis_r为取段码时的偏移量

?

?uchar data key_t = 0; // 按键次数,初始为0

?

?sbit K = P1^4; // K键与P1.4相连

?

?void main()

? {

?P2 = 0xff; // 关所有数码管

?P1 = 0xff; // p1为准双向口,作输入时先写1

? dis[2] = 10; // '-'在段码表中偏移量为10

? dis[5] = 10; // '-'在段码表中偏移量为10

? dis_b = 0x7f; // 初始选通P2.7口数码管

? dis_r = 0; // 初始化偏移量为0

?

?TMOD = 0x11; // 定时/计数器0,1工作于方式1

?TH0 = 0xd8; // 预置定时常数55536(d8f0),产生10ms时基信号

?TL0 = 0xf0;

?TH1 = 0xfc; // 预置定时常数64536(fc18),产生1ms间隔用于动态显示?TH1 = 0x18;

?EA = 1; // 开总中断

?ET0 = 1; // 定时/计数器0允许中断

?ET1 = 1; // 定时/计数器1允许中断

?TR0 = 0; // 关闭定时/计数器0

?TR1 = 1; // 启动定时/计数器1

?while(1)

? {

?if(K != 1) // 有键按下

? {

? delay_ms(10); // 延时10ms去抖

?if(K != 1) // 确定是有键按下

? {

?while(K != 1); // 等待键松开

? key_to(); // 按键处理

? }

? }

? }

? }

?void key_to() // 按键处理子程序

? {

? key_t++; // 按键次数加1

?if(key_t == 1) // 第一次按下

?TR0 = 1; // 启动定时器0

?else

? {

?if(key_t == 2) // 第二次按下

?TR0 = 0; // 关闭定时器0

?else

? {

?if(key_t == 3) // 第三次按下

? {

? dot = 0; // 三个计数器清零

? sec = 0;

? min = 0;

? key_t = 0; // 按键次数清零

? }

? }

? }

?

? }

?void tiem0(void) interrupt 1 // T/C0中断服务程序(产生10ms时基信号)

? {

? dot++; // 百分之一秒计数器加1

?if(dot == 100) // 计数值到100

? {

? dot = 0; // 清零

? sec++; // 秒计数器加1(进位10ms*100=1s)

?if(sec == 60) // 秒计数值到60

? {

? sec = 0; // 秒计数器清零

? min++; // 分计数器加1(进位60s=1m)

?if(min == 100) // 分计数到100

? min = 0; // 分计数器清零

? }

? }

?TH0 = 0xd8; // 重置定时常数

?TL0 = 0xf0;

? }

?void time1(void) interrupt 3 // T/C1中断服务程序(延时1ms数码管动态显示) ? {

? dis[0] = dot % 10; // 百分之一秒计数器个位分离出来赋绐dis[0]

? dis[1] = dot / 10; // 百分之一秒计数器十位分离出来赋绐dis[1]

? dis[3] = sec % 10; // 秒计数器个位赋绐dis[3]

? dis[4] = sec / 10; // 秒计数器十位赋绐dis[4]

? dis[6] = min % 10; // 分计数器个位赋绐dis[6]

? dis[7] = min / 10; // 分计数器十位赋绐dis[7]

?

?P0 = dis_code[dis[dis_r]]; // 段码送P0口(dis[0]...dis[7])

?P2 = dis_b; // 位码送P2口

?

? dis_r++; // 偏移量加1,下次中断时显示下个数

? dis_r &= 0x07; // dis_r增到8时自动清0(使之在0到7间循环) ?

? dis_b = _cror_(dis_b,1); // 位码循环右移,下次中断时选通下个数码管

?

?TH1 = 0xfc; // 重置定时常数

?TL1 = 0x18;

?

? }

?void delay_ms(uchar ms) // 延时毫秒@12M,ms最大值255 ? {

?uchar i;

?while(ms--)

?for(i = 0; i < 124; i++);

? }

用6位数码管显示时间

#include #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; sbit key1=P3^4; sbit key2=P3^5; sbit key3=P3^6; sbit key4=P3^7; sbit fm=P2^3; uchar num,num1,num2,num3,temp; void init(); void keyscan(); //void jianpan(); void delay(uint a) { uint x,z; for(x=a;x>0;x--) for(z=10;z>0;z--); } uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71, }; unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,0xff,0xef}; void display1(uchar numdi) //秒钟显示函数 { uchar fen,miao; fen=numdi/10; miao=numdi%10; dula=1; P0=table[fen]; dula=0; P0=0xff; wela=1; P0=0xfb; wela=0; delay(20); dula=1;

P0=table1[miao]; dula=0; P0=0xff; wela=1; P0=0xf7; wela=0; delay(20); } void display(uchar numdis)//分钟显示函数{ uchar shi,ge; shi=numdis/10; ge=numdis%10; dula=1; P0=table[shi]; dula=0; P0=0xff; wela=1; P0=0xef; wela=0; delay(20); dula=1; P0=table[ge]; dula=0; P0=0xff; wela=1; P0=0xdf; wela=0; delay(20); } void display2(uchar numd2)//小时显示函数{ uchar xshi,xfen; xshi=numd2/10; xfen=numd2%10; dula=1; P0=table[xshi]; dula=0; P0=0xff; wela=1; P0=0xfe;

6位7段LED数码管显示

目录 1. 设计目的与要求..................................................... - 1 - 1.1 设计目的...................................................... - 1 - 1.2 设计环境...................................................... - 1 - 1.3 设计要求...................................................... - 1 - 2. 设计的方案与基本原理............................................... - 2 - 2.1 6 位 8 段数码管工作原理....................................... - 2 - 2.2 实验箱上 SPCE061A控制 6 位 8 段数码管的显示................... - 3 - 2.3 动态显示原理.................................................. - 4 - 2.4 unSP IDE2.0.0 简介............................................ - 6 - 2.5 系统硬件连接.................................................. - 7 - 3. 程序设计........................................................... - 8 - 3.1主程序......................................................... - 8 - 3.2 中断服务程序.................................................. - 9 - 4.调试............................................................... - 12 - 4.1 实验步骤..................................................... - 12 - 4.2 调试结果..................................................... - 12 - 5.总结............................................................... - 14 - 6.参考资料........................................................... - 15 - 附录设计程序汇总.................................................... - 16 -

用数码管显示实时日历时钟的应用设计

(用数码管显示实时日历时钟的应用设计)

摘要 本课题通过MCS-51单片机来设计电子时钟,采用汇编语言进行编程,可以实现以下一些功能:小时,分,秒和年,月,日的显示。本次设计的电子时钟系统由时钟电路,LED显示电路三部分组成。51单片机通过软件编程,在LED数码管上实现小时,分,秒和年,月,日的显示;利用时钟芯片DS1302来实现计时。本文详细介绍了DS1302 芯片的基本工作原理及其软件设计过程,运用PROTEUS软件进行电路连接和仿真,同时还介绍了74LS164,通过它来实现I|O口的扩展。 关键词:时钟芯片,仿真软件,74LS164 目录 前言 0.1设计思路 (8) 0.2研究意义 (8)

一、时钟芯片 1.1 了解时钟芯片……………………………………………….8-9 1.2 掌握时钟芯片的工作原理………………………………….10-11二、74LS164 2.1 了解74LS164........................................................11-12 2.2 掌握的74LS164工作原理. (12) 三、数码管 3.1 熟悉常用的LED数码管...........................................12-13 3.2 了解动态显示与静态显示. (13) 四、程序设计 4.0 程序流程图 (14) 4.1 DS1392的驱动.......................................................15-16 4.2 PROTUES实现电路连接. (17) 4.3 数码管的显示:小时;分;秒 (18) 4.4 数码管显示:年;月;日 (19) 五、总结…………………………………………………………………..20-21 六、附页程序………………………………………………………………22-31前言

ds1302时钟数码管显示时分秒

单片机原理课程设计 课题名称:基于DS1302的数码管显示数字钟 专业班级:电子信息工程 学生学号:0414070126 学生姓名:张向阳 指导教师:张云马崇霄 设计时间:2010年6月21日--2010年6月25日

目录 摘要................................................................................... 1 设计任务和要求..................................................................... 2 方案论证........................................................................... 3 系统硬件设计....................................................................... 3.1 系统总原理图 ............................................................... 3.2 元器件清单.................................................................................... .................................................. 3.3 PCB板图.................................................................................... ................................................... 3.4 Proteus仿真图.............................................................. 3.5 分电路图及原理说明......................................................... 3.5.1 主控部分(单片机MCS-51).................................................................... .......... 3.5.2 计时部分(实时时钟芯片DS1302).................................................................. 3.5.3 显示部分(共阳极数码管)....................................................................... ......... 3.5.4 调时部分(按键)....................................................................... ......................... 4 系统软件设计....................................................................... 4.1 程序流程图.................................................................. 4.2 程序源代码................................................................... 5 心得体会...........................................................................

8位数码管显示时钟

本人依据AT89C51和8位数码管为素材,以最少的见实现最多的功能! 本程序开机流动显示学号可实现时钟,日历,定时闹钟,秒表等功能! C程序: #include unsigned char led[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; //用一维数组定义-9、横杠、全灭 unsigned char num[12]={2,0,0,9,3,5,0,7,0,1,2,0} ; unsigned char a[8]; unsigned char second=0,minute=0,hour=0,year=0,mon=1,day=1,day1,hsec,sec_m,min_m,N,temp1; unsigned char minute1=0,hour1=0; unsigned char b[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //扫描 unsigned char k=0; unsigned int temp; // 记录毫秒为秒的变量 unsigned char M,S_flag; //M是模式,更新时间的种模式加上正常模式 S_flag闪烁标志 sbit K0=P3^7; //K0是闹钟起停标志位 sbit K1=P3^0; sbit K2=P3^1; sbit K3=P3^2; sbit BEEP=P3^3; void delay(unsigned n) //0.2毫秒 { int x,y; for(x=0;x

基于51单片机100天倒计时数码管显示(共阴) (附加时分秒显示)

基于51单片机100天倒计时数码管显示 (共阴) (附加时分秒显示) #include unsigned char s[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char e3,f3,g3,h3,count,flag0,flag2,flag3,flag4,j,a1,a2,a3,a4,b1,b2; void delay(unsigned char i); signed int time1=100,time0=59,time3=59,time4=23; void sm(); void time2(); void hms1 (); void timej (); void timez (); sbit ks=P1^4; sbit hms=P1^5; sbit add=P1^6; sbit bat=P1^7; void sm() //100天数码管显示 { e3=time1/100; f3=time1%100/10; g3=time1%100%10; P2=0x00; P0=s[e3]; delay(2); P2=0x01; P0=s[f3]; delay(2); P2=0x02; P0=s[g3]; delay(2); a1=time4%60/10; //时显示 a2=time4%60%10; a3=time3%60/10; //分显示 a4=time3%60%10; P2=0x03; P0=s[a1]; delay(2); P2=0x04;

delay(2); P2=0x05; P0=s[a3]; delay(2); P2=0x06; P0=s[a4]; delay(2); b1=time0%60/10; 秒显示b2=time0%60%10; P2=0x07; P0=s[b1]; delay(2); P2=0x08; P0=s[b2]; delay(2); } void main() { TMOD=0x01; TH0=0x3c; TL0=0xb0; EA=1; ET0=1; while(1) { sm(); time2(); hms1(); timej(); timez(); } } void time2() //计时开始{ if(ks==0) {delay(10);} if(ks==0) {flag0=1;} if(flag0==1&&ks==1)

单片机-数码管-时分秒显示

#include<> #define uchar unsigned char #define uint unsigned int uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};//0~9的数码管显示 sbit dula=P2^6;//声明段选 sbit wela=P2^7;//声明位选 uchar h,m,s,num1;//定义变量 void delay(uint xms)//延时函数 { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void init()//初始化 { TMOD=0x10;// 0001 0001 定时器0的工作方式1,定时器1的工作方式1 TH1=(65536-45872)/256; TL1=(65536-45872)%256; EA=1;//开总中断 ET1=1;//开定时器1中断 TR1=1;//启动定时器1 } void main()//主函数 { init(); //初始化 while(1) //while循环 { wela=1; //打开位选 P0=0xfe; //点亮数码管 wela=0; //关闭位选 dula=1; //打开段选 P0=table[h/10];//送入数据 dula=0; // 关闭段选 delay(1); //延时5ms wela=1; //打开位选 P0=0xfd; //点亮数码管 wela=0; //关闭位选 dula=1; //打开段选 P0=table[h%10];//送入数据

秒表-六位数码管有效显示

?/************************************************************************** ?* 标题: 秒表-六位数码管有效显示(C51) ?* 作者: wentao https://www.360docs.net/doc/528176220.html, ? https://www.360docs.net/doc/528176220.html, ?* 日期: 2007.3.3 ?* 软件: Keil C51 V8.02 ?* 芯片: AT89X51 ?* 说明: 实验板实测通过,数码管为8位共阳 ?* 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! ?**************************************************************************/? ?#include ?#include ?#define uchar unsigned char ? ?void delay_ms(uchar ms); // 延时毫秒@12M,ms最大值255 ?void key_scan(); // 按键扫描 ?void key_to(); // 按键处理 ? ?uchar code dis_code[11] = {0xc0,0xf9,0xa4,0xb0,0x99, //段码表 ?// 0 1 2 3 4 对应内容 ? 0x92,0x82,0xf8,0x80,0x90,0xbf}; ?// 5 6 7 8 9 - ? ?uchar data dis[8]; // dis[0]为百分之一秒值,dis[1]为十分之一秒值 ?// dis[2],dis[5]为'-'段码的偏移量 ?// dis[3]为秒个位值,dis[4]为秒十位值 ?// dis[6]为分个位值,dis[7]为分十位值 ? ?uchar data dot = 0; // 百分之一秒计数器(0.00s-0.99s) ?uchar data sec = 0; // 秒计数器(00s-59s) ?uchar data min = 0; // 分计数器(00m-99m) ? ?uchar data dis_b; // dis_b为位码选通数码管 ?uchar data dis_r; // dis_r为取段码时的偏移量 ? ?uchar data key_t = 0; // 按键次数,初始为0 ? ?sbit K = P1^4; // K键与P1.4相连 ? ?void main() ? { ?P2 = 0xff; // 关所有数码管 ?P1 = 0xff; // p1为准双向口,作输入时先写1

6位数码管显示

6位数码管显示 2008年03月29日下午 07:48 /******************************************************************** * 公司名称:智佳精控技术小组 模块名称:segment_led.c 功能:六位七段数码管显示模块 说明: 程序设计:kaixinlaohe 设计时间:2008.03.29 版本号: 20080329 程序说明: 使用环境为AT89S52,兼容51型单片机,晶振12M 使用方法:定义一个6位的数组,将数组首地址作参数调用Display_LED(dsi[]) ********************************************************************* / #ifndef SEGMENT_MACRO #define SEGMENT_MACRO #include #define uchar unsigned char //段码的端口 #define Segment_Port P0 //端口从高到低定义为:dp,g,f,e,d,c,b,a //位码的端口,第一位在最左边,在程序中左到右依次显 示 sbit Segment_Bit1=P2^2; sbit Segment_Bit2=P2^3; sbit Segment_Bit3=P2^4; sbit Segment_Bit4=P2^5; sbit Segment_Bit5=P2^6; sbit Segment_Bit6=P2^7; //延时10ms void delay(); //用数码管显示数据 void Display_LED(unsigned char dis[6]); #endif //--------------------------------------------------------------end

六位数码管显示时分秒

六位数码管显示时分秒,通过四个按键进行时间的控制。按下"调时"按键,时间显示停止;按下"选择时分秒"按键,数码管上方的发光二极管会点亮,对应着选中的要修改的时间是小时、分钟还是秒;按下"按下增加"按键,选中的时间将会增加;按下"完成"按键,时间继续显示。 已通过proteus仿真,电路图如下所示,希望大家多多指点,积极留言: //编程:jumpmysoul #include #define ulong unsigned long char tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管数字码 char tab_dp[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x70,0x10};//共阳数码管数字码(带小数点) #define LED P0 //P0为数码管的段选 #define LIGHT P1 //P1为时分秒位的指示灯 #define WS P2 //P2为数码管的位选 sbit time_change=P3^0; //P3^0为“调时”按键 sbit time_choose=P3^1; //P3^1为“选择时分秒”按键 sbit time_inc=P3^2; //P3^2为“增加”按键 sbit time_ok=P3^3; //P3^3为“完成”按键 ulong t; ulong sec,min,hour,sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi; //定义秒,分,时,秒的个位,十位,分的个位,十位,时的个位,十位 int choose_n; //按下“选择时分秒”按键的次数

单片机 数码管 时分秒显示

/****** 2012-8-23日修改为XX-XX-XX,24小时制并成功显示*******/ #include #define uchar unsigned char #define uint unsigned int uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};//0~9的数码管显示 sbit dula=P2^6;//声明段选 sbit wela=P2^7;//声明位选 uchar h,m,s,num1;//定义变量 void delay(uint xms)//延时函数 { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void init()//初始化 { TMOD=0x10;// 0001 0001 定时器0的工作方式1,定时器1的工作方式1 TH1=(65536-45872)/256; TL1=(65536-45872)%256; EA=1;//开总中断 ET1=1;//开定时器1中断 TR1=1;//启动定时器1 } void main()//主函数 { init(); //初始化 while(1) //while循环 { wela=1; //打开位选 P0=0xfe; //点亮数码管 wela=0; //关闭位选 dula=1; //打开段选 P0=table[h/10];//送入数据 dula=0; // 关闭段选 delay(1); //延时5ms wela=1; //打开位选 P0=0xfd; //点亮数码管 wela=0; //关闭位选 dula=1; //打开段选

六位共阴数码管显示时钟程序

#include // 包含51 单片机寄存器定义的头文件 #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar int_time ; //中断次数计数变量 uchar second; //秒计数变量 uchar minute; //分钟计数变量 uchar hour; //小时计数变量 void delay(uint z) //延时函数,延时约1ms { uchar x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } /****************************************************************** 函数功能:显示秒的子程序 入口参数:s ********************************************************************/ void DisplaySecond(uchar s) { wela=1; P0=0xef; //DS5点亮 wela=0; P0=0xff; //消隐 dula=1; P0=table[s/10]; //显示十位 dula=0; delay(1); wela=1; P0=0xdf; //DS6点亮 wela=0; P0=0xff; //消隐 dula=1; P0=table[s%10]; //显示个位

汇编数字钟 8位数码管显示

汇编数字钟(8位数码管显示) 这款数字钟是笔者亲自试验过的作品,电路图和程序都经过优化,供爱好者制作参考。 显示格式依然是23-59-59(同样是小时十位如果为0则不显示),调整时间增加了一只按钮,通过调整选择键SET_KEY选择调整位,选中位开始闪烁,此时再按增加键ADD_KEY或减少键DEC_KEY调整选中位,如果长按ADD_KEY或DEC_KEY,系统识别后则进行调时快进,此时停止闪烁,方便人眼观察。同时还增加了调秒功能:如果选中位是秒,则按增加键或减少键都是将秒清零。 汇编程序设计: /************************************************************** 程序名称:51单片机8位数码管数字钟汇编程序 简要说明:实现24小时制电子钟,8位数码管显示,显示时分秒 显示格式:23-59-59(小时十位如果为0则不显示) 通过3只按键来调整时间 调整选择键SET_KEY:P1.0;通过选择键选择调整位,选中位闪烁 增加键ADD_KEY:P1.1;按一次使选中位加1

减少键DEC_KEY;P1.2;按一次使选中位减1 如果长按ADD_KEY或DEC_KEY,识别后则进行调时快进,此时停止闪烁如果选中位是秒,则按增加键或减少键都是将秒清零 P0口输出数码管段选信号,P2口输出数码管位选信号。晶振12M 编写:https://www.360docs.net/doc/528176220.html, 最后更新:08/12/31晚 **************************************************************/ ORG 0000H ;程序入口地址 LJMP START ORG 000BH ;定时器0中断入口地址 LJMP TIMER_0 ORG 0300H /*****程序开始,初始化*****/ START: SETB 48H ;使用一个bit位用于调时闪烁标志 SETB 47H ;使用一个bit位用于产生脉冲用于调时快进时基 MOV R1,#0 ;调整选择键功能标志:0正常走时、1调时、2调分、3调秒 MOV 20H,#00H ;用于控制秒基准时钟源的产生 MOV 21H,#00H ;清零秒寄存器 MOV 22H,#00H ;清零分寄存器 MOV 23H,#00H ;清零时寄存器 MOV 24H,#00H ;用于控制调时闪烁的基准时钟的产生 MOV IP,#02H ;IP,IE初始化 MOV IE,#82H MOV TMOD,#01H ;设定定时器0工作方式1 MOV TH0,#3CH MOV TL0,#0B0H ;赋定时初值,定时50ms SETB TR0 ;启动定时器0 MOV SP,#40H ;重设堆栈指针 /*****主程序*****/ MAIN: LCALL DISPLAY ;调用显示子程序 LCALL KEY_SCAN ;调用按键检测子程序 JZ MAIN ;无键按下则返回重新循环 LCALL SET_KEY ;调用选择键处理子程序

8位时钟数码管显示

#include // 包含51单片机寄存器定义的头文件 unsigned char Tab[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //control shape unsigned char port[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char int_time ; //中断次数计数变量 unsigned char second; //秒计数变量 unsigned char minute; //分钟计数变量 unsigned char hour; //小时计数变量 void delay(void) //延时函数,延时约0.6ms { unsigned char j; for(j=0;j<180;j++); } /****************************************************************** 函数功能:显示秒的子程序 入口参数:s ********************************************************************/ void DisplaySecond(unsigned char s) { P1=0xbf; //P2.6引脚输出低电平,DS6点亮 P0=Tab[s/10]; //显示十位 delay(); delay(); delay(); P1=0x7f; //P2.7引脚输出低电平,DS7点亮 P0=Tab[s%10]; //显示个位 delay(); delay(); delay(); P1=0xdf; //P1.5引脚输出低电平,DS5点亮 P0=0x40; //分隔符“-”的段码 delay(); delay(); delay(); P1=0xff; //关闭所有数码管 P0=0x00; delay(); delay(); delay();

6位7段数码管时钟显示汇编程序

ORG 0000H AJMP MAIN ORG 000BH AJMP IT0P ORG 0040H MAIN: ;主程序 MOV P0,#0FFH ;数码管初始状态都是8 MOV P1,#0FFH ;选中所有的数码管 MOV SP,#60H MOV TMOD,#01H MOV IE,#82H MOV 30H,#14H ;存放定时循环次数单元20次MOV 40H,#00H ;存放时的数据单元 MOV 41H,#00H ;存放分的数据单元 MOV 42H,#00H ;存放秒的数据单元 MOV TH0,#3CH MOV TL0,#0B0H ;定时50ms*20 SETB TR0

LOOP: ACALL DISPLAY ;调用显示子程序AJMP LOOP DISPLAY: ;数码管显示子程序SECONDGE: SETB P1.0 MOV A,42H ANL A,#0FH ACALL SEG ACALL DELAY1MS CLR P1.0 SECONDSHI:SETB P1.1 MOV A,42H SW AP A ANL A,#0FH ACALL SEG ACALL DELAY1MS CLR P1.1 MINUTEGE: SETB P1.2 MOV A,41H ANL A,#0FH ACALL SEG ACALL DELAY1MS CLR P1.2 MINUTESHI:SETB P1.3 MOV A,41H SW AP A ANL A,#0FH ACALL SEG ACALL DELAY1MS CLR P1.3 HOURGE: SETB P1.4 MOV A,40H ANL A,#0FH ACALL SEG ACALL DELAY1MS CLR P1.4 HOURSHI: SETB P1.5 MOV A,40H SW AP A ANL A,#0FH ACALL SEG ACALL DELAY1MS CLR P1.5 RET

LED数码管显示电子钟设计

《单片机原理及应用》 课程设计说明书 题目LED数码管显示电子钟设计系(部) 专业(班级) 姓名 学号 指导教师 起止日期

课程设计任务书系(部):专业:

目录 目录 (3) 一、摘要 (4) 二、设计内容 (4) 2.1、任务要求 (4) 2.2、设计程序方案 (4) 2.3 设计电路仿真图 (6) 三、心得体会 (9) 四、参考文献 (9)

一、摘要 单片机全称为单片机微型计算机(Single Chip Microsoftcomputer)。从应用领域来看,单片机主要用来控制,所以又称为微控制器(Microcontroller Unit)或嵌入式控制器。单片机是将计算机的基本部件微型化并集成在一块芯片上的微型计算机。 单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。由于具有上述优点,在我国,单片机已广泛地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体化设备等各个方面,而51单片机是各单片机中最为典型和最有代表性的一种。 时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间,它通常有两种实现方法:一是用软件实现,即用单片机内部的可编程定时/计数器来实现,但误差很大,主要用在对时间精度要求不高的场合;二是用专门的时钟芯片实现,在对时间精度要求很高的情况下,通常采用这种方法,典型的时钟芯片有:DS1302,DS12887,X1203等都可以满足高精度的要求。 二、设计内容 2.1、任务要求 本次设计时钟电路,使用了A TC89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的年、月、日、时、分、秒,还有设定闹钟,用一扬声器来进行定时提醒,同时使用汇编语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:键盘、芯片、扬声器、LED显示即可满足设计要求。 2.2、设计程序方案 设计程序思路: 1.实现8位数码管动态扫描显示 void Display_1Code(unsigned char pos,unsigned char code1); void Display_2Num(unsigned char pos,unsigned char num,unsigned char point);

六位数码管时钟设计

xxxx职业技术学院 《计算机控制技术》实训报告 题目: 六位数码管时钟设计 专业:________机电一体化 班级: 机电1006班 学生姓名: 学号: 06100520 指导教师: 实训时间: 2012 年 12 月 29—2013年1月6 日

一.系统设计要求 (一)设计1分钟定时程序 ?选择定时器(T0/T1) ?选择适当的工作方式(方式1/方式2) ?计算并设定定时器的计数初值 ?要求用中断方式 ?每隔1秒钟信号取反一次,输出到P1.0引脚所连接的LED灯去。(二)设计6位数码管显示程序 设计6位数码管显示程序,用动态扫描方式显示6位数字(如日期:121203)。段码显示由P0口负责,位码由P2口显示 (三)实际完成的功能 起始值时、分、秒全是零,系统执行初始化程序后,随即开始走时,无须特为启动。当时钟显示为23:59:59时,再加1,时钟从00:00:00开始运行,从而达到24小时循环。 二.系统的硬件设计 ?

?CPU--AT89C51 ?段码驱动芯片--74LS245 ?6位数码管--7SEG-MPX6-CC ?电阻--3WATT10K ?电容--A VX0402……、GENELECT…… ?晶振--CRYSTAL ?按钮--BUTTON 6LED日期显示

三.系统的软件设计程序流程图

子程序定时中断子程序

调节分钟中断子程序调节小时中断子程序 (一)定时程序 1秒定时(模式1) ORG 0000H SJMP START ORG 000BH SJMP INTI ORG 0030H START:MOV TMOD,#01H SETB TR0 SETB EA SETB ET0 MOV R6,#10 MOV TH0,#15H MOV TL0,#0A0H MOV R6,#0E8H MOV R7,#03H SJMP $ INTI:MOV TH0,#15H MOV TL0,#0A0H DJNZ R6,EXIT DJNZ R7,EXIT MOV R6,#0E8H MOV R7,#03H

数码管时分秒动态显示

数码管时分秒动态显示 1、目的:数码管显示时、分、秒,实现计时功能。 2、原理:定时器产生中断,一秒钟计数一次,计数值转换成时、分、秒后,数码管动态显示。 3、原理图 4、函数思路。 单片机工作频率是12MHZ,定时器12分频后累加计数,也就是1us计数一次。定时一秒,定时器装入初值50000,则需进入中断20次,才能实现(50000*20=100000=1s)!数码管动态显示,要求控制显示延时时间和消隐。累计计数转换成时、分、秒,转换思路是计数分割。一分等于60,秒,一小时等于60分。计数累加,计数一次,秒加1,;计数60次,分加1,;计数3600次,时加1.计数86400次,24小时满,而后计数清零。 5、程序 #include #include // 加载头文件 #define uchar unsigned char // 宏定义无符号字符型 #define uint unsigned long int // 宏定义无符号长整型

uint num ; // 定义num和cunt为全局变量,全局更改有效uchar cunt ; uchar tab1[] = {0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x40}; // 数码管段选编码高电平有效 uchar code tab2[]={0xfe,0xfd,0xfb,0xf7 ,0xef,0xdF,0xbF,0x7F}; //数码管位选编码,低电平有效 void display(uint num ); // 显示函数函数声明 void delay (); // 延时函数声明 void init () // 中断初始化 { TMOD=0x01; // 设置定时器T0为16位定时模式 TH0=(65535-50000)/256; // T0装入初值50000 TL0=(65535-50000)%256; // / 取整,%取余。0xc350(50000),高八位装入th0中,低八位装入tl0中。 EA=1; // 开总中断 ET0=1; // 开定时器中断 TR0=1; // 启动定时器,定时器开始计数 cunt=0 ; // 中断函数标志位初始化 num=0; // 计数初始化 } void main () // 主函数 { init(); // 函数初始化 while(1) // 大循环 { if(cunt==20) // 检测1秒 { cunt=0; // 中断标志清零 num++; // 计数加1 } if(num>86400) // 计数86400次后,计数清零。既是计时24小时后,计时清零 num=0; display(num); // 时、分、秒显示 } } void timer0() interrupt 1 // 中断函数 { TH0=(65535-50000)/256; // T0 装初值, TL0=(65535-50000)%256; cunt++; // 每进中断服务程序一次,cunt加1

相关文档
最新文档