基于51单片机0.001s精度秒表9.999s仿真设计(源码+仿真+原理图+PCB+报告+器件清单+讲解)
仿真版本:proteus 7.8
程序编译器:keil 4/keil 5
编程语言:C语言
设计编号:S0003
🕐1 功能说明:
定时器做精度为0.001s的秒表;
1、秒表精度为0.001s;
2、按键可以实现启动、暂停及清零;
3、计时到9.999秒后清理重新开始计时;
4、用数码管显示计时时间;
仿真51单片机芯片是通用的,AT89C51,AT89C52都是51单片机的具体型号,内核是兼容的。原理图不变的情况下,主控芯片可以替换成STC89C52/STC89C51/AT89C52/AT89C51/8051等51单片机芯片。
🕐2 仿真电路:
打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。开始仿真后数码管显示0.000,按下按键开始计时,再按下按键停止计时,再按下按键复位计时时间。
开始仿真还没开始计数,显示0.000秒。
开始计数后,时间以0.001s递增。启动后按键按下暂停计时并显示当前的计时时间,再按键计时清零。
接近9.999,超过9.999后复位到0并重新计时。
🕐3 原理图:
AD绘制的。
Proteus仿真和实物作品的区别:
1.运行环境:Proteus仿真是在计算机上运行的,而实物则是在硬件电路板上运行。
2.调试方式:在Proteus仿真中,可以方便地进行单步调试和观察变量值的变化,而在实物中则需要通过调试器或者串口输出等方式进行调试。
电路连接方式:在Proteus仿真中,可以通过软件设置进行电路连接的修改,而在实物中则需要通过硬件电路板和连接线进行修改。
3.运行速度:Proteus仿真通常比实物运行速度快,因为仿真是基于计算机运行的,而实物则需要考虑电路板上的物理限制和器件的响应时间等因素。
4.功能实现:在Proteus仿真中,可以通过软件设置实现不同的功能,而在实物中则需要根据电路设计和器件的性能进行实现。
元器件清单
Comment | Description | Designator | Footprint | LibRef | Quantity |
---|---|---|---|---|---|
Cap Pol1 | 电容 | C1 | 电解电容 | Cap Pol1 | 1 |
Cap | 电容 | C2, C3 | 0805_C | Cap | 2 |
104 | 电容 | C4 | 0805_c | CAP | 1 |
四位数码管 | 数码管 | DY1 | 四位数码管 | 四位数码管 | 1 |
CON2 | 2PIN排针 | J1, J2, J3, J4 | HDR1X2 | CON2 | 4 |
KEY | 按键 | key1 | SWITCH | KEY | 1 |
PNP | 三极管 | Q1, Q2, Q3, Q4 | TO-92A | PNP | 4 |
Res2 | 电阻 | R9 | 0805 | Res2 | 1 |
1k | 电阻 | R10, R11, R12, R13, R14 | 0805 | RES | 5 |
510 | 电阻 | RES1 | SIP9 | 排阻 | 1 |
AT89C52 | 单片机 | U1 | STC89C52 | AT89C52 | 1 |
XTAL | 晶振 | Y1 | 晶振12M | XTAL | 1 |
🕐4 PCB:
双层板设计,部分使用贴片元器件
🕐5 程序:
#include<reg52.h>
#define uchar unsigned char //无符号字符型宏定义
#define MS 225
uchar code led1[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //不带小数点数码管段码
uchar code led2[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带小数点数码管段码
uchar n=0,m=0,j=0,k=0;//四位要显示数据
uchar keyln=0; //按键值
sbit key=P3^3; //按键接口
void Delay_ms(uchar s);//延时函数声明
void Display(void); //显示函数声明
void main(void) // 主函数
{
TMOD=0X01; //定时器0方式1
TH0=(65536-1000)/256; //预设初值高位
TL0=(65536-1000)%256; //预设初值低位
ET0=1; //开定时器0中断
EA=1; //开总中断
TR0=0; //定时器关
while(1) //主函数循环
{
if(key==0) //判断按键是否按下
{
Delay_ms(50); //延时,软件消抖
if(key==0) //再次判断按键是否一直被按下
{
while(!key); //等待按键弹起
keyln++; //按键值+1
if(keyln>3) keyln=1; //如果按键值大于3则令其为1
}
}
switch(keyln) //按键值处理循环
{
case 1:TR0=1; break; //按下一次,启动定时器
case 2:TR0=0; break; //按下二次,关闭定时器
case 3:TR0=0; n=m=j=k=0; break;//按下三次,复位
default: break; //其他情况无
}
Display();//调用显示函数
}
}
void timer0(void) interrupt 1 //定时器0中断服务子程序
{
TH0=(65536-1000)/256; //1ms重赋初值高位
TL0=(65536-1000)%256; //重赋初值低位
n++; //秒表最低位+1 n代表毫秒
if(n==10) //如果最低位=10
{
n=0; //则最低位清0
m++; //前一位+1
if(m==10) //以下如此推理 m代表十毫秒
{
m=0;
j++;
if(j==10) //J代表百毫秒
{
j=0;
k++;
if(k==10) //当最高位为10时,全部清零
{
n=0;
m=0;
j=0;
k=0;
}
}
}
}
}
void Delay_ms(uchar s) //延时函数
{
uchar i;
for(i=0;i<s;i++);
}
void Display(void) //显示函数
{
P2=0XF7; //最低位
P1=led1[n];
//P0=~led1[n];
Delay_ms(MS);
P2=0XFF;
P2=0XFB; //第三位
P1=led1[m];
//P0=~led1[m];
Delay_ms(MS);
P2=0XFF;
P2=0XFD; //第二位
P1=led1[j];
// P0=~led2[j];
Delay_ms(MS);
P2=0XFF;
P2=0XFE; //第一位
P1=led2[k];
//P0=~led1[k];
Delay_ms(MS);
P2=0XFF;
}
🕐6 资料清单&&下载链接:
0.常见问题 必读!!!!
\1. 程序
\2. 仿真
\3. 原理图和pcb
4.开题报告
5.元器件清单
6.功能要求
\7. 设计报告
8.讲解视频
Altium Designer 安装破解
filename.bat
KEIL+proteus 单片机仿真设计教程
KEIL安装破解
Proteus元器件查找
Proteus安装
Proteus简易使用教程
单片机学习资料
目录清单.txt
相关数据手册
答辩技巧
设计报告常用描述
鼠标双击打开查找更多51 STM32单片机课程毕业设计.url