代码:
- /*********************************************************************************************************************
- 程序名称: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********************************************/
复制代码 |