资源描述
定时器c 语言程序
#include "c8051f020.h"
#include <intrins.h>
/********函数声明********/
void write7279(unsigned char, unsigned char);//写入到HD7279
void Send7279Byte(unsigned char ch); //发送一个命令字
void Delay1us(unsigned char us) ; //延时1μ
void Delay1ms(unsigned char T) ; //延时1ms
void Timer0_Init (void);
void SYSCLK_Init (void);
//**** 变量及I/O口定义 *********
unsigned char data shi _at_ 0x30; //时
unsigned char data fen _at_ 0x31; //分
unsigned char data miao _at_ 0x32; //秒
unsigned char data zdjs _at_ 0x33; //中断计数
unsigned char bdata BZW _at_ 0x20;
sbit BZW0=BZW^0;
sbit CLK = P1^6; // HD7279
sbit DAT = P1^7; // HD7279
#define NOSELECT7279 P5 |= 0x80 //SPICS4(P57)=1
#define SELECT7279 P5 &= ~(0x80) //SPICS4(P57)=0
//***********延时N * 1μ*****************************//
void Delay1us(unsigned char us) //延时1μ
{
while (us)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
--us;
}
}
//*********发送一个命令字****************//
void Send7279Byte(unsigned char ch) //发送一个命令字
{
char i;
SELECT7279; //置CS低电平
Delay1us(100); //延时50μ
for (i=0;i<0x8;i++)
{
if (ch&0x80) //输出7位到HD7279A的DATA端
{
DAT=1;
}
else
{
DAT=0;
}
CLK=1; //置CLK高电平
ch=ch<<1; //待发数据左移
Delay1us(20); //延时8μ
CLK=0; //置CLK低电平
Delay1us(20); //延时50μ
}
DAT=0; //发送完毕,DATA端置低,返回
}
/************* 显示时钟 ************/
void displaytime() //显示时钟
{
Send7279Byte(0x85) ;
Send7279Byte(shi/10) ; //显示 时的 十位
Send7279Byte(0x84) ;
Send7279Byte(shi%10) ;//显示 时的 个位
Send7279Byte(0x83) ;
Send7279Byte(fen/10) ; //显示 分的 十位
Send7279Byte(0x82) ;
Send7279Byte(fen%10) ; //显示 分的 个位
Send7279Byte(0x81) ;
Send7279Byte(miao/10); //显示 秒的 十位
Send7279Byte(0x80);
Send7279Byte(miao%10); //显示 秒的 个位
}
//*********单片机时钟初始化***********//
void SYSCLK_Init (void)
{
int i; // delay counter
OSCXCN = 0x65; // start external oscillator with
// 18.432MHz crystal
for (i=0; i < 256; i++) ; // Wait for osc. to start up
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
// source and enable missing clock
// detector
}
//***************//初始化IO口*************************//
void PORT_Init (void)
{
XBR0 = 0x07; // Enable SMBus, SPI0, and UART0
XBR1= 0x02; //交叉开关允许
XBR2 = 0x40; // Enable crossbar and weak pull-ups
}
//***************定时器0初始化**************//
void Timer0_Init (void)
{
// CKCON|=0x8;
TMOD=0x01; //定时器0 工作方式1
//TR0 =0;
TH0 =0x70; // set Timer0 to overflow in 1ms
TL0 =0x00;
TR0 =1; // START Timer0
IE =0x82;
}
//************* 定时器0中断 ************//
void timer0() interrupt 1 //定时器0中断
{
TH0=0x70;
TL0=0x00;
zdjs++;
if(zdjs >=50) {BZW0=1; zdjs=0;miao = miao +1; } //是否到 1s 了?
if(miao>=60) { miao =0; fen+=1; }
if(fen>=60) { fen=0; shi+=1; }
if( shi>=24){ shi=0; fen=0; miao=0;}
}
//************主程序****************************//
void main (void)
{
WDTCN = 0xde;
WDTCN = 0xad; //关看门狗
SYSCLK_Init (); //初始化时钟
Timer0_Init(); //初始化定时器
PORT_Init (); //初始化IO口
CPT1CN |= 0x80; //使能比较器1
REF0CN = 0x03; //使能片内参考电压
EA=1; //开中断
BZW0=0;
shi= 22;
fen = miao = zdjs =0x00;
displaytime(); //显示时钟
BZW0=1;
ET0=1;
TR0=1;
while(1)
{
if(BZW0==1) //
{ //{}
displaytime(); //显示时钟
BZW0=0;}
}
}
展开阅读全文