1~99秒倒計(jì)時(shí)數(shù)碼管顯示C程序+Proteus仿真
掃描二維碼
隨時(shí)隨地手機(jī)看文章
1~99秒倒計(jì)時(shí)數(shù)碼管顯示C程序+Proteus仿真文件。
優(yōu)化了程序,使用51單片機(jī)內(nèi)部定時(shí)器,可以實(shí)現(xiàn)1-99秒內(nèi)倒計(jì)時(shí)。
仿真效果為:
源程序?yàn)椋?br/>/*
調(diào)試環(huán)境:Proteus 7.8AT89S52單片機(jī)8位共陰數(shù)碼管
功能為:實(shí)現(xiàn)數(shù)碼管1秒~99秒倒計(jì)時(shí), 12M晶振
*/
#include
#define uchar unsigned char
sbit LED1=P1^1; //連的是LED1
#define MAX_NUM 13 //最大倒計(jì)時(shí)數(shù)1~99可設(shè)
#define SEGPORT P0 //定義數(shù)碼管連接端口
sbit LE_DUAN = P2^0; //定義573鎖存使能端口 段鎖存
sbit LE_WEI = P2^1; //定義573鎖存使能端口 位鎖存
unsigned char code Seg_Duan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰數(shù)碼管顯示段碼值 0~9
unsigned char code Seg_Wei[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //數(shù)碼管的位碼,低電平有效。
static uchar second=MAX_NUM,count; //99只是一個(gè)數(shù),可以任意改,因?yàn)檫@里只學(xué)習(xí)怎樣實(shí)現(xiàn)倒計(jì)時(shí)
uchar shiwei;
uchar gewei;
void delay(unsigned int cnt)
{
while(--cnt);
}
void main()
{
TMOD"=0x01; //定時(shí)器設(shè)置 16位
TH0=(65536-50000)/256; //定時(shí)時(shí)間 50ms
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
SEGPORT = 0;
LE_DUAN = 0;
LE_WEI= 0;
while(1)
{
shiwei=second/10; //數(shù)碼管10位
gewei=second%10; //數(shù)碼管個(gè)位
SEGPORT=0; //清空數(shù)據(jù),防止有交替重影
LE_DUAN=1; //段鎖存
LE_DUAN=0;
delay(30);
SEGPORT = Seg_Wei[1]; //先送位碼值
LE_WEI = 1; //573高電平鎖存
LE_WEI = 0;
SEGPORT = Seg_Duan[shiwei]; //再送段碼值,這里為 2~9
LE_DUAN = 1; //573高電平鎖存
LE_DUAN = 0;
delay(300);
SEGPORT = Seg_Wei[0]; //先送位碼值
LE_WEI = 1; //573高電平鎖存
LE_WEI = 0;
SEGPORT = Seg_Duan[gewei]; //再送段碼值,這里為 2~9
LE_DUAN = 1; //573高電平鎖存
LE_DUAN = 0;
delay(300);
}
}
void tim(void) interrupt 1 //定時(shí)器0中斷
{
TH0=(65536-50000)/256; //定時(shí)時(shí)間 50ms
TL0=(65536-50000)%256;
count++;
if(count==20) //50毫秒定時(shí),50*20=1000(毫秒)=1秒
{
count=0;
second--;
if(second==0xff) /*無(wú)符號(hào)char型數(shù)值,0-1為:0xff,這里若為:0的話,則倒計(jì)到0時(shí)不顯示0直接顯示最大倒計(jì)數(shù)。*/
{
LED1=~LED1; //這里讓LED1反轉(zhuǎn)一下,表現(xiàn)倒計(jì)時(shí)一周。
second=MAX_NUM; //回到最大倒計(jì)數(shù)值,再次倒計(jì),當(dāng)然,可以加入其他的控制,
}
}
}