利用51单片机和3位数码管实现10分钟内的简易计时器
要更改以下:#include利用51单片机的定时器和实验仪的数码管电路设计一个电子时钟,显示格式XX XX XX,依次为 时、分、秒。
给您一个电路和一个程序,//几天前,我为冲浪者写了它。*************************************************************** ************************************************************************************************************************************************************ ********。
****************************************************** ************************************** /#包括“ reg5 2 .h” sbit shug_01 = p2 ^ 0; = p2 ^ 3 ; ^ 5 ; //密钥菜单#Define LED_DATA P1 // P1 数据端口无符号char value_temp = 0; unsigned tank prodipaight_outk = 0; unsigned c har value_shio = 8 ; char unsigned value_feno = 4 0; unsigned ti value_miao = 0; 战车未签名的代码值[] = {0x4 0,0x7 9 ,0x2 4 ,0x3 0,0x1 3 ,0x1 9 ,0x1 2 ,0x02 ,0x7 8 ,0x7 8 ,0x00,0x1 0}; x> 0; x-)for(y = 1 2 0; y> 0; y--);} / * *程序运行[start and stop] sous-function ** / shug_01 = 1 ; * / delay_1 ms(5 ); ****** / delay_1 ms(5 ); 分钟*** / shug_03 = 1 ; ** / delay_1 ms(5 ); ********** / delay_1 ms(5 ); ; ****** **** / delay_1 ms(5 ); ****** ****** / delay_1 ms(5 ); g_06 = 0;} / *计时器启动时间5 0ms ** / void tem_init(void){tmod = 0x01 ; 切换[启动和停止]子功能** / void scan_keyoutcmd(void){if(key0_01 == 0){delay_1 ms(1 0); - ; o == -1 ){value_shio = 2 3 ;}}}}} while(key0_02 == 0); == 6 0){value_miao = 0; _shio ++; = p3 = 0x00; pt 1 {th0 = 0x4 c; ;
51单片机6位数码管显示时间
C5 1 微控制器六数字数字时钟用于用数字管点与三个键分开时钟以设置时间:插入键:时间设置 - > minuse设置 - >最终设置 - 双数字数字管道,在小时设置中表示每小时状态闪烁,当微小设置更改键时指示微小闪光的双数字管:在小时设置状态和分钟 设置状态设置密钥:将第二个设置为零C语言代码://main.c#includecucharcodeNum [] = {0xc0.0xf9 .0xa4 .0xb0.0x9 9 .0x9 9 .0x9 2 .0x8 2 .0x8 2 .0xf8 ,0x8 0.0x9 0}; ; mm = 0; h_增加();}} voids_increase(void)//在秒内增加1 个{if(ss <5 9 )ss ++; else {ss = 0; m_increase();}} voidDisplay(ucharse,uchardigi)//显示数字管,他们自己= 0-9 数字,digi = bit 0-6 {le2 = 1 ; p0 =(0x01 << digi); le2 = 0; p0 = 0x00; le1 = 1 ; p0 = num [自身]; if(digi == 1 || digi == 3 )p0&= 0x7 f; //显示划界延迟(5 0); p0 = 0xff; le1 = 0;} voidmain(void){p0 = 0xff; le1 = 0; le2 = 0; t0_init(); while(1 ){if(mode!= 1 2 4 {display(mm/1 0.2 ); //显示ti-digit屏幕(mm%1 0,3 ); // //显示单位数字中的单位数字} display(ss/1 0,4 ); /键对待{ucharcurkey(keyRelease){case1 : if(模式== 2 )模式= 0; EdeFunsignedChar; //计时器分配原始值,时间为1 0ms。
th0 = 0xd8 ; TL0 = 0xF0; tr0 = 1 ; ie = 0x8 2 ;} voidt0_intsrv(void)interrupt1 {//计时器再次开始计时。
th0 = 0xd8 ; TL0 = 0xF0; U_1 0MS ++; 如果(u_1 0ms%2 0 == 0)// 2 00ms {t_cycle =! t_cycle; //闪烁循环} if(u_1 0ms> 9 9 )// 1 000ms = 1 second {u_1 0ms = 0; s_increx();} key_process(); //指定关键处理}前序仿真电路:
单片机AT89C51芯片完成简易秒表的设计(三个8字数码管从0~999秒)设置一个开始按钮和一个复位按钮,谢了!
设计一个简单的秒表,使用微控制器AT8 9 C5 1 ,并配备了三个8 位数字管道,以显示从0到9 9 9 秒的时间。秒表包含一个启动按钮和一个重置按钮,该按钮易于操作且功能强大。
程序启动部分包含必要的文件,并定义用于数字管显示的数据变量。
使用BCD代码对数字管道进行编码,以方便处理。
另外,定义了定时和钥匙检测的变量。
主函数初始化I/O端口,指定计时器0和1 的工作模式,然后启动小时0。
在主循环中,程序连续检测开始按钮状态。
钥匙处理功能根据键的数量(例如启动定时,停止定时或清除)执行各种操作。
计时器0中断服务程序负责动态扫描和显示数字管,并选择当前通过位移操作显示数字管。
小时1 中断服务程序用于计算时间。
更新屏幕功能负责转换相应的BCD代码的计数值并更新屏幕缓冲区,以确保数字管显示合适的时间。
延迟子例程用于控制程序的执行率并确保计时的准确性。
总体设计是简单有效的,可以满足简单的秒表,直观操作和实用功能的需求。
跪求单片机c51一个多功能时钟设计。 要闹钟。 调整时间、秒表、就行了。 急求。 。 。 C语言编写
//在#include(在-)! = 0){for(j = 1 2 3 ; j> 0; j-);}} usignacharbutton_time(n,x,y)//时钟调整subroutine usignertcharn,x,y; {if(p1 _7 == 0){delay(5 0); if(p1 _7 == 0){n ++; if(n == x)n = 0; while(p1 _7 == 0);}} if(p1 _5 == 0){delay(5 0); if(p1 _5 == 0){if(n == 0)n = y; e lsen-; while(p1 _5 == 0);}} return;} usigncharbutton_date(n,x,y)//日期调整subroutine usignCharn,x,y; {if(p1 _7 == 0){delay(5 0); if(p1 _7 == 0){n ++; if(n == x)n = 1 ; while(p1 _7 == 0);}} if(p1 _5 == 0){delay(5 0); if(p1 _5 === 0){if(n == 1 )n = y; Elsen-; while(p1 _5 == 0);}} return;} void display(sect1 0,sects1 ,minuse1 0,minuse1 ,hour1 0,hour)//显示subroutine subroutine subroutine insededcharesecond1 0,second1 ,minute1 0,minume1 ,minume1 ,minume1 ,minume1 ,hour1 {p2 = 0xfe; p0 = dispode [second1 0]; //在几秒钟内显示十分延迟(1 ); p2 = 0xfd; p0 = dispode [second1 ]; //显示单个咬合延迟(1 ); p2 = 0xfb; p0 = dispode [1 0]; //显示“ - ”延迟(1 ); p2 = 0xf7 ; p0 = dispode [minute1 0]; //十分延迟(1 ); p2 = 0xef; p0 = dispode [minute1 ]; //一个 - 数字延迟(1 ); p2 = 0xdf; p0 = dispode [1 0]; //显示“ - ”延迟(1 ); p2 = 0xbf; p0 = dispode [hour1 0]; //十分延迟(1 ); p2 = 0x7 f; p0 = dispode [hour]; //单个位延迟(1 );} voidmain(){usignedCharflag; initial_ds1 3 02 (); //初始化DS1 3 02 时钟芯片,而(1 ){ds1 3 02 _getTime(&time1 ); //读取时间参数时间[5 ] =(time1 .second)%1 0; //在几秒钟内存储一数字数据[5 ]时间[4 ] =(time1 .second)/1 0; //在时间[4 ]时间[3 ] =(time1 .minute)%1 0的时间内存储十倍数据; //按分钟存储单件数据的存储在时间[3 ]时间[2 ] =(Time1 .minute)/1 0; //存储时间[2 ]时间[1 ] =(time1 .hour)%1 0; //存储当时的数字数据[1 ]时间[0] =(time1 .hour)/1 0; //在时间[0]日期[5 ] =(Time1 Day)%1 0时存储十分数据数据; 日期[4 ] =(time1 .day)/1 0; 日期[3 ] =(time1 .month)%1 0; 日期[2 ] =(time1 .month)/1 0; 日期[1 ] =(Time1 .year)%1 0; 日期[0] =(time1 .yea r)/1 0; 如果(p1 _4 == 0)//如果按时间板,则时钟开始显示正常的时间; if(flag> 1 ){flag = 0;}} while(p1 _4 == 0);} if(p1 _6 == 0)//如果按下每小时键,则可以开始显示日期,然后按以下键进行调整日期和观察模式{delay(5 0); if(p1 _6 == 0){flag ++; 在f(flag> 7 )中{flag = 0;} while(p1 _6 == 0);} switch(flag){case0:display(time [0],time [1 ],time [1 ],time [2 ],time [3 ] ,时间[4 ],时间[5 ]); //调用子函数以显示在矩阵时间中存储的数据中断的数据; [3 ],日期[4 ],日期[5 ]); //调用子函数以显示在矩阵日期中存储的数据以中断; 。
年); 查看(日期[0],日期[1 ],1 0,1 0,1 0,1 0); 休息; case3 :time1 .month = button_date(time1 .month,1 3 ,1 2 ); //调整每月DS1 3 02 _SETTIME(0x8 8 ,time1 .month); 显示(1 0.1 0,日期[2 ],日期[3 ],1 0,1 0); 休息; 案例4 :时间1 day = button_date(time1 .day,3 2 ,3 1 ); //调整DS1 3 02 _SETTIME的一天(0x8 6 ,time1 .day); Ate [4 ],日期[5 ]); 休息; case5 :time1 .hour = button_time(time1 .hour,2 4 ,2 3 ); // DS1 3 02 _SETTIME(0x8 4 ,time1 .hour); 显示(时间[0],时间[1 ],1 0,1 0,1 0); 休息; case6 :time1 .minute = button_time(time1 .minute,6 0.5 9 ); //调整子公司DS1 3 02 _SETTIME(0x8 2 ,time1 .minute); //调整秒DS1 3 02 _SETTIME(0x8 0,time1 .second); ); 休息;}}}// DS1 3 02 .H#IFDEF_REAL_TIMER_DIMER_DS1 3 02 _2 003 _7 _2 1 _#DEDINE_REAL_TIMER_TIMER_TIMER_DIMER_DS1 3 02 _2 003 SBITDS -TIDCLOCK数据线LEAD PIN LIND PIN SITS1 3 02 _RST = P1 ^2 ; //实时钟重置线铅bitacc0 = acc^0; sbitacc7 = acc^7 ; typedefstruct__system小时{usignedChareseCond; Usignedchmint; 未签名; UsignedCharweek; UsignedCharday; Usignertcharth; UsignedCharweek; Usigncharday; Usignertcharth; Usignertcharweek; Usigncharday; G [9 ]; UsignerTchartimestring [9 ];}系统小时; //定义的时间类型#定义(x)x#definepm(x)(x+1 2 )//转换器到2 4 -Hour System#defints1 3 02 _second0x8 0 //第二寄存器#definited1 3 02 _minute0x8 2 // S1 3 02 _DAY0X8 6 #Defints1 3 02 _MONTH0X8 8 #Defined1 3 02 _Year0x8 c#Defints1 3 02 _RAM (x) (0xc0+(x)*2 ) // the macro used to Calculate the ds1 3 02 _ram Address voidds1 3 02 Inputs1 3 02 Inputs1 3 02 Inputs1 . 写一个字节(内部功能){unsignedchari; for(i = 8 ; i> 0; i-){ds1 3 02 _io = acc0; //对应于rrcds1 3 02 _clk = 1 ; ds1 3 02 _clk = 0; //将跳高的脉冲发送到Low acc = acc >> 1 ;}} usignnhards1 3 02 outtbyte(void)// real -time手表读取字节(内部函数){unsignedChari; 对于(i = 8 ; i> 0; i-){acc = acc >> 1 ; //对应于rrcacc7 = ds1 3 02 _io; ds1 3 02 _c在安装lk = 1 ; ds1 3 02 _clk = 0; //将跳高的脉冲发送到低}返回(acc);} voidwrite1 3 02 (usignCharuCaddr,usignedCharucda)// ucaddr:ds1 3 02 地址,ucdata:ucdata:应编写{ds1 3 02 _rst = 0; ds1 3 02 _clk = 0; nputbyte(UCDA); //编写1 Byte Data DS1 3 02 _CLK = 1 ; ds1 3 02 _rst = 0; // rst0-> 1 -> 0,clk0-> 1 } usignCharreD1 3 02 (unsignedCharuCaddr)//读取DS1 3 02 {(DS1 3 02 _RST = 0; DS1 3 02 _CLK = 0; DS1 3 02 _CLK = 0; DS1 3 02 _RSTIPTSS 0X01 )的某个地址的数据; //地址,命令ucdata = ds1 3 02 output village(); (flag)write1 3 02 (0x8 e,0x1 0)); (值/1 0)<< 4 | //上4 件是十块,下4 件是单块} voids1 3 02 _geime(system*hour){unsignedcharreadValue; readValue = read1 3 02 (ds1 3 02 _second); 时间 - > second =((readValue&0x7 0)>> 4 )*1 0+(readValue&0x0f); //转换器转换为十进制readValue = read1 3 02 (DS1 3 02 3 02 02 02 )> minem =(((readValue&0x7 0)>> 4 )*1 0+(readValue&0x0f); readValue = read1 3 02 (ds1 3 02 _hour); 时间 - > hour =((readValue&0x7 0)>> 4 )*1 0+(readValue&0x0f); readValue = read1 3 02 (ds1 3 02 _day); ReadValue = Read1 3 02 (DS1 3 02 _DAY-DAY-DAY-DAY-DAY-DAY-DAY-DAY =(readValue&0x7 0)>> 4 )*1 0+(readValue&0x0f) - >周=&0x7 0)>> 4 )*1 0+(ReadValue& 0x0f); readValue = read1 3 02 (ds1 3 02 _month) readValue = read1 3 02 (ds1 3 02 _year); 时间 - >是r =(((readValue&0xf0)>> 4 )*1 0+(readValue&0x0f);}/*voidDateTost(system*time){time-> datestring [0] = time-> time-> egar/1 0+ '0'; //数字类型转换为等级类型时间>数据字符串[1 ] = Time-> Years%1 0+'0'; 时间 - > datestring [2 ] =' - '; time-> datestring ing [3 ] =时间 - >月/1 0+'0'; 时间 - > datestring [4 ] =时间 - >月%1 0+'0'; 时间 - > datestring [5 ] =' - '; 时间 - > datestring [6 ] =时间 - >天/1 0+'0'; 时间 - > datestring [7 ] =时间 - > day%1 0+'0'; time-> datestring [8 ] ='\ 0';} voidTimetost(系统小时*小时){time-> timeString [0] =时间 - > time-> hour/1 0+'0'; //将数字类型转换为等级类型的时间 - >时间>时间 - 时间 - 时间 - >时间%1 0+'0'; 时间>时间关闭[2 ] =':'; 时间的时间[3 ] =时间 - >分钟/1 0+'0'; 时间 - >时间段[4 ] =时间 - >分钟%1 0+'0'; 时间 - >时间段[5 ] =':'; 时间 - >时间段[6 ] =时间 - > second/1 0+'0'; 小时时间段[7 ] =时间 - >第二%% 1 0+'0'; time-> datestring [8 ] ='\ 0';}*/voidinitial_ds1 3 02 (void){usignedChareseCond = read1 3 02 (ds1 3 02 _secon d); 如果(其他&0x8 0)//如果第七为1 (表示没有引导),则启动时钟DS1 3 02 _SETTIME(DS1 3 02 _SECOND,0);}/**************** **************************************************************************************************************************** ********************************** voidburstwrite1 3 02 (unsignedchar*pwclock)// to ds1 3 02 comcy时钟数据(多字节模式){unsignedChari; Writ1 3 02 (0x8 e,0x00); //控制命令,wp = 0,写手术? ds1 3 02 _rst = 0; ds1 3 02 _clk = 0; ds1 3 02 _rst = 1 ; ds1 3 02 inputbyte(0xbe; /0xbe:clock multibytes写作命令(i = 8 ; i> 0; i-)// 8 byte = 7 byte clock data +1 byte control {ds1 3 02 inputby te(*pwclock) +;} ds1 3 02 _clk = 1 ; ds1 3 02 _rst = 0;} voidburstad1 3 02 (unsignedchar*prclock)= 0; // 0xbf:(i = 8 ; i> 0; i-){*prclock = ds1 3 02 outputtbyte(); //读取1 Byte Data Prclock ++;} DS1 3 02 _CLK = 1 ; ds1 3 02 _rst = 0;} voids1 3 02 _timestop(bitflag)//如果要停止{usignertchardata; data = read1 3 02 (ds1 3 02 _second); D S1 3 02 _SETPROTECT(0); if(flag)write1 3 02 (ds1 3 02 _second,data | 0x8 0); // stop ersewrite1 3 02 (ds1 3 02 _second,data&0x7 f); 不要停止} **************************************************************************** *** **************************************************************************************************************************** *****/#endif