第十二届蓝桥杯单片机组模拟赛题
第十二届蓝桥杯单片机组模拟赛题
@
本次考试开始时间3.19日10.30开始 我2.10分开写,到交卷共花费两小时,自我感觉状态正常
废话不多说直接给题目和完成代码
题目
本人对题目理解为两个通道的电压值采取应同时进行
代码
INLCUE
#ifndef _INCLUDE_H_
#define _INCLUDE_H_
#define u16 unsigned int
#define u8 unsigned char
#define LED 4
#define ULN 5
#define WEI 6
#define DUAN 7
extern u16 nbit[2]; //参数 VP1 VP3
extern u16 nnbit[2];//暂存参数
extern u8 nflag; // 0为数据界面 1为参数界面
extern u8 bflag; //0 为通道1 1为通道2
#include <STC15F2K60S2.H>
#include <intrins.h>
#include "smg.h"
#include "jp.h"
#include "iic.h"
#include "enable138.h"
#include "pcf8591.h"
#endif
使能函数
#include "enable138.h"
void enable(u8 x)
{
P2&= 0x1f;
P2|=(x << 5);
_nop_();
_nop_();
P2&= 0x1f;
}
主函数
#include "include.h"
u16 timer = 0;
u8 led = 0xff;
u8 nkey;
u16 nbit[2]= {250,300}; //参数 VP1 VP3
u16 nnbit[2]= {250,300};
u8 nflag = 0; // 0为数据界面 1为参数界面
u8 bflag = 0; //0 为通道1 1为通道2
u16 Vres[2]; // 采集电压值
u8 ch;
void Timer2Init(void) //2毫秒@12.000MHz
{
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0x40; //设置定时初值
T2H = 0xA2; //设置定时初值
AUXR |= 0x10; //定时器2开始计时
IE2 |= (1<<2); //允许T2中断
EA=1;//中断总开关
}
void allint()
{
P0 = 0xff; enable(LED);
P0 = 0x00; enable(ULN);
P0 = 0x00; enable(WEI);
P0 = 0xff; enable(DUAN);
}
void led_run()
{
P0 = led; enable(LED);
}
void main()
{
Timer2Init();
allint();
while(1)
{
keyfun(keyscan());
if (!bflag) ch = 1;
else ch = 3;
Vres[0] = PCF8591_ADC(3);
Vres[0] = Vres[0] *100/51;
_nop_(); _nop_();
_nop_(); _nop_();
Vres[1] = PCF8591_ADC(1);
Vres[1] = Vres[1] *100/51;
if (!nflag) //数据界面
{
led &= 0xf7;
if (!bflag)//通道1
{
led &= 0xfb;
buff_change(28,1,26,26,26,Vres[0]%1000/100+16,Vres[0]%100/10,Vres[0]%10);
}
else//通道3
{
led |= 0x04;
buff_change(28,3,26,26,26,Vres[1]%1000/100+16,Vres[1]%100/10,Vres[1]%10);
}
}
else//参数界面
{
led |= 0x08;
if (!bflag)//通道1
{
led &= 0xfb;
buff_change(29,1,26,26,26,nnbit[0]%1000/100+16,nnbit[0]%100/10,nnbit[0]%10);
}
else//通道3
{
led |= 0x04;
buff_change(29,3,26,26,26,nnbit[1]%1000/100+16,nnbit[1]%100/10,nnbit[1]%10);
}
}
if (Vres[0] > nbit[0]) led &= 0xfe;
else led |= 0x01;
if (Vres[1] > nbit[1]) led &= 0xfd;
else led |= 0x02;
if (Vres[0] > nbit[0]) led &= 0xef;
else led |= 0x10;
}
}
void T2_int() interrupt 12//2ms
{
smg_display();
led_run();
}
数码管显示
#include "smg.h"
u8 smg_flashset=0x00;//数码管flash bit8对应左1 bit0对用右1
u16 smg_flashT=200; //数码管闪烁周期 200个T2周期 400ms
u8 code smgDU[30] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff,0xbf,0xc1,0x8c};
// 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 灭 - U P
u8 smgWE[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//位选
static u16 num =0;
u16 smgbuff[8];
void buff_change(u16 d1,d2,d3,d4,d5,d6,d7,d8)//显示内容改变
{
smgbuff[0] = d1; smgbuff[1] = d2;
smgbuff[2] = d3; smgbuff[3] = d4;
smgbuff[4] = d5; smgbuff[5] = d6;
smgbuff[6] = d7; smgbuff[7] = d8;
}
void smg_display() //数码管内容显示
{
P0 = 0xff; enable(DUAN);
P0 = smgWE[num]; enable(WEI);
P0 = smgDU[smgbuff[num]]; enable(DUAN);
num++;
num &= 7;
}
独立键盘操作
#include "DJP.h"
//u8 trg
u8 cont;
static u8 k;
u8 keyscan()
{
u8 ReadData = P3^0xff;
u8 trg = ReadData&(ReadData^cont);
cont = ReadData;
return trg;
}
//按键功能
void keyfun(u8 aa)
{
if(aa & 0x01)
{
if (nflag)
if(nnbit[bflag]) nnbit[bflag] -= 20;
}
else if(aa & 0x02)
{
if (nflag)
if(nnbit[bflag] <=500) nnbit[bflag] += 20;
}
else if(aa & 0x04)
{
nflag = !nflag;
if (!nflag)
{
nbit[0] = nnbit[0];
nbit[1] = nnbit[1];
}
}
else if(aa & 0x08)
{
bflag = !bflag;
}
}
IIC协议(官方版)
官方文件中的
/*
程序说明: IIC总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include "iic.h"
#define DELAY_TIME 5
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
//总线引脚定义
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(i=0; i<8; 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(i=0; i<8; i++)
{
SCL = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
IIC_Delay(DELAY_TIME);
}
return da;
}
PCF8591
参照手册即可完成
#include "pcf8591.h"
u8 PCF8591_ADC(u8 ch)//AD ch为0 外部排针 1 光敏 2运放 3滑动电阻
{
u8 dat = 0;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40|ch);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
dat = IIC_RecByte();
IIC_SendAck(1);
EA = 1;
return dat;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步