电子表设计
- 仿真电路图
-
秒表实现
-
#include <reg51.h> #include <intrins.h> int seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; int sec=54; int dis[]={5,4}; void display(); void renew(); void delay(int i) { int k,j; for(k=0;k<i;k++) for(j=0;j<100;j++); } void display() { int j; int i,k=500; while(k--) { j=0x7f; for(i=0;i<2;i++)//内循环;位扫描; { P2=j;//01111111 P0=seg[dis[i]]; delay(1);//总线延长; j=_cror_(j,1); } } } void renew() { sec++; if(sec==60) sec=0; dis[0]=sec/10; dis[1]=sec%10; } void main() { while(1) { display(); renew(); }}
-
-
-
/*************************************************************** 项目名称:项目2 简易电子表 任务名称:任务3秒表 任务描述:单片机控制8个数码管,显示日期. 班级日期:物联网1602班,2019-04-11. 中断系统:计算机执行程序时,遇到突发事件,自动打断当前程序, 转而自动执行中断服务程序(标识interrupt n),执行完服务程序后, 再自动返回被打断的程序继续执行。应激性 中断源:能引发中断的源头。51单片机有5个中断源:0-外部中断0(P3.2) 1-定时器T0(计数器P3.4) 2-外部中断1(P3.3) 3-定时器T1(计数器P3.5) 4-串行通信(P3.0和P3.1),外部中断用来管理设备,一般以故障信号作为中断信号 定时器中断专门用于定时和提醒。 定时器工作原理:51单片机有2个16位定时/计数器。 对内部机器周期(规则变化信号)计数可以确定时间--定时器 对外部引脚信号计数不能确定时间--计数器 用法:先初始化,启动后按照设定的信号自动加1计数, 数到溢出(65536)时自动申请中断,提醒。 初始化:1.通过TMOD设置工作方式, 2.通过TH、TL填装计数初值(根据定时时间计算计数初值), 3.打开中断允许。ET和EA(enable),4.启动定时器。TR 定时器中断服务程序:1.确定时间是否达到,2.执行中断事件处理程序, 3.如果需要连续中断,必须重新填装初值。 ****************************************************************/ #include <reg51.h> #include <intrins.h> int min=0; int hour=0; int seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};// int sec=0;//计数变量 int dis[8];//显示数组 int num=0;//累计中断次数 void display(); /**************************************************************/ void delay(int i) { int j,k; for(k=0;k<i;k++) for(j=0;j<500;j++); } /**************************************************************/ void display() { int j; int i; j=0x7f; for(i=0;i<8;i++) //内循环:位扫描 { P2=j;//01111111 P0=seg[dis[i]]; delay(1);//总线延时 j=_cror_(j,1); } } /**************************************************************/ void t_0()interrupt 1//50毫秒进入一次 { num++; if(num==20)//累计20次中断,1秒到了 { num=0; sec++; if(sec==60) { sec=0; min++; if(min==60) { min=0; hour++; if(hour==24) { hour=0; } } } dis[0]=hour/10; dis[1]=hour%10; dis[2]=10; dis[3]=min/10; dis[4]=min%10; dis[5]=10; dis[6]=sec/10; dis[7]=sec%10; } TH0=(65536-50000*11059/12000)/256;//定时50毫秒=50000微秒 19456/256 TL0=(65536-50000*11059/12000)%256; }//自动返回被打断的程序 /**************************************************************/ void main() { TMOD=0x01;//选择T0用作16位定时器 TH0=(65536-50000*11059/12000)/256;//定时50毫秒=50000微秒 19456/256 TL0=(65536-50000*11059/12000)%256;//50毫秒中断1次,累计20次中断刷新1次显示值 ET0=1; EA=1;//定时器t0中断允许 TR0=1;//启动定时器t0: //启动后按照设定的信号自动加1计数,数到溢出(65536)时自动申请中断 while(1) { display();//无限循环,中断系统可以打断循环,执行中断服务程序,在中断里刷新显示值 } //自动找中断服务程序,找带interrupt 1标识的函数 }