青年旅舍网站开发背景及意义,jsp网站怎么运行,网站建设实训不足,ai国外教程网站题目要求#xff1a;
1、 基本要求 1.1 使用大赛组委会提供的国信长天单片机竞赛实训平台#xff0c;完成本试题的程序设计 与调试。 1.2 选手在程序设计与调试过程中#xff0c;可参考组委会提供的“资源数据包”。 1.3 请注意#xff1a; 程序编写、调试完成后选手…题目要求
1、 基本要求 1.1 使用大赛组委会提供的国信长天单片机竞赛实训平台完成本试题的程序设计 与调试。 1.2 选手在程序设计与调试过程中可参考组委会提供的“资源数据包”。 1.3 请注意 程序编写、调试完成后选手应通过考试系统提交完整、可编译的 Keil 工程文件。选手提交的工程文件应是最终版本要求 Keil 工程文件以准考证 号8 位数字命名工程文件夹内应包含以准考证号命名的 hex 文件该 hex 文件是成绩评审的依据。不符合以上文件提交要求的作品将被评为零分或者被 酌情扣分。 1.4 请勿上传与作品工程文件无关的其它文件。 2、 竞赛板配置要求 2.1将 IAP15F2K61S2 单片机内部振荡器频率设定为 12MHz。 2.2键盘工作模式跳线 J5 配置为 BTN 独立按键模式。 2.3扩展方式跳线 J13 配置为 IO 模式。 2.4 请注意 选手需严格按照以上要求配置竞赛板编写和调试程序 不符合以上 配置要求的作品将被评为零分或者被酌情扣分。 3、 硬件框图
系统硬件框图 4、 功能描述
4.1基本功能 1) 测量竞赛板上电位器 RB2 输出的模拟电压信号和 NE555 模块输出的频率信 号以数码管、LED 等外围设备进行数据呈现。 2) 频率测量功能需将竞赛板 J3-SIGNAL 引脚与 P34 引脚短接。P34 与 SIGNAL 的短接可以使用竞赛板上超声/红外切换等与本试题功能要求无关的跳线 帽完成。 3) 使用 PCF8591 测量电位器 RB2 的输出电压并根据试题要求通过其 DAC 功 能输出该电压值。 4) 电压、频率数据刷新时间要求 电压数据刷新时间≤0.5 秒。 频率数据刷新时间≤1 秒。 5) 电压、频率数据测量范围要求 电压数据测量范围电位器 RB2 输出的最小电压值到最大电压值。 频率数据测量范围NE555 模块输出的最低频率到最高频率值。 4.2显示功能
和之前一样建好工程文件夹里边包含User放工程文件mian.c、Driver存放底层文件如Led.cLed.h等 新建的工程先搭建框架可以先书写底层函数此次书写了五个函数并包含相应的头文件共十个底层文件 4.3按键功能 1) 按键功能说明 S4定义为“显示界面切换”按键按下 S4 按键切换选择频率显 示界面和电压显示界面按键 S4 切换模式如下图所示 S5定义为 PCF8591 DAC“输出模式切换”按键按下 S5DAC 输出 电压跟随电位器 RB2 输出电压 V RB2 变化而变化保持与 V RB2 电压值一致 再次按下 S5DAC 输出固定电压 2.0V不再跟随电位器 RB2 输出电压 变化。按键 S5 工作模式如下图所示 S6定义为“LED 指示灯功能控制”按键按下 S6 按键关闭或打开 LED 指示灯指示功能。按键 S6 工作模式如下图所示 备注关闭 LED 指示灯功能状态下所有 LED 指示灯熄灭。 S7定义为“数码管显示功能控制”按键按下 S7 按键关闭或打 开数码管显示功能。按键 S7 工作模式如下图所示 备注关闭数码管状态下所有数码管熄灭。 4.4LED 指示灯功能 1) 电压测量功能指示L1 点亮L2 熄灭 2) 频率测量功能指示L1 熄灭L2 点亮 3) 指示灯 L3 功能 4) 指示灯 L4 功能 5) 指示灯 L5 功能DAC 输出固定电压2.0V时L5 熄灭DAC 输出电压跟 随 RB2 电位器输出电压变化时L5 点亮。 6) 本试题未涉及的 LED 指示灯应处于熄灭状态。 4.5初始状态说明 1) 初始状态上电默认处于电压测量状态,数码管显示和 LED 指示功能启用。 2) 初始状态上电默认 PCF8591 DAC 芯片输出固定电压值 2.0V。 底层函数内容
1.初始化底层驱动专用文件 比如先用3个IO口控制74HC138译码器控制Y4为低电平当Y4为低电平时或非门74HC02控制Y4C为高电平使74HC573的OE端口有效OE端口有效时可使用P0口控制LED的亮灭。 可以去多了解74HC138译码器74HC02或非门74HC573八路输出透明锁存器的相关内容会更好理解 #include Init.h
//关闭外设 void System_Init() { P0 0xff; P2 P2 0x1f | 0x80; P2 0x1f; P0 0x00; P2 P2 0x1f | 0xa0; P2 0x1f; }
#include STC15F2K60S2.H void System_Init();
2.Led底层驱动专用文件 与初始化底层驱动专用文件同理需要了解对应的锁存器控制可以在使用的芯片数据手册查看 #include Led.h
void Led_Disp(unsigned char addr,enable) { static unsigned char temp 0x00; static unsigned char temp_old 0xff; if(enable) temp | 0x01 addr; else temp ~(0x01 addr); if(temp ! temp_old) { P0 ~temp; P2 P2 0x1f |0x80; P2 0x1f; temp_old temp; } }
#include STC15F2K60S2.H void Led_Disp(unsigned char addr,enable); 3.按键底层驱动专用文件 板子上的按键从按键4开始到按键19可根据实际硬件修改 #include Key.h
unsigned char Key_Read() { unsigned char temp 0; if(P33 0) temp 4; if(P32 0) temp 5; if(P31 0) temp 6; if(P30 0) temp 7; return temp; }
#include STC15F2K60S2.H
unsigned char Key_Read();
4.数码管底层驱动专用文件 这个板子使用的为共阳数码管若使用的为共阴数码管要更换对应的段码表和位选表与初始化底层驱动专用文件同理需要了解对应的锁存器控制可以在使用的芯片数据手册查看 #include Seg.h
unsigned char Seg_Dula[] {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//数码管段码储存数组 unsigned char Seg_Wela[] {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码管位码储存数组
void Seg_Disp(unsigned char wela,dula,point) { P0 0xff; // P2 P2 0x1f |0xe0; P2 0x1f; P0 Seg_Wela[wela]; P2 P2 0x1f |0xc0; P2 0x1f; P0 Seg_Dula[dula]; if(point) P0 0x7f; P2 P2 0x1f |0xe0; P2 0x1f; }
#include STC15F2K60S2.H
void Seg_Disp(unsigned char wela,dula,point); 5.数模转换底层驱动专用头文件
/* 程序说明: IIC总线驱动程序 软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台 805112MHz 日 期: 2011-8-9 */
#include iic.h #include intrins.h
#define DELAY_TIME 5
#define Photo_Res_Channel 0x41 #define Adj_Res_Channel 0x43 //总线引脚定义 sbit SDA P2^1; /* 数据线 */ sbit SCL P2^0; /* 时钟线 */
void IIC_Delay(unsigned char i) { do{_nop_();} while(i--); }
//总线启动条件 void IIC_Start(void) { SDA 1; SCL 1; IIC_Delay(DELAY_TIME); SDA 0; IIC_Delay(DELAY_TIME); SCL 0; }
//总线停止条件 void IIC_Stop(void) { SDA 0; SCL 1; IIC_Delay(DELAY_TIME); SDA 1; IIC_Delay(DELAY_TIME); }
//发送应答 void IIC_SendAck(bit ackbit) { SCL 0; SDA ackbit; // 0应答1非应答 IIC_Delay(DELAY_TIME); SCL 1; IIC_Delay(DELAY_TIME); SCL 0; SDA 1; IIC_Delay(DELAY_TIME); }
//等待应答 bit IIC_WaitAck(void) { bit ackbit; SCL 1; IIC_Delay(DELAY_TIME); ackbit SDA; SCL 0; IIC_Delay(DELAY_TIME); return ackbit; }
//通过I2C总线发送数据 void IIC_SendByte(unsigned char byt) { unsigned char i; for(i0; i8; i) { SCL 0; IIC_Delay(DELAY_TIME); if(byt 0x80) SDA 1; else SDA 0; IIC_Delay(DELAY_TIME); SCL 1; byt 1; IIC_Delay(DELAY_TIME); } SCL 0; }
//从I2C总线上接收数据 unsigned char IIC_RecByte(void) { unsigned char i, da; for(i0; i8; i) { SCL 1; IIC_Delay(DELAY_TIME); da 1; if(SDA) da | 1; SCL 0; IIC_Delay(DELAY_TIME); } return da; }
//函数名ADC转换函数这个要自己写 //入口参数要进行转换的通道控制位 //返回值ADC转换的数值 //函数功能对指定的通道进行ADC转换函数返回转换的数值
unsigned char Ad_Read(unsigned char addr)//AD读取要有一个入口参数 { unsigned char temp;//接收返回值变量 IIC_Start();//启动单总线 IIC_SendByte(0x90);//发送一个0x90,告诉单片机要写数据了 IIC_WaitAck();//等待应答 IIC_SendByte(addr);//发送一个地址获取的数据 IIC_WaitAck();//等待应答 IIC_Start();//启动单总线 IIC_SendByte(0x91);//写一个0x91 IIC_WaitAck();//等待应答 temp IIC_RecByte();//读取数据 IIC_SendAck(1);//发送一个非应答信号 IIC_Stop();//停止 return temp; }
//函数名DAC转换函数这个要自己写 //入口参数要进行转换的数值 //返回值无 //函数功能对入口参数要转换的DA数据进行转换
void Da_Write(unsigned char dat) { IIC_Start();//启动单总线 IIC_SendByte(0x90);//发送一个0x90,告诉单片机要写数据了 IIC_WaitAck();//等待应答 IIC_SendByte(0x41);//使能DAC转换 IIC_WaitAck();//等待应答 IIC_SendByte(dat);//发送一个地址获取的数据 IIC_WaitAck();//等待应答 IIC_Stop(); } //头文件 头文件都需要自己编写目前最新的一版赛点资源包没有头文件。
#include STC15F2K60S2.H void IIC_Start(void); void IIC_Stop(void); bit IIC_WaitAck(void); void IIC_SendAck(bit ackbit); void IIC_SendByte(unsigned char byt); unsigned char IIC_RecByte(void);
unsigned char Ad_Read(unsigned char addr); void Da_Write(unsigned char dat);
工程主函数内容
1.头文件声明把需要用到的头文件添加进来
#include STC15F2K60S2.H//单片机寄存器专用头文件 #include Init.h//初始化底层驱动专用头文件 #include Led.h//Led底层驱动专用头文件 #include Key.h//按键底层驱动专用头文件 #include Seg.h//数码管底层驱动专用头文件 #include iic.h//数模转换底层驱动专用头文件
2.变量声明把需要用到的所有变量现在这里进行声明
unsigned char Key_Val,Key_Old,Key_Down,Key_Up;//按键专用变量 unsigned char Seg_Pos;//数码管扫描专用变量 unsigned char Key_Slow_Down;//按键减速专用变量 unsigned char Seg_Slow_Down;//数码管减速专用变量 unsigned char Seg_Buf[8] {10,10,10,10,10,10,10,10};//数码管显示数据存放数组 unsigned char Seg_Point[8] {0,0,0,0,0,0,0,0};//数码管小数点数据存放数组 unsigned char ucLed[8] {0,0,0,0,0,0,0,0};//Led显示数据存放数组 unsigned int Timer_1000ms;//1000毫秒计时变量 unsigned int Freq;//实时频率值 bit Seg_Disp_Mode;//数码管显示模式变量 0-频率显示界面 1-电压显示界面 float Voltage;//实时电压值 bit Output_Mode;//DAC输出模式标志位 0-固定2V 1-随AD变化 float Vlotage_Output;//实时输出电压 bit Seg_Flag 1;//数码管使能标志位 默认开启 bit Led_Flag 1;//Led使能标志位 默认开启
3.按键处理函数在这里编写按键控制的函数
void Key_proc() { if(Key_Slow_Down)return; Key_Slow_Down 1;//键盘减速程序 Key_Val Key_Read();//实时读取键码值 Key_Down Key_Val (Key_Val ^ Key_Old);//捕捉按键下降沿 Key_Up ~ Key_Val (Key_Val ^ Key_Old);//捕捉按键上升沿 Key_Old Key_Val;//辅助扫描变量 switch (Key_Down) { case 4://显示界面切换 Seg_Disp_Mode ^ 1; break; case 5://输出模式切换 Output_Mode ^ 1; break; case 6://LED 指示灯功能控制 Led_Flag ^ 1; break; case 7://数码管显示功能控制 Seg_Flag ^ 1; break; }
}
4.信息处理函数需要使用到到的函数进行简单的预处理
void Seg_Proc() { unsigned char i 3;//高位熄灭专用变量 if(Seg_Slow_Down)return; Seg_Slow_Down 1;//数码管减速程序 /*信息读取区*/ Voltage Ad_Read(0x43) / 51.0;//实时获取电压值 if(Output_Mode 0)//处于固定输出模式 Vlotage_Output 2; else//处于随AD输出模式 Vlotage_Output Voltage; /*数据显示区*/ Seg_Point[5] Seg_Disp_Mode;//小数点使能 if(Seg_Disp_Mode 0)//频率显示 { Seg_Buf[0] 11;//显示F Seg_Buf[3] Freq / 10000 % 10; Seg_Buf[4] Freq / 1000 % 10; Seg_Buf[5] Freq / 100 % 10; Seg_Buf[6] Freq / 10 % 10; Seg_Buf[7] Freq % 10; while(Seg_Buf[i] 0)//数码管高位熄灭 { Seg_Buf[i] 10; if(i 7)break;//保证最低位不熄灭 避免程序卡死 } } else//处于电压显示界面 { Seg_Buf[0] 12;//显示U Seg_Buf[3] 10; Seg_Buf[4] 10; Seg_Buf[5] (unsigned char)Voltage; Seg_Buf[6] (unsigned int)(Voltage * 100) / 10 % 10; Seg_Buf[7] (unsigned int)(Voltage * 100) % 10; } }
5.其他函数其他编写的函数在这里书写会比较方便理解
void Led_Proc() { unsigned char i;//For循环专用变量 /* DAC相关 */ Da_Write(Vlotage_Output * 51);//实时输出电压值 /* Led相关 */ for(i0;i2;i) //互斥点亮 ucLed[i] (i Seg_Disp_Mode); ucLed[2] ((Voltage 1.5 Voltage 2.5) || (Voltage 3.5)); ucLed[3] ((Freq 1000 Freq 5000) || (Freq 10000)); ucLed[4] Output_Mode; }
6.定时器中断初始化函数 这个可以使用STC的定时器计算那里生成c代码后面要自己添加ET0,EA打开中断这里使用定时器0计数定时器1计时
/* 定时器1中断初始化函数 */ void Timer1Init(void) //1毫秒12.000MHz { AUXR 0xBF; //定时器时钟12T模式 TMOD 0x0F; //设置定时器模式 TL1 0x18; //设置定时初值 TH1 0xFC; //设置定时初值 TF1 0; //清除TF1标志 TR1 1; //定时器1开始计时 ET1 1; EA 1; }
//频率测量定时器配置/* 定时器0中断初始化函数 */
void Timer0Init(void) //0毫秒12.000MHz { TMOD 0xF0; //设置定时器模式 TMOD | 0x05; //GATE 0 计数模式 16位不自动重装//设置计数模式 TL0 0x00; //设置定时初值 TH0 0x00; //设置定时初值 TF0 0; //清除TF0标志 TR0 1; //定时器0开始计时 }
7.定时器1中断服务函数 为了定时执行特定的任务如此处设置了定时的时间触发了数码管和LED产生特定反应//中断在测试时可以先注释掉但是这里按键状态有延时测试按键时可以解除注释void Timer1server()interrupt 3 { if(Key_Slow_Down 10)Key_Slow_Down 0;//键盘减速专用 if(Seg_Slow_Down 500)Seg_Slow_Down 0;//数码管减速专用 if(Seg_Pos 8)Seg_Pos 0;//数码管显示专用 if(Seg_Flag 1)//数码管使能 Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]); else Seg_Disp(Seg_Pos,10,0);//熄灭所有数码管 if(Led_Flag 1)//Led使能 Led_Disp(Seg_Pos,ucLed[Seg_Pos]); else Led_Disp(Seg_Pos,0);//熄灭所有Led if(Timer_1000ms 1000)//实时读取频率值 { Timer_1000ms 0; Freq TH0 8 | TL0; TH0 TL0 0; } }
8.主函数Main调用书写的函数实现所需的相应功能
void main() { Sys_Init(); Timer0Init(); Timer1Init(); while(1) { Key_proc(); Seg_Proc(); Led_Proc(); } }
NE555相关资料 通过Rb3调节电压测量可以在这个图的19,20脚测量。 GATE 0,定时器计数C/T 1连接P34。 根据这两个信息可知定时器0设置成0101的模式使用计数器。
定时器1计时