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,发光二极管状态翻转等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)