标题:
求解答:用proteus仿真实现时钟(帮忙看下代码,已写好了但是显示不对
[打印本页]
作者:
起风了1112
时间:
2020-3-24 11:36
标题:
求解答:用proteus仿真实现时钟(帮忙看下代码,已写好了但是显示不对
1585020856(1).jpg
(34.82 KB, 下载次数: 31)
下载附件
2020-3-24 11:37 上传
代码:
/*********************************************************************************************************************
程序名称:8位数码管时钟程序
函数功能:在8位数码管上显示包含小时,分钟,秒钟的C语言程序
程序版本:V1.0
调试状态:成功
调试时间:2014.10.10
定时器初值计算方法:【16进制】65535-[(晶振频率/12)/(1秒/定时的时间)]
**********************************************************************************************************************/
#include<reg52.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
/*********************************************************************************************************************/
//函数申明
void data_deal(); //数据处理函数
void delay(uchar timer);//延时函数
void H_M_S_circle();//时钟时分秒循环函数
void display();//送显示函数
/*********************************************************************************************************************/
unsigned char code table[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
// 0 1 2 3 4 5 6 7 8 9
};
/*********************************************************************************************************************/
//全局变量申明
uchar time_flag;
uchar Hour=0,Min=0,second=0;
uchar DispBuf[8]; //定义显示缓冲区——待显示的数据(由定时中断程序自动扫描),全局变量
/*********************************************************************************************************************/
void main()
{
//启动定时器
TMOD |= 0x01; //选择定时器的工作方式(00表示13位定时计数器,01表示16位定时计数器,10表示8位定时计数器,11停止工作)
TH0 = 0xDC; //装载定时器初值高八位(此初值表示定时器定时为10ms)
TL0 = 0x00; //装载定时器初值低八位(此初值表示定时器定时为10ms)
EA = 1; //开启总中断
ET0 = 1; //开启定时器中断允许位
TR0 = 1; //开启定时器中断
//时钟显示
while(1)
{
data_deal();//调用数据处理函数,提取处理后的数据
display(); //调用显示函数,显示处理好的数据
}
}
/*********************************************************************************************************************
函数名称:delay(uchar timer)
函数功能:延时
**********************************************************************************************************************/
void delay(uchar timer)
{
uchar i,j;
for(i=0;i<114;i++)
for(j=0;j<timer;j++)
;
}
/*********************************************************************************************************************
函数名称:T1IN_time()
函数功能:利用定时器中断开启定时,并计算出1秒钟
**********************************************************************************************************************/
void T1IN_time() interrupt 1 //(1表示中断号,0表示外部中断0,1表示定时器T0,2表示外部中断1,3表示定时器T1)
{
uchar count;//申明定时器变量
TH0 = 0xDC; //装载定时器初值高八位(此初值表示定时器定时为10ms)
TL0 = 0x00; //装载定时器初值低八位(此初值表示定时器定时为10ms)
count ++; //定时器变量自加1
if(count == 100) //count自加100次,定时器运行100次初值的时间,即10ms *100 = 1s(1秒钟)
{
count = 0; //count归零,等待下一次定时
time_flag = 1; //定时器标志位为1,启动时钟时分秒循环程序
}
}
/*********************************************************************************************************************
函数名称:H_M_S_circle()
函数功能:时分秒循环
*************************************************************************************/
void H_M_S_circle()
{
if(time_flag == 1)//当定时器标志位为1时,表示时间为1秒
{
time_flag = 0;//标志位归零
second++; //秒钟自加1
}
if(second == 60) //当秒钟自加1到60时
{
second = 0; //秒钟归零
Min ++; //分钟自加1
}
if(Min == 60) //当分钟自加1到60时
{
Min = 0; //分钟归零
Hour ++; //小时自加1
}
if(Hour == 24) //当小时自加1到24时
{
Hour = 0; //小时归零
Min = 0; //分钟归零
second = 0; //秒钟归零
}
}
/********************************************************************************
函数名称:data_deal()
函数功能:对数码管将要显示的数据进行拆分
**********************************************************************************/
void data_deal()
{
H_M_S_circle(); //调用时钟时分秒循环程序,取出时,分。秒的值
DispBuf[7] = Hour /10; //小时十位
DispBuf[6] = Hour %10; //小时个位
DispBuf[5] = 8; //显示“-”
DispBuf[4] = Min /10; //分钟十位
DispBuf[3] = Min %10; //分钟个位
DispBuf[2] = 8; //显示“-”
DispBuf[1] = second /10; //秒钟十位
DispBuf[0] = second %10; //秒钟个位
}
void display()
{
uchar i;
code unsigned char com[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
for(i=0;i<8;i++)
{
P0 =com[i]; //i=0表示数码管的最低位
P2 =table[DispBuf[i]];//DispBuf[i]表示拆分后的数据,i表示需要显示的动态数据
delay(1);
} P0 = 0x00; //关闭所有数码管显示
}
/***************************************END********************************************/
复制代码
作者:
tyrl800
时间:
2020-3-24 15:36
DispBuf[2] = 8; //显示“-” 怎么会是显示“-”,肯定显示“8”
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1