基本功能:PC机通过串口以字符方式向单片机发送一1位十进制数值(仿真时串口发送器的显示设置为Echo T),波特率为9600,单片机收到后将其显示到数码管上,当P3.2引脚按键按下时开始做秒表倒计时(这里使用的是定时器),数值减到0停止,P3.5端口的LED灯闪烁三下
发挥部分:在基本功能基础上,PC机通过串口向单片机发送一2位十进制数值
我把基本功能做出来了,有需要的下载即可,另外有没有大佬指点一下发挥部分应该怎样写?
仿真原理图如下(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 num[2];
- uchar time,tt=0,over = 0;
- char s = 0;
- /*****************************************
- 延时函数
- *****************************************/
- void delay(uint x)
- {
- uchar y;
- for(x;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*****************************************
- 数码管显示函数
- *****************************************/
- void smg_show(char num_[])
- {
- char i;
- num_[0] = 0;
- //num_[1] = 2;
- for(i=6;i<=7;i++)
- {
- P1=(0x01<<i);
- P0=~smg[num_[i-6]];
- delay(1);
- P0=0xff;
- delay(1);
- }
- }
- void time_uart_init()
- {
- TMOD = 0x21;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
- SCON = 0x50;
- TH0=0XFC; //给定时器赋初值,定时1ms
- TL0=0X18;
- TH1 = 0xfd;
- TL1 = 0xfd;
- ET0=1;//打开定时器0中断允许
- EA=1;//打开总中断
- TR0=1;//打开定时器
- TR1 = 1;
- ES = 1;
-
- }
- void main()
- {
- uchar j = 0;
- time_uart_init();
- while(1)
- {
- // time = num[0]
- num[0] = 0;
- num[1] = time;
- smg_show(num);
- if(key == 0)
- {
- s = 1;
- while(!key);
- }
- if(over)
- {
- for(j = 0;j<6;j++)
- {
- led = ~led;
- delay(1000);
- }
- over = 0;
- }
- }
- }
- /*****************************************
- 定时器0中断函数
- *****************************************/
- void Timer0() interrupt 1
- {
- static uint i;
- TH0=0XFC; //给定时器赋初值,定时1ms
- TL0=0X18;
- i++;
- if(i==1000)
- {
- if(s)
- {
- time--;
- if(time<=0)
- {
- time = 0;
- over = 1;
- s = 0;
- }
-
-
- // over = 1;
- }
- i = 0;
- }
- }
- void serve() interrupt 4
- {
- uchar temp;
- if(RI)
- {
- RI = 0;
- temp = SBUF-0x30;
- time = temp;
- num[tt] = temp;
- tt++;
- if(tt==2)
- tt = 0;
- }
- }
复制代码
所有资料51hei提供下载:
PC机控制的倒计时秒表.zip
(25.43 KB, 下载次数: 20)
|