蓝桥杯第十届单片机总结

2024-03-12 22:58

本文主要是介绍蓝桥杯第十届单片机总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://blog.csdn.net/qq_37429313/article/details/86929724

这是一篇介绍蓝桥杯板子方波N555模块的博客

我自己的理解是将定时器0设置为计数模式,定时器1设置为计时模式来定1S的时间,然后定时器0记录的次数就是频率。

怎么设置呢只需要将TMOD设置为TMOD=0x04即可

寄存器TMOD高四位是设置定时器1工作方式,低四位是设置定时器0工作方式

C/T位是设置C/T==0是计时模式,C/T==1是计数模式,所以TMOD=0x04;

之后是设置TH0和TL0位,此时可以设置为 TH0=TL0=0X00;也可以设置为 TH0=TL0=0XFF;

设置为TH0=TL0=0x00;就是用这两个记录次数。最后计算 num=(TH0<<8)+TL0;num就是1S内的次数

设置为TH0=TL0=0XFF;是用中断的方式计数,自己写中断函数,在中断函数里自己设置变量来计数。

工作时需要将P34和SIGNAL用调键帽连接在一起,这样P34才会有脉冲。

TH0=TL0=0x00;主要代码如下:

  1. void Timer0Init(void)       
  2. {
  3.     AUXR |= 0x80;       
  4.     TMOD = 0x04;    //方式1 16位模式; 
  5.     TL0 = 0x00;        //设置定时初值
  6.     TH0 = 0x00;        //设置定时初值
  7.     TF0 = 0;        //清除TF0标志 
  8.     TR0 = 1;        //定时器0开始计时  
  9. }
  10. void Timer1Init(void)        //5毫秒@11.0592MHz
  11. {
  12.     AUXR |= 0x40;        //定时器时钟1T模式
  13.     TMOD &= 0x0F;        //设置定时器模式
  14.     TL1 = 0x00;        //设置定时初值
  15.     TH1 = 0x28;        //设置定时初值
  16.     TF1 = 0;        //清除TF1标志
  17.     TR1 = 1;        //定时器1开始计时
  18.     EA=1;
  19.     ET1=1;
  20. }
  21. void main()
  22. {
  23.      while(1)
  24.      {
  25.        if(T_flag)    //频率采集
  26.      { 
  27.           T_flag=0;
  28.           num=(TH0<<8)+TL0;
  29.           TL0=0x00;
  30.           TH0=0x00;
  31.           TF0=0;
  32.           TR0=1;
  33.        }
  34.     } 
  35. }
  36. void  time1() interrupt 3
  37. {
  38.     static  uint T_cont=0;
  39.     T_cont++;
  40.     if(T_cont==200)
  41.     {     T_cont=0;
  42.          TF0 = 0;        
  43.          TR0 = 0;
  44.          T_flag=1;
  45.     }
  46. }

 TH0=TL0=0xff;主要代码如下:

  1. void Timer0() interrupt 1
  2. {
  3.     sqre_count++;  //计数
  4. }
  5. while(1)
  6.     {
  7.         if(count_flag)
  8.         {
  9.             count_flag = 0;
  10.             sqre = sqre_count;   //sqre就是频率
  11.             sqre_count = 0;
  12.             TR0 = 1;
  13.             TR1 = 1;
  14.         }
  15. }

 上面那么多介绍的都N555下面介绍第十届的编程试题这里只放了框图,试题的话大家都能找到;

 

 

我感觉这一届的试题比第九届的简单多了,按键部分也都是简单的逻辑但是因为没看方波所以直接就丢掉了一半的分数。具体实现的思路每个人都不一样,我就直接贴代码了;

主函数

#include<stc15F2K60S2.h>
#include<intrins.h>
#include<iic.h>
#define uchar unsigned char
#define uint  unsigned int
uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc1,0x8e};
uchar yi,er,san,si,wu,liu,qi,ba;
bit T_flag,set_flag,a_flag,L_flag,M_flag;
//T_flag 1S时间的标记 set_flag 电压和频率
//a_flag 电压固定 L_flag灯开关,M_flag数码管开关
uchar AD(uchar add);
void display31(uchar dat1,uchar dat2);
void keyscan();
void allinit();
void keyscan();
void delayms(uint ms);
void display1(uchar dat1,uchar dat2);
void display2(uchar dat1,uchar dat2);
void display3(uchar dat1,uchar dat2);
void display4(uchar dat1,uchar dat2);void Timer0Init(void)		//1毫秒@11.0592MHz
{AUXR |= 0x80;		//定时器时钟1T模式TMOD = 0x05;		TL0 = 0x00;		//设置定时初值TH0 = 0x00;		//设置定时初值TF0 = 0;		//清除TF0标志 TR0 = 1;		//定时器0开始计时  
}
void Timer1Init(void)		//5毫秒@11.0592MHz
{AUXR |= 0x40;		//定时器时钟1T模式TMOD &= 0x0F;		//设置定时器模式TL1 = 0x00;		//设置定时初值TH1 = 0x28;		//设置定时初值TF1 = 0;		//清除TF1标志TR1 = 1;		//定时器1开始计时EA=1;ET1=1;
}void main()
{ uint num,ad;allinit();Timer0Init();Timer1Init();while(1){  ad=AD(0x03)*1.961; //ad采集 255扩大到500keyscan();    //按键扫描if(T_flag)    //频率采集{ T_flag=0;num=(TH0<<8)+TL0;TL0=0x00;TH0=0x00;TF0=0;TR0=1;}/*****电压*******************/if(set_flag==0){yi=12;er=11;san=11;si=11;wu=11;liu=ad/100;qi=ad/10%10;ba=ad%10;if(a_flag==0)  //DAC固定2V{yi=12;er=11;san=11;si=11;wu=11;liu=2;qi=0;ba=0;}if(L_flag==0)  //灯亮{if((ad<150) || (ad>=250 && ad<350)) { if(a_flag==0)//固定{P2=0x80;P0=0xfe;}else if(a_flag==1){P2=0x80;P0=0xee;}}else { if(a_flag==0)//固定{P2=0x80;P0=0xfe;}else{P2=0x80;P0=0xea;}}}else{P2=0x80;P0=0xff;}}/*******频率**********************/else {yi=13;er=11;san=11;si=num/10000;wu=num/1000%10;liu=num/100%10;qi=num/10%10;ba=num%10;if(si==0) {si=11;if(wu==0){wu=11;if(liu==0)  //数码管{liu=11;}}}if(L_flag==0)  {if((num<1000)||(num>=5000&&num<10000)){P2=0x80;P0=0xfd;}else{P2=0x80;P0=0xf5;}} else{P2=0x80;P0=0xff;}				}if(M_flag)//关闭所有数码管{yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=11;}display1(yi,er);display2(san,si);if(set_flag==0&& M_flag==0) display3(wu,liu);  //带小数点的else if(set_flag==1)display31(wu,liu); //不带小数点的display4(qi,ba);}
}
/****按键****************/
void keyscan()
{if(P33==0){delayms(10);if(P33==0){set_flag = ~set_flag;}while(!P33);}if(P32==0){delayms(10);if(P32==0){a_flag = ~a_flag;}while(!P32);}if(P31==0){delayms(10);if(P31==0){L_flag = ~L_flag;}while(!P31);}if(P30==0){delayms(10);if(P30==0){M_flag = ~M_flag;}while(!P30);}
}
//计时
void  time1() interrupt 3
{static  uint T_cont=0;T_cont++;if(T_cont==200){	 T_cont=0;TF0 = 0;		TR0 = 0;T_flag=1;}
}
/***********AD***************/
uchar AD(uchar add)
{uchar temp;IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_Stop();IIC_Start();IIC_SendByte(0x91);IIC_WaitAck();temp=IIC_RecByte();IIC_Stop();return temp;
}
/******初始化*********************/
void allinit()
{P2=0xa0;P0=0x00;P2=0x80;P0=0xff;P2=0xc0;P0=0xff;P2=0xff;P0=0xff;
}void display1(uchar dat1,uchar dat2)
{P2=0xc0;P0=0x01;P2=0xff;P0=tab[dat1];delayms(1);P2=0xc0;P0=0x02;P2=0xff;P0=tab[dat2];delayms(1);
}
void display2(uchar dat1,uchar dat2)
{P2=0xc0;P0=0x04;P2=0xff;P0=tab[dat1];delayms(1);P2=0xc0;P0=0x08;P2=0xff;P0=tab[dat2];delayms(1);
}
void display3(uchar dat1,uchar dat2)
{P2=0xc0;P0=0x10;P2=0xff;P0=tab[dat1];delayms(1);P2=0xc0;P0=0x20;P2=0xff;P0=tab[dat2]&0x7f;delayms(1);
}
void display31(uchar dat1,uchar dat2)
{P2=0xc0;P0=0x10;P2=0xff;P0=tab[dat1];delayms(1);P2=0xc0;P0=0x20;P2=0xff;P0=tab[dat2];delayms(1);
}
void display4(uchar dat1,uchar dat2)
{P2=0xc0;P0=0x40;P2=0xff;P0=tab[dat1];delayms(1);P2=0xc0;P0=0x80;P2=0xff;P0=tab[dat2];delayms(1);P2=0xc0;P0=0xff;P2=0xff;P0=0xff;
}
void delayms(uint ms)
{uint i,j;for(i=0;i<ms;i++)for(j=0;j<855;j++);
}

IIC 驱动:

/*程序说明: IIC总线驱动程序软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台 8051,12MHz日    期: 2011-8-9
*/#include<stc15F2K60S2.h>
#include "intrins.h"#define DELAY_TIME 20#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;    
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

自己给自己的话,这次比赛虽然不是什么大比赛,但也学会了很多,从过完年回来开始准备,2个星期把之前的省赛题做完,后边感觉自己会的挺多的了,后边就没看省赛之前没出过的模块,当时还做了官网模拟题就是把N555模块跳了过去。 今天之后这个比赛就算过去了,以后不管做什么事情都要要求自己做好最充分的准备,万万不可骄傲。

 

 

这篇关于蓝桥杯第十届单片机总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/802860

相关文章

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用