|
单片机仿真实习任务:
05 定时器/计数器类单片机系统
- //10秒测按键1次数,按键2重置
- #include <reg51.h>
- sbit P2_0 = P2^0;//数码管选定位
- sbit P2_1 = P2^1;//数码管选定位
- sbit P2_2 = P2^2;//数码管选定位
- sbit P2_3 = P2^3;//数码管选定位
- sbit k1=P1^0;//计数
- sbit k2=P1^1;//开始
- //共阳数码管
- unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- unsigned int begin = 0;
- unsigned int GE,SHI,BAI,QIAN; //定义变量
- unsigned int time=10;//秒数
- unsigned char Button_count=0;//按键次数
- unsigned int temp;
- void display();//数码管显示函数,依次点亮数码管
- void Daojishi();//倒计时
- void delay0(unsigned int z);//延迟函数
- void scankey();//按键扫描
- void timeint0();
- void main()
- {
- while(1)
- {
- if(k2==0)//检测键是否被按下
- {
- begin=1;
- time=10;
- Button_count=0;
- GE=0;
- SHI=0;
- BAI=0;
- QIAN=0; //定义变量
- timeint0();
- }
- if(begin==1)
- {
- Daojishi();
- scankey();
- }
- display();
- }
- return ;
- }
- /*********************************************************
- //
- //10s倒计时
- //
- *********************************************************/
- void Daojishi()//倒计时
- {
- if (time!=0)
- {
- if(temp!=0)
- {
- temp=0;
- time--;//变量自增
- QIAN=time/10;//显示十位
- BAI=time%10;//显示个位
- }
- }
- }
- /*********************************************************
- //
- //键盘检测子函数
- //
- *********************************************************/
- void scankey()
- {
- if (time!=0)
- {
- if(k1==0) //检测键是否被按下
- {
- delay0(5); //延时消除抖动
- if(k1==0) //重新读取k1的值
- {
- Button_count++; //计数
- SHI=Button_count/10;
- GE=Button_count%10;
- while(!k1); //等待按键释放
- }
- }
- }
- }
- //数码管显示函数,依次点亮数码管
- void display()
- {
- P2_0 = 0;
- P0 = table[QIAN];
- delay0(5);
- P2_0 = 1;
- P2_1 = 0;
- P0 = table[BAI];
- delay0(5);
- P2_1 = 1;
- P2_2 = 0;
- P0 = table[SHI];
- delay0(5);
- P2_2 = 1;
- P2_3 = 0;
- P0 = table[GE];
- delay0(5);
- P2_3 = 1;
- }
- /*********************************************************
- 延时子函数0.24ms
- *********************************************************/
- void delay0(unsigned int z)
- {
- unsigned int i,j;
- for(i=0;i<z;i++)
- for(j=0;j<110;j++);
- }
- /*********************************************************
- //
- //定时器0初始化
- //
- *********************************************************/
- void timeint0()
- {
- TMOD=0X01;//工作方式
- TH0=0XFC;//定时1ms
- TL0=0X18;//定时1ms
- TR0=1;//控制
- ET0=1;//定时器0中断请求
- EA=1;//总中断
- }
- /*********************************************************
- //
- //定时器0中断1ms
- //
- *********************************************************/
- void time0int () interrupt 1//注意中断号
- {
- static int i=0;//注意静态变量的使用!
- TH0=0XFC;//定时器复位
- TL0=0X18;//定时器复位
- i++;
- if(i==1000)//1000个1ms,构成1s
- {
- i=0;
- temp=1;
- }
- }
复制代码
|
|