1、定时器c 语言程序
#include "c8051f020.h"
#include
2、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; sb
3、it 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
4、); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); --us; } } //*********发送一个命令字****************// void Send7279Byte(unsigned char ch) //发送一个命令字 { char i; SELECT7279; //置CS低电平 Delay1us(100); //延时50μ for (i=0;i<0x8;i++) {
5、 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() //
6、显示时钟 { 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); //显示 秒的 十位
7、 Send7279Byte(0x80); Send7279Byte(miao%10); //显示 秒的 个位 } //*********单片机时钟初始化***********// void SYSCLK_Init (void) { int i; // delay counter OSCXCN = 0x65; // start external oscillator with
8、 // 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 an
9、d enable missing clock // detector } //***************//初始化IO口*************************// void PORT_Init (void) { XBR0 = 0x07; // Enable SMBus, SPI0, and UART0 XBR1= 0x02; //交叉开关允许 XBR2 = 0x40;
10、// 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;
11、 // 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; sh
12、i+=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;} } }






