题目要求:
代码段:
main.c:
#include "main.h"
uchar LED_buff=0xff,ULN_buff=0x00,SEG_buff[8];
uchar mode = 0;
uint ult_temp_jl,ult_temp_cs=30;
uchar uart_buff[];
void main()
{
Sys_Init();
Timer2_Init();
Ultrasonic_Timer0Init();
UartInit();
// SendString("I am OK\r\n");
while(1)
{
/*****每100ms执行一次*****/
if(Task_100ms)
{
Task_100ms=0;
Dis_ctrl();
}
/*****每200ms执行一次*****/
if(Task_200ms)
{
Task_200ms=0;
if(ult_temp_jl>ult_temp_cs)
{
if((LED_buff&0x04)==0x00)
{
Display_Led(2,1);
}
else
{
Display_Led(2,0);
}
}
else
{
Display_Led(2,1);
}
}
/*****每500ms执行一次*****/
if(Task_500ms)
{
Task_500ms=0;
}
/*****每1s执行一次*****/
if(Task_1s)
{
Task_1s=0;
ult_temp_jl=Wave_Recv();
};
Key_ctrl();
}
}
void Key_ctrl() //KRY
{
switch(Keynum)//长短按
{
case 0x01:
mode++;mode=mode%2;
Keynum=Keynum&0x80;
break; //短按松开有效
case 0x02:
if(mode==0)
{
ult_temp_cs=ult_temp_jl;
}
Keynum=Keynum&0x80;
break;
case 0x03:
if(mode==1)
{
ult_temp_cs=ult_temp_cs+10;
}
Keynum=Keynum&0x80;
break;
case 0x04:
if(mode==1)
{
if(ult_temp_cs>=10)
ult_temp_cs=ult_temp_cs-10;
else if(ult_temp_cs<10)
ult_temp_cs=0;
}
Keynum=Keynum&0x80;
break;
case 0x0B:
Display_Relay(1);
printf("Distance:%dcm\r\n",ult_temp_jl);
// SendString(uart_buff);
Keynum=Keynum&0x80;
break; //短按松开有效
// case 0x41:Keynum=Keynum&0x80;break; //长按松开有效
// case 0x42:Keynum=Keynum&0x80;break;
// case 0x43:Keynum=Keynum&0x80;break;
case 0x4B:Display_Relay(0);Keynum=Keynum&0x80;break;
default:break;
}
}
void Dis_ctrl()
{
switch (mode)
{
case 0:Dis_Ult_jl();Display_Led(0,0);Display_Led(1,1);
break;
case 1:Dis_Ult_cs();Display_Led(0,1);Display_Led(1,0);
break;
default:
break;
}
}
void Dis_Ult_jl()
{
SEG_buff[0]=25;
SEG_buff[1]=1;
SEG_buff[2]=16;
SEG_buff[3]=16;
SEG_buff[4]=16;
SEG_buff[5]=ult_temp_jl/100%10;
SEG_buff[6]=ult_temp_jl/10%10;
SEG_buff[7]=ult_temp_jl%10;
}
void Dis_Ult_cs()
{
SEG_buff[0]=25;
SEG_buff[1]=2;
SEG_buff[2]=16;
SEG_buff[3]=16;
SEG_buff[4]=16;
SEG_buff[5]=ult_temp_cs/100%10;
SEG_buff[6]=ult_temp_cs/10%10;
SEG_buff[7]=ult_temp_cs%10;
}
main.h:
#ifndef __MAIN_H_
#define __MAIN_H_
#define uchar unsigned char
#define uint unsigned int
#define Y0 P2=(P2&0X1F)|0X00;
#define Y1 P2=(P2&0X1F)|0X20;
#define Y2 P2=(P2&0X1F)|0X40;
#define Y3 P2=(P2&0X1F)|0X60;
#define Y4 P2=(P2&0X1F)|0X80;
#define Y5 P2=(P2&0X1F)|0XA0;
#define Y6 P2=(P2&0X1F)|0XC0;
#define Y7 P2=(P2&0X1F)|0XE0;
#include "STC15F2K60S2.H"
#include "ui.h"
#include "ult.h"
#include "uart.h"
#include "intrins.h"
#include "stdio.h"
extern uchar LED_buff,ULN_buff,SEG_buff[8],E2P_buff[];
extern uint ult_temp_jl,ult_temp_cs;
void Dis_ctrl();
void Key_ctrl();
void Dis_Ult_jl();
void Dis_Ult_cs();
#endif
ui.c
#include "ui.h"
/************* 本地常量声明 **************/
uchar t_display[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J 20K L N o P 25U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uint T2ms_cnt,Task_100ms,Task_200ms,Task_500ms,Task_1s;
void Timer2_Init(void) //2毫秒@12.000MHz
{
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0x40; //设置定时初始值
T2H = 0xA2; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
IE2 |= 0x04; //使能定时器2中断
EA = 1;
}
uchar seg_cnt;
uchar Keynum,Key_temp,key_cnt;
void Timer2_Isr(void) interrupt 12
{
/**********每2ms执行一次**********/
Display_Seg(seg_cnt,SEG_buff[seg_cnt]);
seg_cnt++;
if(seg_cnt>=8)
{
LED_Screen(); //传输LED数据
ULN_Screen(); //传输ULN数据
seg_cnt=0;
}
T2ms_cnt++;
if(T2ms_cnt%50==0)
{
Task_100ms=1;
}
if(T2ms_cnt%100==0)
{
Task_200ms=1;
}
if(T2ms_cnt%250==0)
{
Task_500ms=1;
}
if(T2ms_cnt%500==0)
{
Task_1s=1;
T2ms_cnt=0;
}
Key_temp=Key_1x4();
if(Key_temp!=0)
{
key_cnt++;
if(key_cnt==20)
{
Keynum=Key_temp|0x80;
}
else if(key_cnt>120)
{
key_cnt=20;
Keynum=Key_temp|0xC0;
}
}
else
{
key_cnt=0;
Keynum=Keynum&0x7f;
}
}
uchar Key_1x4()
{
uchar hang=0,lie=0;
P33 = 1; P34 = 0; P35 = 0; P42 = 0 ; P44 = 0;
if(P33==0)
{
hang=1;
P33 = 0; P34 = 1; P35 = 1; P42 = 1 ; P44 = 1;
if(P44==0)
lie=1;
else if(P42==0)
lie=2;
else if(P35==0)
lie=3;
else if(P34==0)
lie=4;
}
P32 = 1; P42 = 0;
if(P32==0)
{
hang = 2;
P32 = 0; P42 = 1;
if(P42==0)
{
lie = 11;
}
}
if(hang!=0 && lie!=0)
{
return ( lie );
}
else
return 0;
}
void ULN_Screen()
{
Y5; P0=ULN_buff; Y0;
}
void Display_Buzzer(unsigned char sta)
{
if(sta==1)
ULN_buff |= 0x40;
else
ULN_buff &=~ 0x40;
}
void Display_Relay(unsigned char sta)
{
if(sta==1)
ULN_buff |= 0x10;
else
ULN_buff &=~ 0x10;
}
void LED_Screen()
{
Y4; P0=LED_buff; Y0;
}
void Display_Led(uchar wei,uchar dat)
{
if(dat==0)
{
LED_buff=LED_buff & ~(1<<wei);
}
else
{
LED_buff=LED_buff | (1<<wei) ;
}
}
void Display_Seg(uchar wei,uchar dat)
{
Y7; P0=0xff; Y0;
Y6; P0=0X01<<wei; Y0;
Y7; P0=~t_display[dat]; Y0;
}
void Sys_Init()
{
Y4; P0=0XFF; Y0;
Y5; P0=0X00; Y0;
Y6; P0=0X00; Y0;
}
uart.c:
#include "uart.h"
uchar rec_buff = 0x00 ;
void UartInit(void) //9600bps@12.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xC7; //设置定时初始值
TH1 = 0xFE; //设置定时初始值
ET1 = 0; //禁止定时器中断
ES = 1;
EA = 1;
TR1 = 1; //定时器1开始计时
}
void Usart_Send_String( unsigned char *Usart_String )
{
while(*Usart_String != '\0')
{
SBUF = *Usart_String;
while(TI == 0);
TI = 0;
Usart_String++;
}
}
void Sendbyte(uchar dat)
{
SBUF = dat;
while(TI == 0); //发送完成后置一跳出
TI = 0;
}
void SendString(uchar *str)
{
SBUF = *str;
while(*str != '\0')
{
Sendbyte(*str++);
}
}
void Uart_service() interrupt 4
{
if(RI == 1)//接受中断标志位
{
rec_buff = SBUF;
RI = 0;
}
// if(TI == 1)//发生中断标志位
// {
// TI = 0;
// }
}
//重定向,否则无法使用printf函数
char putchar(char ch)
{
Sendbyte(ch);
return ch;
}
ult.c:
#include "ult.h"
void Ultrasonic_Timer0Init(void)
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x00; //设置定时初值
TF0 = 0; //清除TF0标志
}
void Delay14us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 39;
while (--i);
}
unsigned int Wave_Recv(void)
{
uchar i;
uint val;
for(i=0;i<8;i++)
{
TX=1;
Delay14us();
TX=0;
Delay14us();
}
TR0=1;
while((RX==1)&&(TF0==0));
TR0=0;
if(TF0==1)
{
val=999; TF0=0;
TH0=0x00; TL0=0x00;
}
if(RX==0)
{
val=(TH0<<8 |TL0)*0.017;
TH0=0x00; TL0=0x00;
}
return val;
}