按下按键1复位,按下按键2开始 ,51单片机8位数码管计时器 ,程序简便一些
4条回答 默认 最新
- 瞬间动力 2023-05-28 23:24关注
花了一个小时写的,希望对你有用!
#include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit D1 = P2^0; // 数码管引脚定义 sbit D2 = P2^1; sbit D3 = P2^2; sbit D4 = P2^3; sbit D5 = P2^4; sbit D6 = P2^5; sbit D7 = P2^6; sbit D8 = P2^7; sbit Key1 = P1^0; // 按键引脚定义 sbit Key2 = P1^1; uint ms; // 毫秒计数器 uint sec; // 秒计数器 uchar min; // 分钟计数器 uchar hour; // 小时计数器 void delay(uint i) { // 短暂延时函数 while(i--); } void DAC(uint n) { // 将数值DAC输出 D1 = (n & 0x01); D2 = (n & 0x02) >> 1; D3 = (n & 0x04) >> 2; D4 = (n & 0x08) >> 3; D5 = (n & 0x10) >> 4; D6 = (n & 0x20) >> 5; D7 = (n & 0x40) >> 6; D8 = (n & 0x80) >> 7; } void display() { // 显示计时器数值 DAC(hour / 10); // 输出小时的十位 delay(50); // 短暂延时 DAC(hour % 10); // 输出小时的个位 delay(50); DAC(min / 10); // 输出分钟的十位 delay(50); DAC(min % 10); // 输出分钟的个位 delay(50); DAC(sec / 10); // 输出秒的十位 delay(50); DAC(sec % 10); // 输出秒的个位 delay(50); } void initTimer() { // 初始化定时器 TMOD |= 0x01; // 设置定时器0为16位模式,使用定时器0的模式1 TH0 = 0xFC; // 计时1ms,从0xFC开始(65536-1000)计时 TL0 = 0x18; ET0 = 1; // 允许定时器0中断 TR0 = 1; // 启动定时器0 EA = 1; // 打开总中断开关 } void main() { initTimer(); // 初始化定时器 while(1) { if (Key1 == 0) { // 如果按下了按键1,复位计时器 ms = sec = min = hour = 0; display(); // 显示0 } if (Key2 == 0) { // 如果按下了按键2,开始计时器 while(1) { display(); // 显示计时器数值 if (ms >= 1000) { ms = 0; sec++; if (sec >= 60) { sec = 0; min++; if (min >= 60) { min = 0; hour++; if (hour >= 24) { hour = 0; } } } } } } } } void timer0() interrupt 1 { // 定时器0中断 TH0 = 0xFC; TL0 = 0x18; ms++; // 每次中断毫秒计数器加1 }
解决 1无用
悬赏问题
- ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
- ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
- ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
- ¥50 成都蓉城足球俱乐部小程序抢票
- ¥15 yolov7训练自己的数据集
- ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
- ¥15 电力市场出清matlab yalmip kkt 双层优化问题
- ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
- ¥20 matlab yalmip kkt 双层优化问题
- ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体