‘壹’ 单片机课程设计 秒表设计
#include<reg51.h>#include<stdio.h>#define dat P0
#define uchar unsigned char#define uint unsigned int
sbit seg1 = P2^0;sbit seg2 = P2^1;sbit seg3 = P2^2;sbit seg4 = P2^3;
uchar a,b,c,d;uint timeout=0,us=0,ms=0;uchar code table[]={0xC0,0xF9,0xA4,0xB0, 0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83, 0xC6,0xA1,0x86,0x8E}; //共阳
/*uchar code table[]={0x3f,0x06,0x5b,0x4f, //0~3 0x66,0x6d,0x7d,0x07, //4~7 0x7f,0x6f,0x77,0x7c, //8~b 0x39,0x5e,0x79,0x71}; //共阴 */
void delay(uint z){while(z--);}
void display(){ dat = table[a]; seg1 = 0; delay(1000); seg1 = 1; dat = 0xff; dat = table[b]-0x80; seg2 = 0; delay(1000); seg2 = 1; dat = 0xff; dat = table[c]; seg3 = 0; delay(1000); seg3 = 1; dat = 0xff; dat = table[d]; seg4 = 0; delay(1000); seg4 = 1; dat = 0xff; }
void InitTimer0(void){ TMOD = 0x01; TH0 = (65536-10000)/256; TL0 = (65536-10000)%256; EA = 1; ET0 = 1; TR0 = 1;}
void main(void){ InitTimer0(); while(1) { d = us%10; c = us/10; b = ms%10; a = ms/10; display(); }}
void Timer0Interrupt(void) interrupt 1{ TH0 = (65536-10000)/256; TL0 = (65536-10000)%256; //add your code here! timeout++; if(timeout==1) { timeout = 0; us++; if(us==100) { us = 0; ms++; { if(ms==100) { ms = 0; } } } }}
‘贰’ 52单片机不用定时中断如何实现60S秒表功能
#include<reg52.h>
sbit AA=P0^7;//数码管显示用IO端口
sbit BB=P0^6;
sbit CC=P0^5;
sbit DD=P0^4;
sbit K1=P3^2;
sbit K2=P3^5;
sbit K3=P3^7;
int s,m;
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};
void YS(int x); //延迟函数声明
void XS(int d); //显示函数声明
void main()
{
s=m=0;
TMOD=0x01;//设置定时器工作方式
TH0=(65536-1000)/256;//1毫秒
TL0=(65536-1000)%256;//定时器装初始值
EA=1;//开总中断
ET0=1;//开定时器 0 的中断
while(1)
{
XS(s); //显示
if(K1==0){ TR0=1; }//开启定时侍哗者器,开始计时
if(K2==0){ TR0=0; }//关闭定时器,暂停计时
if(K3==0){ s=m=0; }//清空数据
}
}
void YS(int x) //延迟子函数
{
int y;
for(;x>0;x--)
for(y=100;y>0;y--);
}
void XS(int d) //显老薯示子函数
{
char d1,d2,d3,d4;
d4=d%10; //取个位 %求余
d3=(d/10)%10; //取十芦春位
d2=(d/100)%10;
d1=(d/1000)%10;
P2=table[d4]; AA=0; YS(1); AA=1;//个位显示
P2=table[d3]; BB=0; YS(1); BB=1;//十位显示
P2=table[d2]; CC=0; YS(1); CC=1;//百位显示
P2=table[d1]; DD=0; YS(1); DD=1;//千位显示
}
void timer() interrupt 1 //中断处理子函数
{
TH0=(65536-922)/256;//1毫秒
TL0=(65536-922)%256;
m++;
if(m>=10) //判断定时是否到达1s 即 1000 ms
{ m=0; s++; }
if(s>=9999) //判断定时是否到达1s 即 1000 ms
{ s=0; }
}
绝对可用的,你试试吧,可能我的程序端口与你的不一样,自己改一下就可以了
‘叁’ 52单片机制作秒表问题
‘肆’ 单片机 秒表的设计
显示部分由于硬件连接状态不明,无法提供程序,有些硬件方案要求一次发送所有的显示内容,这种可以直接参考我下面的部分。有些硬件方案可以分别更改每一位的显示内容,这样可以利用DispFlag的不同位代表不同的显示字符位置,并且在相应计数部分程序中置位,送入主程序显示,当然显示执行完毕后清零相关位是必须的。否则主程序会不断的运行,出问题了。
unsigned char DOT,SEC,MIN,HOU,DispFlag;
//T0中断服务程序
{
//计数部分
DOT++;
if (DOT == 9) {
SEC++;
DOT=0;
}
if (SEC == 59) {
MIN++;
SEC=0;
}
if (MIN == 59) {
HOU++;
MIN=0;
}
if (HOU == 100) {
DOT=0;
SEC=0;
MIN=0;
HOU=0;
}
//置位显示标志
DispFlag = 1;
}
//主程序部分
int main(void) {
//初始化端口
//启动定时器
//开中断
while (1) {
if (DispFlag) {
//显示函数
DispFlag = 0;
}
}
}