第二十二讲 第十二届国赛

一、题目

二、代码

1.频率

定时器0 ne55 输出频率P34

定时器1来实现数码管的显示功能

频率:1ms计次多少次

显示

保留一位小数

可以避免一些数码管读取太慢的问题

2.湿度

btw关于数码管显示

先前我们是500ms后读取芯片数值,处理Seg里的一堆数据,造成资源分配不均匀

现在我们一定时间处理1,又一段时间处理2......把它岔开

还是以500ms为周期进来一次,但是每一次都读取不同的值

在100ms时读取AD值,在200ms时读取距离值

没懂这里

3.参数

俺写参数界面:

风哥写参数界面:

多个参数的直接设一维数组,关于参数设置的要设置两个值,一个设置值,一个保存值

内存优化问题,float型的可以当作char型写(float型更占空间)

Seg

俺写的seg

风哥写的Seg:

都把他们弄成整数,只是点小数点还有0的问题,67位必有数,只有频率的第5位有数

显示编号即索引值+1

是否点小数点就看是否是频率0和距离2界面

第5位是否有数据就看是不是频率0,有则用频率的数据,否则熄灭

通过数组和索引值来实现多个参数的数码管显示

没懂:

4.按键

俺的+:

每个模式下对应+

风哥的+:

设置一个加减的数组(加减是固定值,只读不写,可以放到code(只读不写)里减少内存占用)

数码管的段选位选也可以放进去

因为前面已经把参数值变为整数了,所以就是+整数

索引值是参数显示,实际参数,参数加减,参数上限下限共用的

参数范围也改

当当当:

5.DA写入

一般用y = k (x - x0) + y0来写

输出电压 = ((5.0 - 1.0)/ (80.0 - ShiDu_Param))*(湿度 - ShiDu_Param) + 1.0;

湿度<湿度参数

湿度>80

其他情况则符合函数

写入DA

6.继电器

和下降沿计数的题目一样

(当y>p时,flag拉高=1       else if(flag==1)时,falg拉低=0,a++)

else if:两个意思

1.测距结果>参数值

2.上一次它的状态是关

开继电器的话要把标志位拉低0,避免他进来判断里一直++

7.脉冲输出功能

看见引脚,找原理图

和继电器,蜂鸣器一样,不能简单给引脚赋值p几p几,而是也要像蜂鸣器继电器那样写一个函数

然后cv大师showtime:就改个0x20

1khz的周期是:1/1000 = 0.001s = 1ms = 10 * 100us

在stc手册里搜中断号

俺写的放中断里了...俺知道不要写中断里,但是就是先写中断里了

风哥聪明绝顶!!:

8.长按

通常长按要定义的变量

之前写的长按

①没有说长按按多久的,用Key_Old

②长按短按

9.Led

俺写的:只写了一个功能其实还有一个功能没看见呃呃呃

风:

①Seg_Mode<3:z在频率、湿度、距离界面下:②根据Seg_Mode互斥点亮

否则,不在该界面下,则:根据Param_Index互斥点亮,并且闪烁

俺:

风:

当时俺写读取芯片参数(超声波)是就单纯在外面,后面发现target no creat,排查完后发现,把读取超声波的注释掉就行,不知道是不是AD和超声波读取冲突了

10.超声波

跳线帽接左边两个,Ne55和超声波不是同时用的时候就可以把超声波的跳线帽拔下来给P34和ling短接

底层(之前是33的欸

用PCA,因为定时器莫得了

和之前的区别,之前是定时器1

啊怪不得俺之前用超声波就卡bug

#include <ultrasound.h>
#include "intrins.h"

sbit Tx = P1^0;
sbit Rx = P1^1;

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

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

void Ut_Wave_Init() //超声波初始化函数 产生8个40Mhz的方波信号
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		Tx = 1;
		Delay12us();
		Tx = 0;
		Delay12us();
	}
}

unsigned char Ut_Wave_Data() //超声波距离读取函数
{
	unsigned int time;//时间储存变量
	CMOD &= 0x0f;//配置PCA工作模式
	CH = CL = 0;//复位计数值 等待超声波信号发出
	Ut_Wave_Init();//发送超声波信号
	CR = 1;//开始计时
	while((Rx == 1) && (CF == 0));//等待接受返回信号或者定时器溢出
	CR = 0;//停止计时
	if(CF == 0) //定时器没有溢出
	{
		time = CH << 8 | CL;//读取当前时间
		return (time * 0.017);//返回距离值
	}
	else
	{
		CF = 0;//清除溢出标志位
		return 0;
	}
}

11.保存参数

在退出参数界面时保存参数

12.显示频率以及频率比较

接收到得频率是35587(大概

如果/1000的话就得到35.587

但是频率参数那里设置的khz是1.0-12.0

明显超了

所以我后面改我的代码改成/10000

就是3.5587才在范围内

然后Led那里,我们在参数保存里是90,就是扩大了10倍

后面和Freq=35587比较应该扩大为90000即*1000

但是西风就是/1000,就是35,然后直接/10和%10得到3.5

然后它是退出参数界面才生效,Led才会亮

Freq/1000=35。587和90比较

13.?

14.

  • 37
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值