栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

蓝桥杯单片机第10届国赛程序题参考答案

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

蓝桥杯单片机第10届国赛程序题参考答案

        答案仅供参考,有错误欢迎指正,非常感谢!!!

        文件较多,代码较长,感谢查看!!!

目录

题目分析

main.h

main.c

Init.h

Init.c

SMG.h

SMG.c

DSQ.h

DSQ.c

YanShi.h

YanShi.c

JZKey.h

JZKey.c

onewire.h

onewire.c

iic.h

iic.c

CSB.h

CSB.c

ChuanKou.h

ChuanKou.c

题目分析

        这套题说真滴,是真的恶心,有一说一哈,估计能想出这套题的老师也是真的骚。最后的串口出现的问题,给我整了一天,人直接被整傻了,不过还好都给整出来了。

        这里重点讨论一下接收指令和返回数据的格式。

它题目要求是这样子的:

 我的理解是:“rn”不作转义字符,看到是啥,返回就是啥。还有,这套题我用了3个定时器。

main.h
#ifndef __MAIN_H_
#define __MAIN_H_

#define uchar unsigned char
#define uint unsigned int
	
#include 
#include 
#include 

#include "Init.h"
#include "SMG.h"
#include "DSQ.h"
#include "YanShi.h"
#include "JZKey.h"
#include "onewire.h"
#include "iic.h"
#include "CSB.h"
#include "ChuanKou.h"

void SMG_XianShi();
void LED_XianShi();

#endif

main.c
#include "main.h"

uchar flag2=0;//定时器2标志位
uchar key_num=0;//键值
uchar jie_mian=0;//界面
uchar S13_AnTime_flag=0;//S13按键按下的时间标志位
uchar S12_AnTime_flag=0;//S12按键按下的时间标志位
uchar xian_shi=0;//显示
uchar can_shu=0;//参数
char WenDu_CanShu=30;//温度参数
char JuLi_CanShu=35;//距离参数
uint ci_shu=0;//次数
uchar DAC_KaiQi_flag=1;//DAC输出功能开启标志位
long int S12_KeyTime=0;//按键12按下的时间
long int S13_KeyTime=0;//按键13按下的时间
float wen_du;//温度
int WenDu_XianShi;//显示的温度
int ju_li;//距离
int WenDu_CanShu1=30;//温度参数,确定值
int JuLi_CanShu1=35;//距离参数,确定值
uchar zhi_ling[8];//接收到的指令
uchar i=0;//指令字符串的下标
uchar code ShuJu_ZhiLing[]="ST\r\n";//数据指令
uchar code CanShu_ZhiLing[]="PARA\r\n";//参数指令
uchar ZhiLing_TF=1;//指令的对错判断结果
uchar CSB_CaiJi_flag=100;//超声波采集虚拟中断标志位
uchar ChuanKou_time=0;//串口接收到错误指令的等待时间

void main(){
	uchar j;
	char FanHui_date[15];//向串口返回的数据
	uchar key_num_old;//上一个键值
	Init_BZ();
	SMG_Init();
	ChuanKou_Init();
	DSQ_2_Init();
	JZKey_Init();
	while(1){
		//采集温度
		wen_du=DS18B20_GetWenDu();
		WenDu_XianShi=wen_du*100;
		
		//采集键值
		key_num_old=key_num;
		key_num=JZKey_GetKeynum();
		if(key_num!=key_num_old||S13_AnTime_flag!=0||S12_AnTime_flag!=0){
			if(S13_AnTime_flag==1){//S13按键为短按
				jie_mian++;
				jie_mian=jie_mian%2;
				xian_shi=0;
				can_shu=0;
				S13_AnTime_flag=0;
				if(jie_mian==0){
					if(WenDu_CanShu!=WenDu_CanShu1||JuLi_CanShu!=JuLi_CanShu1){//如果参数发生变化
						ci_shu++;//参数变动次数加l
						IIC_EEPROM_XieDate(10,ci_shu&0x00ff);
						Delay10ms();
						IIC_EEPROM_XieDate(11,ci_shu>>8);
					}
					WenDu_CanShu1=WenDu_CanShu;
					JuLi_CanShu1=JuLi_CanShu;
				}
			}
			else if(S13_AnTime_flag==2){//S13按键为长按
				DAC_KaiQi_flag++;//任何界面状态下,长按S13按键,可切换 DAC输出功能
				DAC_KaiQi_flag=DAC_KaiQi_flag%2;
				S13_AnTime_flag=0;
			}
			else if(S12_AnTime_flag==1){//S12按键为短按
				if(jie_mian){//参数界面
					can_shu++;
					can_shu=can_shu%2;
				}
				else{//数据界面
					xian_shi++;
					xian_shi=xian_shi%3;
				}
				S12_AnTime_flag=0;
			}
			else if(S12_AnTime_flag==2){//S12为长按
				ci_shu=0;//任何界面状态下,长按S12按键,可重置参数变动次数记录为0次。
				S12_AnTime_flag=0;
				IIC_EEPROM_XieDate(10,0);
				Delay10ms();
				IIC_EEPROM_XieDate(11,0);
			}
			else if(key_num==16){//按下S16
				if(jie_mian==1&&can_shu==0){//在温度参数界面下,按下S16,温度参数减少2℃.
					WenDu_CanShu=WenDu_CanShu-2;
					if(WenDu_CanShu<0){
						WenDu_CanShu=WenDu_CanShu+100;
					}
				}
				else if(jie_mian==1&&can_shu==1){//在距离参数界面下,按下S16,距离参数减少5cm
					JuLi_CanShu=JuLi_CanShu-5;
					if(JuLi_CanShu<0){
						JuLi_CanShu=JuLi_CanShu+100;
					}
				}
			}
			else if(key_num==17){//按下S17
				if(jie_mian==1&&can_shu==0){//在温度参数界面下,按下S17,温度参数增加2℃。
					WenDu_CanShu=WenDu_CanShu+2;
					WenDu_CanShu=WenDu_CanShu%100;
				}
				else if(jie_mian==1&&can_shu==1){//在距离参数界面下,接下S17,距离参数增加5cm。
					JuLi_CanShu=JuLi_CanShu+5;
					JuLi_CanShu=JuLi_CanShu%100;
				}
			}
		}
		
		//采集距离
		if(CSB_CaiJi_flag>=100){
			ju_li=CSB_GetJuLi();
			if(DAC_KaiQi_flag){//DAC输出功能启动状态
				if(ju_li<=JuLi_CanShu1){
					IIC_DAC_XieDate(102);
				}
				else{
					IIC_DAC_XieDate(204);
				}
			}
			else{//DAC输出功能关闭状态
				IIC_DAC_XieDate(0.4*51.0);
			}
			CSB_CaiJi_flag=0;
		}
		
		//判断错误的指令
		if(ChuanKou_time>=100){
			ChuanKou_time=0;
			i=0;
			memset(zhi_ling,'',sizeof(zhi_ling));
			ChuanKou_FS_NeiRong("ERROR\r\n");
		}
		
		//指令对比,返回数据
		if(i==6){//判断是否接收到"STrn"或者"PARAr"
			Delay10ms();
			if(i==6){
				ZhiLing_TF=1;
				for(j=0;j0&&i<6)||i==7||i>8){//串口接收到错误的内容,计时
		ChuanKou_time++;
	}
	else{
		ChuanKou_time=0;
	}
	
	if(key_num==12){//按键12被按下,计算按下的时间
		S12_KeyTime++;
	}
	else{
		if(S12_KeyTime>0&&S12_KeyTime<=1000){//S12为短按
			S12_AnTime_flag=1;
		}
		else if(S12_KeyTime>1000){//S12为长按
			S12_AnTime_flag=2;
		}
		S12_KeyTime=0;
	}
	
	if(key_num==13){//按键13被按下,计算按下的时间
		S13_KeyTime++;
	}
	else{
		if(S13_KeyTime>0&&S13_KeyTime<=1000){//S13为短按
			S13_AnTime_flag=1;
		}
		else if(S13_KeyTime>1000){//S13为长按
			S13_AnTime_flag=2;
		}
		S13_KeyTime=0;
	}
	
	if(flag2>=1){
		flag2=0;
		SMG_XianShi();
		LED_XianShi();
	}
}

void ChuanKou_ZD() interrupt 4{
	if(RI==1){
		zhi_ling[i]=SBUF;
		i++;
		RI=0;
	}
}

void SMG_XianShi(){//数码管的界面显示
	if(jie_mian==0){//数据界面
		switch(xian_shi){
			case 0:{//温度数据显示
				if(WenDu_XianShi>=10000){
					SMG_Show(12,16,16,WenDu_XianShi/10000,(WenDu_XianShi/1000)%10,((WenDu_XianShi/100)%10)+32,(WenDu_XianShi/10)%10,WenDu_XianShi%10);
				}
				else if(WenDu_XianShi>=1000){
					SMG_Show(12,16,16,16,WenDu_XianShi/1000,((WenDu_XianShi/100)%10)+32,(WenDu_XianShi/10)%10,WenDu_XianShi%10);
				}
				else if(WenDu_XianShi>=0){
					SMG_Show(12,16,16,16,16,(WenDu_XianShi/100)+32,(WenDu_XianShi/10)%10,WenDu_XianShi%10);
				}
				else if(WenDu_XianShi>-1000){
					SMG_Show(12,16,16,16,17,((-WenDu_XianShi)/100)+32,((-WenDu_XianShi)/10)%10,(-WenDu_XianShi)%10);
				}
				else if(WenDu_XianShi>-10000){
					SMG_Show(12,16,16,17,(-WenDu_XianShi)/1000,(((-WenDu_XianShi)/100)%10)+32,((-WenDu_XianShi)/10)%10,(-WenDu_XianShi)%10);
				}
				break;
			}
			case 1:{//距离数据显示
				SMG_Show(21,16,16,16,16,16,ju_li/10,ju_li%10);
				break;
			}
			case 2:{//变更次数显示
				if(ci_shu>=10000){
					SMG_Show(22,16,16,ci_shu/10000,(ci_shu/1000)%10,(ci_shu/100)%10,(ci_shu/10)%10,ci_shu%10);
				}
				else if(ci_shu>=1000){
					SMG_Show(22,16,16,16,ci_shu/1000,(ci_shu/100)%10,(ci_shu/10)%10,ci_shu%10);
				}
				else if(ci_shu>=100){
					SMG_Show(22,16,16,16,16,ci_shu/100,(ci_shu/10)%10,ci_shu%10);
				}
				else if(ci_shu>=10){
					SMG_Show(22,16,16,16,16,16,ci_shu/10,ci_shu%10);
				}
				else if(ci_shu>=0){
					SMG_Show(22,16,16,16,16,16,16,ci_shu);
				}
				break;
			}
		}
	}
	else{//参数界面
		if(can_shu){//距离参数
			SMG_Show(24,16,16,2,16,16,JuLi_CanShu/10,JuLi_CanShu%10);
		}
		else{//温度参数
			SMG_Show(24,16,16,1,16,16,WenDu_CanShu/10,WenDu_CanShu%10);
		}
	}
}

void LED_XianShi(){//LED显示
	uchar L1=0xff;
	uchar L2=0xff;
	uchar L3=0xff;
	if(wen_du>WenDu_CanShu1){//当温度数据超过温度参数时,指示灯Ll点亮,否则熄灭。
		L1=0xfe;
	}
	else{
		L1=0xff;
	}
	if(ju_li 

Init.h
#ifndef __INIT_H_
#define __INIT_H_

#include 

void Init_BZ();

#endif

Init.c
#include "Init.h"

void Init_BZ(){
	P2=(P2&0x1f)|0xa0;
	P0=0x00;
	P2=(P2&0x1f)|0x80;
	P0=0xff;
}

SMG.h
#ifndef __SMG_H_
#define __SMG_H_

#include 

void SMG_Init();
void SMG_Show(unsigned char n1,n2,n3,n4,n5,n6,n7,n8);

#endif

SMG.c
#include "SMG.h"

unsigned char code SMG_ZK[]={                       //????
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y
    0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
    0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

void SMG_Init(){
	P2=(P2&0x1f)|0xc0;
	P0=0xff;
	P2=(P2&0x1f)|0xe0;
	P0=0xff;
}

void SMG_Show(unsigned char n1,n2,n3,n4,n5,n6,n7,n8){
	static unsigned char i=0;
	i++;
	i=i%8;
	P2=(P2&0x1f)|0xc0;
	switch(i){
		case 1:{
			P0=0x01;
			P2=(P2&0x1f)|0xe0;
			P0=~SMG_ZK[n1];
			break;
		}
		case 2:{
			P0=0x02;
			P2=(P2&0x1f)|0xe0;
			P0=~SMG_ZK[n2];
			break;
		}
		case 3:{
			P0=0x04;
			P2=(P2&0x1f)|0xe0;
			P0=~SMG_ZK[n3];
			break;
		}
		case 4:{
			P0=0x08;
			P2=(P2&0x1f)|0xe0;
			P0=~SMG_ZK[n4];
			break;
		}
		case 5:{
			P0=0x10;
			P2=(P2&0x1f)|0xe0;
			P0=~SMG_ZK[n5];
			break;
		}
		case 6:{
			P0=0x20;
			P2=(P2&0x1f)|0xe0;
			P0=~SMG_ZK[n6];
			break;
		}
		case 7:{
			P0=0x40;
			P2=(P2&0x1f)|0xe0;
			P0=~SMG_ZK[n7];
			break;
		}
		case 0:{
			P0=0x80;
			P2=(P2&0x1f)|0xe0;
			P0=~SMG_ZK[n8];
			break;
		}
	}
	P2=(P2&0x1f)|0x00;
}

DSQ.h
#ifndef __DSQ_H_
#define __DSQ_H_

#include 

void DSQ_2_Init();

#endif

DSQ.c
#include "DSQ.h"

void DSQ_2_Init(){
	AUXR |= 0x04;		//定时器时钟1T模式
	T2L = 0x20;		//设置定时初值
	T2H = 0xD1;		//设置定时初值
	AUXR |= 0x10;		//定时器2开始计时
	EA=1;
	IE2=0x04;//允许定时器2中断
}

YanShi.h
#ifndef __YANSHI_H_
#define __YANSHI_H_

#include 
#include "intrins.h"

void Delay10ms();

#endif

YanShi.c
#include "YanShi.h"

void Delay10ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 117;
	j = 184;
	do
	{
		while (--j);
	} while (--i);
}

JZKey.h
#ifndef __JZKEY_H_
#define __JZKEY_H_

#include "YanShi.h"

void JZKey_Init();
unsigned char JZKey_GetKeynum();

#endif

JZKey.c
#include "JZKey.h"

void JZKey_Init(){
	P30=1;
	P31=1;
	P32=1;
	P33=1;
	P34=0;
	P35=0;
	P42=0;
	P44=0;
}

unsigned char JZKey_GetKeynum(){
	unsigned char key_num=0;
	if(P30==0){
		P30=0;
		P34=1;
		P35=1;
		P42=1;
		P44=1;
		if(P34==0){
			Delay10ms();
			if(P34==0){
				key_num=19;
			}
		}
		else if(P35==0){
			Delay10ms();
			if(P35==0){
				key_num=15;
			}
		}
		else if(P42==0){
			Delay10ms();
			if(P42==0){
				key_num=11;
			}
		}
		else if(P44==0){
			Delay10ms();
			if(P44==0){
				key_num=7;
			}
		}
	}
	else if(P31==0){
		P31=0;
		P34=1;
		P35=1;
		P42=1;
		P44=1;
		if(P34==0){
			Delay10ms();
			if(P34==0){
				key_num=18;
			}
		}
		else if(P35==0){
			Delay10ms();
			if(P35==0){
				key_num=14;
			}
		}
		else if(P42==0){
			Delay10ms();
			if(P42==0){
				key_num=10;
			}
		}
		else if(P44==0){
			Delay10ms();
			if(P44==0){
				key_num=6;
			}
		}
	}
	else if(P32==0){
		P32=0;
		P34=1;
		P35=1;
		P42=1;
		P44=1;
		if(P34==0){
			Delay10ms();
			if(P34==0){
				key_num=17;
			}
		}
		else if(P35==0){
			Delay10ms();
			if(P35==0){
				key_num=13;
			}
		}
		else if(P42==0){
			Delay10ms();
			if(P42==0){
				key_num=9;
			}
		}
		else if(P44==0){
			Delay10ms();
			if(P44==0){
				key_num=5;
			}
		}
	}
	else if(P33==0){
		P33=0;
		P34=1;
		P35=1;
		P42=1;
		P44=1;
		if(P34==0){
			Delay10ms();
			if(P34==0){
				key_num=16;
			}
		}
		else if(P35==0){
			Delay10ms();
			if(P35==0){
				key_num=12;
			}
		}
		else if(P42==0){
			Delay10ms();
			if(P42==0){
				key_num=8;
			}
		}
		else if(P44==0){
			Delay10ms();
			if(P44==0){
				key_num=4;
			}
		}
	}
	JZKey_Init();
	return key_num;
}

onewire.h
#ifndef __ONEWIRE_H
#define __ONEWIRE_H

#include 

sbit DQ = P1^4;  

unsigned char rd_temperature(void);  
float DS18B20_GetWenDu();

#endif

onewire.c
#include "onewire.h"

//单总线内部延时函数
void Delay_OneWire(unsigned int t)  
{
	unsigned char i;
	while(t--){
		for(i=0;i<12;i++);
	}
}

//单总线写操作
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);
}

//单总线读操作
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;
}

float DS18B20_GetWenDu(){
	float wen_du,zheng_shu,xiao_shu;
	unsigned char di,gao;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay_OneWire(200);
	
	init_ds18b20();
	IE2=0x00;
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	di=Read_DS18B20();
	gao=Read_DS18B20();
	IE2=0x04;
	if(gao>=248){
		gao=~gao;
		di=~di;
		if(di==0xff){
			di=0;
			gao++;
		}
		else{
			di++;
		}
		zheng_shu=((gao<<4)|(di>>4))*1.0;
		xiao_shu=(di&0x0f)*0.0625;
		wen_du=-(zheng_shu+xiao_shu);
	}
	else{
		zheng_shu=((gao<<4)|(di>>4))*1.0;
		xiao_shu=(di&0x0f)*0.0625;
		wen_du=(zheng_shu+xiao_shu);
	}
	return wen_du;
}

iic.h
#ifndef _IIC_H
#define _IIC_H

#include 
#include "intrins.h"

sbit SDA = P2^1;
sbit SCL = P2^0;

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 IIC_ADC_GetDate(unsigned char di_zhi);
void IIC_DAC_XieDate(unsigned char date);
void IIC_EEPROM_XieDate(unsigned char di_zhi,unsigned char date);
unsigned char IIC_EEPROM_GetDate(unsigned char di_zhi);

#endif

iic.c
#include "iic.h"

#define DELAY_TIME 5

//I2C总线内部延时函数
void IIC_Delay(unsigned char i)
{
    do{_nop_();}
    while(i--);        
}

//I2C总线启动信号
void IIC_Start(void)
{
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;	
}

//I2C总线停止信号
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;  					
    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;    
}

unsigned char IIC_ADC_GetDate(unsigned char di_zhi){
	unsigned char date;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(di_zhi);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	date=IIC_RecByte();
	IIC_SendAck(1);
	IIC_WaitAck();
	IIC_Stop();
	return date;
}

void IIC_DAC_XieDate(unsigned char date){
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40);
	IIC_WaitAck();
	IIC_SendByte(date);
	IIC_WaitAck();
	IIC_Stop();
}

void IIC_EEPROM_XieDate(unsigned char di_zhi,unsigned char date){
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(di_zhi);
	IIC_WaitAck();
	IIC_SendByte(date);
	IIC_WaitAck();
	IIC_Stop();
}

unsigned char IIC_EEPROM_GetDate(unsigned char di_zhi){
	unsigned char date;
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(di_zhi);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0xa1);
	IIC_WaitAck();
	date=IIC_RecByte();
	IIC_SendAck(1);
	IIC_WaitAck();
	IIC_Stop();
	return date;
}

CSB.h
#ifndef __CSB_H_
#define __CSB_H_

#define FS P10
#define JS P11

#include 
#include "intrins.h"

void Delay13us();
void CSB_FS_MC();
float CSB_GetJuLi();

#endif

CSB.c
#include "CSB.h"

void Delay13us()		//@12.000MHz
{
	unsigned char i;

	_nop_();
	_nop_();
	i = 36;
	while (--i);
}

void CSB_FS_MC(){
	unsigned char i=8;
	while(i>0){
		i--;
		FS=1;
		Delay13us();
		FS=0;
		Delay13us();
	}
}

float CSB_GetJuLi(){
	float ju_li;
	unsigned int time;
	
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0;		//设置定时初值
	TH0 = 0;		//设置定时初值
	ET0=0;
	
	TF0 = 0;		//清除TF0标志
	CSB_FS_MC();
	TR0=1;
	while(JS==1&&TF0==0);
	TR0=0;
	if(JS==0&&TF0==0){
		time=((unsigned int)TH0<<8)|(unsigned int)TL0;
		ju_li=(time*1.0*0.017)/12.0;
	}
	else{
		TF0=0;
		ju_li=99;
	}
	TH0=0;
	TL0=0;
	
	return ju_li;
}

ChuanKou.h
#ifndef __CHUANKOU_H_
#define __CHUANKOU_H_

#include 

void ChuanKou_Init();
void ChuanKou_FS_Date(unsigned char date);
void ChuanKou_FS_NeiRong(unsigned char *s);

#endif

ChuanKou.c
#include "ChuanKou.h"

void ChuanKou_Init(){
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x40;		//定时器1时钟为Fosc,即1T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设定定时器1为16位自动重装方式
	TL1 = 0x8F;		//设定定时初值
	TH1 = 0xFD;		//设定定时初值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	ES=1;
	EA=1;
}

void ChuanKou_FS_Date(unsigned char date){
	SBUF=date;
	while(TI==0);
	TI=0;
}

void ChuanKou_FS_NeiRong(unsigned char *s){
	while(*s!=''){
		ChuanKou_FS_Date(*s++);
	}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/889650.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号