要分析一个单片机 C 语言程序设计的秒表程序,需要考虑以下几个方面:
硬件平台:需要了解秒表程序所运行的单片机类型,以及硬件平台上可用的硬件资源,如定时器、显示器等。
时间计数方式:需要确定秒表程序使用的时间计数方式,是通过定时器实现周期性计时,还是通过程序每隔一段时间手动计时。
显示方式:需要确定秒表程序的显示方式,是通过数码管显示时间,还是通过 LCD 显示屏显示时间。
程序流程:需要分析秒表程序的主要流程,包括初始化、计时、显示等步骤。
程序细节:需要关注秒表程序中的细节,如处理溢出、计时格式
这个程序可以实现秒的计时,按键控制开始、暂停、清零功能,更多功能自己在看清程序的基础上进行改进。#include <reg51.H>
sbit P3_5 =P3^5
unsigned char code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x00}
unsigned char second
unsigned char keycnt
unsigned int tcnt
void main(void)
{
unsigned char i,j
TMOD=0x02
ET0=1
EA=1
second=0
P1=dispcode[second/10]
P2=dispcode[second%10]
while(1)
{
if(P3_5==0)
{
for(i=20i>0i--)
for(j=248j>0j--)
if(P3_5==0)
{
keycnt++
switch(keycnt)
{
case 1:
TH0=0x06
TL0=0x06
TR0=1
break
case 2:
TR0=0
break
case 3:
keycnt=0
second=0
P1=dispcode[second/10]
P2=dispcode[second%10]
break
}
while(P3_5==0)
}
}
}
}
void t0(void) interrupt 1 using 0
{
tcnt++
if(tcnt==4000)
{
tcnt=0
second++
if(second==100)
{
second=0
}
P1=dispcode[second/10]
P2=dispcode[second%10]
}
}
#include<reg51.h> // 时钟与秒表
#define uchar unsigned char
#define uint unsigned int
sbit qingling=P1^0 //清零
sbit tiaofen=P1^1 //调分
sbit tiaoshi=P1^2 //调时
sbit sounder=P1^7 //naozhong
uint a,b
uchar hour,minu,sec, //时钟
hour0,minu0,sec0, //秒表
hour1,minu1,sec1
h1,h2,m1,m2,s1,s2, //显示位
k,s //状态转换标志
uchar code select[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}
/*****************函数声明***********************/
void keyscan()
void init()
void delay(uchar z)
void display(uchar,uchar,uchar)
void sounde()
/*****************主函数*************************/
void main()
{
init()
while(1)
{
while(TR1)
{
keyscan() // 扫描函数
while(s==1) // s是状态标志,当s=0时,闹钟取消。s=1时,设定闹钟时间
//(也是通过调时,调分函数);
{ //s=2时,闹钟工作,时间与设定时刻一致时,闹钟响
// (一分钟后自动关闭,可手动关闭)。再次切换,s=0.
keyscan()//s状态切换(0-》1-》2-》0)通过外部中断1实现。
display(hour1,minu1,sec1)//闹钟时刻显示
}
display(hour0,minu0,sec0)//时钟表显示
while(k) /*k是秒表状态(0-》1-》2-》0)通过外部中断0实现。
0秒表关;1秒表从零计时;2秒表停,显示计时时间*/
{
display(hour,minu,sec) //秒表显示
}
}
}
}
/*****************初始化函数***********************/
void init()
{
a=0
b=0
k=0
s=0
hour0=0
minu0=0
sec0=0
hour=0
minu=0
sec=0
hour1=0
minu1=0
sec1=0
TMOD=0x11 //定时器0,1工作于方式1;赋初值
TH0=(65536-5000)/256
TL0=(65536-5000)%256
TH1=(65536-50000)/256
TL1=(65536-50000)%256
EA=1
EX0=1 //秒表中断
EX1=1 //闹钟设定中断
ET0=1
ET1=1
IT0=1 //边沿触发方式
IT1=1
PX0=1
PX1=1
TR0=0 //初始,秒表不工作
TR1=1 //时钟一开始工作
}
/*****************定时器0中断*************/
void timer0_int() interrupt 1 //秒表
{
TH0=(65536-5000)/256
TL0=(65536-5000)%256
a++
if(a==2)
{
a=0
sec++
if(sec==100)
{
sec=0 //毫秒级
minu++
if(minu==60)
{
minu=0 //秒
hour++
if(hour==60) //分
{
hour=0
}
}
}
}
}
/*************外部中断0中断函数************/
void ex0_int() interrupt 0
{
k++
if(k==3)
k=0
if(k==1)
{
TR0=~TR0
if(TR0==1)
{
hour=0
minu=0
sec=0
}
}
if(k==2)
{
TR0=~TR0
}
}
/*************外部中断1中断函数************/
void ex1_int() interrupt 2
{
s++
if(s==3)
s=0
}
/*************定时器1中断****************/
void timer1_int() interrupt 3 //控制时钟工作
{
TH1=(65536-50000)/256
TL1=(65536-50000)%256
if(s==2)
{
if(hour1==hour0 &&minu0==minu1)
sounde()
}
b++
if(b==20)
{
b=0
sec0++
if(sec0==60)
{
sec0=0
minu0++
if(minu0==60)
{
minu0=0
hour0++
if(hour0==24)
hour0=0
}
}
}
}
/*************键盘扫描****************/
void keyscan()
{
if(s==1)
{
if(qingling==0)
{
delay(10)
if(qingling==0)
{
sec1=0
minu1=0
hour1=0
}
}
if(tiaofen==0)
{
delay(10)
if(tiaofen==0)
{
minu1++
if(minu1==60)
{
minu1=0
}
while(!tiaofen)
}
}
if(tiaoshi==0)
{
hour1++
if(hour1==24)
{
hour1=0
}
while(!tiaoshi)
}
}
else //调整时钟时间
{
if(qingling==0)
{
delay(10)
if(qingling==0)
{
sec0=0
minu0=0
hour0=0
}
}
if(tiaofen==0)
{
delay(10)
if(tiaofen==0)
{
minu0++
if(minu0==60)
{
minu0=0
}
while(!tiaofen)
}
}
if(tiaoshi==0)
{
hour0++
if(hour0==24)
{
hour0=0
}
while(!tiaoshi)
}
}
}
/*************显示函数****************/
void display(uchar hour,uchar minu,uchar sec)
{
h1=hour/10
h2=hour%10
m1=minu/10
m2=minu%10
s1=sec/10
s2=sec%10
P0=0xff
P2=table[h1]
P0=select[7]
delay(5)
P0=0xff
P2=table[h2]
P0=select[6]
delay(5)
P0=0xff
P2=0x40
P0=select[5]
delay(5)
P0=0xff
P2=table[m1]
P0=select[4]
delay(5)
P0=0xff
P2=table[m2]
P0=select[3]
delay(5)
P0=0xff
P2=0x40
P0=select[2]
delay(5)
P0=0xff
P2=table[s1]
P0=select[1]
delay(5)
P0=0xff
P2=table[s2]
P0=select[0]
delay(5)
}
/*************闹钟函数****************/
void sounde()
{
sounder=~sounder
}
/*************延时函数****************/
void delay(uchar z)
{
int x,y
for(x=zx>0x--)
for(y=110y>0y--)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)