喜欢研究单片机定时器的可以来看一下,代码里有单片机定时器初始化的代码
单片机源程序如下:
- #include <AT89X52.H>
- #define uint unsigned int //宏定义无符号整型数据
- #define uchar unsigned char //宏定义无符号字符型数据
- sbit key1=P3^6; //按键
- sbit led=P1^0; //灯
- sbit ledc=P1^1; //灯
- uchar Cntus=0,Cnt10ms=0,Cnt1s=0,Cnt1min=0;//中断计时变量
- bit stop=0; //停止标志
- void display(); //显示程序声明
- void keyscan(); //按键扫描程序声明
- /**************************************
- 1602液晶
- **************************************/
- sbit RS = P2^5;
- sbit RW = P2^6;
- sbit E = P2^7;
- /**********************************************************
- 函数说明: 延时程序
- **********************************************************/
- void delay(uchar t)
- {
- uint j;
- uchar i;
- for(i=0;i<t;i++)
- for(j=0;j<1000;j++);
- }
- /**************************************
- 短延时
- **************************************/
- void delay5ms()
- {
- uchar i,v,k;
- for(i=1;i>0;i--)
- for(v=168;v>0;v--)
- for(k=22;k>0;k--);
- }
- /**************************************
- 写指令
- **************************************/
- void lcd_Write_com(uchar com)
- {
- RS=0; //定义指令寄存器
- RW=0; //写允许
- P0=com; //写指令
- delay5ms(); E=1; //片选端上拉
- delay5ms(); E=0; //下降沿锁存
- }
- /**************************************
- 写数据
- **************************************/
- void lcd_write_date(uchar date)
- {
- RS=1; //定义数据寄存器
- RW=0; //写允许
- P0=date; //写数据
- delay5ms(); E=1; //片选端上拉
- delay5ms(); E=0; //下降沿锁存
- }
- /**************************************
- 显示程序
- **************************************/
- void dis_lcd1602(uchar x,uchar y,uchar dat)
- {
- uchar add;
- if(y==1) add=(0x80+x);
- if(y==2) add=(0xc0+x);
- lcd_Write_com(add); //写指令
- lcd_write_date(dat); //写数据
- }
- /**************************************
- 液晶初始化
- **************************************/
- void lcd1602_init()
- {
- lcd_Write_com(0x38); //设置8位格式,2行,5*7
- lcd_Write_com(0x01); //清屏
- lcd_Write_com(0x0c); //整体显示,关光标,不闪烁
- lcd_Write_com(0x06); //设定输入方式,增量不移位
- lcd_Write_com(0x80); //初始坐标
- }
- /**************************************
- 液晶显示汉字程序
- **************************************/
- void hz_lcdDis(uchar x,uchar y,uchar *p) //汉字显示
- {
- uchar i=0,temp;
- if(x)temp = 0x40; else temp = 0;
- for(i=y;*p!='\0';i++,p++)
- {
- lcd_Write_com(i|0x80+temp);
- lcd_write_date(*p);
- delay5ms();
- }
- }
- /**************************************
- 液晶显示数字程序
- **************************************/
- void num_lcdDis(uchar X,uchar Y,uint num,uchar n)
- {
- uint i=0,temp,hang;
- n +=1;
- if(X)hang = 0x40;else hang = 0;
- for(i=(n-1);i>0;i--)
- {
- lcd_Write_com((i+Y-1)|0x80+hang); //从个位开始显示
- temp = num%10+0x30;
- lcd_write_date(temp);
- delay5ms();
- num/=10;
- }
- }
- void num_lcdDis1_1(uint num)//input 电压 整数部分
- {
- uint i,temp,x;
- x=5;
- for(i=0;i<2;i++)
- { x--;
- lcd_Write_com(0x80+x); //写指令
- temp = num%10+0x30;
- lcd_write_date(temp);// 写数据
- num/=10;
- }
- }
- /**************************************
- 液晶显示数字程序
- **************************************/
- void num_lcdDisx(uchar X,uchar Y,uint num,uchar n)
- {
- uint i=0,temp,hang;
- n +=1;
- if(X)hang = 0x40;
- else hang = 0;
- for(i=(n-1);i>0;i--)
- {
- lcd_Write_com((i+Y-1)|0x80+hang);//从个位开始显示
- temp = num%10+0x30;
- lcd_write_date(temp);
- delay5ms();
- num/=10;
- }
- }
- /***********按键扫描程序****************/
- void keyscan()
- {
- static uint count2=0,count1=0; //计数变量
- static bit key_sign=0; //按键自锁标志
- if(key1==0) //检测按键为0
- { delay(50);
- if(key1==0){
- count1++;
- stop=!stop;
-
- }
- //计数延时消抖
-
- }
- else
- {
- count1=0; //计数变量清0
- }
- }
- /***********定时器初始化程序****************/
- void Timer0Init(void) //2.5毫秒@11.0592MHz
- {
- TMOD = 0x01; //设置定时器模式
- TL0 = 0x00; //设置定时初值
- TH0 = 0xF7; //设置定时初值
- TR0 = 1; //定时器0开始计时
- EA=1; //开总中断
- ET0=1; //开定时器0中断
- }
- /***************主程序****************/
- void main()
- {
- int cm=0;
- Timer0Init(); //定时器初始化
- lcd1602_init();//液晶初始化
- hz_lcdDis(0,0,"Timer system"); //启动电源
- hz_lcdDis(1,7,": :"); //欢迎你
- led=1;
- while(1)
- {
- // Cnt1min Cnt1s Cnt10ms
- num_lcdDis(1,5,Cnt1min,2);
- num_lcdDis(1,8,Cnt1s,2);
- num_lcdDis(1,11,Cnt10ms,2);
- if(Cnt1min>9){
- led=0;
- }
-
- keyscan(); //按键扫描
- }
- }
- /**************中断服务程序*****************/
- void timer0() interrupt 1 //2.5毫秒@11.0592MHz
- {
- TL0 = 0x00; //设置定时初值
- TH0 = 0xF7; //设置定时初值
- Cntus++; //中断变量Cntus自+1
- if(Cntus>=4) //10ms
- {
- Cntus=0; //清0
- if(stop==1) //启动
- Cnt10ms++; //10毫秒计数
- if(Cnt10ms>=100)
- {
- Cnt10ms=0;
- ledc=!ledc;
- Cnt1s++;
- //秒计数
- if(Cnt1s>=60)
- {
- Cnt1s=0;
- Cnt1min++; //分计数
- if(Cnt1min>=100)
- Cnt1min=0;
- }
- }
- }
- }
复制代码
所有资料51hei提供下载:
毫秒级的秒表.zip
(131.34 KB, 下载次数: 70)
|