C语言单相智能电表课程设计,51单片机电子跑表课程设计报告 含源代码,原理图,word文档...
#include
#define uchar unsigned char
#define uint unsigned int
uchar code Tab0[]= //定义数码管数组,没有小数点
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
uchar code Tab1[]= //定义数码管数组,有小数点
{
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef
};
uchar miaobiao[80]; //定义存储秒表数组
sbit K1=P3^2; //模式选择键,本程序三种模式,分别是时间显示、秒表、时间设置
sbit K2=P3^3; //设置时间时加一/开始(暂停)秒表按键
sbit K3=P3^4; //切换设置位/清零秒表按键
sbit K4=P3^5; //秒记录
void Delay(uchar x); //延时函数
void Display0(); //时间显示函数
void Display1(); //秒表显示函数
void Display2(); //时间设置显示函数
void Display3(); //保存的秒表显示函数
void Init(); //中断初始化函数
void Mode_K1(); //模式切换函数
void KEY_MiaoBiao(); //检测秒表操作按键
void KEY_Time_Set(); //检测时间设置按键
void KEY_MiaoBiao_keep(); //检测秒表记录显示按键操作
uchar Hours=12,Minutes=00,seconds=00; //分别定义三个变量表示时、分、秒
uchar Time0_bit=0; //用于定时器0的溢出标志
bit Set_Time=0; //设置时 闪烁时长的标志位
bit Set0=0; //设置时间标志,确定是设置‘分’还设置‘时’
uchar K1_bit=0,m=0; //用于模式切换的标志
uchar Miao_Biao0,Miao_Biao1,Miao_Biao2,Miao_Biao3,Miao_Biao4; //用于秒表的变量
uchar Miao_Biao11,Miao_Biao22,Miao_Biao33,Miao_Biao44; //用于保存秒表显示时的变量
void main()
{
Init(); //中断初始化
while(1) //死循环
{
Mode_K1(); //模式扫描
switch(K1_bit) //模式选择
{
case 0:
{
Display0(); //显示时间
break;
}
case 1:
{
Display1(); //显示秒表
KEY_MiaoBiao(); //扫描秒表操作
break;
}
case 2:
{
Display2(); //设置时间时的显示程序,可闪烁定位
KEY_Time_Set(); //扫描按键
break;
}
case 3:
{
Display3(); //显示秒表
KEY_MiaoBiao_keep(); //扫描秒表操作
break;
}
}
}
}
void KEY_Time_Set() //设置时间时的按键扫描函数
{
if(K1_bit==2) //判断是否为时间设置模式
{
if(K2==0) //K2有按下(下同)
{
Delay(10); //延时消抖(下同)
if(K2==0) //再次检测是否为误按
{
if(Set0==0) //检测是设置‘时’还是分,Set0为0时设置‘分’,Set0为1时设置‘时’
{
Minutes++; //‘分’加1
if(Minutes==60) //当'分'加到60时,重新赋值0
Minutes=0;
}
else
{
Hours++; //‘时’加1
if(Hours==24) //当'时'加到24时,重新赋值0
Hours=0;
}
while(!K2);//按键松开检测,消除松开按键时的抖动干扰
}
}
if(K3==0)
{
Delay(10);
if(K3==0)
{
Set0=~Set0; //K3每按一次Set0取反,时分切换,Set0为0时设置‘分’,Set0为1时设置‘时’
while(!K3);
}
}
}
}
void KEY_MiaoBiao() //检测秒表按键操作
{
if(K1_bit==1) //判断是否为秒表模式
{
if(K2==0)
{
Delay(10);
if(K2==0)
{
TR1=~TR1; //K2每按一次TR1取反,0暂停或1开始定时器1,达到暂停或开始秒表的目的
while(!K2);
}
}
if(K4==0) //当K4按下时秒表记录一组数据
{
Delay(10);
if(K4==0)
{
miaobiao[4*m]=Miao_Biao1;
miaobiao[4*m+1]=Miao_Biao2;
miaobiao[4*m+2]=Miao_Biao3;
miaobiao[4*m+3]=Miao_Biao4;
m++;
while(!K4);
}
}
if(K3==0)
{
Delay(10);
if(K3==0) //当K3按下时秒表所有数据清零,并停止定时器1
{
uchar i;
for(i=0;i<81;i++)
{
miaobiao[i]=0; //清除所有秒记录数据
}
TR1=0; //停止定时器1
Miao_Biao0=0; //清零数据
Miao_Biao1=0;
Miao_Biao2=0;
Miao_Biao3=0;
Miao_Biao4=0;
m=0; //秒表记录清零
while(!K3);
}
}
}
}
void KEY_MiaoBiao_keep() //检测秒表记录显示按键操作
{
if(K1_bit==3) //判断是否为秒表记录显示模式
{
if(K2==0)
{
Delay(10);
if(K2==0)
{
m++;
while(!K2);
}
}
Miao_Biao11=miaobiao[4*m];
Miao_Biao22=miaobiao[4*m+1];
Miao_Biao33=miaobiao[4*m+2];
Miao_Biao44=miaobiao[4*m+3];
if(K3==0)
{
Delay(10);
if(K3==0) //当K3按下时秒表所有数据清零,并停止定时器1
{
uchar i;
for(i=0;i<81;i++)
{
miaobiao[i]=0; //清除所有秒记录数据
}
while(!K3);
}
}
}
}
void Mode_K1() //模式选择键,本程序三种模式,分别是时间显示、秒表、时间设置
{
if(K1==0)
{
Delay(10);
if(K1==0)
{
K1_bit++;
// if(K1_bit==1) m=0;
if(K1_bit==3) m=0;
if(K1_bit==4)
{
K1_bit=0;
}
while(!K1);
/***********************************************************************
*************当K1_bit为0时显示时钟,为1时进入秒表,*********************
*******************为2时进入时间设置模式,3时进入秒表记录显示***********
***********************************************************************/
}
}
}
void Time1() interrupt 3 //定时器1函数
{
TH1=(65536-50000)/256; //重装初值
TL1=(65536-50000)%256;
Miao_Biao0++;
if(Miao_Biao0==2) //以下为秒表数据处理,每两次循环进行一次操作
{
Miao_Biao0=0;
Miao_Biao1++; //Miao_Biao1每加1次为100ms
if(Miao_Biao1==10)
{
Miao_Biao1=0;
Miao_Biao2++;
if(Miao_Biao2==60)
{
Miao_Biao2=0;
Miao_Biao3++;
if(Miao_Biao3==60)
{
Miao_Biao3=0;
Miao_Biao4++;
if(Miao_Biao4==10)
Miao_Biao4=0;
}
}
}
}
}
void Time0() interrupt 1 //定时器0函数
{
TH0=(65536-50000)/256; //重装初值
TL0=(65536-50000)%256;
Time0_bit++;
if((Time0_bit%10)==0) //每溢出10次Time0_bit取反一次
Set_Time=~Set_Time; //0.5秒闪烁一次
if(Time0_bit==20) //以下为时间数据处理
{
Time0_bit=0;
seconds++;
if(seconds==60)
{
seconds=0;
Minutes++;
if(Minutes==60)
{
Minutes=0;
Hours++;
if(Hours==24)
{
Hours=0;
}
}
}
}
}
void Init() //中断初始化函数
{
EA=1; //开总中断
TMOD=0X11; //定时器工作方式选择,定时器0和定时器1都选择第1种工作方式
TH0=(65536-50000)/256; //定时器0装初值,定时50ms
TL0=(65536-50000)%256;
ET0=1; //开定时器0开关
TR0=1; //开定时器0小开关
TH1=(65536-50000)/256; //定时器1装初值,定时50ms
TL1=(65536-50000)%256;
ET1=1; //开定时器1开关
TR1=0; //关定时器1小开关
}
void Display3() //显示保存的秒表
{
P0=Tab0[Miao_Biao11%10]; //显示1/10秒的个位
P1=0xdf; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab1[Miao_Biao22%10]; //显示秒的个位,需要加上小数点做分隔符
P1=0xef; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[Miao_Biao22/10]; //显示秒的十位
P1=0xf7; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab1[Miao_Biao33%10]; //显示分的个位,需要加上小数点做分隔符
P1=0xfb; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[Miao_Biao33/10]; //显示分的十位
P1=0xfd; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab1[Miao_Biao44%10]; //显示时的个位,需要加上小数点做分隔符
P1=0xfe; //段选
Delay(10); //延时
P0=0X00; //消隐
}
void Display2() //时间设置时的显示函数
{
if(Set0==0) //判断是否为设置‘时’还是‘分’
{
P0=Tab0[seconds%10]; //显示秒的个位
P1=0xdf; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[seconds/10]; //显示秒的十位
P1=0xef; //段选
Delay(10); //延时
P0=0X00; //消隐
if(Set_Time) //这个if语句实现分钟以0.5秒的频率闪烁
{
P0=Tab1[Minutes%10]; //显示分的个位,需要加上小数点做分隔符
P1=0xf7; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[Minutes/10]; //显示分的十位
P1=0xfb; //段选
Delay(10); //延时
P0=0X00; //消隐
}
else
{
P0=0x00; //显示分的个位,需要加上小数点做分隔符
P1=0xf7; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=0x00; //显示分的十位
P1=0xfb; //段选
Delay(10); //延时
P0=0X00; //消隐
}
P0=Tab1[Hours%10]; //显示时的个位,需要加上小数点做分隔符
P1=0xfd; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[Hours/10]; //显示时的十位
P1=0xfe; //段选
Delay(10); //延时
P0=0X00; //消隐
}
else //‘时’钟闪烁
{
P0=Tab0[seconds%10]; //显示秒的个位
P1=0xdf; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[seconds/10]; //显示秒的十位
P1=0xef; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab1[Minutes%10]; //显示分的个位,需要加上小数点做分隔符
P1=0xf7; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[Minutes/10]; //显示分的十位
P1=0xfb; //段选
Delay(10); //延时
P0=0X00; //消隐
if(Set_Time) //这个if语句实现‘时’钟以0.5秒的频率闪烁
{
P0=Tab1[Hours%10]; //显示时的个位,需要加上小数点做分隔符
P1=0xfd; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[Hours/10]; //显示时的十位
P1=0xfe; //段选
Delay(10); //延时
P0=0X00; //消隐
}
else
{
P0=0x00; //显示时的个位,需要加上小数点做分隔符
P1=0xFF; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=0X00; //显示时的十位
P1=0xFF; //段选
Delay(10); //延时
P0=0X00; //消隐
}
}
}
void Display1() //显示秒表
{
P0=Tab0[Miao_Biao1%10]; //显示1/10秒的个位
P1=0xdf; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab1[Miao_Biao2%10]; //显示秒的个位,需要加上小数点做分隔符
P1=0xef; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[Miao_Biao2/10]; //显示秒的十位
P1=0xf7; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab1[Miao_Biao3%10]; //显示分的个位,需要加上小数点做分隔符
P1=0xfb; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[Miao_Biao3/10]; //显示分的十位
P1=0xfd; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab1[Miao_Biao4%10]; //显示时的个位,需要加上小数点做分隔符
P1=0xfe; //段选
Delay(10); //延时
P0=0X00; //消隐
}
void Display0() //显示时钟
{
P0=Tab0[seconds%10]; //显示秒的个位
P1=0xdf; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[seconds/10]; //显示秒的十位
P1=0xef; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab1[Minutes%10]; //显示分的个位,需要加上小数点做分隔符
P1=0xf7; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[Minutes/10]; //显示分的十位
P1=0xfb; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab1[Hours%10]; //显示时的个位,需要加上小数点做分隔符
P1=0xfd; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[Hours/10]; //显示时的十位
P1=0xfe; //段选
Delay(10); //延时
P0=0X00; //消隐
}
void Delay(uchar x) //延时
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
C语言单相智能电表课程设计,51单片机电子跑表课程设计报告 含源代码,原理图,word文档...相关推荐
- 微型计算机系统电子时钟程序设计,基于单片机的电子时钟设计 普通单片机电子时钟的设计的分析...
摘要:随着电子科技的飞速发展,尤其是超大规模集成电路的出现,给我国的经济带来了实质性的改变.其中,对于单片机的使用已经在很多领域都有出现,比如说在工业自动化控制房间.在智能仪器仪表方面以及各种家用电器 ...
- C语言单相智能电表课程设计,《单相单用户电能表的设计课程设计》
<<单相单用户电能表的设计课程设计>>由会员分享,可在线阅读,更多相关<<单相单用户电能表的设计课程设计>(10页珍藏版)>请在金锄头文库上搜索. 1. ...
- 基于51单片机电子贺卡全套设计
功能介绍:设计使用51单片机为控制芯片,主要包含点阵字符显示和蜂鸣器音乐播放,在播放音乐的同时,通过一个8*8点阵来滚动显示字符,同时轮流点亮四周的发光二极管.完美仿真出一个电子贺卡的相关功能,程序采 ...
- C语言单相智能电表课程设计,单相单用户电能表的计_课程设计.doc
单相单用户电能表的计_课程设计 摘要 此课程设计主要是通过编程来实现电子式数码管显示单相单用户的用电量,其硬件部分主要以C8051F360单片机为控制核心,连接电能计量.LED显示.掉电存储.按键清零 ...
- c语言 修改密码源码,基于51单片机串口密码修改设计-(源码+电路图)
名称:多功能电子密码锁(使用STM32平台 使用 keiluvision软件,用C语言写代码) 系统由STM32单片机核心板电路.7位按键电路.串口电路.电源电路.液晶1602电路.继电器模块电路和L ...
- 基于51单片机电子密码锁门禁开关设计全套资料
基于51单片机电子密码锁门禁(实物图+原理图+源程序+仿真+毕设论文)全套资料 资料编号:011 本系统采用 51单片机 +24C02芯片+矩阵键盘 +继电器 +开锁指示灯 + LCD1602液晶 + ...
- 51单片机超声波测距带语音播报(源程序+原理图+原理图讲解)
本设计 51单片机超声波测距带语音播报(源程序+原理图+原理图讲解) 原理图:Altium Designer 程序编译器:keil 4 编程语言:C语言 编号S0004 功能说明: 1.本设计采用ST ...
- 秒表系统的设计c语言程序,51单片机秒表计时器课程设计报告(含C语言程序).doc...
51单片机秒表计时器课程设计报告(含C语言程序) XXXXXX学院 51单片机系统设计 课程设计报告 题 目: 秒表系统设计 专业.班级: 学生姓名: 学 号: 指导教师: 分 数 : [摘要]本设计 ...
- 单片机四路抢答器课程C语言设计,基于51单片机四路抢答器设计
内容简介: 毕业设计 基于51单片机四路抢答器设计 共25页,9905字 随着经济水平的不断提高,人们在物质文明得到满足的同时更注重精神文明的追求,各种娱乐节目不断涌现,提高节目的质量尤为重要..本次 ...
最新文章
- 《当下的哲学》[法]阿兰.巴迪欧(作者)epub+mobi+azw3格式下载
- 计算机网络(谢希仁第八版)第一章:概述
- 计算机丢失d3dcompiler,win7系统提示缺少D3DCompiler_47.dll文件怎么办
- 【图像超分辨率】Image Super-Resolution by Neural Texture Transfer
- 文件目录管理与显示c语言,Centos 7 文件和目录管理
- Attention Model
- Windows环境下使用Linux命令
- Linux下安装Go环境
- 深入理解PHP内核(十二)函数-函数的定义、传参及返回值
- 如何将网易云音乐/QQ音乐转移到Apple Music
- CAN总线物理值与原始值
- taptap解析安装包出错_光遇解析软件包出现问题怎么解决 安装失败原因解答
- 每日 30 秒 ⏱ 强风吹拂
- uniApp实现热更新
- 图片怎么转换成PDF格式?这两种方法都可以实现转换
- 机器学习编译MLC 笔记 1-5章(上)
- 迅为i.MX6ULL终结者Linux中断实验运行测试
- 【题解】poj1738石子合并 区间DP 加西亚瓦克斯算法
- UG NX 12 布尔求和
- 百度云 x 中国联通 | 立标杆,中国联通新客服上线大幕拉开!