C51单片机秒表计时(C语言)
- 格式:docx
- 大小:83.26 KB
- 文档页数:4
学号:1108421065课程设计报告基于AT89C51单片机的秒表设计院系电子信息工程学院专业电子信息工程班级 1姓名张远远摘要本设计是设计一个单片机控制的多功能秒表系统。
近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动着传统控制检测日新月异的更新。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面的知识是不够的,还要根据具体的硬件结构,以及针对具体的应用对象的软件结合,加以完善。
秒表的出现,解决了传统的由于人为因素造成的误差和不公平性。
本设计的秒表系统采用AT89C51单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、电源电路、LED数码管以及按键电路来设计计时器。
将软、硬件有机地结合起来,使得系统能够正确地进行计数,并且结合相应的显示驱动程序,使数码管能够正确地显示时间,暂停和中断。
可谓功能强大。
其中软件系统采用c语言编写程序,包括显示程序,计数程序,中断,延时程序,按键消抖程序等,硬件系统利用PROTEUS强大的功能来实现,简单且易于观察,在仿真中就可以观察到实际的工作状态。
关键字:单片机秒表目录摘要 (I)目录 (II)引言 (III)1.课程设计目的 (1)2.课程设计题目描述和要求 (1)3.课程设计报告内容 (1)3.1设计思路(方案) (1)3.2系统总体方案及硬件设计(方案论证、设计、调试) (1)3.2.1系统总体方案 (1)3.2.2硬件电路设计 (2)3.3 软件设计 (5)3.3.1软件设计概述 (5)3.3.2程序流程图 (5)3.3.3子程序模块设计 (6)4.Protues软件仿真 (7)5.秒表c语言程序 (9)6.焊接实物图 (11)7.总结(设计后的体会和建议) (11)8.参考文献: (12)引言中国使用单片机的历史只有短短的30年,在初始的短短五年时间里发展极为迅速。
纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机。
南开大学滨海学院C51嵌入式软件设计(C语言)题目:计时秒表●功能描述:本设计实现在99秒内的秒表计时,一个按键实现开始、暂停、复位。
●原理概述:P1接四位七段数码管,P3。
2接一按键产生外部中断0,P3。
4-P3。
7控制扫描显示。
计时使用定时器0产生10ms中断累计。
按键不同次序决定了对应的控制功能,因为第一次按键必定为开始计时,所以第二次按键判断为暂停,依次第三次为置零.主程序调用显示程序,显示程序实时显示计时时间.●效果显示●图一(电路总图)●图二(效果显示)注:第四位显示为单位:S●程序清单#include<reg51。
h>#include〈stdio.h>unsigned char Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };sbit P37=P3^7;sbit P36=P3^6;sbit P35=P3^5;sbit P34=P3^4;unsigned int a=0,cout=0,mm=0;x,y,p,q;/*********延时*********************/void delay(){int g;for(g=70;g>0;g—-);}/*********显示程序*****************/void display(){x=cout/10;//秒十位P34=0;P1=Tab[x];delay();P34=1;y=cout—x*10; //秒各位P35=0;P1=Tab[y]; delay();P1=0x80;delay();P35=1;p=mm/10; //ms的高位P36=0;P1=Tab[p];delay();P36=1;P37=0; //显示单位:SP1=Tab[5]; delay();P37=1;}/*********主程序********************/ void main(){IT0=1;EX0=1;ET0=1;TMOD=0x01;TH0=0xD8;//装初值,10msTL0=0xF0;EA=1;while(1){display(); };}/*********外部按键中断子程序*********/ void int0 ()interrupt 0{if(a==0)//开始计时{ TR0=1;mm=0;a++;}else if(a==1)//暂停计时{TR0=0;a++;}else//置零{ a=0;mm=0;cout=0;}}/*********定时器子程序****************/ void time0()interrupt 1{TH0=0xD8;TL0=0xF0;mm++;if(mm==80)//考虑其它损耗,调整后约为1S {cout++;mm=0;}}。
c51数字秒表课程设计一、课程目标知识目标:1. 学生能理解C51单片机的基本原理,掌握数字秒表的硬件设计及编程方法。
2. 学生能够运用C语言编写程序,实现秒表的启动、停止、计时的功能。
3. 学生了解数字秒表在实际应用中的重要性,如时间测量、实验数据记录等。
技能目标:1. 学生能够运用所学的C51知识,设计并实现一个具有基本功能的数字秒表。
2. 学生通过实际操作,提高动手实践能力,培养解决实际问题的能力。
3. 学生能够运用所学知识,对数字秒表进行调试和优化,提高程序运行效率。
情感态度价值观目标:1. 学生培养对单片机编程的兴趣,提高学习主动性和积极性。
2. 学生通过合作完成任务,培养团队协作能力和沟通能力。
3. 学生在解决问题的过程中,培养坚持不懈、勇于探索的精神。
本课程针对高年级学生,结合C51单片机课程内容,注重理论与实践相结合。
课程设计旨在帮助学生巩固所学知识,提高动手实践能力,培养解决实际问题的能力。
通过数字秒表的设计与实现,让学生充分体会单片机编程的乐趣,激发学生的学习兴趣,为后续课程学习打下坚实基础。
同时,课程强调团队协作和情感态度的培养,使学生在学习过程中形成积极向上的人生态度。
本章节教学内容主要包括以下几部分:1. C51单片机原理回顾:复习C51单片机的硬件结构、工作原理及编程基础,重点掌握I/O口编程、定时器/计数器等知识点。
2. 数字秒表的硬件设计:介绍数字秒表的硬件组成,包括单片机、时钟电路、显示电路等,分析各部分功能及相互关系。
3. 数字秒表的编程实现:学习如何使用C语言编写程序,实现数字秒表的功能。
内容包括:- 定时器/计数器的配置与使用;- 按键扫描程序编写;- 数码管显示程序编写;- 秒表功能模块设计(启动、停止、计时)。
4. 教学案例分析与实践:结合教材案例,分析数字秒表的设计过程,引导学生动手实践,完成一个具有基本功能的数字秒表设计。
5. 调试与优化:介绍程序调试方法,指导学生运用调试工具,对数字秒表程序进行调试和优化,提高程序运行效率。
倒计时60秒程序(单片机C51)#include#define uint unsigned int#define uchar unsigned charuchar code table[]={0xc0,0xf9,0xa4, 0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};sbit gew=P2^1;sbit shiw=P2^0;sbit k2=P1^0;uchar num,num1=60,num2,shi,ge;void Init(){TMOD=0X01; TH0=(65536-50000)%256; TL0=(65536-50000)%256;EA=1;ET0=1; TR0=1;}void delay(uint xms) //延时子函数{uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void scankey() //键盘检测子函数{if(k2==0) //检测键是否被按下{delay(5); //延时消除抖动if(k2==0) //重新读取k2的值{num2++; //num2为按次数标志位while(!k2); //等待按键释放if(num2==1) //按键一次计时停止TR0=0;if(num2==2) //按键两次计时开始{TR0=1;}}}}void main() //主函数{Init(); //初始化子函数调用while(1){scankey(); //不断键盘扫描gew=0; //打开数码管个位位选P0=table[ge]; //数码管个位赋值delay(1); //延时送入数据的反应时间gew=1; //关闭数码管个位位选delay(1);shiw=0; //打开数码管十位位选P0=table[shi]; //送入数据delay(1);shiw=1; //关闭数码管十位位选delay(1);}}void Timer0() interrupt 1{TH0=(65536-50000)/256; //定时器重装初值TL0=(65536-50000)%256;num++;if(num==20) //定时器每进行一个周期num加1,运行20个周期即为1s{num=0; //到1秒,num清0重新开始num1--; //倒计时1秒if(num1==0)num1=60;shi=num1%10; //两位数分离赋给数码管十位显示ge=num1%10; //两位数分离赋给数码管个位显示}}。
单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。
该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。
具有时间显示、整点报时、校正等功能。
走时准确、显示直观、运行稳定等优点。
具有极高的推广应用价值。
关键词:电子钟 AT89C52 硬件设计软件设计目录NO TABLE OF CONTENTS ENTRIES FOUND.一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。
具有时间显示,并有时间设定,时间调整功能。
1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。
该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。
1.3 设计课的设计总体方案介绍及工作原理说明本电子钟主要由单片机、键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1所示:图1-1总体设计方案图本电子钟的所有的软件、参数均存放在AT89C52的Flash ROM和内部RAM 中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。
键盘采用动态扫描方式。
利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。
一、课设思路(1)利用单片机定时器中断和定时器计数方式实现秒定时。
(2)通过LED显示程序的调整,熟悉单片机与LED的接口技术,熟悉LED动态显示的控制过程。
(3)通过阅读和调试简易秒表整体程序,学会如何编制含LED动态显示和定时器中断等多种功能的综合程序,初步体会大型程序的编制和调试技巧。
(4)进一步学习单片机开发系统的整个流程。
二、所需元件名称数量7段数码管 2电阻10kΩ 1电阻1kΩ 8键盘开关 1电容10 µf 1电容30 pf 2晶振12 MHz 189C51 1万能板 1导线若干三、元件介绍AT89C51AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL 的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
主要特性:与MCS-51 兼容·4K字节可编程FLASH存储器·寿命:1000写/擦循环·数据保留时间:10年·全静态工作:0Hz-24MHz·三级程序存储器锁定·128×8位内部RAM·32可编程I/O线·两个16位定时器/计数器·5个中断源·可编程串行通道·低功耗的闲置和掉电模式·片内振荡器和时钟电路特性概述:AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
C51单片机简易秒表和按键控制秒表的程序(一)简易秒表#include<reg51.h>#include<intrins.h>code unsigned char LED_TBL[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; unsigned char LED_BUF[2] = {0,0}; //字位码有两个,分别对应两个接口的选择unsigned char second = 0,counter=0;void refresh();void delay();void ledBufModify();void main(){TMOD = 0x10;TH1 = 0x3C; //计数初值为15536 ,即3CB0HTL1 = 0xB0;IT0=1;EA=1;//总中断控制打开EX0=1;ET1=1;//定时器/计时器中断打开TR1=1;//T1中断允许打开while(1){ledBufModify();refresh();}}void timer1() interrupt 3 //n 1/3 ,Timer0/Timer1 {counter++;TH1=0x3c;TL1=0xb0;}void refresh() //数码管动态刷新子程序{unsigned char select,i;select=0xFE;for(i = 0 ; i< 2 ; i ++){P1=select;//字位口输出选择码;P2=LED_TBL[LED_BUF[i]];//字型口输出字型码;delay();select=_crol_(select,1);//选择码循环左移;}}void delay() //延时子程序{unsigned char i,j;for(i=0;i<0x10;i++)for(j=0;j<0x10;j++);}void ledBufModify() //修改显示缓冲区,秒变化时调用{if(counter==20) //产生1秒的时间标志{second++;if(second==60){second=0;} //ledBufModify();counter=0;}LED_BUF[0]=second/10; //second 的个位数字拆出来,ledBuf[0];LED_BUF[1]=second%10; //second 的十位数字拆出来,ledBuf[1];//flag=0;//1秒钟标志清除;}硬件电路:(二)按键控制秒表:#include<reg51.h>#include<intrins.h>code unsigned char LED_TBL[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};unsigned char LED_BUF[2] = {0,0}; //字位码有两个,分别对应两个接口的选择unsigned char second = 0,counter=0;void refresh();void delay();void ledBufModify();void main(){TMOD = 0x10;TH1 = 0x3C; //计数初值为15536 ,即3CB0HTL1 = 0xB0;IT0=1;EA=1;//总中断控制打开EX0=1;ET1=1;//定时器/计时器中断打开TR1=1;//T1中断允许打开while(1){ledBufModify();refresh();}}void timer1() interrupt 3 //n 1/3 ,Timer0/Timer1{counter++;TH1=0x3c;TL1=0xb0;}void refresh() //数码管动态刷新子程序{unsigned char select,i;select=0xFE;for(i = 0 ; i< 2 ; i ++){P1=select;//字位口输出选择码;P2=LED_TBL[LED_BUF[i]];//字型口输出字型码;delay();select=_crol_(select,1);//选择码循环左移;}}void delay() //延时子程序{unsigned char i,j;for(i=0;i<0x10;i++)for(j=0;j<0x10;j++);}void ledBufModify() //修改显示缓冲区,秒变化时调用{ //counter++;if(counter==20) //产生1秒的时间标志{second++;if(second==60){second=0;}counter=0;}LED_BUF[0]=second/10; //second 的个位数字拆出来,ledBuf[0];LED_BUF[1]=second%10; //second 的十位数字拆出来,ledBuf[1];//flag=0;//1秒钟标志清除;}void intr0 () interrupt 0 //0/2,INT0/INT1{//本质秒表取决于定时器工作状态,控制定时器是否工作//TRxTR1 = !TR1;}硬件电路图:。
基于C51单片机控制的数码管秒表/*****************************************************************************/说明:下面是通过c语言编写的程序,数码管为共阴数码管使用的芯片有74h138译码器器74HCT573PW芯片。
显示效果为:00-00-00分别是分--秒--百分之一秒可用一个键控制:按一下开始计时,再按暂停,再按清零。
本代码经测试可以使用/*****************************************************************************/ #include <reg51.h>#define ENABLE 0#define DISABLE 1#define DATA P0unsigned n=0;unsigned char a,b,count=0, i, j = 0,x,u[8];sbit hc138s_enable = P1^3;sbit hc138s_a = P1^0;sbit hc138s_b = P1^1;sbit hc138s_c = P1^2;sbit k1=P3^4;unsigned char code table[]=//共阴极0~f数码管编码{0x3f,0x06,0x5b,0x4f, //0~30x66,0x6d,0x7d,0x07, //4~70x7f,0x6f//8~9};voiddelay_ms(unsigned intnms);void chose7s(unsigned char num);void chose7ss(unsigned char numm);void timer0_init(void){TMOD = 0X01;TH0 = (65536-10000)/256;TL0 = (65536-10000)%256;ET0 = 1;EA = 1;TR0 = 1;}/*********************************************************************//* 用作数码管最初显示状态*//*********************************************************************/ void s1(){for(j=0;j<8;j++){if(j==2||j==5){chose7s(j);//使能某位数码管DATA=0x40;delay_ms(2);}else{chose7s(j);DATA=0x3f;delay_ms(2);}}}void s2(){// timer0_init();for(i=0;i<10;i++)//扫描{for(j=0;j<8;j++){if(j==2||j==5){chose7s(j);DATA=0x40;delay_ms(2);}else{chose7s(j);x=u[j];DATA=table[x];delay_ms(2);}}}}/**************************开关*************************************/void key1(){if (k1==0){delay_ms(20);if(k1==0){n++;if(n==3){n=0;count=0;b=0;a=0;}while(!k1);}}}/****************************************************************************** ** 函数名: main** 函数功能: 主函数** 输入: 无** 输出: 无******************************************************************************** /void main(void){while(1){key1();switch(n){case 0:s1();break;case 1:timer0_init();s2();break;case 2:TR0=0;s2();break;}}}/****************************************************************************** ** 函数名: chose7s** 函数功能: 使能某个数码管** 输入: 数码管编号** 输出: 无******************************************************************************** /void chose7s(unsigned char num){hc138s_enable = ENABLE;switch(num){case 0://第1个数码管hc138s_a = 0;hc138s_b = 0;hc138s_c = 0;//P0=0x3f;break;case 1://第2个数码管hc138s_a = 1;hc138s_b = 0;hc138s_c = 0;//P0=0x3f;break;case 2://第3个数码管hc138s_a = 0;hc138s_b = 1;hc138s_c = 0;//P0=0x40;break;case 3://第4个数码管hc138s_a = 1;hc138s_b = 1;hc138s_c = 0;//P0=0x3f;break;case 4://第5个数码管hc138s_a = 0;hc138s_b = 0;hc138s_c = 1;//P0=0x3f;break;case 5://第6个数码管hc138s_a = 1;hc138s_b = 0;hc138s_c = 1;//P0=0x40;break;case 6://第7个数码管hc138s_a = 0;hc138s_b = 1;hc138s_c = 1;//P0=0x3f;break;case 7://第8个数码管hc138s_a = 1;hc138s_b = 1;hc138s_c = 1;//P0=0x3f;break;default:hc138s_enable = DISABLE;break;}hc138s_enable = DISABLE;}/****************************************************************************** ** 函数名: delay_ms* 函数功能: 延时* 输入: n* 输出: 无******************************************************************************* /voiddelay_ms(unsigned intnms){unsignedinti, j;for(i = nms; i > 0; i--)for(j = 55; j > 0; j--);}/*****************************************************************************/ /*1/100秒计时*//*****************************************************************************/ void T0_time() interrupt 1{TH0 = (65536-10000)/256;TL0 = (65536-10000)%256;count++;if(count==100){count=0;a++;if(a==60){a=0;b++;if(b==60){b=0;a=0;count=0;}}}u[7]=count%10;u[6]=count/10;u[4]=a%10;u[3]=a/10;u[1]=b%10;u[0]=b/10;}/*如果显示亮度不够可以改一下延时*///后面我会发设计报告。