PC机通过串口以字符方式向单片机发送一二位十进制数值(仿真时串口发送器的显示设置为Echo Typed),波特率为9600,单片机收到后将其显示到数码管上,当P3.2引脚按键按下时开始做秒表倒计时(这里使用的是定时器),数值减到0停止,P3.5端口的LED灯闪烁三下。这里附上程序和仿真图,有需要的可以下载。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #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)
|