IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 蓝桥杯单片机:12届省赛 -> 正文阅读

[嵌入式]蓝桥杯单片机:12届省赛

请在网上找试题题目
main.c


#include "mycode.h"
#include "key.h"
#include "iic.h"
#include "onewire.h"
unsigned char page_flag=1,key_value;
unsigned short int count=0,T_count=0;
bit T_flag=0;
///定时1ms
void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x20;		//设置定时初始值
	TH0 = 0xD1;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;
}



void main()
{
	SystemInit();
	//UartInit();//115200 12Mhz
	Timer0Init();
	EA = 1;                  // 开启总中断
	while(1)
	{

		if(T_flag)Read_DS18B20_Tem();//温度数据获取}

		if(page_flag==1) {HC_138(7);	LED2=0;LED3=1;LED4=1;led_pattern(pattern);}
		if(page_flag==2) {HC_138(7);	LED2=1;LED3=0;LED4=1;led_pattern(pattern);}
		if(page_flag==3) {HC_138(7);	LED2=1;LED3=1;LED4=0;led_pattern(pattern);}

		key_value=get_key();
		switch(key_value)
		{
			case 9: key_value=0;pattern=!pattern;break;
			case 10:key_value=0;if(page_flag==2) tem_refer++;break;//界面二数值加
			case 13:key_value=0;page_flag++;if(page_flag>=4) page_flag=1;break;//界面切换
			case 14:key_value=0;if(page_flag==2) tem_refer--;break;//界面二减
			
		}

		
	}


	
}

void timer0() interrupt 1
{
	
	count++;
	T_count++;
	if(count>=23)
	{
		EA=0;ET0 = 0;
		switch(page_flag)
		{
			case 1:page_1();break;
			case 2:page_2();break;
			case 3:page_3();break;
		}
		count=0;
		EA=1;ET0 = 1;
	}
	if(T_count>=500)
	{
		T_count=0;
		T_flag=~T_flag;
	}
}




mycode.c


#include "mycode.h"
#include "onewire.h"
#include "iic.h"
unsigned char code numb[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0xbf,0x7f,0xc6,0x8c,0x88
};
unsigned char pattern=0;//模式选择
unsigned short int dac_out=0;//DAC输出值

unsigned char tem_refer=25;//温度参考值
//温度显示
void page_1()
{

	
	display(0,12);// C
	
	display(4,temp/1000);
	display(5,(temp/100)%10);
	display(5,11);//小数点
	display(6,temp/10%10);
	display(7,temp%10);
	

		HC_138(6); P0 = 0x00;
		HC_138(7); P0 = 0xff;
	
}
//参数设置界面
void page_2()
{
	display(0,13);// P

	display(6,tem_refer/10);
	display(7,tem_refer%10);
			HC_138(6); P0 = 0x00;
		HC_138(7); P0 = 0xff;
}

//DAC输出界面
void page_3()
{
	unsigned short int ds;
	display(0,14);// A
	if(pattern==0)//模式一 输出电压与温度相关
	{
		if((temp/100)<tem_refer)
		{
			Pcf8591_WriteDA(0);
			display(5,0);
			display(5,11);//小数点
			display(6,0);
			display(7,0);
		}
		else if((temp/100)>=tem_refer)
		{
			Pcf8591_WriteDA(255);
			display(5,5);
			display(5,11);//小数点
			display(6,0);
			display(7,0);
		}


		HC_138(6); P0 = 0x00;
		HC_138(7); P0 = 0xff;
	}
	if(pattern==1)//模式二  线性相关
	{
		//  1V = 51;
		if((temp/100)<=20)// 模式二情况下小于20°输出1V
		{
			Pcf8591_WriteDA(51);
			display(5,1);
			display(5,11);//小数点
			display(6,0);
			display(7,0);
		}
		else if((temp/100)<40)//  温度区间在 20到40度之间
		{
			ds=((float)(765.0*(temp/100)/100))-102;
				Pcf8591_WriteDA(ds);
			ds=(ds*100)/51;
			display(5,ds/100);
			display(5,11);//小数点
			display(6,ds%100/10);
			display(7,ds%10);
		}
		else if((temp/100)>=40) // 温度大于  40° 输出4V
		{
			Pcf8591_WriteDA(204);
			display(5,4);
			display(5,11);//小数点
			display(6,0);
			display(7,0);
		}
		
	
		HC_138(6); P0 = 0x00;
		HC_138(7); P0 = 0xff;
	}


}





void HC_138(unsigned char n)
{
	switch(n)
	{
		case 4: P2&=0x1f;P2|=0x80;break;
		case 5: P2&=0x1f;P2|=0xa0;break;
		case 6: P2&=0x1f;P2|=0xc0;break;
		case 7: P2&=0x1f;P2|=0xe0;break;
	}

}
void display(unsigned char s,unsigned char n)
{
	HC_138(7); P0 = 0xff;

	HC_138(6); P0 = 1<<s;
	HC_138(7); P0 = numb[n];
	delay_us(300);
///*****************
//	XBYTE[0x8000]=0xff;//消隐
//	
//	XBYTE[0xC000]=1<<s;
//	XBYTE[0x8000]=numb[n];
//	delay_ms(1);
	
///*************
}
void led_pattern(unsigned char t)
{
		if(t) {HC_138(4);	LED1=1;} 
		if(!t) {HC_138(4);	LED1=0;}
}
void SystemInit(void)
{
	HC_138(7);	P0=0xff;
	
	HC_138(5);	P0=0x00;
	
	HC_138(4); P0 = 0xff;
//		XBYTE[LED] = 0xff;
//		XBYTE[UL]	 = 0x00;
//		XBYTE[0x8000]=0xff;//消隐
}



void UartInit(void)		//115200bps@12.000MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x40;		//定时器时钟1T模式
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0xE6;		//设置定时初始值
	TH1 = 0xFF;		//设置定时初始值
	ET1 = 0;		//禁止定时器%d中断
	TR1 = 1;		//定时器1开始计时
	ES = 1;
}

void uart_byte(unsigned char c)
{
	ES = 0;
	SBUF=c;
	while(!TI);
	TI=0;
	ES = 1;
}

char putchar(char c)	//重写putchar函数
{
  uart_byte(c);	
  return c;
}


void delay_us(unsigned int t)		//@12.000MHz
{
	while(t--){
	_nop_();
	_nop_();
	_nop_();
	_nop_();}
}

void delay_ms(unsigned int t)		//@12.000MHz
{
	unsigned char i, j;
	while(t--){
	i = 12;
	j = 169;
	do
	{
		while (--j);
	} while (--i);}
}

mycode.h

#ifndef __MYCODE_H__
#define __MYCODE_H__
#include <reg52.h>
#include <stdio.h>
#include "absacc.h"
#include "intrins.h"

sfr AUXR = 0x8e;

#define 	LED				0xE000
#define   UL				0xA000

sbit LED1=P0^0;
sbit LED2=P0^1;
sbit LED3=P0^2;
sbit LED4=P0^3;
extern unsigned short int dac_out;
extern unsigned char tem_refer;//温度参考值
extern unsigned char pattern;


//温度显示
void page_1();

void page_2();

void page_3();

void led_pattern(unsigned char t);


void HC_138(unsigned char n);
void delay_us(unsigned int t);		//@12.000MHz
void delay_ms(unsigned int t)	;	//@12.000MHz
void UartInit(void)	;	//115200bps@12.000MHz
char putchar(char c);
void SystemInit(void);
void display(unsigned char s,unsigned char n);

#endif


iic.c

/*
  程序说明: IIC总线驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台 8051,12MHz
  日    期: 2011-8-9
*/

#include "reg52.h"
#include "intrins.h"
#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;    
}

//		dat = ((int)read_pcf8591(3))/51.0 * 100;    // 读取ad值		
//		
//		display(0,dat/100);        // 数据在数码管上显示
//		display(0,11);
//		display(1,dat%100/10);
//		display(2,dat%10);
unsigned char read_pcf8591(unsigned char ch)
{
	unsigned char dat;
	IIC_Start();            // I2C启动启动信号
	IIC_SendByte(0x90);     // PCF8591器件地址
	IIC_WaitAck();          // 等待应答
	IIC_SendByte(ch);     // 选择AIN0 通道选择
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0x91);     // 读取数据命令
	IIC_WaitAck();          // 等待应答 
	dat = IIC_RecByte();   // 读数据
	IIC_WaitAck(); 
	IIC_Stop();             // I2C停止信号
	return dat;
}
/**********  写入DA数据  ***********/
void Pcf8591_WriteDA(unsigned char dat)
{
	IIC_Start();              // I2C启动信号
	IIC_SendByte(0x90);       // 写入PCF8591器件地址
	IIC_WaitAck();            // 等待应答
	IIC_SendByte(0x40);	      // 使能DA输出允许
	IIC_WaitAck();        
	IIC_SendByte(dat);        // 写入模拟量大小
	IIC_WaitAck();
	IIC_Stop();               // I2C停止信号
}

void write_at24c02(unsigned char add,unsigned char datas)
{
  IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	
	IIC_SendByte(datas);
	IIC_WaitAck();
	
	IIC_Stop();	
}

unsigned char read_at24c02(unsigned char add)
{
  unsigned char datas;
	
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();

	IIC_Start();
	IIC_SendByte(0xa1);
	IIC_WaitAck();
	
  datas=IIC_RecByte();
	IIC_WaitAck();
	
	IIC_Stop();	
	
	return datas;
}



iic.h

#ifndef _IIC_H
#define _IIC_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 read_pcf8591(unsigned char ch);
void Pcf8591_WriteDA(unsigned char dat);
void write_at24c02(unsigned char add,unsigned char datas);
unsigned char read_at24c02(unsigned char add);
#endif

key.c

#include "key.h"
#include "mycode.h"
#include <reg52.h>
sfr P4 = 0xC0;

sbit P42 = P4^2;
sbit P44 = P4^4;
unsigned char keyvalue;
unsigned char get_key()
{
	unsigned char n,m;
		P3=0xf0;P44=1;P42=1;				//列信号置一,行信号置零
		if(P3!=0xF0||P44!=1||P42!=1)		//检测哪一列信号不为一
		{
			delay_ms(10);
				if(P3!=0xF0||P44!=1||P42!=1)
				{
					P3=0xf0;P44=1;P42=1;
					if(P44==0) n=1;					//判断哪一列被拉低
					else if(P42==0) n=2;
					else if((P3&0x20)==0) n=3;
					else if((P3&0X10)==0) n=4;
					
			
					P3=0x0F;P44=0;P42=0;			//行信号置零,列信号置一
					if((P3&0x01)==0) m=n;			//判断哪一行被拉低
					else if((P3&0x02)==0) m=n+4;
					else if((P3&0x04)==0) m=n+8;
					else if((P3&0x08)==0) m=n+12;
 
				//	count++;						//按键按下后执行的操作
 
					while(P3!=0x0F);				//松手判断
				
				}
				return m;
		}	
		return 0;
}

key.h

#ifndef __KEY_H__
#define __KEY_H__

unsigned char get_key();
#endif


onewire.c

/*
  程序说明: 单总线驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
  日    期: 2011-8-9
*/
#include "reg52.h"
#include "onewire.h"
#include "mycode.h"
sbit DQ = P1^4;  //单总线接口

//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
	t*=10;
	while(t--);
}

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

//DS18B20设备初始化
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}


*******************************
unsigned int temp;
void Read_DS18B20_Tem(void)
{
		float tp;  
	unsigned char TH,TL;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay_OneWire(800); 
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	
	TL=Read_DS18B20();	
	TH=Read_DS18B20();
	
	temp = TH;
	temp = temp <<8;
	temp |= TL;
	

	if(temp < 0)	// 当温度值为负数
  	{
		// 因为读取的温度是实际温度的补码,所以对其取反,加一		
		temp = ~temp;
		temp = temp + 1;
		tp = temp;
		temp = tp*0.0625*1000+5;// 扩大1000倍,四舍五入
		temp = temp/10;// 除10,即总共扩大100倍,相当于保留两位小数点
  	}
 	else
  	{			
		tp=temp; // 因为数据处理有小数点所以将温度赋给一个浮点型变量
		         // 如果温度是正的,那么正数的原码就是补码它本身
		temp = tp*0.0625*1000+5;// 四舍五入
		temp = temp/10;// 除10,即总共扩大100倍,相当于保留两位小数点
	}

}




onewire.h

#ifndef __ONEWIRE_H
#define __ONEWIRE_H

unsigned char rd_temperature(void);  //; ;
extern unsigned int temp;

void Read_DS18B20_Tem(void);
#endif

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:36:52  更:2022-04-09 18:37:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:51:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码