问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

你好,请问你弄单片机00.00~99.99秒表得了吗?

发布网友 发布时间:2024-09-28 06:51

我来回答

3个回答

热心网友 时间:2024-10-22 07:20

/***********************************************************
实验名称:8位数码管秒表
程序说明:烧好程序,短接J6的上端(ON),按下S17即可看到秒表运行,再按下S17秒表暂停计时,按第三下秒表归零。
实验平台:YZ200 V2.0开发箱
作者:徐锐锋
日期:2010-10-15
广州研展电子科技有限公司 www.52yanfa.com (我爱研发网) 版权所有
***********************************************************/

#include <reg52.h>
#include <intrins.h>

unsigned char data dis_digit;
unsigned char key_s, key_v;

unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 共阳0, 1, 2, 3
0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off
unsigned char dis_buf[8]; // 显示缓冲区
unsigned char sec_bcd[8]; // 秒计数值, BCD码
unsigned char dis_index; //
unsigned char key_times; // K1 按下次数 //

void clr_time();
void update_disbuf();
bit scan_key();
void proc_key();
void delayms(unsigned char ms);

sbit K1 = P3^0;

/******************************************/
/* 主函数 */
/******************************************/
void main(void)
{
P0 = 0x00;
P1 = 0xff;
TMOD = 0x11; // 定时器0, 1工作模式1, 16位定时方式
TH1 = 0xdc; //定时10ms
TL1 = 0;

TH0 = 0xfc; //定时1ms
TL0 = 0x17;

clr_time(); //

dis_digit = 0x80; // 初始化,改变初始值可改变小数点的位置
dis_index = 0; //

key_times = 0;
key_v = 0x01;

IE = 0x8a; // 使能timer0, timer1中断

TR0 = 1;
TR1 = 0;
while(1)
{
if(scan_key())
{
delayms(10);
if(scan_key())
{
key_v = key_s;
proc_key();
}
}

}
}

/******************************************/
/* 清零 */
/******************************************/
void clr_time()
{
sec_bcd[0] = 0x0;
sec_bcd[1] = 0x0;
sec_bcd[2] = 0x0;
sec_bcd[3] = 0x0;
sec_bcd[4] = 0x0;
sec_bcd[5] = 0x0;
sec_bcd[6] = 0x0;
sec_bcd[7] = 0x0;

update_disbuf();

}

/******************************************/
/* 键盘扫描子程序 */
/******************************************/
bit scan_key()
{
key_s = 0x00;
key_s |= K1;
return(key_s ^ key_v);
}

/******************************************/
/* 键盘处理子程序 */
/******************************************/
void proc_key()
{
if((key_v & 0x01) == 0)
{
key_times++;
if(key_times == 1)
{
TR1 = 1;
}
else if(key_times == 2)
{
TR1 = 0;
}
else
{
clr_time();
key_times = 0;
}

}
}

/*******************************************/
/*定时器0中断服务程序, 用于数码管的动态扫描*/
/*dis_index --- 显示索引, 用于标识当前显示的
数码管和缓冲区的偏移量 */
/*dis_digit --- 位选通值, 传送到P1口用于选通
当前数码管的数值, 如等于0x01时,选通P1.0口数码管*/
/*dis_buf --- 显于缓冲区基地址 */
/******************************************/
void timer0() interrupt 1
{
TH0 = 0xFC; //FC17=64535
TL0 = 0x17;

P1 = 0x00; // 先关闭所有数码管
P0 = dis_buf[dis_index]; // 显示代码传送到P0口
P1 = dis_digit; // 位选通

dis_digit = _cror_(dis_digit,1); // 位选通值右移(P10<-P17), 下次中断时选通下一位数码管
dis_index++; //

dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
} //0x07 = 0000 0111

/***********************************************************************************
注释: dis_index &= 0x07是8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描.
写回一般形式:dis_index = dis_index & 0x07。这种方法挺新,第一次见到,十六进制的07
就是二进制的00000111,这样通过与操作可能控制循环了。比如dis_index 经第一次循环后值
为00000001,和0x07与操作后值不变仍为0x01,第二次循环时,其值为0为0x02,与0x07后仍
为0x02,一直到其值增为0x07时还是不变的,但再次循环后其值为0x80,再与0x07后就变成
0x00了,这样又从初始循环。此句可用if(dis_index == 8) dis_index = 0 代替,效果一样
************************************************************************************/

/******************************************/
/* 定时中断1 */
/******************************************/
void timer1() interrupt 3
{
unsigned char i;
TH1 |= 0xdc;
for(i = 0; i < 8; i++)
{
sec_bcd[i]++; // 低位加1
if(sec_bcd[i] < 10) // 如果低位满10则向高位进1
break; // 低位未满10
sec_bcd[i] = 0; // 低位满10清0
}
update_disbuf(); // 更新显示缓冲区
}

/******************************************/
/* 更新显示缓冲区 */
/******************************************/
void update_disbuf()
{
dis_buf[7] = dis_code[sec_bcd[7]];
dis_buf[6] = dis_code[sec_bcd[6]];
dis_buf[5] = dis_code[sec_bcd[5]];
dis_buf[4] = dis_code[sec_bcd[4]];
dis_buf[3] = dis_code[sec_bcd[3]];
dis_buf[2] = dis_code[sec_bcd[2]] & 0x7f; // 加上小数点
dis_buf[1] = dis_code[sec_bcd[1]];
dis_buf[0] = dis_code[sec_bcd[0]];
}

/******************************************/
/* 延时子程序 */
/******************************************/
void delayms(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
这个程序可以显示小数点后两位,但只能一直加,到99.99如果不按下K1则一直加。K1按一次启动秒表,再按一次暂停,再按一次清0.

热心网友 时间:2024-10-22 07:16

很简单的啊,

热心网友 时间:2024-10-22 07:15

问你的老师去
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
网上上传一本十几万字的小说可以有多少钱 中国民间风俗目录 怎么才能提升外贸B2C商城网站建设的体验度? 谁不是一边做外贸B2B,一边做B2C呢? 咖啡豆有哪几种 你了解四种类型的咖啡豆吗? 咖啡豆的两大品种是啥 乌爹泥的意思是什么 孩儿茶的意思是什么 双鱼座的你,会不会喜欢上和自己同星座的人,为什么? 索爱e16i搜狗安装后,我已经设置了,但是发信息和QQ打字都还是原来的输... 为什么我的word文档变成了写字板为什么我的word文档变成了写字板... 电脑'装个写字板,一根线接在什么位置? 祁门红茶要煮吗?怎么煮? ...的顾客越来越多了,水饺库存告急,现在什么牌子的水饺卖的比较好?打... 人到中年,背叛带来的两种结局,你可能承受不起 什么是手写板? 我的写字板不小心删除了,怎样恢复呀?我要具体的步骤?具... ...已安装搜狗手写输入软件,在正常使用搜狗拼音输入时怎么转换成手写输... word打开为啥是写字板 平安陆金贷款12万,现在还了6期,会不会被起诉诈骗 煮红茶的步骤 碧海食品的素水饺为什么会有妈妈包的饺子的味道? 女人喜欢丑男是多数还是少数?? 碧海食品的哪款水饺比较好吃? “饼良知”产自哪个速冻食品厂家啊?想找他们合作,拜托大家告知一下吧... 冷冻饺子为什么这么便宜 请问河南碧海食品生产的蒸煎饺怎么样? 女人喜欢丑男是多数还是少数?。。。 将从1开始的九个连续奇数填入3行3列的九个空格中,使每一横行、每一竖... 你好 我母亲前几天得了冠心病,医生说第一次完全治愈后就没有后遗症... 怎么看信用卡的内容 背叛承诺的人会有报应吗? 写字板文档 片段 '73806820...'删除不了 ...有人送了一尊玉观音。女主送的应该是一副双面绣。 求一程序 可无限次循环打开'写字板' 急急急~~~! 如何关闭搜狗拼音输入法的自动更新 我在设置里点了 没有用 照样自动... 年薪3.5万(联通公司工作)申办中银信用卡,额度能有多少?本人已有建行... 我用写字板写东西,因为电脑不稳定,所以能否给出一个每隔一分钟就自动存... 能不能把搜狗拼音输入法的手写创建快捷方式 去中国银行办业务,然后被推荐办了一张全币种信用卡,办的时候柜员复印了... 我男朋友六月份要到西藏骑行,为期一个月,除了一些必备的东西,我应该... 如何Windows在桌面右键新增添加'新增'HTML' 菜单? 小程序无法连接网络怎么回事? 京东店铺运营怎么做?运营方法介绍 手机wi-fi连上却上不了网 白板笔写的字怎么擦掉? 寒假作业答案七年级上册2017零五网 有什么方法可以擦干净白板上的擦不掉的字迹 ...好像是心脏方面的因为我看见他赤身心脏处是青黑色的,