第十四届蓝桥杯单片机第二场模拟赛程序(AD+字符接受串口)

2023-11-10

******完整代码**** 

#include <STC15F2K60S2.H>
#include <stdio.H>

#include <IIC.H>

#define u8 unsigned char
#define u16 unsigned int

u8 Nodat[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
u8 Isdat[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

u8  smg_i,tab[8];
u16 smg_db,parm=65;
u16 cont2;

u8 R_I;
u8 keyval;
u8 stbuf[6];
u8 L1=0;L2=0;L8=0;

bit smg_mode;
bit flag10ms,flag100ms,flag200ms;
//======== ==================初始化函数=========================
void initsystem()
{
	P0=0; P2=0xa0; P2=0;
	P0=0xff; P2=0x80; P2=0;
}
//======== T0定时(串口接收字符串)
void Timer0Init(void)		//10毫秒@12.000MHz
{
	AUXR &= 0x7F;			//定时器时钟12T模式
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0xE0;				//设置定时初始值
	TH0 = 0xB1;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
}
//======== T1串口
void UartInit(void)		//9600bps@12.000MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设定定时器1为16位自动重装方式
	TL1 = 0xE6;		//设定定时初值
	TH1 = 0xFF;		//设定定时初值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	EA=1; ES=1;
}
//======== T2定时
void Timer2Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0x18;		//设置定时初值
	T2H = 0xFC;		//设置定时初值
	AUXR |= 0x10;		//定时器2开始计时
	IE2 |= 0x04;  
	EA=1;
}
//======== =================数据读取函数=========================
//======== AD数据读取
float read_ADC()
{
	float  val;
	EA=0;
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x03);
	I2CWaitAck();
	I2CStop();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	val=(5.00/255)*I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	EA=1;
	return val;
}	
//======== 串口打印T1
void Uart_Ist()  interrupt 4
{
	if(RI)
	{  RI=0;
		 stbuf[R_I++]=SBUF;
	}
}
void sendbyte(u8 udat)
{
	SBUF=udat;
	while(TI==0);
	TI=0;
}
char putchar(char c)
{
	sendbyte(c);
	return  c;
}
void uart_mange()
{
  u8 i;
	if(TF0)
	{
		 TF0=0;
		if(R_I!=6)
		{  for(i=0;i<7;i++)
			{ stbuf[i++]=0; }
		}
		else 
		{ stbuf[R_I]='\0';
			if((stbuf[0]=='R')&&(stbuf[1]=='e')&&(stbuf[2]=='t')&&(stbuf[3]=='u')&&(stbuf[4]=='r')&&(stbuf[5]=='n'))
				printf("Noises:%.1fdB",(float)smg_db/10);
		}
		R_I=0;
	}
}					

//======== =================数码管显示=========================
void setsmg()
{
	if(smg_mode==0)
	{
		tab[0]=0xc1;
		tab[1]=Nodat[1];
		tab[2]=0xff;
		tab[3]=0xff;
		tab[4]=0xff;
		if(smg_db>99)
		tab[5]=Nodat[smg_db/100];
		else tab[5]=0xff;
		tab[6]=Isdat[smg_db/10%10];
		tab[7]=Nodat[smg_db%10];
		L1=1; L2=0;
	}
	if(smg_mode==1)
	{
		tab[0]=0xc1;
		tab[1]=Nodat[2];
		tab[2]=0xff;
		tab[3]=0xff;
		tab[4]=0xff;
		tab[5]=0xff;
		if(parm>9)
		tab[6]=Nodat[parm/10];
		else tab[6]=0xff;
		tab[7]=Nodat[parm%10];
		L2=1; L1=0;
	}	
}
//======== =================按键扫描========================
u8 read_key()
{
	u8 val=0,x=0,y=0;
	TR1=0;
	P3=0x0f; P42=0; P44=0;
	if(!P30)   x=3;
	else if(!P31)  x=2;
	else if(!P32)  x=1;
	else if(!P33)  x=0;
	P3=0xf0; P42=1; P44=1;
	if(!P34)   y=4;
	else if(!P35)  y=3;	
	else if(!P42)  y=2;
	else if(!P44)  y=1;
	val=x+4*y;
	TR1=1; P3=0xff;
	return  val;
}
void scankey()
{
	u8 up,down,temp;
	static u8 old=0;
	temp=read_key();
	down=temp&(temp^old);
	up=~temp&(temp^old);
	old=temp;
	if(up) keyval=up;
}
//======== =================定时轮询========================
void t2int() interrupt 12           //中断入口
{
	cont2++;
	if(cont2==1000)
		cont2=0;
	if(cont2%2==0)
	{ P0=~(L1+2*L2+128*L8); P2=0x80; P2=0;
		P0=0; P2=0xc0; P2=0;
	  P0=tab[smg_i]; P2=0xe0; P2=0;
	  P0=(1<<smg_i); P2=0xc0; P2=0;	
			smg_i++; smg_i&=0x07;
		if(cont2%10==0)
	{  flag10ms=1;
		if(cont2%100==0)
	{   flag100ms=1;
		if(cont2%200==0)
	{ 
		flag200ms=1;
	 }}}
	}
}
//======== =================主函数========================
void main()
{
	initsystem();
	Timer0Init();
	UartInit();
	Timer2Init();
	while(1)
	{
     	 
	switch(keyval)
	{ 
		case 12 :  smg_mode=!smg_mode;     break;
		case 16 : if(smg_mode) if(parm>=90) parm=90; else  parm+=5;  break;
		case 17 : if(smg_mode) if(parm<=0)   parm=0; else  parm-=5;  break;
	}
	keyval=0;
  
	
	if(flag10ms)
	 {  flag10ms=0;
		    scankey();     	 
	  if(flag100ms)
	   {  flag100ms=0;	
        uart_mange();   			
       if(smg_db>parm*10)	
           L8=!L8;
        else L8=0;			 
	   if(flag200ms)
	   {  flag200ms=0;	
			  smg_db=read_ADC()*18*10;;
			  if(smg_db>=900)
		      smg_db=900;
		 }
	  }  
	 }
	 setsmg();	
	}
}

驱动程序

#ifndef __IIC_H_
#define __IIC_H_

void I2CStart(void);
void I2CStop(void);
void I2CSendByte(unsigned char byt);
unsigned char I2CReceiveByte(void);
unsigned char I2CWaitAck(void);
void I2CSendAck(unsigned char ackbit);
#endif
/*	#   I2C代码片段说明
	1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
	2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
		中对单片机时钟频率的要求,进行代码调试和修改。
*/
#include <reg52.H>
#include <intrins.H>

sbit scl=P2^0;
sbit sda=P2^1;


#define DELAY_TIME	5

//
static void I2C_Delay(unsigned char n)
{
    do
    {
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();		
    }
    while(n--);      	
}

//
void I2CStart(void)
{
    sda = 1;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 0;
	I2C_Delay(DELAY_TIME);
    scl = 0;    
}

//
void I2CStop(void)
{
    sda = 0;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 1;
	I2C_Delay(DELAY_TIME);
}

//
void I2CSendByte(unsigned char byt)
{
    unsigned char i;
	
    for(i=0; i<8; i++){
        scl = 0;
		I2C_Delay(DELAY_TIME);
        if(byt & 0x80){
            sda = 1;
        }
        else{
            sda = 0;
        }
		I2C_Delay(DELAY_TIME);
        scl = 1;
        byt <<= 1;
		I2C_Delay(DELAY_TIME);
    }
	
    scl = 0;  
}

//
unsigned char I2CReceiveByte(void)
{
	unsigned char da;
	unsigned char i;
	for(i=0;i<8;i++){   
		scl = 1;
		I2C_Delay(DELAY_TIME);
		da <<= 1;
		if(sda) 
			da |= 0x01;
		scl = 0;
		I2C_Delay(DELAY_TIME);
	}
	return da;    
}

//
unsigned char I2CWaitAck(void)
{
	unsigned char ackbit;
	
    scl = 1;
	I2C_Delay(DELAY_TIME);
    ackbit = sda; 
    scl = 0;
	I2C_Delay(DELAY_TIME);
	
	return ackbit;
}

//
void I2CSendAck(unsigned char ackbit)
{
    scl = 0;
    sda = ackbit; 
	I2C_Delay(DELAY_TIME);
    scl = 1;
	I2C_Delay(DELAY_TIME);
    scl = 0; 
	sda = 1;
	I2C_Delay(DELAY_TIME);
}

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第十四届蓝桥杯单片机第二场模拟赛程序(AD+字符接受串口) 的相关文章

  • 推拉模式

    推 push 模式是一种基于客户器 服务器机制 由服务器主动将信息送到客户器的技术 联想一下木马的端口反弹技术 在push模式应用中 服务器把信息送给客户器之前 并没有明显的客户请求 push事务由服务器发起 push模式可以让信息主动 快
  • 手机连电脑USB选择MTP连接方式,并解决没有MTP选项的问题

    MTP全称是 Media Transfer Protocol 中文译作 文件传输 usb选择MTP的一般步骤 手机连电脑 usb连接方式选择MTP 如果没有MTP 选择 File Transfer或文件传输或设备文件管理 即为打开usb的M
  • React:非受控组件&ref

    非受控组件 在受控组件中 表单数据由react处理 让表单数据由dom处理 就是非受控组件 使用ref从DOM中获取表单数据 点击按钮 Input输入框获得焦点 import React from react class H extends
  • 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

    启动服务失败 报错信息 com microsoft sqlserver jdbc SQLServerException 驱动程序无法通过使用安全套接字层 SSL 加密与 SQL Server 建立安全连接 错误 sun security v
  • IDEA 代码质量规范插件SonarLint

    IDEA 安装SonarLint插件 1 打开setting 找到Plugins选项 安装SonarLint 插件 如果有就跳过这一步 检索 SonarLint 安装成功后 重新启动IDEA编辑器 2 使用SonarLint 手动检测类文件
  • linux部署web服务器-Nginx

    linux部署web服务器 Nginx 前言 有很多小伙伴想要建立一个自己的web站点 今天就给大家演示一下 准备工作 1 Nginx安装包 2 Linux服务器 3 PCRE安装包 4 手 方式一 手动编译安装 1 安装编译库 yum y
  • jpa利用Specification实现多条件查询排序

    Entity实体类 import java time Instant import javax persistence Column import javax persistence Entity import javax persiste

随机推荐

  • js大纲(流程控制语句对象,函数,数组等)

    一 运算符 1 逻辑运算符 非运算 与运算 像爱情 或运算 像亲情 2 赋值运算符 3 关系运算符 gt gt lt lt 非数值比较时先转换为数字再比较 比较字符串中字符的Unicode编码 4 相等运算符 5 条件运算符也叫三元运算符
  • 操作系统知识点总结(四)进程同步和临界区互斥问题

    一 进程同步的基本概念 临界资源 同步和互斥 在多道程序环境下 进程是并发执行的 不同进程之间存在着不同的相互制约关系 为了协调进程之间的相互制约关系 引入了进程同步的概念 临界资源 虽然多个进程可以共享系统中的各种资源 但其中许多资源一次
  • FPGA学习记录:第28章 VGA显示器驱动设计与验证

    硬件平台 Cyclone IV E EP4CE10F17C8 开发平台 Quartus II 64 Bit Version 13 0 1 Build 232 06 12 2013 SP 1 SJ Full Version 开发板 野火征途p
  • Android——使用ListView显示信息列表

    1 理解ListView的基础使用 1 作用 Android系统中显示列表的控件 2 两种适配器 ArrayAdapter SimpleAdapter 1 数据适配器 作用 把复杂的数据 数组 链表 数据库 集合等 填充在指定视图界面上 是
  • xp系统一直跳出宽带连接服务器,电脑开机后会自动弹出自动宽带连接提示窗口 怎么关闭?...

    自从电脑接宽带后 我们经常会用到宽带连接 甚至为了方便操作 我们直接让电脑开机就自动宽带连接了 而当我们接上路由后 我们会发现电脑再也不用宽带连接了 而这时电脑由于之前被我们设置为开机自动宽带连接 而导致经常会弹出提示窗口 那我们该如何去关
  • Linux--进程间通信、IPC、管道

    目录 1 进程间通信的方法 2 IPC机制 1 有命管道 1 简介 5 管道的特点 6 循环写读 2 无名管道 1 简介 2 代码 4 总体特点 5 管道实现图 1 进程间通信的方法 1 管道 2 信号量 3 共享内存 4 消息队列 5 套
  • java - jdwp远程调试线协议的使用

    前言 线上服务器出现的bug 因为各种复杂环境的原因 经常会很难在本地调试 只能到处打log 然后去服务器查看log日志 以定位问题产生原因 是否一工具能像idea中本地debug一样能直接断点调试呢 介绍 JDWP Java Debug
  • 华为上机考试注意事项及编程技巧(精品)

    这是一篇关于华为招聘软件类职位上机考试的博客 主要介绍一下华为机考的流程 注意事项以及一些机试题中常用的编程技巧 写得有点长 但都是尽心尽力敲的 如果真的要参加华为招聘 或者类似公司的招聘 建议稍微花点时间看完 话不多说 直接进入正题 一
  • 我对维度建模和范式建模的一点理解

    谈维度建模和范式建模之前 先了解下模型设计的三个阶段吧 概念模型 将业务划分成几个主题 逻辑模型 定义各种实体 属性 关系 物理模型 设计数据对象的物理实现 比如表的命名规范 字段的命名规范 字段类型等 一 范式建模 我先来介绍一下范式 范
  • 思维的特点和缺陷

    人类总是喜欢歌颂自己的大脑 比如 思想的威力 逻辑的威力 数学的威力 数学来自于思考 科学的威力 科学来源于思考 还有 意识 这个 人类与动物最大的区别 i blah blah 不过 几乎没有人关心过这种想法究竟来自于人体的哪个器官 心理学
  • 海思3559 安装

    设置地址 开机后任意键 进入 u boot 界面显示 hisilicon 以下内容转自 海思开发记录 一 3559A开发环境搭建 whitefish520的博客 CSDN博客 海思3559a 说明 这次安装的是Ubuntu14 04 64位
  • java8 lambda 获取list对象中重复数据

    工作上的场景 简单记录一下 在这里直接借用业务上的list 不再new 了 List
  • 前台模糊查询中用“\%”替换字符串中的“%”

    最近在做电商项目 前端开发好后就丢给我们 用的时候发现一个缺陷 前台模糊查询的时候 输入一个 或者包含 的词 查询的时候不准确 解决过程中第一个问题 前端用了Js的 decodeURL 转码 将前台输入的 转码了 无法传到后台 参考 htt
  • Java前端知识HTML

    Java前端知识 首先我们用的是HBuilderX软件 当然 前端知识有很多 如果有遗忘或者需要查询的可以去菜鸟驿站查询 比较全 html的文档结构主要是有三部分组成的 1 标记用于html文件的最前面 用来表示html文件的开始 而的标记
  • QSignalMapper信号映射器的使用

    目录 QSignalMapper介绍 Signal 信号 slots 根据标识获取对象 给对象设置标识 删除映射 实例 代码 需求升级 总结 相关文章 QSignalMapper介绍 该类收集一组无参数的信号 并使用与发送信号的对象对应的整
  • 不限时长,免费制作

    在这个信息爆炸的时代 短视频已经崭露头角 成为人们获取信息 娱乐和学习的首选渠道 事实上 大部分互联网用户每天都沉浸在短视频的世界中 这无疑证明了短视频营销的巨大潜力和不可替代的地位 2023年的数据进一步印证了这一点 中国短视频用户规模已
  • 页面禁止长按保存图片和长按复制文字

    1 禁止长按保存图片 img pointer events none 禁止none 启用auto Tips pointer events属性详解 官方文档 https www html cn book css properties user
  • 面试题 01.06. 字符串压缩

    字符串压缩 利用字符重复出现的次数 编写一种方法 实现基本的字符串压缩功能 比如 字符串aabcccccaaa会变为a2b1c5a3 若 压缩 后的字符串没有变短 则返回原先的字符串 你可以假设字符串中只包含大小写英文字母 a至z 示例1
  • 找出数组中的最大有序子数组

    效率O n m import java util HashSet import java util Set public class FindLongestArray public static void main String args
  • 第十四届蓝桥杯单片机第二场模拟赛程序(AD+字符接受串口)

    完整代码 include