PC機通過串口以字符方式向單片機發送一二位十進制數值(仿真時串口發送器的顯示設置為Echo Typed),波特率為9600,單片機收到后將其顯示到數碼管上,當P3.2引腳按鍵按下時開始做秒表倒計時(這里使用的是定時器),數值減到0停止,P3.5端口的LED燈閃爍三下。這里附上程序和仿真圖,有需要的可以下載。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
F5RL{E]HK`MGLJ%V3MXNTIB.png (76.95 KB, 下載次數: 58)
下載附件
2020-6-26 09:51 上傳
單片機源程序如下:
- #include <reg52.h>
- sbit key = P3^2;
- sbit led = P3^5;
- typedef unsigned char uchar;
- typedef unsigned int uint;
- uchar smg[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};
- uchar time,s=0,over = 0;
- char m = 0;
- uchar num[2];
- void delay(uint x)
- {
- uchar y;
- for(x;x>0;x--)
- for(y=110;y>0;y--);
- }
- void time_uart_init()
- {
- TMOD = 0x21;
- SCON = 0x50;
- TH0=0XFC;
- TL0=0X18;
- TH1 = 0xfd;
- TL1 = 0xfd;
- ET0=1;
- EA=1;
- TR0=1;
- TR1 = 1;
- ES = 1;
-
- }
- void smg_some()
- {
- char num_[2];
- char i;
- num_[0] = time/10;
- num_[1] = time%10;
- for(i=6;i<8;i++)
- {
- P1=(0x01<<i);
- P0=~smg[num_[i-6]];
- delay(1);
- P0=0xff;
- delay(1);
- }
- }
- void main()
- {
- uchar j = 0;
- time_uart_init();
- while(1)
- {
- smg_some();
- if(key == 0)
- {
- m = 1;
- while(!key);
- }
- if(over)
- {
- for(j = 0;j<6;j++)
- {
- led = ~led;
- delay(1500);
- }
- over = 0;
- }
- }
- }
- void Timer0() interrupt 1
- {
- static uint i;
- TH0=0XFC;
- TL0=0X18;
- i++;
- if(i==1000)
- {
- if(m)
- {
- time--;
- if(time<=0)
- {
- time = 0;
- over = 1;
- m = 0;
- }
- }
- i = 0;
- }
- }
- void serve() interrupt 4
- {
- uchar temp;
- if(RI)
- {
- RI = 0;
- temp = SBUF-0x30;
- num[1]=num[0];
- num[0]=temp;
- time=num[1]*10+num[0];
- }
- }
復制代碼
所有資料51hei提供下載:
PC機控制的倒計時秒表發揮部分.zip
(101.58 KB, 下載次數: 28)
2020-6-26 09:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|