C语言实现数字时钟:51单片机编程与液晶屏显示教程

创始人
2025-01-01 03:44:11
0 次浏览
0 评论

用c语言模拟一个数字时钟,要求延时一秒运行

1.使用sleep来延迟刷新,让系统时间显示出来。

2.例程:

#include#include<math.h>#include#定义IP3.1415926//的中心坐标屏幕(640X480模式)#definemid_x320#definemid_y240intmain(){intgraphdriver=DETECT,graph模式;intend_x,end_y;结构时间curtime;floatth_min,th_sec(&graphdriver,&graph;mode,"C:\\TC2");//初始化VGA屏幕模式setbkcolor(BLACK);//使用黑色背景色while(!kbhit(0))//如果有键盘输入则跳转,至程序结束{setcolor(GREEN);//将画笔设置为绿色圆圈(mid_x,mid_y,180);//时钟圈的外圈(mid_x,mid_y,150);//时钟圈内圈(mid_x,mid_y);,1);//绘制时钟的中心gettime(&curtime);//获取当前系统时间th_sec=(float)curtime.ti_sec*0.1047197551//将秒针角度转换为弧度,方便以后绘图,如下。
像h_min=(float)curtime.ti_min*0.1047197551+th_sec/60.0;//分针的弧度th_hour=(float)curtime.ti_hour*0.5235987755+th_min/12.0;//小时的弧度。
注意时间被分成12等分,所以时间乘以3.14/180*5//计算时针(时针)尾部的坐标。
长度70)end_x=mid_x+70*sin(th_hour);end_y=mid_y-70*cos(th_hour);设置颜色(红色);线(mid_x,mid_y,end_x,end_y);//用红线画出时针//计算分针的坐标(分针长度110)end_x=middle_x+110*sin(th_min);end_y=mid_y-110*cos(th_min);设置颜色(红色);线(mid_x,mid_y,end_x,end_y);end_x=mid_x+140*sin(th_sec);end_y=mid_y-140*cos(th_sec);设置颜色(红色);//如上,绘制秒针,长度为140//在钟面上绘制刻度,刻度长度为20行(140,240,160,240)//9点钟方向为行大刻度(320,60,320);//12点对应大刻度线(500)。
,240480240);//3点刻度线(320420320400);//6点刻度线(410395.7400378.4//5点线(475.7330458.4);320);//4点线(475,7,150,458,4,160);//2点线(410,84,3,400,101,6);//1点线(230,84,3,240,101,6);新(164.3,150,181.6,160);//10点线(164.3,330,181.6,320);//8点line(230,395.7,240,378.4//7点sleep(BLUE);//这里应该有错别字,停一下,应该是sleep(1000)cleardevice();//清除屏幕display}closegraph(//关闭VGA屏幕,即返回文本模式returns0;

数字时钟C语言设计.用的是51单片机。00秒00分00小时还有小数点。麻烦把程序代码告诉我把

我写了一篇!用数码管显示!您可以使用键盘校对时间!请参考一下。
我还写了一个液晶屏!如果你想要的话我可以发给你!#include#defineucharunsignedchar#defineuintunsignedintsbitK1=P3^0;sbitK2=P3^1;sbitK3=P3^2;uchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchartable1[]={0x5b,0x66,0x6d,0x6f,0x6d,0x6f};uchartable2[]={0,01,0,0,0,0};英寸=1,fen=0,miao=0;uchara,i,j,temp=-2,temp1;voidsfm(uchardz,ucharshu);//统计的个数中的技能十位和个位voiddisplay();//技能时间为显示voiddisplay1(ucharz);//只显示需要校准的数字voidinit();//初始化voidjiaoshi();//定义一个时间函数voiddelay(ucharz)//定义一个延迟函数{ucharx,y;for(x=0;x

急求一个用51单片机编的可按键调时的数字时钟程序,数码管显示,C语言编写,谢谢。

#include#includeunsignedcharcodedis_week[]={"周日、周一、周二、周三、周四、周五、周六"};unsignedcharcodepara_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5};//周和月参数变量unsignedchardatadis_buf1[16];//顶行LCD显示缓冲区unsignedchardatadis_buf2[16];//底行LCD显示缓冲区unsignedchardatayear,month,day,week;//年月日周unsignedchardataarmhour,armmin,armsec;//报警Clock时、分、秒unsignedchardatahour,min,sec,sec100;//时、分、秒、百分之一秒unsignedchardataflag,vkey,skey;//设置状态计数标志,上一个键值,键当前值bitalarm;//判断闹钟是否有闹钟启用,1--开启,0--禁用sbitrs=P2^0;//LCD数据/命令选择端口(H/L)sbitrw=P2^1;//LCD读出/Device写选择端(H/L)sbitep=P2^2;//LCD触发控制sbitPRE=P3^3;//调节键(AN3)sbitSET=P3^4;//调节键(AN4)sbitSPK=P3^6;voiddelayms(unsignedcharms);//程序延迟bitlcd_busy();//检查程序LCD忙状态voidlcd_wcmd(charcmd);//向LCD程序写入指令voidlcd_wdat(chardat);//向LCD程序写入数据voidlcd_pos(charpos);//LCD数据指针定位程序voidlcd_init();//LCD初始化设置程序voidpro_timedate();//日期和时间处理程序voidpro_display();//显示处理程序voidpro_key();//按键处理程序voidtime_alarm();//闹钟函数(闹钟)unsignedcharscan_key();//按键扫描程序unsignedcharweek_proc();//自动计算并显示的函数bitleap_year();是闰年voidlcd_sef_chr();//LCD自定义字符程序voidupdate_disbuf(unsignedchart1,unsignedchart2[],unsignedchardis_h,unsignedchardis_m,unsignedchardis_s);//更新显示缓冲函数//程序延时voiddelay(unsignedcharms){while(ms--){unsignedchari;for(i=0;i<250 LCD忙状态bitlcd_busy(){bitresult;rs=0;rw ep=1;_nop_();_nop_();_nop_();_nop_();result LCD中D0--D7,D7=1表示忙,D7 ep=0;returnresult;}//写入指令LCDvoidlcd_wcmd(charcmd){while(lcd_busy());//当lcd_busy为1时,再次检测LCDbusy状态当lcd-busy为0时,开始写指令rs rw=0;ep>=cmd;_nop_();_nop_();_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0;}//写入数据输入LCDvoidlcd_wdat(chardat){while(lcd_busy());//当lcd_busy为1时,再次检测LCD忙状态,当lcd-busy为0,开始写入数据rs=1;rw=0;ep=0;P0=dat;_nop_();_nop_();_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0;}//LCD数据光标定位程序voidlcd_pos(charpos){lcd_wcmd(pos|0x80);//数据指针=80+地址码(00H~27H,40H~67H)}//设置两个自定义字符,(注:LCD1602中自定义字符的地址为0x00--0x07,表示可以定义8个字符)//这里放1个字符自定义字符放在0x00(000)位置,剩余字符放在0x01(001)位置voidlcd_sef_chr(){//第一个自定义字符lcd_wcmd(0x40);//“01000000”第1行地址(D7D6为定义的CommandFormat地址设置D5D4D3为字符存储位置(0--7),D2D1D0为字符行地址(0--7))lcd_wdat(0x1f);//数据“XXX11111”row1(D7D6D5is2lcd_wdat(0)x11);//“XXX10001”第2行数据lcd_wcmd(0x42);//“01000010”第3行地址lcd_wdat(0x15);//第3行数据“XXX10101”lcd_wcmd(0x43);//“01000011”第4行地址lcd_wdat(0x11);//“XXX10001”行数据4lcd_wcmd(0x44);//"01000100"第5行地址lcd_wdat(0x1f);//"XXX11111"第5行数据lcd_wcmd(0x45);//"01000101"第6行地址lcd_wdat(0x0a));//"XXX01010"第6行数据lcd_wcmd(0x46);//"01000110"第7行地址lcd_wdat(0x1f);//"XXX11111"第7行数据lcd_wcmd(0x47);//"01000111"第8行地址lcd_wdat(0x00);//“XXX00000”第8行数据//第二个自定义字符lcd_wcmd(0x48);//“01001000”第1行地址lcd_wdat(0x01);//“XXX00001”第1行数据lcd_wcmd(0x49);//“01001001”第2行地址lcd_wdat(0x1b);//“XXX11011”第2行数据lcd_wcmd(0x4a);//“01001010”第3行地址lcd_wdat(0x1d);//“XXX11101”数据3号线lcd_wcmd(0x4b);//“01001011”第4行地址lcd_wdat(0x19);//“XXX11001”第4行数据lcd_wcmd(0x4c);//“01001100”第5行地址lcd_wdat(0x1d);//“XXX11101”"数据第5行lcd_wcmd(0x4d);//“01001101”第6行地址lcd_wdat(0x1b);//“XXX11011”第6行据lcd_wcmd(0x4e);//“01001110”第7行地址lcd_wdat(0x01);//“XXX00001”行数据7lcd_wcmd(0x4f);//"01001111"行地址8lcd_wdat(0x00);//行数据8"XXX00000"}//LCD初始化设置voidlcd_init(){lcd_wcmd(0x38);//设置LCD为16X2屏,5X7点阵,数据接口8个bitdelay(1);lcd_wcmd(0x0c);//LCD显示及光标设置(光标不闪烁,不显示“-”)delay(1);lcd_wcmd(0x06);//LCD显示显示光标移动设置(光标光标地址加1,整个屏幕不动)delay(1);lcd_wcmd(0x01);//清除屏幕内容延时LCD(1);}//计算闰年bitleap_year(){bitleap;if((year%4==0&&year0!=0)||year%400==0)//闰年leap=1的条件;elseleap=0;returnleap;}//自动计算处理unsignedcharweek_weeksproc(){unsignedcharnum_leap;unsignedcharc;num_leap=year/4-year/100+year/400;//从00到年份的闰年数if(leap_year()&&month<=2)//即年份闰年即一月和二月c=5;elsec=6;week=(year+para_month[month]+date+num_leap+c)%7;//计算对应周的返回周期;}//更新显示缓冲区voidupdate_disbuf(unsignedchart1,unsignedchart2[],unsignedchardis_h,unsignedchardis_m,unsignedchardis_s){dis_buf1[0]=t1;//dis_buf1[1]=0x20;//空间dis​​_buf1[2]=50;//'2'dis_buf1[3]=48;//'0'dis_buf1[4]=年/10+48;dis_buf1[5]=年+48;dis_buf1[6]=0x2d;dis_buf1[7]=月/10+48;dis_buf1[8]=月+48;dis_buf1[9]=0x2d;//'-'dis_buf1[10]=日/10+48;dis_buf1[11]=日期+48;dis_buf1[12]=0x20;dis_buf1[13]=dis_week[4*周];dis_buf1[14]=dis_week[4*周+1];dis_buf1[15]=dis_week[4*week+2];dis_buf2[0]=t2[0];dis_buf2[1]=t2[1];dis_buf2[2]=t2[2];dis_buf2[3]=t2[3];dis_buf2[4]=t2[4];dis_buf2[5]=t2[5];dis_buf2[6]=t2[6];//空格if(alarm)dis_buf2[7]=0x01;//alarm=1,显示闹钟并启用标致(第二个自定义字符)elsedis_buf2[7]=0x20;//alarm=0,不显示闹钟,开启标致dis_buf2[8]=dis_h/10+48;dis_buf2[9]=dis_h+48;dis_buf2[10]=0x3a;//':'dis_buf2[11]=dis_m/10+48;dis_buf2[12]=dis_m+48;dis_buf2[13]=0x3a;dis_buf2[14]=dis_s/10+48;dis_buf2[15]=dis_s+48;}//日期时间处理程序voidpro_timedate(){sec++;if(秒>59){秒=0;分钟++;if(分钟>59){分钟=0;小时++;if(小时>23){小时=0;日期++;if(月==1||月==3||月==5||月==7||月==8||月==10||月==12)if(day>31){date=1;month++;}//大月31天如果(月==4||month==6||month==9||month==11)if(date>30){date=1;month++;}//小月30天if(month==2){if(leap_year())//闰年的条件{if(date>29){date=1;month++;}}//闰年的2月还有29天{if(date>28){date=1;Month++;}}//平年二月有28天}if(month>12){month=1;year++;}if(year>99)year=0;}}}week_proc();if(sec==armsec&&min==armmin&&hour==armhour){if(alarm)TR1=1;//闹钟开启时,闹钟时间已到,启动Timer1}}//显示handlervoidpro_display(){unsignedchari;lcd_pos(0x00);for(i=0;i<=15;i++){lcd_wdat(dis_buf1[i]);}lcd_pos(0x40);for(i=0;i<=15;i++){lcd_wdat(dis_buf2[i]);}}//Timer0中断处理程序,产生的秒数voidtimer0()interrupt1{TH0=0xD8;TL0=0xF0;sec100++;if(sec100>=100)//1秒时间(100*10ms=1000ms=1s){sec100=0;pro_timedate();//Handler句柄调用日期和时间}if(sec&0x01)//“RICHMCU”暂时闪烁一秒停一秒updatete_disbuf(0x00,"",hour,min,sec);//0x00表示在00位置显示自定义字符elseupdate_disbuf(0x00,"RICHMCU",hour,min,sec);pro_display();//调用显示处理函数}//程序扫描键unsignedcharscan_key(){skey=0x00;//设置初始值变量vkeyskey|=PRE;//读取PRE键的状态skey=skey<<1 PRE键的状态保存在skey的B1位中skey|=SET;//读取RE键的状态SETkey并保存到skey的B0位returnkey;//返回skey键值(PRE,SETstatus)}//外部中断中断处理程序INT0voidint0()interrupt0{TR0 timer0IE=0;//禁用中断lcd_wcmd(0x0e);//显示光标“_”,所有光标不闪烁dynamic flag=0;vkey x03;while(flag^0x0a){skey=scan_key();//扫描按键状态if(skey^vkey)//如果skey与vkey相同,则跳出循环,执行循环体else{delay(10);//去除键抖动skey skey与vkey相同,则跳出循环执行不同的循环体{vkey=skey;//将skey的值返回给vkeyif(skey xss=clean LCD显示内容IE=0x8f;//CPU中断开启,INT0,INT1,使能中断TR0 hour=0;min sec=0;//开机时显示时分秒armhour armmin=0;armsec week_proc();alarm=1;//首次开机,开启闹钟IE CPU中断开启,INT0、INT1、Timer0、Timer1中断使能IP=0x04;//设置INT0为最高中断优先级IT0 IT1=0;//设置外部INT0和INT1为电平使能模式(注意,不要选择边沿模式激活,因为容易出问题)TMOD Timer0,Timer1工作在模式1,16位定时模式TH0=0xdc;TL0 Timer0设置初始值10ms时间值TH1=0xff;TL1 Timer1设置初始值TR0=1;//定时器0启动TR1 voidpro_key(){switch(flag){case0:alarm=!alarm;//打开或关闭闹钟(alarm alarm=0:关闭)update_disbuf(0x50,>23)armhour=0;update_disbuf(0x50,"alarm:",armhour,armmin,armsec);//更新显示数据pro_display();//处理显示调用lcd_pos(0x49);break;//光标返回原来调整位置case2:armmin++;if(armmin>59)armmin=0;update_disbuf(0x50,"闹钟:",armhour,armmin,armsec);pro_display();lcd_pos(0x4c);break;case3:armsec++;if(armsec>59)armsec=0;update_disbuf(0x50,"闹钟:",armhour,armmin,armsec);pro_display();lcd_pos(0x4f);break;case4:year++;if(year>99)year=0;week_proc();//自动计算周update_disbuf(0x50,"time:",hour,min,sec);();lcd_pos(0x05);中断;case5:month++;if(month>12)month=1;week_proc();//自动计算周update_disbuf(0x50,"time:",hour,min,sec);pro_display();lcd_pos(0x08);break;case6:日期++;if(月==1||月==3||月==5||month==7||month==8||month==10||month==12)if(date>31)date=1;//大月份有31天if(month==4||month==6||month==9||month==11)if(date>30)date=1;//小月30天if(month==2){if(jump_year())//事情闰年事件{if(date>29)date=1;}//闰年的二月有29天{if(date>28)date=1;}}//平年的二月有28天week_proc();//自动计算星期update_disbuf(0x50,"time:",hour,min,sec);pro_display();lcd_pos(0x0b);break;case7:hour++;if(hour>23)hour=0;update_disbuf(0x50,“时间:”,小时,分钟,秒);pro_display();lcd_pos(0x49);break;case8:min++;if(min>59)min=0;update_disbuf(0x50,"时间:",小时,分钟,秒);pro_display();lcd_pos(0x4c);break;case9:sec++;if(sec>59)sec=0;update_disbuf(0x50,"time:",hour,min,sec);pro_display();lcd_pos(0x4f);break;default:break;}}//Timer1中断处理程序,生成警告声voidtimer1()interrupt3{TH1=0xff;0x00;SPK=~SPK;}//外部中断断点INT1管理程序,停止报警声voidint1()interrupt2{if(TR1)TR1=0;}实验说明:按按键K1进入状态设置状态,按K2按键进入状态设置是否开启闹钟功能,然后进入闹钟功能。
设置时钟时、分、秒,年、月、日、时、分、秒。
按K3直至退出设置状态可调节是否打开闹钟以及调节闹钟的时、分、秒、年。
、月份、日期和时间数字液晶显示屏位于第二排中间小扬声器显示,表明闹钟功能已开启。
否则,闹钟功能将被禁用(可设置为正常调节状态,液晶屏上排显示自定义字符)。
前面下排液晶显示器“RICHMCU”闪烁。
液晶屏设置状态前排显示“P”,设置时下排前显示“报警:”。
其他状态下显示闹钟时间和“时间”。
年份从2000年更改为2099年。
周会自动转换。
我希望你能应用它。
谢谢。
热门文章
1
Redisson分布式锁深度解析:Red... Redis实现分布式锁+Redisson源码解析在某些场景下,多个进程需要以互斥...

2
深度解析Docker:容器技术提升应用部... docker是什么Docker是一种强大的开源容器技术,它将应用程序及其所有依赖...

3
C语言实现:如何判断一个整数是否为质数? C语言输入一个整数,判断是否是质数?#include//头文件intmain()...

4
K8s弃用Docker背后的故事及Doc... K8s为什么要弃用Docker?在讨论K8s抛弃Docker的话题时,我们首先需...

5
C语言文本输入输出教程:安全高效处理字符... C语言怎么变成文字?如果你想用C语言输入输出文本,其实很简单。您必须首先定义一个...

6
深入解析Java:面向对象编程特性与实现... Java语言的特点,实现机制和体系结构。中的任何实体都可以被视为一个对象。对象通...

7
三款免费Docker管理工具,提升您的可... 3款免费又好用的Docker可视化管理工具在Docker的世界里,命令行工具无疑...

8
C语言期末编程题解析:完整程序代码分享 C语言期末考试编程代码函数题?按照题目要求编写的完整程序如下(见图,图中重复的部...

9
轻松掌握:Redis键值查看技巧,两种方... 如何读取redis中的key值中的结果我们希望它能帮助您使用它。怎么查看redi...

10
SQL DELETE语句:详解及不同删除... 请问Sql的DELETE语句怎么写delete表示删除表中的数据示例:delet...