单片机C语言该怎么编写时钟程序?

单片机C语言该怎么编写时钟程序?,第1张

这个是简单的数码管时钟显示如果有需要贺戚,我写过比较完善的1602显示时钟.显示控制年月日等等.#include\x0d\x0asbit Begin=P2^0\x0d\x0asbit Hour=P2^1\x0d\x0asbit Mus=P2^2\x0d\x0asbit End=P2^3\x0d\x0aunsigned char code Tab[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,\x0d\x0a0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40}\x0d\x0aunsigned char code num[]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}\x0d\x0aunsigned char Time[]={0,0,16,0,0,16,0,0}\x0d\x0aunsigned char a\x0d\x0aunsigned int x,m,th\x0d\x0avoid init()\x0d\x0a{\x0d\x0a TMOD=0x01\x0d\x0a TH0=(65535/50000)/256\x0d\x0a TL0=(65535/50000)%256\x0d\x0a EA=1\x0d\x0a ET0=1\x0d\x0a TR0=1\x0d\x0a}\x0d\x0avoid delay(unsigned int z) \x0d\x0a{ \x0d\x0a unsigned int x,y\x0d\x0a for(x=zx>0x--)\x0d\x0a for(y=110y>0y--)\x0d\x0a}\x0d\x0aunsigned char keyboard()\x0d\x0a{\x0d\x0a if(Begin==0){\x0d\x0a delay(5)\x0d\x0a if(Begin==0)\x0d\x0a return 1\x0d\x0a }\x0d\x0a if(Hour==0){\x0d\x0a delay(30)\x0d\x0a if(Hour==0)\x0d\x0a return 2\x0d\x0a }\x0d\x0a if(Mus==0)\x0d\x0a return 3\x0d\x0a if(End==0)\x0d\x0a return 4\x0d\x0a}\x0d\x0avoid display()\x0d\x0a{\x0d\x0a unsigned char i for(i=0i=20)\x0d\x0a {\x0d\x0a x++\x0d\x0a m=x\x0d\x0a th=m/3600/判悉/设置禅冲陵小时\x0d\x0a Time[0]=th/10\x0d\x0a Time[1]=th%10\x0d\x0a m=m%3600 Time[2]=16 th=m/60//设置分钟\x0d\x0a Time[3]=th/10\x0d\x0a Time[4]=th%10\x0d\x0a m=m%60 Time[5]=16 th=m//设置秒\x0d\x0a Time[6]=th/10\x0d\x0a Time[7]=th%10 a=0\x0d\x0a }\x0d\x0a}

#define uchar unsigned char //  (先定义改谨一下方便使碰清用)

#define uint unsigned int

#define ulong unsigned long

#include <reg52.h>//包括一个52标准内核的头文件

uchar code zixing[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}

uchar code ziwei[]={0x10,0x20,0x40,0x80}

uchar *h,*m

uchar hour=12,min=0,sec=0,h_ding,m_ding,count=0,ms_50,ms_10,miaobiao_sec

sbit dp=P0^7

sbit k1=P3^2

sbit k2=P3^3

sbit k3=P3^4

sbit sound=P2^3

sfr ZIXING=0x80//p0口输出字形

sfr ZIWEI=0xa0//P2口输出字位

typedef enum //枚举类型:4种状态//

{

CLOCK,

SET_RING1,

SET_RING2,

MIAOBIAO_RUN,

}STATE

STATE status

typedef struct //定时时间的数据结构//

{

uchar hour

uchar min

}DINGSHI_TIME

DINGSHI_TIME dingshi_time[2]

#define NO_KEY -1 //定义一下方便使用

#define KEY_1 1

#define KEY_2 2

#define KEY_3 3

bit show_on_flag

//#######定时器T0中断服务程序########//

Timer0() interrupt 1

{

TH0=0x3cTL0=0xb4//50ms

ms_50++

if(ms_50==20) {sec++ms_50=0}

if(sec==60) {sec=0min++}

if(min==60) {min=0hour++}

if(hour==24) {hour=0}

}

//#######定时器T1中断笑歼前服务程序########//

Timer1() interrupt 3

{

TH1=0xd8TL1=0xf4//10ms

ms_10++

if(ms_10==100)

{

miaobiao_sec++

ms_10=0

}

if(miaobiao_sec==60)

miaobiao_sec=0

}

//##############数码管显示#####################//

show(uchar time_high,uchar time_low)

{

uchar m

uint n,k

k=time_high*1000/10+time_low

for(m=0m<4m++)

{

ZIXING=zixing[k%10]

if(ms_50<10)

dp=0

ZIWEI=~ziwei[m]

for(n=0n<500n++)

ZIXING=0xff

for(n=0n<100n++)

k=k/10

}

}

//显示 on 定时编号//

show_on(uchar id) //id:定时编号//

{

uchar m

uint n

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

{

ZIXING=zixing[id%10]

dp=0

ZIWEI=~ziwei[m]

for(n=0n<500n++)

ZIXING=0xff

for(n=0n<80n++)

id=id/10

}

ZIXING=0xc8//字母n//

ZIWEI=~ziwei[2]

for(n=0n<500n++)

ZIXING=0xff

for(n=0n<200n++)

ZIXING=0xc0//字母0//

ZIWEI=~ziwei[3]

for(n=0n<500n++)

ZIXING=0xff

for(n=0n<200n++)

}

/*************启动秒表***************/

void run_miaobiao()

{

ms_10=0

miaobiao_sec=0

TH1=0xd8//标准是0xd8e4

TL1=0xf4

// TR1=1//启动定时器1

}

显示秒表:

void show_miaobiao()

{

show(miaobiao_sec,ms_10)

}

程序功能:单片机读出时钟芯片DS1302的数据,四位数码管显示当前时间

电路连接:P0口低四位分别连接74LS47的ABCD,高四位通过岁做猜非门分别控制四个数码管的公共端,

低电平有效,数码管的小数点与P2.7相连。

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

#include<reg52.h>

#include"intrins.h" //_nop_()延时函数使用声明

#define uint unsigned int

#define uchar unsigned char

#define LED_data P0//P0口作为数码管显示的数据口

sbit RST_1302=P1^4//时钟复位信号线

sbit IO_1302=P1^3//时钟数据线

sbit SCLK_1302=P1^2 //时钟时钟线

sbit decimal=P2^7 //小数点

uchar LED_4[4]={0,0,0,0}//四位数码管显示的数据储存

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

//时钟1302各寄存器读/写标志

#define second_write 0x80 //秒寄存器 写

#define second_read 0x81 //乎型秒寄存器 读

#define minute_write 0x82 //分 写

#define minute_read 0x83 //分 读

#define hour_write 0x84 //时 写

#define hour_read0x85 //时 读

#define day_write0x86 //日 写

#define day_read 0x87 //日 读

#define month_write 0x88 //月 写

#define month_read 0x89 //月 读

#define week_write 0x8A //周 写

#define week_read0x8B //周 读

#define year_write 0x8C //年 写

#define year_read0x8D //年胡升 读

#define wri_protect_write0x8E //写保护寄存器 写

#define wri_protect_read 0x8F //写保护寄存器 读

#define clock_consecution_write 0xBE//时间寄存器连续写

#define clock_consecution_read 0xBF//时间寄存器连续读

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

//秒 分 时 日 月 周 年 控制字

uchar start_time[]={0x00,0x00,0x21,0x01,0x01,0x02,0x08}//初始时间

// 2008-1-1 星期二 AM12:00:00

/********5ms延时函数*********/

void delay_5ms(uint i)

{ uint j

for(i>0i--)

for(j=450j>0j--)

}

/*******显示函数,i为显示次数,P0口为显示数据口**********/

void desplay(uchar i)

{ LED_4[0]=start_time[0]&0x0f

LED_4[1]=start_time[0]>>4

LED_4[2]=start_time[1]&0x0f

LED_4[3]=start_time[1]>>4

while(i--)

{ LED_data=0xe0|LED_4[0]delay_5ms(3)//右边第一位显示

decimal=0 //灭小数点

LED_data=0xd0|LED_4[1]delay_5ms(3)//第二位显示

decimal=1 //亮小数点

LED_data=0xb0|LED_4[2]delay_5ms(3)//第三位显示LED_data=0x70|LED_4[3]delay_5ms(3)//第四位显示}

}

/********1302写入一个字节************/

void write_1302byte(uchar dat)

{uchar i

RST_1302=1//_nop_() 启动数据传送

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

{

IO_1302=dat&0x01//_nop_()

SCLK_1302=0_nop_() //SCLK时钟的上升沿时数据被写入

SCLK_1302=1

dat=dat>>1

}

}

/*******1302读出一个字节数据**********/

uchar read_1302byte(void)

{ uchar i,dat=0

RST_1302=1//_nop_()//启动数据传送

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

{ IO_1302=1 //释放数据线

dat=dat>>1

SCLK_1302=1_nop_()//SCLK脉冲的下降沿读出数据

SCLK_1302=0

if(IO_1302)dat|=0x80

}

return(dat)

}

/********1302写入一个字节数据(dat)到指定寄存器中(adresss)************/

void write_1302(uchar address,uchar dat)

{RST_1302=0SCLK_1302=0_nop_()

RST_1302=1

write_1302byte(address)

write_1302byte(dat)

RST_1302=0

IO_1302=1

}

/*******1302在对应的寄存器中(dress)读出一个字节数据**********/

uchar read_1302(uchar address)

{uchar da=0

RST_1302=0SCLK_1302=0_nop_()

RST_1302=1

write_1302byte(address)

da=read_1302byte()

RST_1302=0

return(da)

}

/*************时钟DS1302初始化*********/

void start_1302(void)

{SCLK_1302=0

RST_1302=0_nop_()_nop_()

RST_1302=1_nop_()

write_1302(0x80,0x00)//秒寄存器,最高位写"0",时钟工作

write_1302(0x8e,0x00)//写保护寄存器,最高位写"0",时钟能够写入

write_1302(0x90,0xa5)//涓流充电寄存器,使用涓流充电、一个二极管、一个2k的电阻

write_1302(0x84,0x00)//24小时制

}/******设定时间初值***********/

void set_1302(void)

{uchar i,address=0x80

write_1302(0x8e,0x00)//将控制寄存器值设为"0",最高位WP=0允许写

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

{ start_time[i]=start_time[i]/10*16+start_time[i]%10

write_1302(address,start_time[i])

address+=2

}

write_1302(0x8e,0x80)//将控制寄存器值设为"1",最高位WP=1不允许写,防止干扰影响时间值}

/*******读取当前时间值***********/

void get_1302(void)

{uchar i,address=0x81

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

{ start_time[i]=read_1302(address)//读对应时钟寄存器的值

address+=2

}

}

void main(void)

{

start_1302() //1302时钟复位

write_1302(0x80,0x00)//秒寄存器,最高位写"0",时钟工作

write_1302(0x8e,0x00)//写保护寄存器,最高位写"0",时钟能够写入

set_1302()//设置时间初值while(1)

{ get_1302()

desplay(6)

}

}


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

原文地址: https://outofmemory.cn/yw/12498475.html

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

发表评论

登录后才能评论

评论列表(0条)

保存