標題: 我怎么仿真不出來,大家來看看 [打印本頁]
作者: 五十度灰 時間: 2018-3-26 09:15
標題: 我怎么仿真不出來,大家來看看
#include<reg52.h> //52 系列單片機頭文件
#define uchar unsignedchar //宏定義
#define uint unsigned int
sbit key1=P3^4; //申明四個按鍵的鎖存端
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
uchar code table[]={ //含有 0~9 的數字數組
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7c,0x07,
0x7f,0x67};
uchar code table2[]={ //含有 0~9 的數字數組(帶小數點)
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfc,0x87,
0xff,0xe7};
void delayms(uint); //聲明延時函數
voiddisplay(uchar,uchar,uchar); //聲明顯示函數
void keyscan(); //聲明按鍵函數
ucharnum1,num2,bai,shi,ge; //變量聲明
uint num;
void main() //主函數入口
{
TMOD=0x11; //設置 TO,T1 定時器
TH0=(65536-45872)/256; //裝初值11.05992M晶振50ms數為45872
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1; //開總中斷
ET0=1; //開啟定時器 T0 中斷
ET1=1; //開啟定時器 T1 中斷
while(1) //程序停在這里等待中斷的發生,這個大循環也是實現數據顯示的主體
{
keyscan(); //三個數碼管要選送的數據
bai=num/100; //百位
shi=(num-100*bai)/10; //十位
ge=num-100*bai-shi*10; //個位
display(bai,shi,ge); //數碼管顯示
}
}
void display(uchar bai,uchar shi,uchar ge)
{
P1=0xfe; //位選選中第一個數碼管
P2=table[bai]; //送段選數據
delayms(10); //延時
P1=0xff; //關閉位選
P1=0xfd; //位選選中第二個數碼管
P2=table2[shi]; //送段選數據
delayms(10); //延時
P1=0xff; //關閉位選
P1=0xfb; //位選選中第二個數碼管
P2=table[ge]; //送段選數據
delayms(10); //延時
P1=0xff; //關閉位選
}
void delayms(uintxms) //延時子函數
{
uint i,j; for(i=xms;i>0;i--) //i=xms 即延時約 xms 毫秒
for(j=110;j>0;j--);
}
void keyscan()
{
if(key1==0) //清零
{
delayms(10); //延時去抖
if(key1==0)
{ while(!key1) //等待按下
{
TR0=0; //定時器 TR0 關閉
TR1=1; //定時器 TR1 打開
num=0; //送數據 num=0
TR1=0; //定時器 TR1 關閉
}
}
}
if(key2==0) //暫停和開始
{
delayms(10);
if(key2==0)
{
while(!key2);
TR0=0;
TR1=~TR1; //每次按下,TR1 的狀態時相反的
}
}
if(key3==0) //使計數器顯示為 60.0
{
while(!key3);
TR0=0;
TR1=1;
num=999;
TR1=0;
}
if(key4==0) //實現計數器的倒數功能
{
while(!key4);
TR1=0;
TR0=~TR0;//TR0=1;
}
}
void T0_time()interrupt 1 //定時器 T0,中斷序號為 1
{TH0=(65536-45872)/256; //重裝初值
TL0=(65536-45872)%256;
num2++;
if(num2==2) //如果到了2次,說明0.1秒的時間到
{ num2=0; //然后把num2清零重新再計2次
num1++;
}
if(num1==10)
num1=0;
if(num==0) //當 num 自減為0時,重新為 60.0,再開始倒計時
num=999; //num 逐漸自減
num--;
}
void T1_time()interrupt 3
{ TH1=(65536-45872)/256; //重裝初值
TL1=(65536-45872)%256;
num2++;
if(num2==2) //如果到了 2 次,說明 0.1 秒的時間到
{ num2=0; //然后把 num2 清零重新再計 2 次
num1++;
if(num1==10)
num1=0;
num++; //num 逐漸自加
if(num==999)
num=0;//這個數十用來送給數碼管顯示的,到了60.0后歸零
}
}
-
秒表.png
(29.28 KB, 下載次數: 30)
下載附件
2018-3-26 09:14 上傳
照圖仿真做不出來!
歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |