『壹』 單片機課程設計 秒錶設計
#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;
}
}
}