找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1890|回复: 0
打印 上一主题 下一主题
收起左侧

我怎么仿真不出来,大家来看看

[复制链接]
跳转到指定楼层
楼主
#include<reg52.h>               //52 系列单片机头文件
#define uchar unsignedchar        //宏定义
#define uint unsigned int
sbit key1=P3^4;                //申明四个按键的锁存端
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
uchar code table[]={            //含有 0~9 的数字数组
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7c,0x07,
0x7f,0x67};
uchar code table2[]={            //含有 0~9 的数字数组(带小数点)
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfc,0x87,
0xff,0xe7};
void delayms(uint);                //声明延时函数
voiddisplay(uchar,uchar,uchar);      //声明显示函数
void keyscan();                   //声明按键函数
ucharnum1,num2,bai,shi,ge;     //变量声明
uint num;
void main()                       //主函数入口
{
TMOD=0x11;                  //设置 TO,T1 定时器
TH0=(65536-45872)/256;    //装初值11.05992M晶振50ms数为45872
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;                       //开总中断
ET0=1;                      //开启定时器 T0 中断
ET1=1;                     //开启定时器 T1 中断
while(1) //程序停在这里等待中断的发生,这个大循环也是实现数据显示的主体
{
  keyscan();                  //三个数码管要选送的数据
  bai=num/100;               //百位
  shi=(num-100*bai)/10;        //十位
  ge=num-100*bai-shi*10;      //个位
  display(bai,shi,ge);           //数码管显示
}
}
void display(uchar bai,uchar shi,uchar ge)
    {
       P1=0xfe;        //位选选中第一个数码管
       P2=table[bai];    //送段选数据
       delayms(10);     //延时
       P1=0xff;         //关闭位选
P1=0xfd;        //位选选中第二个数码管
       P2=table2[shi];   //送段选数据
       delayms(10);  //延时
P1=0xff;     //关闭位选
       P1=0xfb;     //位选选中第二个数码管
       P2=table[ge];  //送段选数据
       delayms(10);    //延时
P1=0xff;      //关闭位选
}
void delayms(uintxms)   //延时子函数
   {
       uint i,j; for(i=xms;i>0;i--)         //i=xms 即延时约 xms 毫秒
       for(j=110;j>0;j--);
   }
void keyscan()
{
   if(key1==0)                   //清零
     {
       delayms(10);             //延时去抖
       if(key1==0)
         { while(!key1)             //等待按下
           {
              TR0=0;               //定时器 TR0 关闭
              TR1=1;               //定时器 TR1 打开
              num=0;               //送数据 num=0
              TR1=0;               //定时器 TR1 关闭
            }
          }
      }
    if(key2==0)                   //暂停和开始
      {
        delayms(10);
        if(key2==0)
          {
            while(!key2);
            TR0=0;
            TR1=~TR1;            //每次按下,TR1 的状态时相反的
          }
       }
     if(key3==0)                   //使计数器显示为 60.0
       {
          while(!key3);
          TR0=0;
          TR1=1;
          num=999;
          TR1=0;
        }
      if(key4==0)                      //实现计数器的倒数功能
        {
          while(!key4);
          TR1=0;
          TR0=~TR0;//TR0=1;
         }
}
void T0_time()interrupt 1                                                  //定时器 T0,中断序号为 1
{TH0=(65536-45872)/256;       //重装初值
    TL0=(65536-45872)%256;
    num2++;
    if(num2==2)                 //如果到了2次,说明0.1秒的时间到
      {  num2=0;                 //然后把num2清零重新再计2次
        num1++;
      }
    if(num1==10)
num1=0;
    if(num==0)     //当 num 自减为0时,重新为 60.0,再开始倒计时
      num=999;        //num 逐渐自减
        num--;
}
void T1_time()interrupt 3
{   TH1=(65536-45872)/256;    //重装初值
    TL1=(65536-45872)%256;
    num2++;
    if(num2==2)                //如果到了 2 次,说明 0.1 秒的时间到
      {  num2=0;                //然后把 num2 清零重新再计 2 次
         num1++;
         if(num1==10)
num1=0;
           num++;               //num 逐渐自加  
         if(num==999)                                                                          
num=0;//这个数十用来送给数码管显示的,到了60.0后归零
      }
}


秒表.png (29.28 KB, 下载次数: 29)

照图仿真做不出来!

照图仿真做不出来!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表