单片机c语言8 8编程,单片机C语言基础编程源码八则

1.某单片机系统的P2口接一数模转换器DAC0832输出模拟量,现在要求从DAC0832输出连续的三角波,实现的方法是从P2口连续输出按照三角波变化的数值,从0开始逐渐增大,到某一最大值后逐渐减小,直到0,然后再从0逐渐增大,一直这样输出。试编写一函数,使从P2口输出的值产生三角波,并且使三角波的周期和最大值通过入口参数能够改变。

#include#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;jdelay();

}

for(i=max-1;i>0,i--)

{

DAC0832=i;

for(j=0;jdelay();

}

}

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{

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{

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);

}[page]

4.利用库函数_getkey编写一函数,实现从单片机串行口接收数据的C51程序,把接收的数据存放在片内数据存储器从0x40开始的区域,遇到回车符CR(ASCII码是0x0d)结束。

include 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 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 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 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 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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值