概述
硬件设计
仿真图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数码管显示语言播报所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复