用Keil uVision4完成的实时时钟程序怎么做(急)

用Keil uVision4完成的实时时钟程序怎么做(急),第1张

时钟配置:在第一行菜单栏里有一个"闪存"菜单,点击其中的“配置闪存工具”,在出现的对话框中点击“项目”,在第一个选框中输入所要的晶振频率(单位是mhz)。

io配置:io配置是在程序的编写中实现的,这个根据你的程序内容按要求选择。

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

* 文件名 : 时钟DS1302.c

* 描述: 该文件实现用DS1302来实现日历和时钟功能,数码管上显示出来。

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

#include<reg52.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}

sbit ACC0 = ACC^0

sbit ACC7 = ACC^7

sbit P3_2 = P3^2

sbit P3_5 = P3^4

sbit T_CLK = P1^6/*实时时钟时钟线引脚 */

sbit T_IO = P3^5/*实时时钟数据线引脚 */

sbit T_RST = P1^7/*实时时钟复位线引脚 */

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

* 名称 : delay()

* 功能 : 延时,延时时间大概为140US。

* 输入 : 无

* 输出 : 无

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

void delay()

{

int i,j

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

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

}

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

* 名称 : Delay_1ms()

* 功能 : 延时子程序,延时时间为 1ms * x

* 输入 : x (延时一毫秒的个数)

* 输出 : 无

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

void Delay_1ms(uint i)//1ms延时

{

uchar x,j

for(j=0j<ij++)

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

}

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

* 名称 : v_RTInputByte()

* 功能 : 往DS1302写入1Byte数据

* 输入 : ucDa 写入的数据

* 输出 : 无

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

void v_RTInputByte(uchar ucDa)

{

uchar i

ACC = ucDa

T_RST = 1

for(i=8i>0i--)

{

T_IO = ACC0

T_CLK = 1

T_CLK = 0

ACC = ACC >>1

}

}

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

* 名称 : uc_RTOutputByte()

* 功能 : 从DS1302读取1Byte数据

* 输入 : 无

* 返回值: ACC

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

uchar uc_RTOutputByte(void)

{

uchar i

T_RST = 1

for(i=8i>0i--)

{

ACC = ACC >>1

T_IO=1

ACC7 = T_IO

T_CLK = 1

T_CLK = 0

}

return(ACC)

}

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

* 名称 : v_W1302(uchar ucAddr, uchar ucDa)

* 功能 : 往DS1302写入数据

* 输入 : ucAddr: DS1302地址, ucDa: 要写的数据

* 返回值 : 无

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

void v_W1302(uchar ucAddr, uchar ucDa)

{

T_RST = 0

T_CLK = 0

T_RST = 1

v_RTInputByte(ucAddr) // 写地址

_nop_()

_nop_()

v_RTInputByte(ucDa)// 写1Byte数据

T_CLK = 1

T_RST = 0

}

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

* 名称 : uc_R1302(uchar ucAddr)

* 功能 : 读取DS1302某地址的数据

* 输入 : ucAddr: DS1302地址

* 返回值 : ucDa :读取的数据

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

uchar uc_R1302(uchar ucAddr)

{

uchar ucDa

T_RST = 0

T_CLK = 0

T_RST = 1

v_RTInputByte(ucAddr) //写地址,命令

_nop_()

_nop_()

ucDa = uc_RTOutputByte()//读1Byte数据

T_CLK = 1

T_RST = 0

return(ucDa)

}

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

* 名称 : v_BurstW1302T

* 功能 : 往DS1302写入时钟数据(多字节方式)

* 输入 : pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制

* 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B

* 返回值 : 无

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

void v_BurstW1302T(uchar *pSecDa)

{

uchar i

v_W1302(0x8e, 0x00) //控制命令,WP=0,写 *** 作

T_RST = 0

T_CLK = 0

T_RST = 1

v_RTInputByte(0xbe) //0xbe:时钟多字节写命令

for(i=8i>0i--)//8Byte = 7Byte 时钟数据 + 1Byte 控制

{

v_RTInputByte(*pSecDa) //写1Byte数据

pSecDa++

}

T_CLK = 1

T_RST = 0

}

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

* 名称 : v_BurstR1302T(uchar *pSecDa)

* 功能 : 读取DS1302时钟数据

* 输入 : pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年

* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B

* 返回值 : ucDa :读取的数据

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

void v_BurstR1302T(uchar *pSecDa)

{

uchar i

T_RST = 0

T_CLK = 0

T_RST = 1

v_RTInputByte(0xbf) //0xbf:时钟多字节读命令

for(i=8i>0i--)

{

*pSecDa = uc_RTOutputByte() //读1Byte数据

pSecDa++

}

T_CLK = 1

T_RST = 0

}

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

* 名称 : v_BurstW1302R(uchar *pReDa)

* 功能 : 往DS1302寄存器数写入数据(多字节方式)

* 输入 : pReDa: 寄存器数据地址

* 返回值 : 无

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

void v_BurstW1302R(uchar *pReDa)

{

uchar i

v_W1302(0x8e,0x00)//控制命令,WP=0,写 *** 作

T_RST = 0

T_CLK = 0

T_RST = 1

v_RTInputByte(0xfe) //0xbe:时钟多字节写命令

for(i=31i>0i--)//31Byte 寄存器数据

{

v_RTInputByte(*pReDa)//写1Byte数据

pReDa++

}

T_CLK = 1

T_RST = 0

}

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

* 名称 : v_BurstR1302R(uchar *pReDa)

* 功能 : 读取DS1302寄存器数据

* 输入 : pReDa: 寄存器数据地址

* 返回值 : 无

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

void v_BurstR1302R(uchar *pReDa)

{

uchar i

T_RST = 0

T_CLK = 0

T_RST = 1

v_RTInputByte(0xff) //0xbf:时钟多字节读命令

for(i=31i>0i--) //31Byte 寄存器数据

{

*pReDa = uc_RTOutputByte()//读1Byte数据

pReDa++

}

T_CLK = 1

T_RST = 0

}

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

* 名称 : v_Set1302(uchar *pSecDa)

* 功能 : 设置初始时间

* 输入 : pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年

* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B

* 返回值: 无

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

void v_Set1302(uchar *pSecDa)

{

uchar i

uchar ucAddr = 0x80

v_W1302(0x8e, 0x00) //控制命令,WP=0,写 *** 作

for(i=7i>0i--)

{

v_W1302(ucAddr, *pSecDa) // 秒 分 时 日 月 星期 年

pSecDa++

ucAddr += 2

}

v_W1302(0x8e, 0x80) //控制命令,WP=1,写保护

}

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

* 名称 : v_Get1302(uchar ucCurtime[])

* 功能 : 读取DS1302当前时间

* 输入 : ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年

* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B

* 返回值 : 无

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

void v_Get1302(uchar ucCurtime[])

{

uchar i

uchar ucAddr = 0x81

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

{

ucCurtime[i] = uc_R1302(ucAddr) //格式为: 秒 分 时 日 月 星期 年

ucAddr += 2

}

}

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

* 名称 : dectobcd(uchar dec)

* 功能 : DEC码转换为BCD码

* 输入 : dec码

* 输出 : bcd码

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

uchar dectobcd(uchar dec)

{

uchar bcd

bcd = 0

while(dec >= 10)

{

dec -= 10

bcd++

}

bcd <<= 4

bcd |= dec

return bcd

}

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

* 名称 : bcdtodec(uchar bcd)

* 功能 : BCD码转换为DEC码

* 输入 : bcd码

* 输出 : dec码

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

uchar bcdtodec(uchar bcd)

{

uchar data1

data1 = bcd &0x0f//取BCD低4位

bcd = bcd &0x70 //剔除BCD的最高位和低4位。

data1 += bcd >>1

data1 += bcd >>3 //用位移代替乘法运算

return data1

}

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

* 名称 : Write_DS1302Init()

* 功能 : 往DS1302中写入数据。最开始显示的数据就是在这里设置的。

* 输入 : 无

* 输出 : 无

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

void Write_DS1302Init(void)

{

v_W1302(0x8e,0)

v_W1302(0x80,0x50) //写入秒

v_W1302(0x8e,0)

v_W1302(0x82,0x59) //写入分

v_W1302(0x8e,0)

v_W1302(0x84,0x07) //写入小时

v_W1302(0x8e,0)

v_W1302(0x86,0x08) //写入日

v_W1302(0x8e,0)

v_W1302(0x88,0x08) //写入月

v_W1302(0x8e,0)

v_W1302(0x8a,0x05) //写入星期

v_W1302(0x8e,0)

v_W1302(0x8c,0x08) //写入年

}

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

* 名称 : Run_DS1302(void)

* 功能 : 读出DS1302中的数据,并在液晶1602上进行显示

* 输入 : 无

* 输出 : 无

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

void Run_DS1302(void)

{

uchar sec, min, hour, day, month, year

while(1)

{

v_W1302(0x8f, 0)

sec = bcdtodec(uc_R1302(0x81)) //读出DS1302中的秒

v_W1302(0x8f, 0)

min = bcdtodec(uc_R1302(0x83)) //读出DS1302中的分

v_W1302(0x8f, 0)

hour = bcdtodec(uc_R1302(0x85)) //读出DS1302中的小时

v_W1302(0x8f, 0)

day = bcdtodec(uc_R1302(0x87)) //读出DS1302中的日

v_W1302(0x8f, 0)

month = bcdtodec(uc_R1302(0x89)) //读出DS1302中的月

v_W1302(0x8f, 0)

year = bcdtodec(uc_R1302(0x8d)) //读出DS1302中的年

P0 = table[hour / 10 % 10]

P2 = 0

Delay_1ms(2)

P0 = table[hour % 10]

P2 = 1

Delay_1ms(2)

P0 = 0x80

P2 = 2

Delay_1ms(2)

P0 = table[min / 10 % 10]

P2 = 3

Delay_1ms(2)

P0 = table[min % 10]

P2 = 4

Delay_1ms(2)

P0 = 0x80

P2 = 5

Delay_1ms(2)

P0 = table[sec / 10 % 10]

P2 = 6

Delay_1ms(2)

P0 = table[sec % 10]

P2 = 7

Delay_1ms(2)

}

}

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

* 名称 : Main(void)

* 功能 : 主函数

* 输入 : 无

* 输出 : 无

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

void Main(void)

{

Write_DS1302Init()

Run_DS1302()

}

1、以下例程实现时钟的实时显示基本要求: 1) 自行设计界面,模拟表盘式时钟。要求界面美观,清晰。2)数字同步显示时间信息。

2、例程:

#include<graphics.h> 

#include<math.h> 

#include<dos.h> 

#define PI 3.1415926 

//屏幕中心的坐标(640X480模式下)

#define mid_x 320 

#define mid_y 240 

int main() 

{ int graphdriver=DETECT,graphmode 

int end_x,end_y 

struct time curtime 

float th_hour,th_min,th_sec 

initgraph(&graphdriver,&graphmode,"C:\\TC2") //初始化VGA屏幕模式

setbkcolor(BLACK) //使用黑色的背景色

while(!kbhit(0)) //若有键盘输入,则跳出,即是结束程序

{ setcolor(GREEN) //把画笔设为绿色

circle(mid_x,mid_y,180) //钟的外圆

circle(mid_x,mid_y,150) //钟的内圆

circle(mid_x,mid_y,1) //画出钟的圆心

gettime(&curtime) //取得系统当前时间

th_sec=(float)curtime.ti_sec*0.1047197551 //把秒针的角度化为弧度,为以后绘制时方便,下同

th_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) 

setcolor(RED) 

line(mid_x,mid_y,end_x,end_y) //用红色线画出时针

//计算出分针坐标(分针长110)

end_x=mid_x+110*sin(th_min) 

end_y=mid_y-110*cos(th_min) 

setcolor(RED) 

line(mid_x,mid_y,end_x,end_y) //用红色画出分针

end_x=mid_x+140*sin(th_sec) 

end_y=mid_y-140*cos(th_sec) 

setcolor(RED) 

line(mid_x,mid_y,end_x,end_y) //同上,画出秒针,长为140

//画出钟盘上的刻度,刻度长20

line(140,240,160,240) //9点对应的大刻度

line(320,60,320,80) //12点对应的大刻度

line(500,240,480,240) //3点的刻度

line(320,420,320,400) //6点的刻度

line(410,395.7,400,378.4) //5点

line(475.7,330,458.4,320) //4点

line(475.7,150,458.4,160) //2点

line(410,84.3,400,101.6) //1点

line(230,84.3,240,101.6) //11点

line(164.3,150,181.6,160) //10点

line(164.3,330,181.6,320) //8点

line(230,395.7,240,378.4) //7点

sleep(BLUE) //这里应该是打错,停止一秒,应为sleep(1000)

cleardevice() //清除屏幕上的显示

closegraph() //关闭VGA屏幕,即返回文本方式

return 0 

}


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

原文地址:https://54852.com/yw/11089491.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存