|
可能有些小毛病仿真没毛病,就是自己的那个开发版出不来,大家拿去研究研究
仿真原理图如下 需要用8.0以上的版本(proteus仿真工程文件可到本帖附件中下载)
单片机源代码如下:
- #include <reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//变量定义
- sbit BEEP=P3^1;
- sbit start_stop=P3^2;
- sbit reset=P3^3;
- sbit key1=P1^0;
- sbit key2=P1^1;
- sbit key3=P1^2;
- sbit key4=P1^3;
- sbit key5=P1^4;
- sbit key6=P1^5;
- sbit key7=P1^6;
- sbit key8=P1^7;
- sbit state=P3^0;
- bit start_stop_flag=0;
- bit key1_flag=0;
- bit key2_flag=0;
- bit key3_flag=0;
- bit key4_flag=0;
- bit key5_flag=0;
- bit key6_flag=0;
- bit key7_flag=0;
- bit key8_flag=0;
- bit reset_flag=0;
- bit action=0;
- uchar second=20;
- uchar timer0_count=0;
- uchar number=0;
- uchar number_display=0;
- uint flag=1; //延时函数
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=120;y>0;y--);
- } //蜂鸣器发声延时
- void DelayMS(uint x)
- {
- uchar t;
- while(x--)
- for(t=0;t<100;t++);
- } //数码管显示驱动函数
- void display(uchar number,uchar second)
- {
- uchar second_first,second_second;
- second_first = second / 10;
- second_second = second % 10;
- P0 =0x00;
- P2 = 0xfe;
- P0 = table[number];
- delay(2);
- P0 =0x00;
- P2 = 0xfd;
- P0 = 0x40;
- delay(2);
- P0 =0x00;
- P2 = 0xfb;
- P0 = table[second_first];
- delay(2);
- P0 =0x00;
- P2 = 0xf7;
- P0 = table[second_second];
- delay(2);
- P0 =0x00; } //蜂鸣器响应按周期t发音
- void Play(uchar t)
- { uchar i; for(i=0;i<1;i++)
- { BEEP=~BEEP;
- DelayMS(t); } BEEP=0;
- } //开始键扫描函数
- void start_stop_keyscan()
- {
- if(start_stop == 0)
- {
- delay(8);
- if((start_stop == 0)&&(!start_stop_flag))
- {
- start_stop_flag = 1;
- action = 1;
- TR0 = 1;
- state = 0;
- }
- }
- else
- {
- start_stop_flag = 0;
- }
- } //八位抢答键扫描函数
- uchar key_scan8()
- {
- if(key1 == 0)
- {
- delay(8);
- if((key1 == 0)&&(!key1_flag))
- {
- key1_flag = 1;
- number = 1;
- number_display = number;
- }
- }
- else
- {
- key1_flag = 0;
- number = 0;
- } if(key2 == 0)
- {
- delay(8);
- if((key2 == 0)&&(!key2_flag))
- {
- key2_flag = 1;
- number = 2;
- number_display = number;
- }
- }
- else
- {
- key2_flag = 0;
- number = 0;
- }
- if(key3 == 0)
- {
- delay(8);
- if((key3 == 0)&&(!key3_flag))
- {
- key3_flag = 1;
- number = 3;
- number_display = number;
- }
- }
- else
- {
- key3_flag = 0;
- number = 0;
- }
- if(key4 == 0)
- {
- delay(8);
- if((key4 == 0)&&(!key4_flag))
- {
- key4_flag = 1;
- number = 4;
- number_display = number;
- }
- }
- else
- {
- key4_flag = 0;
- number = 0;
- }
- if(key5 == 0)
- {
- delay(8);
- if((key5 == 0)&&(!key5_flag))
- {
- key5_flag = 1;
- number = 5;
- number_display = number;
- }
- }
- else
- {
- key5_flag = 0;
- number = 0;
- }
- if(key6 == 0)
- {
- delay(8);
- if((key6 == 0)&&(!key6_flag))
- {
- key6_flag = 1;
- number = 6;
- number_display = number;
- }
- }
- else
- {
- key6_flag = 0;
- number = 0;
- }
- if(key7 == 0)
- {
- delay(8);
- if((key7 == 0)&&(!key7_flag))
- {
- key7_flag = 1;
- number = 7;
- number_display = number;
- }
- }
- else
- {
- key7_flag = 0;
- number = 0;
- }
- if(key8 == 0)
- {
- delay(8);
- if((key8 == 0)&&(!key8_flag))
- {
- key8_flag = 1;
- number = 8;
- number_display = number;
- }
- } else
- {
- key8_flag = 0;
- number = 0;
- } if(number_display != 0)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- } //复位键扫描函数
- void reset_keyscan()
- {
- if(reset == 0)
- {
- delay(8);
- if((reset==0)&&(!reset_flag))
- {
- reset_flag = 1;
- number_display = 0;
- state = 1;
- }
- }
- else
- {
- reset_flag = 0;
- }
- } //主函数
- void main()
- {
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA= 1;
- ET0= 1;
- TR0=0;
- while( 1)
- {
- if(number_display!=0)
- Play(number_display/2); //蜂鸣器发声
- start_stop_keyscan();
- reset_keyscan();
- while(action)
- {
- while(!key_scan8())
- {
- display(number_display,second);
- if(second == 0)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
8位竞赛抢答器课程设计.zip
(56.9 KB, 下载次数: 137)
|
评分
-
查看全部评分
|