单片机 > 单片机程序设计 > 详情

单片机内部定时/计数器实验程序

发布时间:2023-04-11 发布时间:
|

新人发帖:

实验六、实验内容

1. 连线并编制程序。使用定时器1中断,按方式1工作,得到1S的定时;按方式2工作,得到4ms的定时。

2.初始化程序

包括定时器初始化和中断系统初始化。主要对IP,IE,TCON,TMOD 的相应位进行正确的设置,并将时间常数送入定时器中。由于只有定时器中断,IP不必设置。

3.设计中断服务程序和主程序

中断服务程序除了要完成计时工作外,还要实现动态显示。


软件设计:扩展单个按键,使其具有“开启/停止/清除”的功能,开启:可以实现0—99S的计时,停止:能显示记录的时间,清除:具有清除当前记录重新记录数据。


仿真原理图如下

单片机源程序如下:

#include

#define uchar unsigned char

#define uint usigned int

#define SEG P2

uchar key_idx,key_state;

#define SCANP P1;

sbit LED=P0^7;

sbit K1=P1^7;

char code TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,

0x92,0x83,0xf8,0x80,0x98};


char disp[2]={0xc0,0xc0};

char seconds=0; //秒数

char scan=0; //扫描信号

int count_T0=0; //中断次数

int count_T1=0;

void delay(int x)

{

uchar i;

while(x--)

for(i=0;i<100;i++);

}

void key_envent()

{

if(key_state==0)

{

key_idx=(key_idx+1)%3;

switch(key_idx)

{

case 1:EA=1;TR0=1;break;

case 2:TR0=0;break ;

case 0:TR0=1;seconds=0;

}

}

}

main()

{ key_idx=0; //按键次数(0,1,2,3)

key_state=1;//按键状态

IE=0x8a;

TMOD=0x21;

TH0=(65636-50000)/256;

TL0=(65636-50000)%256;

TR0=1;

TH1=256-250;

TL1=256-250;

TR1=1;

LED=1;

while(1)

{

if(key_state!=K1)

{

delay(10);

key_state=K1;

key_envent();

}

}

}

//T0中断子程序,计算显示秒数

void T0_1s(void) interrupt 1

{ TH0=(65636-50000)/256;

TL0=(65636-50000)%256;

if(++count_T0==20) //20*0.05=1s

{

count_T0=0;

if(key_idx==1) seconds++;

if(seconds==100)

{ seconds=0;

LED=~LED;}

}

disp[1]=TAB[seconds/10];

disp[0]=TAB[seconds%10]; //个位

}

void T1_8ms(void) interrupt 3

{

if(++count_T1==32) //0.25*32=8ms

{ count_T1=0;

if(++scan==3) scan=1;

SEG=0xff;

P1=~scan;

SEG=disp[scan-1];

}

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别