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

控制/MCU

1811人已加入

描述

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;

}

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分