stc89c51单片机使用C语言编程实现使用计数器显示0~59秒的程序代码

时间: 2023-09-10 10:05:35 浏览: 97
### 回答1: 以下是使用STC89C51单片机和C语言编写的计数器显示0~59秒程序代码: ```c #include <reg52.h> // 引入reg52.h头文件 sbit LED = P1^0; // 定义P1.0口为LED输出口 void delay(unsigned int ms) // 延时函数 { unsigned int i, j; for(i=0;i<ms;i++) for(j=0;j<1141;j++); } void main() { unsigned char sec = 0; // 秒计数器 TMOD = 0x01; // 定时器0工作在模式1(16位自动重载)下 TH0 = (65536-50000)/256; // 计时50ms TL0 = (65536-50000)%256; TR0 = 1; // 启动定时器0 while(1) { if(TF0 == 1) // 定时器0溢出中断 { TF0 = 0; // 清除溢出标志 TH0 = (65536-50000)/256; // 重新计时50ms TL0 = (65536-50000)%256; sec++; // 秒计数器加1 if(sec >= 60) // 秒计数器达到60时清零 sec = 0; LED = sec%2; // LED每隔1秒闪烁一次 } delay(10); // 延时10ms } } ``` 程序的主要思路是通过定时器0每隔50ms中断一次,然后在中断服务函数中让秒计数器加1,并在秒计数器达到60时清零。同时,LED每隔1秒闪烁一次,以达到计数器显示的效果。程序中使用了延时函数,但这种方法并不是很精确,实际应用中建议使用定时器或其他更为精确的方法来实现延时。 ### 回答2: #include <reg51.h> #include <intrins.h> // 数码管显示数据表 // 共阳数码管,段选是位选,即拉高某一位即可显示对应的数码管上 unsigned char code LEDCODE[] = { 0xc0, // "0" 0xf9, // "1" 0xa4, // "2" 0xb0, // "3" 0x99, // "4" 0x92, // "5" 0x82, // "6" 0xf8, // "7" 0x80, // "8" 0x90 // "9" }; unsigned char second = 0; // 计数秒数 void delay(unsigned int t) { while (t--) { _nop_(); _nop_(); _nop_(); _nop_(); } } void timer0Init() { // 定时器0初始化函数 TMOD &= 0xf0; // 清除定时器0设置 TMOD |= 0x01; // 定时器0工作在模式1 TH0 = 0xfc; // 初始值设置为0x10000-0xfc16 = 0xff04 TL0 = 0x04; TR0 = 1; // 启动定时器0 ET0 = 1; // 打开定时器0中断 EA = 1; // 打开总中断 } void timer0Interrupt() interrupt 1 { // 定时器0中断服务函数 TH0 = 0xfc; // 更新计数器初始值 TL0 = 0x04; second++; // 计数秒数自增 if (second > 59) { // 如果计数超过59秒,重置为0 second = 0; } } void main() { unsigned char s; // 当前秒数 timer0Init(); // 定时器0初始化 while (1) { P0 = LEDCODE[second / 10]; P2 = 0x01; // 选择第1位数码管 delay(5); P2 = 0x00; // 关闭所有数码管 P0 = LEDCODE[second % 10]; P2 = 0x02; // 选择第2位数码管 delay(5); P2 = 0x00; //...依次类推,实现第3和第4位数码管的显示 if (second == 59) { // 当计数到59秒时,break退出循环 break; } } while (1) ; // 如果不希望程序退出,可以在这里添加一个无限循环 } ### 回答3: #include<reg51.h> //包含头文件reg51.h,该头文件定义了51单片机的特殊功能寄存器 #define uchar unsigned char //定义uchar为无符号字符型 #define uint unsigned int //定义uint为无符号整型 uchar code displaySeg[]={ //显示段码值,对应数码管的显示方式 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, //对应0~5 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83 //对应6~A }; uchar code displayDig[]={ //位选码值,对应数码管的位选 0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb //分别对应1~6位 }; void delay(uint xms){ //延时函数 uint i, j; for(i=xms; i>0; i--){ for(j=110; j>0; j--); } } void main(){ uchar minute, second, tenth; minute = 0; //初始化分钟 second = 0; //初始化秒钟 tenth = 0; //初始化十分之一秒 while(1){ P0=0x00; //设置P0口为低电平 P2=displaySeg[minute/10]; //P2口输出第一位显示段码 P0=displayDig[5]; //P0将位选码输入第一位 delay(1); //短暂延时 P0=0x00; //关闭当前段码和位选码 P2=displaySeg[minute%10]; //输出第二位显示段码 P0=displayDig[4]; //输入第二位位选码 delay(1); P0=0x00; P2=displaySeg[second/10]; //输出第三位显示段码 P0=displayDig[3]; //输入第三位位选码 delay(1); P0=0x00; P2=displaySeg[second%10]; //输出第四位显示段码 P0=displayDig[2]; //输入第四位位选码 delay(1); P0=0x00; P2=displaySeg[tenth%10]; //输出第五位显示段码,显示当前毫秒的个位数 P0=displayDig[1]; //输入第五位位选码 delay(1); P0=0x00; tenth++; //每次循环,播放下一个毫秒值 if(tenth == 100){ //如果毫秒达到100,则变为0,秒钟加1 tenth = 0; second++; if(second == 60){ //如果秒钟达到60,则变为0,分钟加1 second = 0; minute++; if(minute == 60){ //如果分钟达到60,则变为0,重新从0开始 minute = 0; } } } } } 这段代码使用STC89C51单片机来显示0~59秒,通过P0口和P2口,将数码管的位选码和段码发送到数码管上。使用一个死循环来控制时间的改变和段码的输出,通过判断毫秒、秒、分钟的值来刷新数码管上的显示内容。使用delay函数来控制刷新的速度,达到显示计数器从0~59的效果。

相关推荐

最新推荐

recommend-type

基于STC89C51单片机的出租车计费器设计

本文以单片机STC89C51 为核心设计一款出租车计费器, 使能够实现里程及对应价格的显示,由于采用芯片的自动定时计数,所以能够准确的计算出总的行车里程并能转换成对应的价格来,这样能够避免出租车司机作弊的可能性...
recommend-type

如何用AltiumDesigner绘制STC89C51单片机原理图

在学习AltiumDesigner或者51单片机的过程中,当我们要绘制一个...所以,在这里呢,小编将结合自己的经历向大家介绍如何用AltiumDesigner软件来绘制自己的原理图库,并绘制STC89C51单片机的原理图,希望能对大家有所帮助
recommend-type

单片机C语言程序设计:用计数器中断实现100以内的按键计数

名称:用计数器中断实现 100 以内的按键计数 说明:本例用 T0 计数器中断实现按键技术,由于计数寄存器初值为 1,因此 P3.4 引脚的每次负跳变都会触发 T0 中断,实现计数值累加。计数器的清零用外部中断 0 控制。
recommend-type

STC89C51单片机EEPROM读写例程

今天无意间看到STC系列芯片手册上关于片上EEPROM的介绍,狂喜。原来STC单片机本身就有EEPROM的,可惜发现晚了点,不然很多同学的...下午花了点时间看了资料,然后写了个例子程序,本程序在STC89C52RC上测试,运行成功。
recommend-type

51单片机C语言中断程序(定时计数器)

利用定时/计数器T0从P1.0输出周期为1s 的方波,让发光二极管以1HZ闪烁...利用定时/计数器T1产生定时时钟,由P1口控制8个发光二极管,使8个指示灯依次一个一个闪动,闪动频率为10次/秒(8个灯依次亮一遍为一个周期),循环。
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

numpy数组索引与切片技巧

![numpy数组索引与切片技巧](https://img-blog.csdnimg.cn/f610d87ed50745d2b7052af887da2d0d.png) # 2.1 整数索引 整数索引是 NumPy 数组中索引元素的最简单方法。它允许您使用整数来访问数组中的特定元素或子数组。 ### 2.1.1 单个元素索引 单个元素索引使用一个整数来访问数组中的单个元素。语法为: ```python array[index] ``` 其中: * `array` 是要索引的 NumPy 数组。 * `index` 是要访问的元素的索引。 例如: ```python import
recommend-type

javaboolean类型怎么使用

Java中的boolean类型表示真或假,只有两个可能的值。在Java中,boolean类型的变量可以被初始化为false或true。可以使用以下语法来声明和初始化一个boolean类型的变量: ``` boolean myBoolean = true; ``` 在Java中,boolean类型的变量通常用于控制流程和条件测试,例如: ``` if (myBoolean) { // do something if myBoolean is true } else { // do something if myBoolean is false } ``` 除了if语句之外
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。