试题
代码
sys.h
cpp
#ifndef __SYS_H__
#define __SYS_H__
#include <STC15F2K60S2.H>
//sys.c
extern unsigned char UI; //界面标志(0湿度界面、1参数界面、2时间界面)
extern unsigned char time; //时间间隔(1s~10S)
extern bit ssflag; //启动/停止标志(0启动、1停止)
void init74hc138(unsigned char n);//译码器选通
void init(); //系统初始化
void relay(bit flag); //继电器吸合控制
void led(unsigned char n); //LED控制
void led_if(); //led指示灯
//iic.c
extern unsigned char shidu; //湿度值
extern unsigned char shidu_canshu; //湿度参数(30%~90%)
extern bit flag_relay; //继电器状态
unsigned char adc(unsigned char addr);//模数转换选通
float get_Vrb2(); //获取RB2电压值
void get_shidu(); //RB2电压值转换为湿度数据
//seg_key.c
extern unsigned char Seg_Buff[8];//数码管缓存
void Key_Loop(); //按键扫描
void Seg_Loop(); //数码管刷新
void seg_ui(); //界面选择
#endif
main.c
cpp
#include "sys.h"
bit flag_seg=0;
bit flag_key=0;
bit flag_shidu=0;
bit flag_relay_con=0;
void Timer0_Init(void) //100微秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x50; //设置定时初始值
TH0 = 0xFB; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA = 1;
}
void main(){
init();
Timer0_Init();
get_shidu();
while(1){
if(flag_seg){
flag_seg=0;
Seg_Loop();
}
if(flag_key){
flag_key=0;
Key_Loop();
seg_ui();
}
if(flag_shidu){
flag_shidu=0;
get_shidu();
seg_ui();
}
if(flag_relay_con){
flag_relay_con=0;
flag_relay=0;
relay(0);
}
led_if();
}
}
void Timer0_Isr(void) interrupt 1
{
static unsigned char count1=0;
static unsigned char count2=0;
static unsigned int count3=0;
static unsigned int count4=0;
count1++;count2++;count3++;
if(count1==2){
count1=0;
flag_seg=1;
}
if(count2==50){
count2=0;
flag_key=1;
}
if(count3==1000){
count3=0;
flag_shidu=1;
}
if(flag_relay){
count4++;
if(count4==((unsigned int)time*10000)){
count4=0;
flag_relay_con=1;
}
}
}
sys.c
cpp
#include "sys.h"
unsigned char UI=0;
unsigned char time=3;
bit ssflag=1;
void init74hc138(unsigned char n){
P2=(P2&0x1f)|(n<<5);
P2&=0x1f;
}
void init(){
P0=0x00;
init74hc138(5);
P0=0xff;
init74hc138(4);
}
void relay(bit flag){
if(flag) P0=0x10;
else P0=0x00;
init74hc138(5);
}
void led(unsigned char n){
P0=~(0x01<<(n-1));
init74hc138(4);
}
void led_if(){
switch(UI){
case 0:led(1);break;
case 1:led(2);break;
case 2:led(3);break;
}
if(!ssflag) led(8);
}
seg_key.c
cpp
#include "sys.h"
sbit COL1=P4^4;
sbit COL2=P4^2;
sbit ROW3=P3^2;
sbit ROW4=P3^3;
code unsigned char Seg_Table[]={
0xc0,//0
0xf9,//1
0xa4,//2
0xb0,//3
0x99,//4
0x92,//5
0x82,//6
0xf8,//7
0x80,//8
0x90,//9
0xc6,//C 10
0x86,//E 11
0x89,//H 12
0xff //熄灭 13
};
unsigned char Seg_Buff[8]={13,13,13,13,13,13,13,13};
unsigned char keyval,keyold,keyup,keydown;
unsigned char key_scan(){
COL1=0;COL2=1;
if(ROW4==0) return 4;
if(ROW3==0) return 5;
COL1=1;COL2=0;
if(ROW4==0) return 8;
if(ROW3==0) return 9;
return 0;
}
void Key_Loop(){
keyval=key_scan();
keydown=keyval&(keyold^keyval);
keyup=~keyval&(keyold^keyval);
//s4为界面切换按键
if(keyval==4&&keyold!=4){
UI++;
if(UI==3) UI=0;
}
//s5为启动停止按键
if(keyval==5&&keyold!=5){
ssflag=!ssflag;
}
//s8为减按键
if(keyval==8&&keyold!=8){
if(UI==1){
if(shidu_canshu>30)
shidu_canshu-=5;
else
shidu_canshu=90;
}else if(UI==2){
if(time>1)
time--;
else
time=10;
}
}
//s9为加按键
if(keyval==9&&keyold!=9){
if(UI==1){
if(shidu_canshu<90)
shidu_canshu+=5;
else
shidu_canshu=30;
}else if(UI==2){
if(time<10)
time++;
else
time=1;
}
}
keyold=keyval;
keyval=0;
}
void seg(unsigned char addr,num){
P0=0xff;
init74hc138(7);
P0=0x01<<addr;
init74hc138(6);
P0=Seg_Table[num];
init74hc138(7);
}
void Seg_Loop(){
static unsigned char i=0;
seg(i,Seg_Buff[i]);
i++;
if(i==8) i=0;
}
//湿度界面
void ui0(){
Seg_Buff[7]=shidu%10;
Seg_Buff[6]=shidu/10;
Seg_Buff[5]=13;
Seg_Buff[4]=13;
Seg_Buff[3]=13;
Seg_Buff[2]=13;
Seg_Buff[1]=13;
Seg_Buff[0]=10;//C
}
//参数界面
void ui1(){
Seg_Buff[7]=shidu_canshu%10;
Seg_Buff[6]=shidu_canshu/10;
Seg_Buff[5]=13;
Seg_Buff[4]=13;
Seg_Buff[3]=13;
Seg_Buff[2]=13;
Seg_Buff[1]=13;
Seg_Buff[0]=11;//E
}
//参数界面
void ui2(){
Seg_Buff[7]=time%10;
if(time<10)
Seg_Buff[6]=13;
else
Seg_Buff[6]=1;
Seg_Buff[5]=13;
Seg_Buff[4]=13;
Seg_Buff[3]=13;
Seg_Buff[2]=13;
Seg_Buff[1]=13;
Seg_Buff[0]=12;//H
}
void seg_ui(){
switch(UI){
case 0:ui0();break;
case 1:ui1();break;
case 2:ui2();break;
}
}
ii.c
cpp
#include "sys.h"
#include "intrins.h"
#define DELAY_TIME 10
sbit scl=P2^0;
sbit sda=P2^1;
unsigned char shidu;
unsigned char shidu_canshu=50;
bit flag_relay=0;
static void I2C_Delay(unsigned char n)
{
do
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
while(n--);
}
void I2CStart(void)
{
sda = 1;
scl = 1;
I2C_Delay(DELAY_TIME);
sda = 0;
I2C_Delay(DELAY_TIME);
scl = 0;
}
void I2CStop(void)
{
sda = 0;
scl = 1;
I2C_Delay(DELAY_TIME);
sda = 1;
I2C_Delay(DELAY_TIME);
}
void I2CSendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++){
scl = 0;
I2C_Delay(DELAY_TIME);
if(byt & 0x80){
sda = 1;
}
else{
sda = 0;
}
I2C_Delay(DELAY_TIME);
scl = 1;
byt <<= 1;
I2C_Delay(DELAY_TIME);
}
scl = 0;
}
unsigned char I2CReceiveByte(void)
{
unsigned char da;
unsigned char i;
for(i=0;i<8;i++){
scl = 1;
I2C_Delay(DELAY_TIME);
da <<= 1;
if(sda)
da |= 0x01;
scl = 0;
I2C_Delay(DELAY_TIME);
}
return da;
}
unsigned char I2CWaitAck(void)
{
unsigned char ackbit;
scl = 1;
I2C_Delay(DELAY_TIME);
ackbit = sda;
scl = 0;
I2C_Delay(DELAY_TIME);
return ackbit;
}
void I2CSendAck(unsigned char ackbit)
{
scl = 0;
sda = ackbit;
I2C_Delay(DELAY_TIME);
scl = 1;
I2C_Delay(DELAY_TIME);
scl = 0;
sda = 1;
I2C_Delay(DELAY_TIME);
}
unsigned char adc(unsigned char addr){
unsigned char temp;
I2CStart();
EA = 0;
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CStart();
I2CSendByte(0x91);
I2CWaitAck();
temp=I2CReceiveByte();
I2CSendAck(1);
I2CStop();
EA = 1;
return temp;
}
float get_Vrb2(){
return (float)adc(3)/255.0*5.0;
}
void get_shidu(){
float temp;
temp=get_Vrb2();
if(temp<1.0){
shidu=10;
}else if(temp<=4){
shidu=(unsigned char)(80.0/3.0*(temp-1)+10+0.5);
}else{
shidu=90;
}
if(ssflag){
flag_relay=0;
relay(0);
}else{
if(shidu<shidu_canshu&&!flag_relay){
flag_relay=1;
relay(1);
}
}
}
测评结果
尚待解决的问题
最后一项测评一直不正确,在板子上显示正常。感谢各位大佬们批评指导