秒表设计程序

#include //52系列单片机头文件

#define uchar unsigned char //宏定义

#define uint unsigned int

sbit key1=P1^0; //申明四个按键

sbit key2=P1^1;

sbit key3=P1^2;

//sbit key4=P1^3;

sbit feng=P3^1;

//bit aa=1;

uchar code table[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//含有0~9的数字数组

void delayms(uint); //声明延时函数

void display(uchar,uchar,uchar); //声明显示函数

void keyscan(); //声明按键函数

uchar num1,num2,maoshi,maoge,bai,shi,ge; //变量声明

uint num;

void display(uchar bai, uchar shi,uchar ge) //数码管显示子函数

{

bai=num/100; //百位

shi=(num-100*bai)/10; //十位

ge=num-100*bai-shi*10;

P0=table[bai];

P2=0x01;

delayms(5);

P0=table[shi];

P2=0x02; //送位选数据

delayms(5); //延时

P0=0xbf;

P2=0x04; //送位选数据

delayms(5);

P0=0xbf;

P2=0x08; //送位选数据

delayms(5);

P0=table[ge];

P2=0x10;

delayms(5);

}

void main() //主函数入口

TMOD=0x11; //设置TO,T1定时器

TH0=(65536-50000)/256; //装初值12M 晶振定时50ms 数为50000

TL0=(65536-50000)%256;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

EA=1; //开总中断

ET0=1; //开启定时器T0中断

ET1=1; //开启定时器T1中断

while(1) //程序停在这里等待中断的发生,这个大循环也是实现数据显示的主体循环

{

while(!feng)

{

delayms(10);

feng=1;

}

keyscan();

display();

}

}

void delayms(uint xms) //延时子函数

{

uint i,j;

for(i=xms;i>0;i--) //i=xms即延时约xms 毫秒

for(j=110;j>0;j--);

}

void keyscan() //按键子函数

{

if(key1==0) //清零

{

delayms(10); //延时去抖

if(key1==0)

{

while(!key1) //等待按下

{

TR0=0; //定时器TR0关闭

TR1=1; //定时器TR1打开

num=0; //送数据num=0

TR1=0; //定时器TR1关闭

}

}

}

if(key2==0) //暂停和开始

{

delayms(10);

if(key2==0)

{

while(!key2);

TR0=0;

TR1=~TR1; //每次按下,TR1的状态时相反的

}

}

if(key3==0) //使计数器显示为60.0

{

delayms(10);

if(key3==0)

{

while(!key3);

TR0=0;

TR1=1;

num=600;

TR1=0;

}

}

}

void T0_time()interrupt 1 //定时器T0,中断序号为1

{

TH0=(65536-50000)/256; //重装初值

TL0=(65536-50000)%256;

num2++;

if(num2==2) //如果到了2次,说明0.1秒的时间到

{

num2=0; //然后把num2清零重新再计2次

num1++;

if(num1==10)

num1=0;

if(num==0) //当num 自减为0时,重新为60.0,再开始倒计时 num=600;

num--; //num逐渐自减

}

}

void T1_time()interrupt 3 //定时器T1, 中断序号为3

{

TH1=(65536-50000)/256; //重装初值

TL1=(65536-50000)%256;

num2++;

if(num2==2) //如果到了2次,说明0.1秒的时间到 {

num2=0;

num1++;

if(num1==10)

num1=0;

num++;

if(num==600)

{

feng=1;

delayms(1000);

feng=0;

num=0;

}

}

}

//然后把num2清零重新再计2次 //num逐渐自加 //这个数用来送给数码管显示的,到了60.0后归零

#include //52系列单片机头文件

#define uchar unsigned char //宏定义

#define uint unsigned int

sbit key1=P1^0; //申明四个按键

sbit key2=P1^1;

sbit key3=P1^2;

//sbit key4=P1^3;

sbit feng=P3^1;

//bit aa=1;

uchar code table[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//含有0~9的数字数组

void delayms(uint); //声明延时函数

void display(uchar,uchar,uchar); //声明显示函数

void keyscan(); //声明按键函数

uchar num1,num2,maoshi,maoge,bai,shi,ge; //变量声明

uint num;

void display(uchar bai, uchar shi,uchar ge) //数码管显示子函数

{

bai=num/100; //百位

shi=(num-100*bai)/10; //十位

ge=num-100*bai-shi*10;

P0=table[bai];

P2=0x01;

delayms(5);

P0=table[shi];

P2=0x02; //送位选数据

delayms(5); //延时

P0=0xbf;

P2=0x04; //送位选数据

delayms(5);

P0=0xbf;

P2=0x08; //送位选数据

delayms(5);

P0=table[ge];

P2=0x10;

delayms(5);

}

void main() //主函数入口

TMOD=0x11; //设置TO,T1定时器

TH0=(65536-50000)/256; //装初值12M 晶振定时50ms 数为50000

TL0=(65536-50000)%256;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

EA=1; //开总中断

ET0=1; //开启定时器T0中断

ET1=1; //开启定时器T1中断

while(1) //程序停在这里等待中断的发生,这个大循环也是实现数据显示的主体循环

{

while(!feng)

{

delayms(10);

feng=1;

}

keyscan();

display();

}

}

void delayms(uint xms) //延时子函数

{

uint i,j;

for(i=xms;i>0;i--) //i=xms即延时约xms 毫秒

for(j=110;j>0;j--);

}

void keyscan() //按键子函数

{

if(key1==0) //清零

{

delayms(10); //延时去抖

if(key1==0)

{

while(!key1) //等待按下

{

TR0=0; //定时器TR0关闭

TR1=1; //定时器TR1打开

num=0; //送数据num=0

TR1=0; //定时器TR1关闭

}

}

}

if(key2==0) //暂停和开始

{

delayms(10);

if(key2==0)

{

while(!key2);

TR0=0;

TR1=~TR1; //每次按下,TR1的状态时相反的

}

}

if(key3==0) //使计数器显示为60.0

{

delayms(10);

if(key3==0)

{

while(!key3);

TR0=0;

TR1=1;

num=600;

TR1=0;

}

}

}

void T0_time()interrupt 1 //定时器T0,中断序号为1

{

TH0=(65536-50000)/256; //重装初值

TL0=(65536-50000)%256;

num2++;

if(num2==2) //如果到了2次,说明0.1秒的时间到

{

num2=0; //然后把num2清零重新再计2次

num1++;

if(num1==10)

num1=0;

if(num==0) //当num 自减为0时,重新为60.0,再开始倒计时 num=600;

num--; //num逐渐自减

}

}

void T1_time()interrupt 3 //定时器T1, 中断序号为3

{

TH1=(65536-50000)/256; //重装初值

TL1=(65536-50000)%256;

num2++;

if(num2==2) //如果到了2次,说明0.1秒的时间到 {

num2=0;

num1++;

if(num1==10)

num1=0;

num++;

if(num==600)

{

feng=1;

delayms(1000);

feng=0;

num=0;

}

}

}

//然后把num2清零重新再计2次 //num逐渐自加 //这个数用来送给数码管显示的,到了60.0后归零


相关文章

  • 单片机原理及接口技术电子秒表课程设计
  • <单片机原理及接口技术>课程设计 --单片机秒表的设计 学 院: 机电工程学院 专业班级: 10 级电气工程二班 姓 学 名: 姚杜村 号: 1002120208 杨坤漓 指导教师: 宋东亚 时 间:2012 年 11 月 20 ...查看


  • 秒表说明书
  • Xxxxxxxxxxxxxxx大学 课 程 设 计 题 目 学 院 专 业 班 级 姓 名 指导教师 单片机秒表 机电工程学院 XXXXXXXXX XXXXXXX XXX XXXXXX 2009 年 1 月 16 日 课程设计任务书 学生姓 ...查看


  • 基于CPLD的秒表设计
  • 课程设计说明书(本科) 题 目: 基于CPLD/FPDA数字秒表设计 姓 名: 赵 超 尚晓亮 王 浩 专 业: 电子信息工程 班 级: 08级2班 2011年 6 月 21 日 目录 摘要„„„„„„„„„„„„„„„„„„„„„„„„„ ...查看


  • 数字秒表课程设计
  • 摘 要 当前电子系统的设计正朝着速度快,容量大,体积小,质量轻,用电省的方向发展.推动该潮流迅速发展的决定性因素就是使用了现代化的EDA [1]设计工具.本论文先确定了系统的逻辑功能,建立算法流程,选择电路结构,然后确定并设计电路所需的数据 ...查看


  • 综合课程设计 1
  • 综合课程设计 --数字时钟_秒表的设计 姓名: 学号: 班级: 学院:自动化 联系方式: 数字时钟_秒表设计 1.1 项目要求 设计基于AT89C51单片机的数字可调时钟,晶振采用12HZ ,要求如下: (1) 设计采用显示. (2) 可以 ...查看


  • 51单片机秒表实验报告
  • 江西理工大学应用科学学院信息工程系 单片机原理与应用课程设计报告 设计题目:专班学 业:级:号: 基于51单片机的秒表设计 王苏敏参与人员:指导老师:完成日期: 指导老师评语: 得分:指导教师签名: 目录 1设计任务和性能指标....... ...查看


  • 电子科技大学电子技术综合实验秒表实验报告
  • 现代电子技术综合实验 电子秒表设计 学生姓名:学 号:指导老师:学 院:提交时间: 摘要 本文介绍了使用VHDL开发FPGA的一般流程,重点介绍了电子秒表的设计.该设计以VHDL作为硬件开发语言,以ISE作为软件开发平台,准确地实现了秒表计 ...查看


  • 多功能电子秒表
  • <单片机原理及应用> 课程设计 <多功能电子秒表> 学生姓名 郭君君 学 号 所属学院 信息工程学院 专 业 计算机科学与技术 班 级 16-4班 指导教师 孟洪兵 前 言 中国使用单片机的历史只有短短的30年,在初 ...查看


  • 实验报告-数字秒表
  • 学院:物理与信息工程学院 专业:电子信息工程 姓名:肖伟 学号:[1**********]6 指导老师:漆为民 一.设计题目: 数字秒表的设计 二.设计目的: 1.了解数字秒表的工作原理. 2.进一步熟悉用VHDL语言编写驱动七段码管显示的 ...查看


  • 电气工程与自动化毕业论文论文
  • 黑龙江信息技术职业学院 毕业设计(论文)说明书 系 部 专 业 年 级姓 名 指导教师 年 月 日 一.原始依据(包括设计或论文的工作基础.研究条件.应用环境.工作目的等) 二.参考文献 [1] 李叶紫.王喜斌.胡辉.孙东辉.编著MCS_5 ...查看


热门内容