51单片机学习19-简易秒表
前面几篇我们说到了 LED灯,数码管,按键等内容,按键和数码管组合可以设计出简易秒表。
硬件组成:单片机最小系统+数码管显示电路+3个按键
功能:一个开始键,一个暂停键,一个复位键。数码管显示的精度是00:00--59:99
仿真图:
程序:
程序内容比较多,详细的参考源代码
源代码:
#include<reg52.h> //头文件
#define uint unsigned int
#define uchar unsigned char
uchar qian;
uchar bai;
uchar shi;
uchar ge;
//共阴数码管0-F 编码表
uchar smg_dm[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,};
uchar smg_dm1[]={0xbf,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,}; //0. 1. 2.----9.段码表
uchar smg_wm[]={0Xef,0Xdf,0xbf,0x7f}; //位选
uchar Display_buffer[4]={0,0,0,0}; //数码管显示缓存
sbit key1=P2^0; //开始键
sbit key2=P2^1; //暂停键
sbit key3=P2^2; //复位键
void delay_ms(uint z) //延时子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void key(void)
{
if(key1==0)
{
delay_ms(10);
if(key1==0)
{
TR0=1;
}
while(!key1);
}
if(key2==0)
{
delay_ms(10);
if(key2==0)
{
TR0=0;
}
while(!key1);
}
if(key3==0)
{
delay_ms(10);
if(key3==0)
{
TR0=0;qian=0;bai=0;shi=0;ge=0;
}
while(!key1);
}
}
void msg_display(void)
{
uchar i;
Display_buffer[0]=qian;
Display_buffer[1]=bai;
Display_buffer[2]=shi;
Display_buffer[3]=ge;
for(i=0;i<=3;i++)
{
if(i==1)
{
P2=smg_wm[i];//选位码
P1=smg_dm1[Display_buffer[i]];//选段码
delay_ms(5);
//P2=0XFF; //消影仿真这句加不加都一样
}
else
{
P2=smg_wm[i];//选位码
P1=smg_dm[Display_buffer[i]];//选段码
delay_ms(5);
//P2=0XFF; //消影
}
}
}
void main()
{
TMOD=0X01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
while(1)
{
key();
msg_display();
}
}
void time0() interrupt 1
{
uchar num;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
num++;
if(num==1)
{
num=0;
ge++;
if(ge==10)
{
ge=0;
shi++;
if(shi==10)
{
shi=0;
bai++;
if(bai==10)
{
bai=0;
qian++;
if(qian==6)
{
qian=0;
}
}
}
}
}
}
仿真结果:
单片机秒表实例
下面是用单片机来实现秒表功能的一个例子, 该源程序已在实验板上调试通过,可直接引用,并可利用软件编程的灵活性,加以拓展,实现更为复杂的功能。
#include <pic.h>
#include <math.h>
//此程序实现计时秒表功能,时钟显示范围 00.00~95.99 秒,分辨度:0.01 秒
unsigned char s0,s1,s2,s3;
//定义 0.01 秒、0.1 秒、1 秒、10 秒计时器
unsigned char s[4];
unsigned char k ,data ,sreg;
unsigned int i;
const table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};
//不带小数点的显示段码表
const table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
//带小数点的显示段码表//TMR0 初始化子程序
void tmint()
{
T0CS=0;//TMR0 工作于定时器方式
PSA=1;//TMR0 不用分频
T0IF=0;//清除 TMR0 的中断标志
T0IE=1;//TMR0 中断允许
}
//spi 显示初始化子程序
void SPIINIT()
{
PIR1=0;
SSPCON=0x30;
SSPSTAT=0xC0;
//设置 SPI 的控制方式,允许 SSP 方式,并且时钟下降沿发送。与"74HC595,当其//SCLK 从低到高跳变时,串行输入寄存器"的特点相对应
TRISC=0xD7;//SDO 引脚为输出,SCK 引脚为输出
TRISA5=0;//RA5 引脚置为输出,输出显示锁存信号
}
//系统其它部分初始化子程序
void initial()
{
TRISB1=0;
TRISB2=0;
TRISB4=1;
TRISB5=1;//设置与键盘有关的各口的输入输出方式
RB1=0;
RB2=0;//建立键盘扫描的初始条件
}
//SPI 传输数据子程序
void SPILED(data)
{
SSPBUF=data;//启动发送
do {
;
}while(SSPIF==0);
SSPIF=0;
}
//显示子程序,显示 4 位数
void dispaly()
{
RA5=0;//准备锁存
for(k=4;k>0;k--)
{
data=s[k-1];
if(k==3) data=table0[data];//第二位需要显示小数点
else data=table[data];
SPILED(data);//发送显示段码
}
for(k=0;k<4;k++)
{
data=0xFF;
SPILED(data);//连续发送 4 个 DARK,使显示好看一些
}
RA5=1;//最后给锁存信号,代表显示任务完成
}
//软件延时子程序
void DELAY()
{
for(i = 3553;--i ;) continue;
}
//键扫描子程序
void KEYSCAN()
{
while(1){
while(1)
{
dispaly();//调用一次显示子程序
if ((RB5==0)||(RB4==0)) break;
}
DELAY();//若有键按下,则软件延时
if ((RB5==0)||(RB4==0)) break;
//若还有键按下,则终止循环扫描,返回
}
}
//等键松开子程序
void keyrelax()
{
while(1){
dispaly();//调用一次显示子程序
if ((RB5==1)&&(RB4==1)) break;
} //为防止按键过于灵敏,每次等键松开才返回
}
//系统赋值初始化子程序
void inizhi()
{
s0=0x00;
s[0]=s0;
s1=0x00;
s[1]=s1;
s2=0x00;
s[2]=s2;
s3=0x00;
s[3]=s3;//s0=s1=s2=s3=0,并放入显示缓冲数组中
sreg=0x00;//tmr0 中断次数寄存器清 0
}
//中断服务程序
void interrupt clkint(void)
{
TMR0=0X13;
//对 TMR0 写入一个调整值。因为写入 TMR0 后接着的
//两个周期不能增量,中断需要 3 个周期的响应时间,
//以及 C 语言自动进行现场保护要消耗周期
T0IF=0;//清除中断标志
CLRWDT();
sreg=sreg+1;//中断计数器加 1
if(sreg==40) //中断次数为 40 后,才对 S0,S1,S2,S3 操作
{
sreg=0;
s0=s0+1;
if(s0==10){
s0=0 ;
s1=s1+1;
if(s1==10){
s1=0 ;
s2=s2+1;
if(s2==10){
s2=0;
s3=s3+1;
if(s3==10) s3=0 ;
}
}
}
}
s[0]=s0;
s[1]=s1;
s[2]=s2;
s[3]=s3;
}
//主程序
main()
{
OPTION=0XFF;
tmint();//TMR0 初始化
SPIINIT();//spi 显示初始化
initial();//系统其它部分初始化
di();//总中断禁止
while(1) {
inizhi();//系统赋值初始化
KEYSCAN();//键扫描,直到开始键按下
keyrelax();//等键松开
ei();//总中断允许
KEYSCAN();//键扫描直到停止键按下,在键扫描时有显示
keyrelax() ;//等键松开
di();//总中断禁止
KEYSCAN();//键扫描到清 0 键按下,在键扫描时有显示
keyrelax() ;//等键松开
}
}
相关问答
单片机秒表 实验原理?利用单片机的定时器/计数器定时和记的原理,结合显示电路、LED数码管以及按键来设计计时器,具有00-99分钟计时及显示功能;具有开始、停止和复位功能,并由按键...
单片机秒表 程序 80C51-ZOL问答voidKEY()//按键扫描程序{unsignedchari,j;if(P3^0==0){for(i=20;i>0...单片机里面有程序存储器,还有数据存储器,数据存储器是...
51 单片机秒表 程序[回答]这个程序写的太乱了执行的顺序是先定义秒等一些寄存器,然后清零,并定义定时初值,开显示。再打开定时器中断,定时到,中断秒寄存器加1,加到10时清...
单片机 ( 秒表 制作)?,制作 单片机 如何选??[回答]单片机cpl指汇编指令,是一个逻辑运算指令,是单片机中直接寻址位取反的指令,作用是将存储器的指定数据中的每一位转变为逻辑反的数据。CPL为单片机Co...
设计电子时钟 要用AT89S51 单片机 的定时器实现,用4位数码管...(1)显示准确2113的北京时间(时、分、秒),5261可用24小时4102制式;(2)随时可以调校时间。(3)增加公1653历日期显示功能(年、月、日),年号只...(3)增...
英语翻译基于 单片机 的数字 秒表 设计.用英文怎么翻译.还有 单片 ...[最佳回答]digitalstopwatchdesignbasedonsinglechipmachine单片机:singlechipmachine,可缩写为SCM
关于 单片机 做的 秒表 的问题 时间不准是为什么 我用PROTEUS模...定时不准,用单片机没法做到很准确的中断函数执行太长,占用时间5条回答:【推荐答案】cc=0;bai=dd%10;dd++;——qian,bai,shi,ge,放到++的后面来。进入下一级...
单片机 ( 秒表 制作)?,制作 单片机 有专业度吗??[回答]旺扬单片机开发很早就听说过了,现在还有在做,公司实力不错的,推荐。服务热情,公司环境设备先进,价格合理品控做的不错,据说他们生意做的也很好。建...
我想知道: 单片机 ( 秒表 制作)?,制作 单片机 排名好吗?[回答]建议联系,他们是专业承接电路板设计开发的公司,做产品非常的负责靠谱,可以去咨询咨询还不错的,他们专业承接单片机解决方案,以前朋友在那做了,还批...
我想做一个高精度电子 秒表 ,请问用那种时钟芯片比较好?精度的高低取决于晶振,跟时钟芯片无关。采用高精度的晶振,用单片机就能做高精度的秒表了。精度的高低取决于晶振,跟时钟芯片无关。采用高精度的晶振,用单片...