我是靠谱客的博主 舒服黄豆,最近开发中收集的这篇文章主要介绍基于51单片机电子秒表倒计时器proteus仿真程序原理图PCB数码管显示语言播报,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

硬件设计

仿真图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;
    }
  }
}

附:http://www.jh-tec.cn/archives/7294

最后

以上就是舒服黄豆为你收集整理的基于51单片机电子秒表倒计时器proteus仿真程序原理图PCB数码管显示语言播报的全部内容,希望文章能够帮你解决基于51单片机电子秒表倒计时器proteus仿真程序原理图PCB数码管显示语言播报所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部