打印

小会会的C51编程小技俩

[复制链接]
2227|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jrcsh|  楼主 | 2011-8-5 00:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jrcsh 于 2011-8-18 23:58 编辑

if(aaa==1)
{
for(aaa=0;aaa<50;aaa++)
{
delaymma(50);
P1=~P1;
}
for(aaa=0;aaa<30;aaa++)
{
delaymma(100);
P1=~P1;
}
for(aaa=0;aaa<20;aaa++)
{
delaymma(500);
P1=~P1;
}
aaa=1;
}//aaa=1


aaa 原本是一个 标记  在进入后又利用aaa 来当临时变量, 用完后在还原 原来的值

相关帖子

沙发
jrcsh|  楼主 | 2011-8-5 01:06 | 只看该作者
本帖最后由 jrcsh 于 2011-8-5 01:07 编辑

在加点

if(aaa==3)
{
delay2(bbb);
P1=~P1;
}
现在我想在加个数码管显示上去就~~~显示效果就相当糟糕了(不用定时器)

if(aaa==3)
{
delay2(bbb);
ccc++;
if(ccc==100)
{
P1=~P1;
ccc=0;
}

于是我把这个延时 砍成 100份(延时部分数值也同样改小了) 让主程序来其它程序不用等这么久 (其实引入状态标记会更好不用延时。。但我刚好在写这个小程序~~~实在烦得起框架)

使用特权

评论回复
板凳
jrcsh|  楼主 | 2011-8-19 00:04 | 只看该作者
数码管利用状态标记+程序流程上的占用代替,亮度保护保持时间,提升运行效率.

#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit w1=P2^4;
sbit w2=P2^5;
sbit w3=P2^6;
sbit w4=P2^7;
unsigned int bbb,aaa,smg,ccc;
uchar code table[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0,0xff};
void delay()
{
   for(bbb=0;bbb<250;bbb++)
  {
;
}
}
void smg_xs()
{
smg++;
if(smg==5)
{
smg=1;
}
if(smg==1)
{
w2=w3=w4=1;
P0=table[aaa%10];
w1=0;
}
if(smg==2)
{
w1=w3=w4=1;
P0=table[aaa/10%10];
w2=0;
}
if(smg==3)
{
w1=w2=w4=1;
P0=table[aaa/100%10];
w3=0;
}
if(smg==4)
{
w1=w2=w3=1;
P0=table[aaa/1000%10];
w4=0;
}
}
void main()
{
smg=0;
aaa=1234;
ccc=0;
while(1)
{
smg_xs();
delay();
delay();//#%%%¥#%¥@%@¥#%#@
ccc++;
if(ccc>30)
{
ccc=0;
aaa++;
}
if(aaa>9999)
{
aaa=0;
}
}
}

使用特权

评论回复
地板
Breming| | 2011-8-19 12:52 | 只看该作者
:victory:

使用特权

评论回复
5
jrcsh|  楼主 | 2011-8-25 16:06 | 只看该作者
这次是结果复用 , 省下了2次运算的时间

原代码

ppp=1000000/(65535-eee);
aaa=(65535-eee)%256;
bbb=(65535-eee)/256;


小花样后
aaa=65535-eee
ppp=1000000/aaa;
bbb=aaa/256;
aaa=aaa%256;

使用特权

评论回复
6
jrcsh|  楼主 | 2012-1-7 11:48 | 只看该作者
忙中之余,还是挤挤了点点时间,在没有实物的条件下,用张纸在上边涂鸦涂鸦,出的 STC-AD采集中由于使用VCC作为电压基准带来的不便(数据飘阿飘),




STC的 AD 采样转换公式为  (10位下):1024*Vin/Vcc   //Vin 输入电压   //Vcc MCU 电源电压


也就是这个改死的 Vcc 电源电压作为 AD的采样参考电压在般小应用的电源线根本就不能满足稳定性的要求,之前作过软件,使用算法,降低了,灵敏度来过滤这个数据发飘。


忙中找乐子就YY一个,假设有了一路基准电压之后求出电源电压,在求出其它几路AD的实际电压





我把一开始注意力集中在,1024*vin/vcc 整体上 得出一个  0.00488281 这样的数 之后在安基准反求出来的比例补偿回去
  用Excel 例出数据, 看看样子可行是可行,但是这么长的小点点估计弱浮点运算能力的STC要跑得吐血了











于是走简化方程式避开不必要的计算和:
基准电压结果重复的计算去中和结果的反求的计算   

    把 1024 *vin/Vcc   方程化   A*B/C=D   
    A=1024
    B=Vin
   C=vcc
   D=采样结果
    基准: A1*B1/C1=D1   反求C1   推出 A1*B1/D1=C1  
    待求: A2*B2/C2=D2    反求B1   推出 D2*C2/A2=B2


    合为: D2*(A1*B1/D1)/A2=B2
       因:  A1=A2=A=1024      ,
中和为: D2*B1/D1=B2  


   从而大大的简化的MCU 的计算时间
  
  D2*B1/D1=B2   


D2=基准电压采样结果
B1=已知基准电压值(2.5V)
D1=目标AD采样结果
   
对于B1=2.5V 还可以 先放大10倍去除小数点,结果在除小或直接显示时处理小数点的显示位(处理小数点的显示位置更省MCU时间)   

其实结果还是可预见到范围的,作了一个可能出现的结果表,直接先把数放大上去,就完全避开了MCU(STC)进入浮点运算。

又一次使用了仅为初中水平的数学解决了问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:以上以下纯属瞎扯,概不承认!!!!! 感谢  应试教育 培养了我的基础    感谢自己  没吧应试教作为各种借口

228

主题

2348

帖子

18

粉丝