如何分析单片机C语言程序设计10秒的秒表的程序?

如何分析单片机C语言程序设计10秒的秒表的程序?,第1张

要分析一个单片机 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--)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11503336.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存