51单片机计时100s怎么编程

时间:2025-01-29 00:35:10 网络游戏

要在51单片机上实现100秒的计时,可以使用定时器来实现。以下是一个基于AT89C51单片机的100秒倒计时的示例程序,使用两位数码管静态显示倒计时秒值。

```c

include

define uchar unsigned char

define uint unsigned int

uchar duan = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; // 共阴

uchar wei={0XEf,0XDf,0XBf,0X7f}; // 位的控制端

uint setfen,setmiao,runfen,runmiao;

uint z,x,c,v;

uint fs,fg,ms,mg;

uint setwz;

sbit KEYSTOP=P3^7; // 停止键

sbit KEYSET=P1^7; // 设置键

sbit KEYUP=P1^6; // 上调

sbit KEYDOWN=P1^5; // 下调

sbit KEYRUN=P1^4; // 开始

sbit LEDSET=P1^3; // 设置灯

sbit LEDRUN=P1^2; // 运行灯

sbit LEDSTOP=P1^1; // 停止灯

sbit LABA=P1^0; // 喇叭

uint runmod=0; // 状态,0是等待运行(停止),1是运行,2是设置,3是刚刚完成

void Timer0Init(void) //1毫秒@11.0592MHz {

TMOD &= 0xF0; //设置定时器模式

Timer0 = 0x30; //设置定时初值

TH0 = 0xE3; //设置定时初值

TL0 = 0; //设置定时初值

TF0 = 0; //清除TF0标志

TR0 = 1; //定时器0开始计时

}

void DIGdisplay() {

u8 i;

for (i=0; i<2; i++){

switch(i){

case(0): LSA = 1 ;LSB = 0 ; break;

case(1): LSA = 0 ; LSB = 0 ; break;

}

}

}

void delay(unsigned int time) {

unsigned int i, j;

for(i=0; i for(j=0; j<123; j++){

}

}

}

void main(void) {

uchar code smgduan = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴

uint cnt = 0;

uint sec = 100;

Timer0Init();

while(1) {

if(KEYRUN){

if(runmod == 0){

cnt = sec;

runmod = 1;

}

if(cnt > 0){

cnt--;

DIGdisplay();

delay(1000); // 延时1秒

} else {

LABA = 1; // 响铃

runmod = 0;

}

} else {

LABA = 0; // 停止响铃

}

}

}

```

代码说明:

初始化

`Timer0Init`函数用于初始化定时器0,设置其模式为13位,并设置定时初值。

显示

`DIGdisplay`函数用于控制数码管的显示。

延时

`delay`函数用于实现延时,这里使用了一个简单的循环来实现1秒的延时。

主循环

在主循环中,检测`KEYRUN`键的状态,如果按下开始键,则开始倒计时,否则停止倒计时。

倒计时结束后,响铃并停止响铃。

注意事项:

该程序假设使用11.