|
發布時間: 2020-4-13 22:54
正文摘要:編一個搶答器,倒計時60秒用中斷法定時,搶答倒計時30秒用定時器定時,一個按鍵控制60秒倒計時開關,一個按鍵控制搶答開關,一個按鍵復位。 不知道為什么仿真失敗。電路圖如下,程序在一樓。 |
|
#include <reg51.h> #define uchar unsigned char #define uint unsigned int uchar code zixingma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; sbit P20=P2^0; sbit P21=P2^1; sbit P22=P2^2; //黃燈 sbit P23=P2^3; //紅燈 sbit P26=P2^6; sbit P27=P2^7; sbit key1=P3^2; //倒計時開關 sbit key2=P3^3; //搶答器開關 sbit key3=P3^5; //復位開關 uchar s,n,k,flag; void delay5ms() { uchar i,j; for(i=10;i>0;i--) for(j=248;j>0;j--); } void delay10ms() { unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); } void main() { P22=0; P23=0; P0=0xff; P1=0xff; TMOD=0x11; //T0用中斷定時1s,T1用定時器定時1s,均為方式一 TH0=(65536-50000)/256; TL0=(65536-50000)%256; IE=0x8d; //1000 1101 TH1=(65536-50000)/256; TL1=(65536-50000)%256; TR0=1; TR1=1; flag=0; while(1) { if(flag==1) //倒計時60s開始,中斷法定時 { s=60; k=20; P20=1; P21=0; if(s>=10) P0=zixingma[s/10]; delay5ms(); P0=0xff; P20=0; P21=1; P0=zixingma[s%10]; delay5ms(); while(s==0) //倒計時結束,紅燈亮 { P0=0xff; P23=1; } } if(flag==2) //搶答開始,定時器T0定時30s倒計時 { P22=1; //答題開始,黃燈亮 P0=0xff; k=20; n=20; while(TF1==0); TH1=(65536-50000)/256; TL1=(65536-50000)%256; TF1=0; k--; if(k==0) { k=20; P1=0xff; P26=1; P27=0; if(n>=10) { P1=zixingma[n/10]; delay5ms(); } P1=0xff; P26=0; P27=1; P1=zixingma[n%10]; delay5ms(); while(n==0) //答題時間到,黃燈滅,紅燈亮 { P22=0; P1=0xff; P23=1; } } } if(flag==3) //復位 { P2=0; P0=0xff; P1=0xff; s=60; n=30; } } } void t_0() interrupt 1 //1秒定時 (1分鐘) { TH0=(65536-50000)/256; TL0=(65536-50000)%256; k--; if(k==0) { k=20; s--; if(s==0) { P23=1; P0=0xff; } } } void int_0() interrupt 0 //倒計時開關 { EX0=0; delay10ms(); if(key1==0) flag=1; while(key1==1); delay10ms(); EX0=1; } void int_1() interrupt 2 //搶答開關 { EX1=0; delay10ms(); if(key2==0) flag=2; while(key2==1); delay10ms(); EX1=1; } void t_1() interrupt 3 //復位開關 { ET1=0; delay10ms(); if(key3==0) flag=3; while(key3==1); delay10ms(); ET1=1; } |