
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
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)