2018-12-02 17:50:24 BLueberry_Pie 阅读数 2087
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3415 人正在学习 去看看 朱有鹏
/*
*	  秒表
*/
#include<reg52.h>
#define uchar unsigned char
uchar counter=0,tmp,second=0,minute=0, change = 1;
int led[]= {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //数字0-9
int _led[]= {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10};
void main() {
    //设置TMOD寄存器
    TMOD=0X01;							//设置TMOD寄存器
    TH0=(65536-5000)/256;			   //装初值
    TL0=(65536-5000)%256;
    EA=1;		//开 中断
    ET0=1;
    TR0=1;
    while(1) {

        tmp=counter%4;
        switch(tmp) {
        case 0:
            P2 = 0x7f;
            P0 = led[second%10];
            break;
        case 1:
            P2 = 0xbf;
            P0 = led[second/10];
            break;
        case 2:
            P2 = 0xdf;
            P0 = _led[minute%10];
            break;
        case 3:
            P2 = 0xef;
            P0 = led[minute/10];
            break;

        }

    }
}
void zhongduan()interrupt 1 {
    TH0=(65536-5000)/256;			   //装初值
    TL0=(65536-5000)%256;
    TF0=0;
    TR0=1;
    counter++;
    if(counter==200) {
        counter=0;
        second++;
        if(second==60) {
            second=0;
            minute++;
        }
    }
    change = 1;
}

 

2015-11-19 16:11:42 cjdsn 阅读数 1550
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3415 人正在学习 去看看 朱有鹏
/* 
write by cjdsn
 时间计算
1/22.1184=0.0000005425
1/0.5425=1843317
1843317/40=46083
//我的是阳极显示,0开1关
*/


#include<reg52.h>  
unsigned char code Tab[12]=


{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f,0xff}; 
 //数码管显示0~9的段码表
unsigned char int_time;        //记录中断次数
unsigned char second;        //储存秒
unsigned char t,h;
sbit pd=P2^0;
sbit pc=P2^1;
sbit pb=P2^2;
sbit pa=P2^3;
sbit p27=P2^7;
/******************************************************************


*****
函数功能:快速动态扫描延时,延时约0.6毫秒
*******************************************************************


*****/
void delay(void)
{
  unsigned char i;
  for(i=0;i<200;i++)
        ;
}
/******************************************************************


*****
函数功能:显示秒
入口参数:k
出口参数:无
*******************************************************************


*****/
 void DisplaySecond(unsigned char k)
{
   pb=0;        //P2.1引脚输出低电平
P0=Tab[k/10];          //显示十位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
   pb=1;
   pa=0;      //P2.0引脚输出低电平
P0=Tab[k%10];         //显示个位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pa=1;
pd=0;
P0=Tab[t/10];  //分 十位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pd=1;
pc=0;
P0=Tab[t%10];  //分 个位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pc=1;
///////////////////////////////////
pc=0;
P0=Tab[10];
delay();
delay();
delay();
delay();
delay();
delay();
pc=1;
//====================================//
/*
P2=0xff;     //关闭所有数码管
P0=0xff;        //显示个位
*/
//====================================//
}


///////////////////////////////////////////////////////////////////


/////////////////


 void Displayh()
{
   pb=0;        //P2.1引脚输出低电平
P0=Tab[t/10];          //显示十位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
   pb=1;
   pa=0;      //P2.0引脚输出低电平
P0=Tab[t%10];         //显示个位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pa=1;
pd=0;
P0=Tab[h/10];  //分 十位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pd=1;
pc=0;
P0=Tab[h%10];  //分 个位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pc=1;
///////////////////////////////////
pc=0;
P0=Tab[10];
delay();
delay();
delay();
delay();
delay();
delay();
pc=1;
}


////////////////////////////////  显示小数点
displayms(void)
 {
P2=1;
p27=1;
pa=0;
pb=1;
P0=Tab[10];
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pa=1;
 }


//==========================================================//


 
void main(void)     
   {
   P2=1;
   p27=1;
     TMOD=0x01;                 //使用定时器T0
    TH0=(-46083)/256;    //将定时器计时时间设定为


46083×1.085微秒
//=50000微秒=50毫秒
TL0=(-46083)%256;
EA=1;                 
      ET0=1;                 
          TR0=1;                   
  int_time=0;     //中断次数初始化
second=0;   //秒初始化
t=59;

while(1)
{       if(h<=0){
      DisplaySecond(second);//调用秒的显示子程序
  }
else Displayh();
}
 }  
//********************************************************
//函数功能:定时器T0的中断服务程序
//*******************************************************
  void interserve(void ) interrupt 1 using 1  
  {
    TR0=0;    //关闭定时器T0
    int_time ++;        //每来一次中断,中断次数int_time自加1


断次数清0  
if(int_time==40)   //够20次中断,即1秒钟进行一次检测结果采样
 {
        int_time=0;    //
second++;    //秒加1
if(h>0){displayms();}
if(second==60)
   {  second =0; //秒等于60就返回0
 t++;}
if(t==60){t=0;h++;
if(h==24)h=0;}
 }      
  TH0=(-46083)/256;   //重新给计数器T0赋初值
TL0=(-46083)%256;
TR0=1;     //启动定时器T0
 }  
2019-09-03 22:18:38 weixin_44884545 阅读数 247
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3415 人正在学习 去看看 朱有鹏

/*配置并启动T0,ms-T0定时时间*/
void ConfigTimer0(unsigned int ms)
{
    unsigned long tmp;	  //临时变量
	tmp = 11059200/12;	 //定时器计数频率
    tmp = (tmp * ms)/1000;	//计算所需的计数值
	tmp = 65536 - tmp;		//计算定时器重载值
	tmp = tmp + 18;			//补偿中断响应延时造成的误差
	T0RH = (unsigned char)(tmp >> 8);  //定时器重载值拆分为高低字节
	T0RL = (unsigned char)tmp;	
	TMOD &= 0xF0;	  //清零T0的控制位
	TMOD |= 0x01;	  //配置T0为模式1
	TH0 = T0RH;	      //加载T0中断`
	TL0 = T0RL;
	ET0 = 1;		  //使能T0中断
	TR0 = 1; 		  //启动T0
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/201909032214203.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDg4NDU0NQ==,size_16,color_FFFFFF,t_70)
/*按键扫描函数,需在定时中断中的调用*/
void KeyScan()
{
    unsigned char i;
	static unsigned char keybuf[4] = {	 //按键扫描缓冲区
	   0xFF, 0xFF, 0xFF, 0xFF
	};

	//按键值移位缓冲区,8bit每次向左移动1位,|上按键的值
	keybuf[0] = (keybuf[0]<<1) | KEY1;
	keybuf[1] = (keybuf[1]<<1) | KEY2;
	keybuf[2] = (keybuf[2]<<1) | KEY3;
	keybuf[3] = (keybuf[3]<<1) | KEY4;

	//消抖后更新按键状态
	for(i = 0; i < 4;i++)
	{
	    if(keybuf[i] == 0x00)
		{				   //连续8次扫描值为0,即16ms内都是按下状态时,可认可按键以稳定地按下
		    KeySta[i] = 0;
		}
		else if(keybuf[i] == 0xFF)
		{				   //连续8次扫描值为1,即16ms内都是弹起状态时,可认为按键已稳定地弹起
		    KeySta[i] = 1;
		}
	}
}

所要的定时功能

  • 定时器计数``
    • 数码管显示
      • 按键控制
2012-08-21 10:42:03 xmfthu 阅读数 4526
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3415 人正在学习 去看看 朱有鹏

     用51单片机的定时器0的方式1计时,结果用4位数码管显示,分别为秒十位,秒个位,毫秒百位,毫秒十位。所以总共最大计时为1分钟,精确到了0.01s。同时,加上3个独立按键,分别控制秒表的清零,暂停和开始功能。

   按照模块化的思想,首先先把要用的函数和预定义写到一个头文件中,要用到的预定义和全局变量如下:

#include <reg52.h>
#define uchar   unsigned char

sbit Clear=P3^7;   //按键实现清零
sbit Stop=P3^6;    //按键实现暂停
sbit ReStart=P3^5;  //按键实现开始
sbit dula=P2^6;     //段选线接P2^6口
sbit wela=P2^7;     //位选线接P2^7口

//table数组中存储数码管显示0~F对应的编码
uchar code   table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

//计时时间,计时中断发生一次,则加1,最大为5999
int time;

 

接下来是将要用到的函数声明:

//用于动态扫描数码管的时间较短的延时函数
void ShortDelay();    

//用于键盘消抖的时间较长的延时函数
void LongDelay();

//初始化
void Inital();

//在数码管显示秒十位,秒个位,微秒百位,微秒十位
//用拼音表示很不好,将就着看吧
void Display(uchar shimiao,uchar gemiao,uchar baiwei,uchar shiwei);

//清零函数,按下清零键的时候调用
void Clc();

//暂停函数,按下暂停键时候调用
void StopTimer();

//开始或重新开始函数,按下开始键时候调用
void ReStartTimer();

//键盘扫描函数,是否有键被按下,并且执行相应操作
void KeyScan();


 

接下来是主函数:

void main()
{
  uchar shimiao,gemiao,baiwei,shiwei;
  Inital();   //初始化
  while(1)
  {
    if(time==6000)    //到了秒表最大值,自动归零
    {
      time=0;
    }
    
    //分解出要显示的各个数位
    shimiao=time/1000;
    gemiao=time%1000/100;
    baiwei=time%100/10;
    shiwei=time%10;
    
    //显示
    Display(shimiao,gemiao,baiwei,shiwei);
    ShortDelay();
    //键盘扫描,有键按下执行相应操作
    KeyScan();
  }
}


下面的工作就是要写相应的处理函数了:

首先是两个延时函数:

void ShortDelay()
{
  uchar a=100;
  while(a--);
}

void LongDelay()
{
  int a=5000;
  while(a--);
}


初始化函数:

void Inital()
{
  dula=0;
  wela=0;
  time=0;
  EA=1;
  ET0=1;    //开定时器0中断
  TMOD=0x01;
  TH0=0xdc;
  TL0=0x01;   //装载初值,计时方式1  
  Clear=1;
  Stop=1;
  ReStart=1;   //按键接口管脚输出高电平
}


在数码管上显示时间的函数:

void Display(uchar shimiao,uchar gemiao,uchar baiwei,uchar shiwei)
{
  //输出秒十位
  wela=1;
  P0=0xfb;
  wela=0;
  P0=0xff;
  dula=1;
  P0=table[shimiao];
  dula=0;
  ShortDelay();
  
  //输出秒个位
  wela=1;
  P0=0xf7;
  wela=0;
  P0=0xff;
  dula=1;
  P0=table[gemiao];
  dula=0;
  ShortDelay();
  
  wela=1;
  P0=0xef;
  wela=0;
  P0=0xff;
  dula=1;
  P0=table[baiwei];
  dula=0;
  ShortDelay();
  
  wela=1;
  P0=0xdf;
  wela=0;
  P0=0xff;
  dula=1;
  P0=table[shiwei];
  dula=0;
  ShortDelay();
  
}


键盘扫描函数:

void KeyScan()
{
   if(Clear==0)    
    {
      LongDelay();    //消抖
      if(Clear==0)    //确实是被按下
      {
        //Do somthing
        Clc();
      }
    }
    
    //Stop和ReStart检测方法相同
    if(Stop==0)     
    {
      LongDelay();
      if(Stop==0)
      {
        //Do somthing
        StopTimer();
      }
    }
    if(ReStart==0)
    {
      LongDelay();
      if(ReStart==0)
      {
        //Do somthing
        ReStartTimer();
      }
    }
}


最后是3个按键按下后的处理函数:

void Clc()
{
  TR0=0;   //计时暂时停止
  time=0;   //时间归零
  Display(0,0,0,0);   //显示0000
  ShortDelay();    
}

void StopTimer()
{
  //计时暂时停止,仅此而已
  TR0=0;    
}

void ReStartTimer()
{
  //计时重新开始,仅此而已
  TR0=1;
}


至此,编译链接后生成的.HEX文件就能下载到51单片机里了。

 

2016-10-24 22:56:32 mengdewangzi 阅读数 590
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3415 人正在学习 去看看 朱有鹏

                 用单片机控制数码管实现秒表功能

要求:秒表跑到10s时停止,蜂鸣器响一声,秒表精度为0.01s


代码张贴:

#include <reg52.h>


#define SEGPORT P0

sbit dula=P1^1;

sbit wela=P1^0;

sbit deep = P1^2;

  

unsigned char code wei_table[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

unsigned char  tempdata[4];

unsigned char  p_table[10] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

unsigned char code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

 

unsigned char miao,m_miao;

void display_seg()

{

static unsigned char i = 0; 

  

SEGPORT=0xff;

wela = 1;

wela = 0;

    

SEGPORT =0x0;

dula = 1;

dula = 0;

 

    SEGPORT=wei_table[i];

wela = 1;

wela = 0;

 

SEGPORT = tempdata[i];  

dula = 1;

dula = 0;

i++;

if(4 == i)

{

i = 0;

}

}

 

void timer0_init()

{

EA = 1;

TMOD = 0x01;

TH0 = (65536 - 3000)/256;

TL0 = (65536 - 3000)%256;

ET0 = 1;

TR0 = 1;    

}

void timer1_init()

{

EA = 1;

TMOD |= 0x10;

TH1 = (65536 - 10000)/256;

TL1 = (65536 - 10000)%256;

ET1 = 1;

TR1 = 1;     

}    

void  timer0_isr() interrupt 1

{

TH0 = (65536 - 3000)/256;

TL0 = (65536 - 3000)%256; 

display_seg(); 

}

void  timer1_isr() interrupt 3

{

unsigned char i,j;

TH1 = (65536 - 10000)/256;

TL1 = (65536 - 10000)%256; 

m_miao++;

if(100 == m_miao)

{

m_miao = 0;

miao++;

if(10 == miao)

{

ET1 = 0;

tempdata[0] = table[miao/10];

tempdata[1] = p_table[miao%10];

tempdata[2] = table[m_miao/10];

tempdata[3] = table[m_miao%10];

for(j=0;j<200;j++)

{

i=50;

deep = ~deep;

while(i--);

}

}

}

 

tempdata[0] = table[miao/10];

tempdata[1] = p_table[miao%10];

tempdata[2] = table[m_miao/10];

tempdata[3] = table[m_miao%10];

}

 

void main()

{

   timer0_init();

   timer1_init();

   while(1);

}


51 单片机 秒表

阅读数 2087

没有更多推荐了,返回首页