求只用51单片机设计的能显示时分秒且能校时的C语言程序最好详解哦

求只用51单片机设计的能显示时分秒且能校时的C语言程序最好详解哦,第1张

//at89c2051单片机 运用在(sft ck301)时钟上的程序 12m晶振

//省去其他的功能,只有显示时间功能,是24小时显示制。

//三个按键的设置安排由左向右是

//k1:设置秒分时退出的循环按钮 P3.5初始高电平

//k2数字上加循环 P3.4初始高电平

//k3: 数字下减循环 P3.2 初始高电平

//

//蜂鸣器 P3.7 初始高电平 低电平触发

//

//数码管

//段码端口P1

//位码分别是 P3.0十万位 P3.4万位 P3.2千位 P3.5百位P3.3十位 P3.1个位

//原11版本的计数器设置TMOD设置为0X20是错误的,应该是0x10,已经更正

//且装填的数字是50000累加中断数字是20都已经更正

#include<reg51.h> //包含单片机寄存器的头文件

unsigned char code Tab[]={0x81,0xe7,0x92,0xa2,0xe4,0xa8,0x88,0xe3,0x80,0xa0,0xff}//数码管段码///P1口

////////////////////////----0----1----2---3-----4----5----6----7----8---9---空

unsigned int m//// 秒

unsigned int f//// 分

unsigned int s//// 时

unsigned int a//////主秒a

unsigned int b//////主秒 b

unsigned int c//////调节循环 0//显示 1//调分 2//调时

sbit p30=P3^0

sbit p31=P3^1

sbit p32=P3^2

sbit p33=P3^3

sbit p34=P3^4

sbit p35=P3^5

sbit p37=P3^7

sbit p17=P1^7

/****************************************************************

函数名 delay() 函数功能:延时一段时间 始

*****************************************************************/

void delay(void)//两个void意思分别为无需返回值,没有参数传递

{

unsigned int i //定义无符号整数,最大取值范围65535

for(i=0i<10i++) //做20000次空循环

//什么也不做,等待一个机器周期

}

/****************************************************************

函数名 delay() 函数功能:延时一段时间 终

*****************************************************************/

/****************************************************************

函数名 xianshi() 函数功能:显示整个时钟 始

*****************************************************************/

void xianshi()//两个void意思分别为无需返回值,没有参数传递

{

////////// 个位

p33=0

p31=1

p32=1

p35=1

p30=1

p34=1

P1=Tab[m%10]

delay()

//////////

p33=1//////消除鬼影语句

delay()//////消除鬼影语句

P1=0xff//////消除鬼影语句

////////// 十位

p33=1

p31=0

p32=1

p35=1

p30=1

p34=1

P1=Tab[m/10]

delay()

//////////

p31=1//////消除鬼影语句

delay()//////消除鬼影语句

P1=0xff//////消除鬼影语句

////////// 百位

p33=1

p31=1

p32=0

p35=1

p30=1

p34=1

P1=Tab[f%10]

delay()

//////////

p32=1//////消除鬼影语句

delay()//////消除鬼影语句

P1=0xff//////消除鬼影语句

////////// 千位

p33=1

p31=1

p32=1

p35=0

p30=1

p34=1

P1=Tab[f/10]

delay()

//////////

p35=1//////消除鬼影语句

delay()//////消除鬼影语句

P1=0xff//////消除鬼影语句

////////// 万位

p33=1

p31=1

p32=1

p35=1

p30=0

p34=1

P1=Tab[s%10]

delay()

//////////

p30=1//////消除鬼影语句

delay()//////消除鬼影语句

P1=0xff//////消除鬼影语句

//////////十万位

p33=1

p31=1

p32=1

p35=1

p30=1

p34=0

P1=Tab[s/10]

delay()

//////////

p34=1//////消除鬼影语句

delay()//////消除鬼影语句

P1=0xff//////消除鬼影语句

p33=1

p31=1

p32=1

p35=1

p30=1

p34=1

}

/****************************************************************

函数名 xianshi()函数功能:显示整个时钟 终

*****************************************************************/

/****************************************************************

函数名 xianshifen() 函数功能:显示分 始

*****************************************************************/

void xianshifen()//两个void意思分别为无需返回值,没有参数传递

{

////////// 百位

p33=1

p31=1

p32=0

p35=1

p30=1

p34=1

P1=Tab[f%10]

delay()

//////////

p32=1//////消除鬼影语句

delay()//////消除鬼影语句

P1=0xff//////消除鬼影语句

////////// 千位

p33=1

p31=1

p32=1

p35=0

p30=1

p34=1

P1=Tab[f/10]

delay()

//////////

p35=1//////消除鬼影语句

delay()//////消除鬼影语句

P1=0xff//////消除鬼影语句

p33=1

p31=1

p32=1

p35=1

p30=1

p34=1

}

/****************************************************************

函数名 xianshifen()函数功能:显示分 终

*****************************************************************/

/****************************************************************

函数名 xianshishi() 函数功能:显示时 始

*****************************************************************/

void xianshishi()//两个void意思分别为无需返回值,没有参数传递

{

////////// 万位

p33=1

p31=1

p32=1

p35=1

p30=0

p34=1

P1=Tab[s%10]

delay()

//////////

p30=1//////消除鬼影语句

delay()//////消除鬼影语句

P1=0xff//////消除鬼影语句

//////////十万位

p33=1

p31=1

p32=1

p35=1

p30=1

p34=0

P1=Tab[s/10]

delay()

//////////

p34=1//////消除鬼影语句

delay()//////消除鬼影语句

P1=0xff//////消除鬼影语句

p33=1

p31=1

p32=1

p35=1

p30=1

p34=1

}

/****************************************************************

函数名 xianshishi()函数功能:显示时 终

*****************************************************************/

/****************************************************************

函数名 leijijiamiao() 函数功能:利用中断累计加秒 始

*****************************************************************/

void leijijiamiao(void)//两个void意思分别为无需返回值,没有参数传递

{

if(b==1)

{

b=0

m++

p17=~p17 ////p17取反实现冒号闪烁

if(m==60)

{

m=0

f++

}

if(f==60)

{

f=0

s++

}

if(s==24)

{

s=0

}

}

}

/****************************************************************

函数名 leijijiamiao() 函数功能:利用中断累计加秒 终

*****************************************************************/

/*******************************************************************

函数功能:主函数 (C语言规定必须有也只能有1个主函数) 始

********************************************************************/

void main()

{ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/******************************************************************

定义初始值

******************************************************************/

p37=1////蜂鸣器不发声

f=0

m=0

s=0

c=0

p17=1

/******************************************************************

定义初始值

******************************************************************/

/***********************************************************************

定时计数器的 *** 作 作为定时器使用1秒计时 始

************************************************************************/

EA=1 //开总中断

ET1=1//定时器T1中断允许

TR1=1//启动定时计数器T1

TMOD=0x10////0001 0000设置定时计数器T1为定时使用,并使用16位定时器

TH1=(65536-50000)/256//////装填定时计数器T1高8位//定时5000次的时间是0.05秒。得循环20次才是1秒

TL1=(65536-50000)%256//////装填定时技数器T1底8位//定时5000次的时间是0.05秒。得循环20次才是1秒

TF1=0/////////定时计数器1的溢出位清零

/***********************************************************************

定时计数器的 *** 作 作为定时器使用1秒计时 终

************************************************************************/

while(1) ////////////////////////////////////主循环

{////////////////////////////////////主循环 始

//////////////////////////////////////////////////////////显示 循环

while(c==0)

{

xianshi()

leijijiamiao()

if(p35==0)

{

delay()

delay()

delay()

delay()

if(p35==0)

{

c++

while(!p35)

{

}

}

}

}

//////////////////////////////////////////////////////////显示 循环

//////////////////////////////////////////////////////////调分 循环

while(c==1)

{

xianshifen()

////////////////// 调分 上加按钮判断

if(p34==0)

{

delay()

delay()

delay()

delay()

if(p34==0)

{

f++

if(f==60)

{

f=0

}

while(!p34)

{

}

}

}

/////////////////// 调分 上加按钮判断

/////////////////// 调分 下减按钮判断

if(p32==0)

{

delay()

delay()

delay()

delay()

if(p32==0)

{

if(f==00)

{

f=60

}

f--

while(!p32)

{

}

}

}

///////////////////调分 下减按钮判断

///////////////////循环按钮判断

if(p35==0)

{

delay()

delay()

delay()

delay()

if(p35==0)

{

c++

while(!p35)

{

}

}

}

///////////////////循环按钮判断

}

//////////////////////////////////////////////////////////调分 循环

//////////////////////////////////////////////////////////调时 循环

while(c==2)

{

xianshishi()

///////////////////调时 上加按钮判断

if(p34==0)

{

delay()

delay()

delay()

delay()

if(p34==0)

{

s++

if(s==24)

{

s=0

}

while(!p34)

{

}

}

}

///////////////////调时 上加按钮判断

///////////////////调时 下减按钮判断

if(p32==0)

{

delay()

delay()

delay()

delay()

if(p32==0)

{

if(s==00)

{

s=24

}

s--

while(!p32)

{

}

}

}

///////////////////调时 下减按钮判断

///////////////////循环按钮判断

if(p35==0)

{

delay()

delay()

delay()

delay()

if(p35==0)

{

c=0

while(!p35)

{

}

}

}

///////////////////循环按钮判断

}

//////////////////////////////////////////////////////////调时 循环

}////////////////////////////////////主循环 终

} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*******************************************************************

函数功能:主函数 (C语言规定必须有也只能有1个主函数) 终

********************************************************************/

/*****************************************************************************************************************

中断服务函数;定时器T1中断服务函数//当定时计数器T1有溢出时则执行本函数,执行完本函数后接着执行之前的运行的程序

******************************************************************************************************************/

void Time1(void) interrupt 3 using 0

//interrupt 3 理解是中断函数修饰后面的数字取值由0--31,

//目前数字意义是0--外部中断0、1--定时计数器T0、2--外中断1、3--定时计数器T1、4--串行中断、5--定时计数器T2(其他数值保留)

//using 0 理解是工作寄存器组,可以忽略 通常取0

{

TF1=0

TH1=(65536-50000)/256//////装填定时计数器T1高8位//定时5000次的时间是0.05秒。得循环20次才是1秒

TL1=(65536-50000)%256//////装填定时技数器T1底8位//定时5000次的时间是0.05秒。得循环20次才是1秒

a++

if(a==20)////检测a的数值为3713后给b加1///当定时器有3713次溢出时最接近1秒计时(20121018号由原来的3713改为3715)之前时钟偏快

{

a=0

b=1

}

}

/*****************************************************************************************************************

中断服务函数;定时器T1中断服务函数//当定时计数器T1有溢出时则执行本函数,执行完本函数后接着执行之前的运行的程序

******************************************************************************************************************/

c语言时钟程序代码如下:

#include<windows.h>

#include<math.h>

#define ID_TIMER 1//计时器ID

#define TWOPI (2*3.14159)

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM)

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)

{

static TCHAR szAppName[]=TEXT("Clock")

HWND hwnd

MSG msg

WNDCLASS wndclass

wndclass.cbClsExtra=0

wndclass.cbWndExtra=0

wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH)

wndclass.hCursor=LoadCursor(NULL,IDC_ARROW)

wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION)

wndclass.hInstance=hInstance

wndclass.lpfnWndProc=WndProc

wndclass.lpszClassName=szAppName

wndclass.lpszMenuName=NULL

wndclass.style=CS_HREDRAW|CS_VREDRAW

if(!RegisterClass(&wndclass))

{

MessageBox(NULL,TEXT("This program requires Windows

T"),szAppName,MB_ICONERROR)

return 0

}

hwnd=CreateWindow(szAppName,TEXT("Analog Clock"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL)

ShowWindow(hwnd,iCmdShow)

UpdateWindow(hwnd)

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg)

DispatchMessage(&msg)

}

return msg.wParam

}

void Setsotropic(HDC hdc,int cxClient,int cyClient)

{

SetMapMode(hdc,MM_ISOTROPIC)

SetWindowExtEx(hdc,1000,1000,NULL)

SetViewportExtEx(hdc,cxClient/2,-cyClient/2,NULL)

SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL)

}

void RotatePoint(POINT pt[],int iNum,int iAngle)

{

int i

POINT ptTemp

for(i=0i<iNumi++)

{

ptTemp.x=(int)(pt[i].x*cos(TWOPI*iAngle/360)+pt[i].y*sin(TWOPI*iAngle/360))

ptTemp.y=(int)(pt[i].y*cos(TWOPI*iAngle/360)+pt[i].x*sin(TWOPI*iAngle/360))

pt[i]=ptTemp

}

}

void DrawClock(HDC hdc)

{

int iAngle

POINT pt[3]

for(iAngle=0iAngle<360iAngle+=6)

{

pt[0].x=0

pt[0].y=900

RotatePoint(pt,1,iAngle)

pt[2].x=pt[2].y=iAngle%5?33:100

pt[0].x-=pt[2].x/2

pt[0].y-=pt[2].y/2

pt[1].x=pt[0].x+pt[2].x

pt[1].y=pt[0].y+pt[2].y

SelectObject(hdc,GetStockObject(BLACK_BRUSH))

Ellipse(hdc,pt[0].x,pt[0].y,pt[1].x,pt[1].y )

}

}

void DrawHands(HDC hdc,SYSTEMTIME *pst,BOOL fChange)

{

static POINT pt[3][5]={0,-150,100,0,0,600,-100,0,0,-150, 0,-200,50,0,0,800,-50,0,0,-200, 0,0,0,0,0,0,0,0,0,800 }

int i,iAngle[3]

POINT ptTemp[3][5]

iAngle[0]=(pst->wHour*30)%360+pst->wMinute/2

iAngle[1]=pst->wMinute*6

iAngle[2]=pst->wSecond*6

memcpy(ptTemp,pt,sizeof(pt))

for(i=fChange?0:2i<3i++)

{

RotatePoint(ptTemp[i],5,iAngle[i])

Polyline(hdc,ptTemp[i],5)

}

}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)

{

static int cxClient,cyClient

static SYSTEMTIME stPrevious

BOOL fChange

HDC hdc

PAINTSTRUCT ps

SYSTEMTIME st

switch(message)

{

case WM_CREATE:

SetTimer(hwnd,ID_TIMER,1000,NULL)

GetLocalTime(&st)

stPrevious=st

return 0

case WM_SIZE:

cxClient=LOWORD(lParam)

cyClient=HIWORD(lParam)

return 0

case WM_TIMER:

GetLocalTime(&st)

fChange=st.wHour!=stPrevious.wHour||st.wMinute!=stPrevious.wMinute

hdc=GetDC(hwnd)

Setsotropic(hdc,cxClient,cyClient)

SelectObject(hdc,GetStockObject(WHITE_PEN))

DrawHands(hdc,&stPrevious,fChange)

SelectObject(hdc,GetStockObject(BLACK_PEN))

DrawHands(hdc,&st,TRUE)

stPrevious=st

return 0

case WM_PAINT:

hdc=BeginPaint(hwnd,&ps)

Setsotropic(hdc,cxClient,cyClient)

DrawClock(hdc)

DrawHands(hdc,&stPrevious,TRUE)

EndPaint(hwnd,&ps)

return 0

case WM_DESTROY:

KillTimer(hwnd,ID_TIMER)

PostQuitMessage(0)

return 0

}

return DefWindowProc(hwnd,message,wParam,lParam)

}

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

C语言是由UNIX的研制者丹尼斯·里奇(Dennis Ritchie)于1970年 由 肯·汤普逊(Ken Thompson)所研制出的B语言的基础上发展和完善起来的。目前,C语言编译器普遍存在于各种不同的 *** 作系统中,例如UNIX、MS-DOS、Microsoft Windows及Linux等。C语言的设计影响了许多后来的编程语言,例如C++、Objective-C、Java、C#等。

我这写了一个!使用数码管显示的!可以用键盘校对时间!你参考下。还写了一个液晶显示的!你要的话也可以发给你!

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit K1=P3^0

sbit K2=P3^1

sbit K3=P3^2

uchar table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f}

uchar table1[]={0x5b,0x66,0x6d,0x6f,0x6d,0x6f}

uchar table2[]={0,1,0,0,0,0}

int shi=1,fen=0,miao=0

uchar a,i,j,temp=-2,temp1

void sfm(uchar dz,uchar shu)//将计的数的十位和个位分开

void display()//将时间显示出来

void display1(uchar dz)//只显示要校对的数

void init()//初始化

void jiaoshi()//定义一个校时函数

void delay(uchar z)//定义一个延时函数

{

uchar x,y

for(x=0x<50x++)

for(y=0y<zy++)

}

void main()

{

init()

while(1)

{

jiaoshi()

}

}

void init()

{

EA=1

ET0=1

ET1=1

TR1=1

TR0=0

TMOD=0x11

TH0=(65536-50000)/256

TL0=(65536-50000)%256

TH1=(65536-50000)/256

TL1=(65536-50000)%256

K1=K2=1

temp1=0

while(TR1)

{

for(i=0i<6i++)

{

delay(3)

P1=i

P2=table1[i]

delay(3)

}

}

}

void sfm(uchar dz,uchar shu)

{

if(shu==60&dz!=0) shu=0

table2[dz]=shu/10

table2[dz+1]=shu%10

}

void display()

{

uchar j

for(j=0j<6j++)

{

delay(3)

P1=j

P2=table[table2[j]]

delay(3)

}

}

void display1(uchar dz)

{

uchar j

for(j=0j<2j++)

{

delay(3)

P1=dz+j

P2=table[table2[dz+j]]

delay(3)

}

}

void jiaoshi()

{

uchar a

if(K1==0)

{

delay(5)

if(K1==0)

{

TR0=0

a++

temp+=2

if(a==4|temp==6)

{

a=0

temp=-2

TR0=1

}

}

}

while(!K1)

{

delay(5)

display1(temp)

}

while(!K1)

display1(temp)

if(K2==0)

{

delay(5)

if(K2==0)

{

if(a==1)

{

temp=0

if(shi==24)

shi=0

shi++

sfm(0,shi)

}

if(a==2)

{

temp=2

if(fen==59)

fen=-1

fen++

sfm(2,fen)

}

if(a==3)

{

temp=4

if(miao==59)

miao=-1

miao++

sfm(4,miao)

}

}

}

while(!K2)

{

delay(5)

display1(temp)

}

while(!K2)

if(K3==0)

{

delay(5)

if(K3==0)

{

if(a==1)

{

shi--

if(shi==0)

shi=24

sfm(0,shi)

}

if(a==2)

{

fen--

if(fen==-1)

fen=59

sfm(2,fen)

}

if(a==3)

{

miao--

if(miao==-1)

miao=59

sfm(4,miao)

}

}

}

while(!K3)

{

delay(5)

display1(temp)

}

while(!K3)

}

void timer0() interrupt 1

{

TH0=(65536-50000)/256

TL0=(65536-50000)%256

a++

if(a==16)

{

a=0

miao++

sfm(4,miao)

if(miao==60)

{

miao=0

display()

fen++

sfm(2,fen)

if(fen==60)

{

fen=0

shi++

sfm(0,shi)

if(shi==25)

{

shi=1

sfm(0,shi)

}

}

}

}

display()

}

void timer1() interrupt 3

{

TH0=(65536-50000)/256

TL0=(65536-50000)%256

j++

if(j==20)

{

TR0=1

TR1=0

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11699580.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存