这周实训弄得一个简单的秒表
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg51.H>
- sbit sta_end=P0^0;
- sbit reset=P3^7;
- unsigned char code table0[]={
- 0x3F,/*0*/
- 0x06,/*1*/
- 0x5B,/*2*/
- 0x4F,/*3*/
- 0x66,/*4*/
- 0x6D,/*5*/
- 0x7D,/*6*/
- 0x07,/*7*/
- 0x7F,/*8*/
- 0x6F,/*9*/
- };
- unsigned char code table1[]={
- 0x3F,/*0*/
- 0x06,/*1*/
- 0x5B,/*2*/
- 0x4F,/*3*/
- 0x66,/*4*/
- 0x6D,/*5*/
- 0x7D,/*6*/
- 0x07,/*7*/
- 0x7F,/*8*/
- 0x6F,/*9*/
- };
- /*声明second10用于计数十分之一秒变化,second1用于记录秒的个*/ /*位,second2用于记录秒的十位*/
- unsigned int second10,second1,second2;
- bit bdata flag; /*以下是设置延时功能的函数*/
- void delay()
- {
- unsigned char i,j;
- for(i=90;i>0;i--)
- for(j=200;j>0;j--);
- }
- /*以下是设置时间的函数*/
- void setTime()
- {
- second10++;
- if(second10==10) /*当十分之一秒计数到十后从零重新计时*/
- {
- second10=0; /*同时秒计时个位加一*/
- second1++;
- if(second1==10) /*当秒计数个位到十后从零重新计时*/
- {
- second1=0;
- second2++; /*同时秒计时十位加一*/
- if(second2==10)
- second2=0;
- }
- }
- }
- /*以下是向LED管输数据并使之显示的函数*/
- void dispact()
- {
- P3=0xfe;
- P1=table1[second1];
- delay();
- P3=0xfd;
- P1=table1[second2];
- delay();
- P2=table0[second10];
- }
- /*十分之一秒刷新一次,实现十分之一秒进一*/
- Timer0 () interrupt 1 using 1
- {
- TH0 = (65535 - 50000)/256;
- TL0 = (65535 - 50000)%256;
- if(flag)
- setTime();
- dispact();
- }
- void main(void)
- {
- TMOD = 0x01;
- TH0 = (65535 - 50000)/256; /*定时器赋初值*/
- TL0 = (65535 - 50000)%256;
- flag = 0;
- EA = 1; /*cpu开中断*/
- TR0 = 1; /*利用定时器0*/
- ET0 = 1; /*外部中断允许*/
- do
- {
- if(!sta_end)
- {
- if(flag == 0)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
新建文件夹.rar
(17.34 KB, 下载次数: 12)
|