(单片机原理与应用)定时器/计数器设计实验

2019-04-15 19:22发布

一、实验内容 采用12MHZ时钟频率的单片机,通过一个开关输入,触发定时计数。按下开关10次,计算按键的平均时间,并通过数码管显示出来。 二、实验目的 了解定时器的各种工作方式 掌握定时器/计数器的使用和编程方法 三、实验设备 DELL台式机 、keilC51版本7、proteus版本6 四、实验电路图
五、程序流程图
六、程序源码   #include #include #define uchar unsigned char #define uint unsigned int sbit Dot=P0^7;//小数点 sbit P3_5=P3^5;//按钮 uchar Count=0;//循环次数 uchar flag=0;//判断标志 uchar Times=0; //数码管段码定义 uchar code DSY_CODE[]= { 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90 }; //延时 void DelayMS(uint x) { uchar i; while(--x)for(i=0;i<120;i++); } //6只数码管上显示的数字 uchar Digit[]={0,0,0,0,0,0}; void main() { uchar i,j; P0=0xff; P2=0x00; P3_5=1; TMOD=0x01;//设T0为定时方式1 EA=1;ET0=1;//开总控,INT0 TH0=(65536-50000)/256;//设置50ms定时 TL0=(65536-50000)%256; while(Count!=10){ if(P3_5==1)//开关高电平 { if(flag==1)//判断标志位 { flag=0;Count++;//修改标志位,循环次数+1 } TR0=0;//关中断 } else if(P3_5==0)//开关低电平 { flag=1; TR0=1;//修改标志位,关中断 } } //显示数码管 while(1) { j=0x80; for(i=0;i<6;i++) { j=_crol_(j,1); P2=j; P0=DSY_CODE[Digit[i]]; if(i==2)//因为是平均时间,所以小数点左移一位 Dot=0; DelayMS(2); } } } void Time0()interrupt 1 { uchar i; TH0=(65536-50000)/256;//定时 TL0=(65536-50000)%256; if((++Times)==2)//50ms*2=0.1s { Times=0; Digit[0]++;//0.1s累加 for(i=0;i<=5;i++)//进位处理 { if(Digit[i]==10) { Digit[i]=0; if(i!=5) Digit[i+1]++; } } } }