基于51单片机电子秒表倒计时器proteus仿真程序原理图PCB数码管显示语言播报

本文介绍了一款硬件设计,包含计时功能的数码管显示、与LCD结合的显示方式,以及具有语音播报和多次记录功能。程序设计部分展示了使用51单片机的控制逻辑,包括定时器、中断处理和LCD驱动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

硬件设计

附:http://www.jh-tec.cn/archives/7294
仿真图1:

计时功能,数码管显示在这里插入图片描述

仿真图2
数码管LCD结合显示;具有多次记录模式;
在这里插入图片描述

仿真图3
数码管显示;具有时钟和秒表功能;
在这里插入图片描述
仿真图4
数码管显示;具有语音播报功能(这里采用示波器模拟,实物在此管脚外接喇叭接口播放);能够多次记录;也可设置复位值。

在这里插入图片描述

程序设计

#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit start=P3^2;
sbit stop =P3^3;
sbit clear=P3^4;
sbit swch =P3^5;
sbit next =P3^7;
//sbit e1=P2^0;sbit e2=P2^1;sbit e3=P2^2;sbit e4=P2^3;sbit e5=P2^4;
sbit rs=P3^0;
sbit rw=P3^1;
sbit en=P3^6;

sbit dp=P1^7;

char displaytemp[16];
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar table2[5];//存储个位到万位
uint k;   //每10ms加一
uchar ktime=1;//停止按键按下次数
uint table3[5];//存储多次计时的时间
uchar ch2=0x01;
uchar ch1=0;
uchar q;
uint flag=3;
float klcd;

void delay(uchar z)  //延时
{
  uchar x,y;
  for(x=z;x>0;x--)
  for(y=110;y>0;y--); 
}

void led_disp(uchar ch0)  //led显示
{
  P2=~ch2;
  P1=table[table2[ch0]];
  if(ch2==0x04)
    dp=1;
  else
    dp=0;
  ch2=ch2<<1;
  if(ch2==0x20)
    ch2=0x01;
}

/*------------------------------------------------
              判忙函数
------------------------------------------------*/
bit lcd_busy(void) 
{ 
  P0= 0xFF; 
  rs=0; 
  rw=1; 
  en=0;
  _nop_(); 
  en=1;
  return (bit)(P0 & 0x80);
}
/*------------------------------------------------
              写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com) 
{  
  //while(lcd_busy()); //忙则等待
  delay(2);
  rs=0; 
  rw=0; 
  en=1;
  P0= com; 
  _nop_(); 
  en=0;
}
/*------------------------------------------------
              写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data) 
{ 
  //while(lcd_busy()); //忙则等待
  delay(2);
  rs=1; 
  rw=0; 
  en=1; 
  P0= Data; 
  _nop_();
  en=0;
}

void lcd_clear(void) //清屏
{ 
  LCD_Write_Com(0x01); 
  delay(3);
}

void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 
{     
  if (y==0) 
  {     
	  LCD_Write_Com(0x80 + x);    //表示第一行
  }
  else 
  {      
 	  LCD_Write_Com(0xC0 + x);    //表示第二行
  }        
  while (*s) 
  {     
    LCD_Write_Data( *s);     
    s++;     
  }
}

void lcd_init(void) 
{
  LCD_Write_Com(0x38);    /*显示模式设置*/ 
  delay(2); 
  LCD_Write_Com(0x38); 
  delay(2); 
  LCD_Write_Com(0x38); 
  delay(2);
  LCD_Write_Com(0x38);  
  LCD_Write_Com(0x08);    /*显示关闭*/ 
  LCD_Write_Com(0x01);    /*显示清屏*/ 
  LCD_Write_Com(0x06);    /*显示光标移动设置*/ 
  delay(2); 
  LCD_Write_Com(0x0C);    /*显示开及光标设置*/
}

void main(void)
 {
   uchar m=0;
   k=0;
   lcd_init();
   TMOD=0x11; 
   TH0=(65536-10000)/256;
   TL0=(65536-10000)%256;
   TH1=(65536-8000)/256;
   TL1=(65536-8000)%256;
   EA=1;
   IT0=1;EX0=1;
   IT1=1;EX1=1;
   TR0=0;ET0=1;
   TR1=1;ET1=1;
   while(1)
   {
     klcd=(float)k/100;
     sprintf(displaytemp,"% 3.2f",klcd);
     LCD_Write_String(1,0,displaytemp);
     if(table2[0]==table2[1]==table2[2]==table2[3]==table2[4]==9)
     {
       EA=0;
       for(q=0;q++;q<5)
         table2[q]=0;
       EA=1;
     }    
   }
 }

void int0(void) interrupt 0
{
  if(clear==0)
  {
    TR0=0;
    k=0;
    delay(2);
    TR0=1;
  }
  else if(clear&next)
    TR0=1; 
  else
//       if(table3[3]!=0)
       {
         k=table3[flag];
         flag--;
         if(flag==0)
           flag=3;
       }       
}

void int1(void) interrupt 2
{
  if((swch==1))
    TR0=0;
  else
  {
    TR0=0;
    table3[ktime]=k;
    delay(1);
    TR0=1;
    ktime++;
    if(ktime==4)
    {
      ktime=1;
      TR0=0;
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值