第十二届蓝桥杯单片机组模拟赛题

第十二届蓝桥杯单片机组模拟赛题

本次考试开始时间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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值