使用2个数码管设计一个60秒倒计时C语言程序,要求用定时器中断定时1秒。 仿真元件数码管为7SEG-COM-CATHODE

使用2个数码管设计一个60秒倒计时C语言程序,要求用定时器中断定时1秒。 仿真元件数码管为7SEG-COM-CATHODE,第1张

7SEG-COM-CATHODE 为共阴管

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

uchar num=60,shi,ge;

uchar code TAB[]={

  0x3F,/0/

        0x06,/1/

        0x5B,/2/

        0x4F,/3/

        0x66,/4/

        0x6D,/5/

        0x7D,/6/

        0x07,/7/

        0x7F,/8/

        0x6F,/9/

 };

void T0INTinit()

{

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

}

void main()

{

T0INTinit();

while(1)

{

shi=num/10;

ge=num%10;

P0=TAB[shi];

P2=TAB[ge];

}

}

void T0INT() interrupt 1

{

uchar i;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

i++;

if(i==20)

{

i=0;

num--;

if(num==0)

num=60;

}

}

51单片机12M晶振时,定时/计数器的时钟为1uS,所以单个16位的定时/计数器能达到的最大定时时间为:655361uS=65536ms,所以12M晶振的情况下,用单个16位定时器得不到100ms的定时。这时可更换频率较低的晶振或用以下两种软件的方法:

1、定时器累加。用一个计数值来记录定时器的中断次数。比如,设定定时器10ms中断,用一个计数值来记录定时器的中断次数,每中断一次计数加1,这样计数值为10时候,定时器中断10次,即为100ms,然后将计数值清0,重新计数。这个方法会有小小误差,因为 *** 作计数值的时候会占用一点时间,这个时间比较短。

2、2个定时/计数器串联。一个用作定时器,一个用作计数器。定时器中断的时候输出一个脉冲作为计数器的计数脉冲,设定一个计数值,计数满的时候中断。总的定时时间的原理同上。

至于定时/计数器的 *** 作,楼上两位说得很清楚了。

#define GPFCON ((volatile unsigned long) 0x56000050)

#define GPFDAT ((volatile unsigned long) 0x56000054)

#define GPF4_out (1<<(42)) //左移42位,每个引脚占据GPFCON的两位,所以就是把第4个2位设置为01

#define GPF5_out (1<<(52))

#define GPF6_out (1<<(62))

void wait(volatile unsigned long dly)

{

for(;dly > 0; dly --);

}

int main()

{

unsigned long i = 0;

GPFCON = GPF4_out | GPF5_out | GPF6_out; //将GPF4/5/6都设为了输出引脚

while(1)

{

wait(30000);

GPFDAT = (~(i << 4)); //左移4位

if(++i == 8)

i = 0;

}

return 0;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

//功能:99秒时钟

#include<AT89X51H> //包含头文件

#define uchar unsigned char //预定义关键词

#define uint unsigned int

#define ulong unsigned long

uchar tcount,secount; //定义全局变量

uchar code DISP[] //字形表

={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60};

//0,1,2,3,4,5,6,7,8,9

uchar code LED[] //位码表

={0xfd,0xfb,0xf7,0xef,0xdf,0xbf};

//P26,P25,P24,P23,P22,P21

//

void DELAY_1MS(uint i) //延时1毫秒子程序

{

uchar j; //定义局部变量j

while(i--) //每循环一次,变量减一,为零返回

{

for(j=0;j<123;j++); //循环123次

}

}

//

void t0() interrupt 1 using 0//50毫秒定时器t0中断入口

{

tcount++; //定时器中断计数器加一

if(tcount==20) //计数20次

{

tcount=0; //清零定时器中断计数器

secount++; //秒计数器加一

if(secount==100) //秒计数器等于100

{

secount=0; //秒计数器清零

}

}

TH0=(65535-50000)/256; //重赋定时器初值高位

TL0=(65535-50000)%256; //重赋定时器初值低位

}

//

void main() //主程序

{

TMOD=0x01; //初始化定时器t0,工作于方式1,16位定时器

TH0=(65535-50000)/256; //赋初值高低

TL0=(65535-50000)%256; //赋初值低位

TR0=1; //启动定时器t0

ET0=1; //允许定时器t0中断

EA=1; //开放总中断

tcount=0; //定时器中断计数器初始化

secount=0; //秒计数器初始化

while(1) //主循环

{

P0=DISP[secount/10]; //秒计数器十位送显示

P2=LED[4]; //点亮对应数码管

DELAY_1MS(2); //延时2毫秒

P0=DISP[secount%10]; //秒计数器个位送显示

P2=LED[5]; //点亮对应数码管

DELAY_1MS(2); //延时2毫秒

}

}

再次重新启动。

用C语言实现的,先要定义好定时器的初值,不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期,机器周期=12/n(n指晶振频率),假设你要定时的时间为M,那么定时的初值为:M/机器周期=初值;

TH0=(65536-初值)%256;

TL0=(65536-初值)/256;

将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值,例如用12M晶振做1ms定时计算如下:

机器周期=12/1210^6=1us(微秒)

定时初值=(110^-3)/(110^-6)=1000;

所以:TH0=(65536-1000)%256;

TL0=(65536-1000)/256;

将65536-1000=64536化为16进制为:0xFC18,TH0=0xFC,TL0=0X18;

定好初值后要延迟一秒就定一个延时参数,这里使用1000就行了(定时为1ms)中断程序为:timer0() interrupt 1 // 1ms延时(120MHz)

是51单片机吗? 如果是51单片机,你可以使用TMOD设置两个定时器,然后使用TR0、TR1分别启动两个定时器。PT0置为“1”,就可以中断定时器1的服务函数,相反,如果PT1置为“1”就可以中断定时器0的服务函数。 如果不设置PT的值,默认为“0”,这样的话,T0和T1谁也不能中断谁。

以上就是关于使用2个数码管设计一个60秒倒计时C语言程序,要求用定时器中断定时1秒。 仿真元件数码管为7SEG-COM-CATHODE全部的内容,包括:使用2个数码管设计一个60秒倒计时C语言程序,要求用定时器中断定时1秒。 仿真元件数码管为7SEG-COM-CATHODE、C51单片机C语言中断问题、用C语言编写程序,要求如下:定时器0,工作方式1,开启定时中断每隔50ms,发光二极管状态翻转等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9832994.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存