找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1228|回复: 2
收起左侧

自己写的一个码表程序

[复制链接]
ID:442350 发表于 2018-12-22 20:16 | 显示全部楼层 |阅读模式
四个按键控制,可以实现暂停开始 加一 归零
#include <reg51.h>
typedef unsigned char u8;
typedef unsigned int  u16;
sbit start=P2^7;
sbit stop=P2^6;
sbit plus_one=P2^5;
sbit resert=P2^4;
#define dpick P0
#define wpick P1
u16 num1=0;                                                               //1s的次数的计数值
u16 num60=0;                                                        //1min的次数的计数值
u16 zd_num=0;                 //进入中断次数的计数值

                    //子函数

void delay(u16 num)                                                         //延时函数
{
               u16 x,y;
               for(x=num;x>0;x--)
               for(y=110;y>0;y--)
               {
               ;                     
               }
}
u8 code table[]={0x3f,0x06 ,0x5b ,0x4f, 0x66, 0x6d, 0x7d ,0x07, 0x7f,
                 0x6f,0x77 ,0x7c, 0x39, 0x5e, 0x79, 0x71};
void Display(u16 a,u16 b,u16 c,u16 d)                                      //定义显示函数  
{
    dpick=table[a];                                              //秒的个位的段选
wpick=0x7f;                                                         //秒的个位的位选
delay(5);   

dpick=table[b];                                                        //秒的十位的段选
wpick=0xbf;                                                         //秒的十位的位选
delay(5);

dpick=table[c]+0x80;                                                   //分的个位的段选(带小数点)
wpick=0xdf;                                                      //分的个位的位选
delay(5);
  
dpick=table[d];                                                     //分的十位的段选
wpick=0xef;                                                   //分的十位的位选
delay(5);      
}
void InitTimer0()                                                         //定时器初始化函数
{

TMOD=0x01;                                                            //选择定时器0的工作方式1
TH0=(65535-50000) / 256;                            //计算初值 (定时50ms)
    TL0=(65535-50000) % 256;
EA=1;                                                            //打开总中断
ET0=1;                                                               //打开定时器中断
TR0=0;
}
void TIMER0()  interrupt 1                                                //定时器中断服务函数
{
TH0=(65535-50000) / 256;                                              //手动填充
TL0=(65535-50000) % 256;
zd_num++;                                                        //让进入中断次数值加1,用于判断是否达到1s
}
            //主函数
void main()
{
    u16 s1,s10,min1,min10;                                     //秒的个位,秒的十位,分的个位,分的十位
InitTimer0();                                            //初始化定时器
while(1)  
{
if(start==0)                                                   //检测启动
{
    delay(20);                                   
if(start==0)  
{               
   TR0=1;                                              //定时器打开
   while(!start);                                 
}
}
if(stop==0)                                                     //检测启动
{
  delay(20);
  if(stop==0)  
  {
TR0=0;                                                  //定时器关闭
while(!stop);                                 
  }
}
if(plus_one==0)                                                
{
  delay(20);                                      
  if(plus_one==0)  
  {
zd_num=zd_num+20;                                    
while(!plus_one);                                 
  }
}
if(resert==0)                                             
{
  delay(20);                                       
  if(resert==0)  
  {
    zd_num=0;
TR0=0;
num1=0;
num60=0;            
  }
  while(!resert);
}  

if(zd_num>=20)                                                     
{
   zd_num=0;                                                              
   num1++;                                                     
  if(num1>=60)                                                           
    {
        num1=0;                                                         
     num60++;
     if(num60>=60)
      {
     TR0=0;   
     num1=0;
     num60=0;
     zd_num=0;
   }
    }
}

s1=num1%10;                                               //从秒的计数值里面分离秒的个位
s10=num1/10;                                                //从秒的计数值里面分离秒的十位
min1=num60%10;                                             //从分的计数值里面分离分的个位
min10=num60/10;                                             //从分的计数值里面分离分的十位

Display(s1,s10,min1,min10);                                 //显示
}

}









回复

使用道具 举报

ID:1 发表于 2018-12-23 00:46 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

ID:442350 发表于 2018-12-23 14:49 | 显示全部楼层
电路连接 就是单片机P0连接数码管段选位 P1 的四个IO口 连接数码管所选的位选位 四个按键连接P2口的7 6 5 4
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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