stm32倒计时秒表proteus_单片机倒计时秒表系统实验程序Proteus仿真
#include
unsigned??char code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共陰數(shù)碼管 0-9
sbit led=P3^0;
sbit s1=P0^0;
sbit s2=P0^1;
sbit k0=P2^0;
sbit k1=P2^1;
int sec=0,i,a,b=20,key1;
/*-----延遲函數(shù)-------*/
void delay(int z)
{
while(z-->0);
}
/*-----顯示函數(shù)-------*/
void display(int n)
{
if(n>0)
{
s2=1;s1=0;??? ? ? ? //顯示十位
P1=tab[n/10];??//除10,取十位數(shù)值
delay(100);? ? ? ?? ? //延遲顯示
s1=1;s2=0;? ? ? ?? ? //顯示個位
P1=tab[n%10];??//求余,取個位數(shù)值
delay(100);? ? ? ?? ? //延遲
}
else
{? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //當(dāng)輸入值小于0,顯示0
s2=1;s1=0;? ? ? ?? ???//顯示十位
P1=tab[0];? ? ? ?? ???//除10,取十位數(shù)值
delay(100);? ? ? ?? ???//延遲
s1=1;s2=0;? ?? ? ? ???//顯示個位
P1=tab[0];? ? ? ? ? ? ? ? //求余,取個位數(shù)值
delay(100);? ? ? ?? ???//延遲顯示
}
}
/*-----外部中斷0中斷服務(wù)函數(shù)----------*/
void RESET() interrupt? ? ? ? 0
{
sec=0;? ? ? ???//恢復(fù)初始值
b=20;? ? ? ???//恢復(fù)初始值
TR0=0;? ? ? ???//關(guān)閉定時器
}
/*-----外部中斷1中斷服務(wù)函數(shù)----------*/
void START() interrupt? ? ? ? 2
{
TR0=1;? ? ? ? //打開定時器
}
/*-----定時器T0服務(wù)函數(shù),計(jì)時功能----------*/
void timer0() interrupt 1
{
i--;? ?//50ms時間到
TH0=(65536-50000)/256;? ? ? ? //存放高8位,50ms
TL0=(65536-50000)%256; ? ? ? ???//存放低8位
if(i==0)
{
i=20;? ?? ?? ?? ?//1s計(jì)數(shù)
sec++;? ? ? ? ? ? ? ? ? ? ? ? //軟件計(jì)數(shù)1s
}
}
/*------鍵值掃描函數(shù)----------*/
void key()
{
k0=1;k1=1;? ? ? ?? ???? ? ? ? //讀按鍵
key1=P2;? ? ? ?? ?? ?? ?//將P2的值賦值給key1
key1=key1&0x03;? ? ? ? ? ? ? ? //屏蔽高6位,保留k0,k1的值
while(key1!=0x03)? ?//判斷是否有按鍵按下
{
delay(600);? ? ? ? ? ? ? ? ? ? ? ? //消抖動
key1=P2;
key1=key1&0X03;
while(key1!=0x03)? ? ? ???//當(dāng)有按鍵按下時
{
if(k0==0) b=b+1;? ?? ? ? ???//按下k0按鍵時,初始值加1
else b=b-1;? ? ? ? ? ? ? ? ? ? ? ???//按下k1按鍵時,初始值減1
k0=1;k1=1;? ? ? ? ? ? ? ?? ? //判斷按鍵是否抬起
key1=P2;? ? ? ? ? ? ? ?? ?//重新將P2的值賦值給key1
key1=key1&0x03;
while(key1!=0x03)??//判斷是否有按鍵按下
{
key1=P2;
key1=key1&0x03;
}
}
}
}
/*------主函數(shù)----------*/
void main()
{
TMOD=0X01;? ? ? ? ? ? ? ? ? ? ? ?? ? //設(shè)定定時器0工作,工作方式1
TH0=(65536-50000)/256;? ? ? ???//存放高8位,50ms
TL0=(65536-50000)%256; ? ? ? ? //存放低8位
IT0=1;IT1=1;? ? ? ? ? ? ? ???//外部中斷選擇下降沿觸發(fā)
IE=0X87;? ? ? ? ? ? ? ? ? ? ? ???//開啟INT0,INT1,T0
PX0=1;? ? ? ? ? ? ? ? ? ? ? ?? ???//設(shè)定INT0為高優(yōu)先級
led=1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //初始燈熄滅
TR0=0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //初始計(jì)數(shù)停止
i=2;
while(1)
{
a=b-sec;? ? ? ? ? ? ? ? ? ? ? ???//將增計(jì)時變?yōu)闇p計(jì)時
if(TR0==0)? ? ? ? ? ? ? ? ? ? ? ???//當(dāng)定時器關(guān)閉時開啟鍵值掃描
{key();}
display(a);? ? ? ? ? ? ? ? ? ? ? ???//顯示函數(shù)
if(a<=0)
{
led=0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???//當(dāng)減計(jì)時為0時,報(bào)警燈點(diǎn)亮
}
else
{
led=1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //當(dāng)減計(jì)時不為0時,報(bào)警燈熄滅
}
}
}
總結(jié)
以上是生活随笔為你收集整理的stm32倒计时秒表proteus_单片机倒计时秒表系统实验程序Proteus仿真的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python做流程管理平台_[译] Ai
- 下一篇: OpenStack之Neutron理论部