您的位置 首页 软件

单片机编程源码的八大原则

单片机编程源码的八大准则-在数字滤波中有一种叫做“中值滤波”技术,就是对采集的数据按照从大到小或者从小到大进行排序,然后取其中在中间位置的数作为采样值。

1.某单片机体系的P2口接一数模转换器DAC0832输出模拟量,现在要求从DAC0832输出接连的三角波,完成的办法是从P2口接连输出依照三角波改动的数值,从0开端逐步增大,到某一最大值后逐步减小,直到0,然后再从0逐步增大,一向这样输出。试编写一函数,使从P2口输出的值发生三角波,而且使三角波的周期和最大值经过进口参数可以改动。

#include《absacc.h》

#define DAC0832 XBYTE[0x7FFF]

void san(unsigned char max1,unsigned char zhou1)

{

unsigned char i,j,max,zhou;

max=max1;

zhou=zhou1;

while(1)

{

for(i=0;i《=max,i++)

{

DAC0832=i;

for(j=0;j《zhou/max;j++)

delay();

}

for(i=max-1;i》0,i–)

{

DAC0832=i;

for(j=0;j《zhou/max;j++)

delay();

}

}

单片机编程源码的八大原则

2.在数字滤波中有一种叫做“中值滤波”技能,便是对收集的数据依照从大到小或许从小到大进行排序,然后取其间在中心方位的数作为采样值。试编写一函数,对存放在片内数据存储器中从0x50开端的20个单元的采样数据用冒泡法排序进行中值滤波,把得到的采样数据存放到0x4f单元中。

void midf()

{

unsigned char data temp,i,j,*ptr,*ptr1;

ptr=0x50;

ptr1=0x4f;

for(j=20;j》1,j–)

{

for(i=0;i《j;i++)

{

if(*(ptr+i)》*(ptr+i+1))

{

temp=*(ptr+i+1);

*(ptr+i+1)=*(ptr+i);

*(ptr+i)=temp;

}

}

}

*ptr1=*(ptr+20/2);

}

3.在数字滤波中有一种叫做“去极值均匀滤波”技能,便是对收集的数据依照从大到小或许从小到大进行排序,然后去掉相同数目的极大值和极小值,对中心部分数据求算术均匀值作为采样值。试编写一函数,对存放在片外数据存储器中从0x150开端的16个单元的采样数据,用选择法进行“去极值均匀滤波”,把得到的采样数据存放到0x14f单元中。

void teaf()

{

unsigned char xdata *ptr;

unsigned char data temp,i,j,*ptr1;

ptr=0x150;

ptr1=0x4f;

for(j=16;j》1,j–)

{

for(i=0;i《j;i++)

{

if(*(ptr+i)》*(ptr+i+1))

{

temp=*(ptr+i+1);

*(ptr+i+1)=*(ptr+i);

*(ptr+i)=temp;

}

}

}

temp=0;

for(i=0;i《16-2;i++)

temp=temp+*(ptr+i+1);

*ptr1=temp/(16-2);

}

4.使用库函数_getkey编写一函数,完成从单片机串行口接纳数据的C51程序,把接纳的数据存放在片内数据存储器从0x40开端的区域,遇到回车符CR(ASCII码是0x0d)完毕。

include 《stdio.h》

void main()

{

unsigned char data *dpt;

unsigned char i=0,temp;

dpt=0x40;

while(1)

{

temp=_getchar();

if(temp==0x0d)

break;

*(dpt+i)=temp;

i++;

}

}

5.使用库函数scanf编写一函数,完成从单片机串行口接纳数据的C51程序,把接纳的数据存放在片外数据存储器从0x240开端的区域,遇到回车符CR(ASCII码是0x0d)完毕。

include 《stdio.h》

void main()

{

unsigned char xdata *xdpt;

unsigned char i=0,temp;

xdpt=0x240;

while(1)

{

scanf(“%c”,&temp);

if(temp==0x0d)

break;

*(xdpt+i)=temp;

i++;

}

}

6.使用库函数putchar编写一函数,完成从单片机串行口发送数据的C51程序,发送的数据存放在片内数据存储器从0x50开端的区域,遇到回车符CR(ASCII码是0x0d)完毕。

include 《stdio.h》

void main()

{

unsigned char data *dpt;

unsigned char i=0;

dpt=0x50;

while(*(dpt+i)!=0x0d)

{

putchar(*(dpt+i));

i++;

}

}

7.使用库函数printf编写一函数,完成从单片机串行口发送数据的C51程序,发送的数据存放在片外数据存储器从0x100开端的区域,遇到回车符CR(ASCII码是0x0d)完毕。

include 《stdio.h》

void main()

{

unsigned char xdata *xdpt;

unsigned char i=0;

xdpt=0x100;

while(*(xdpt+i)!=0x0d)

{

printf(“%c”,*(xdpt+i));

i++;

}

}

8.编写一守时器/计数器0守时100ms中止处理函数,使函数完成时钟的功用,即发生时钟的秒、分钟和小时。设守时初值的高、低字节分别为TIMER_H和TIMER_L。

设fosc=6mhz

#include 《reg52.h》

sfr TIMER_H=0x8b;

sfr TIMER_L=0x8a;

unsigned char data shi,fen,miao,bfm;

void main()

{

TMOD=0x01;

TIMER_H=15536/16;

TIMER_L=15536%16;

ET0=1;

EA=1;

TR0=1;

while(1);

}

void time0_int() interrupt 1

{

TIMER_H=15536/16;

TIMER_L=15536%16;

bfm++;

if(bfm==10)

{

bfm=0;

miao++;

}

if(miao==60)

{

miao=0;

fen++;

}

if(fen==60)

{

fen=0;

shi++;

}

if(shi==24)

{

shi=0;

}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/347652.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部