对照式光电传感器 c语言 单片机 编程

对照式光电传感器 c语言 单片机 编程,第1张

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

void delay(uchar z)

{

unsigned int x,y;

for(x=0;x<z;x++)

for(y=0;y<110;y++);

}

sbit a=P1^0;

sbit b=P1^1;

sbit c=P1^2;

void main()

{

while(1)

{

if(b==1)

a=0;

delay(100);

a=1;

if(b==0)

c=0;

delay(100);

c=1;

}

}

这是一个项目中的汇编程序,供你参考

org 000h

jmp main

org 0030h

main:

mov r0,#40h

mov dptr,#0bff8h ;指向0809首地址

movx @dptr,a ;启动A/D转换

tt1:

movx a,@dptr ;读数

movx @r0,a ;存数

movx @dptr,a ;启动A/D转换

lcall delay128us ;等待转换完毕(至少128us)

movx a,@dptr

mov @r0,a

lcall tran ;模数-数据转换

lcall disp ;数据的静态显示

lcall delay1s

sjmp main

;;;;;;;;;;;;;;;;数据转换;;;;;;;;;;;;;;;

tran: ;数据转换

mov r0,#40h

mov r3,#00h

mov a,@r0 ;把r0中的数给a

mov b,#03h ;标度变换 3格一度

div ab

mov r3,b

mov b,#0ah ;将标度变换结果的整数部分进行BCD码转换

div ab

mov @r0,a ;将十位数送显示缓冲单元

inc r0 ;指向缓冲单元下一地址

mov @r0,b ;将个位数送显示缓冲单元

mov a,r3 ;标度转换结果小数部分处理

mov b,#03h ;实现三格一度

mul ab

inc r0

mov @r0,a ;送显示缓冲单元

lop: ret

;;;;;;;;;;静态显示子程序-串入并出;;;;;;;

disp:

mov dptr,#tab

mov r0,#40h ;r0指向缓存区首地址

mov a,@r0 ;将整数位数给a

movc a,@a+dptr ;利用表格计算十位七段LED数码管的段码

mov 40h,a ;将段码结果送入40h

inc r0 ;r0指向缓存区下一地址

mov a,@r0 ;将个位数给a

movc a,@a+dptr ;利用表格计算个位七段LED数码管的段码

mov 41h,a ;将段码结果送入41h

inc r0 ;r0指向缓存区下一地址

mov a,@r0 ;将小数给a

movc a,@a+dptr ;利用表格计算小数位七段LED数码管的段码

mov 42h,a ;将段码结果送入42h

;;;;;;;;;;;最后一位清零;;;;;;;;;;;;

mov 43h,#00h

mov a,43h

mov r7,#8

ccc: jb acc7,aaa ;

clr p30 ;

jmp bbb

aaa: setb p30

bbb: setb p31

clr p31

rl a

djnz r7,ccc

;;;;;;;;小数位数显示;;;;;;;

mov a,42h

mov r7,#8

cc:

jb acc7,aa ;

clr p30 ;

jmp bb

aa: setb p30

bb: setb p31

clr p31

rl a

djnz r7,cc ;所有位检测后顺序执行

;;;;;;;;;;;;个位数显示;;;;;;;;;;;

orl 41h,#80h ;个位数后置小数点

mov a,41h

mov r7,#8

dd: jb acc7,ee

clr p30

jmp ff

ee: setb p30

ff: setb p31

clr p31

rl a

djnz r7,dd

;;;;十位数数显示;;;;;

mov a,40h

mov r7,#8

gg: jb acc7,hh

clr p30

jmp ii

hh: setb p30

ii: setb p31

clr p31

rl a

djnz r7,gg

tab: db 3fh,06h,5bh,4fh,66h

db 6dh,7dh,07h,7fh,6fh

lop1:

ret

;;;;;;;;;;ADC0809转换所需时间;;;;;;;;;;

delay128us:

mov r5,#30

delay1:

mov r7,#5

delay2:

nop

nop

djnz r7,delay2

djnz r5,delay1

ret

;;;;;;;;;;为使数据显示稳定延时;;;;;;;;

delay1s:

mov r4,#10

delay00:

mov r5,#100

delay11:

mov r7,#249

delay22:

nop

nop

djnz r7,delay22

djnz r5,delay11

djnz r4,delay00

Ret

财富不值钱,功能实现简单,但是你说的复杂的,可见你的基础不好。

看几个例子程序可能你就会用了。

我帮你给字符串做个定义,所有的字符组成的串叫做字符串,里面可以有字母,也可以有数字,也可以有很多其他的转义字符,字符串的结尾是以'\0'为结尾的。

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

sbit DQ=P3^7;//ds18b20与单片机连接口

sbit RS=P3^0;

sbit RW=P3^1;

sbit EN=P3^2;

unsigned char code str1[]={"temperature: "};

unsigned char code str2[]={" "};

uchar data disdata[5];

uint tvalue;//温度

uchar tflag;//温度正负标志

/lcd1602程序/

void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)

{unsigned int i,j;

for(i=0;i<ms;i++)

for(j=0;j<100;j++);

}

void wr_com(unsigned char com)//写指令//

{ delay1ms(1);

RS=0;

RW=0;

EN=0;

P2=com;

delay1ms(1);

EN=1;

delay1ms(1);

EN=0;

}

void wr_dat(unsigned char dat)//写数据//

{ delay1ms(1);;

RS=1;

RW=0;

EN=0;

P2=dat;

delay1ms(1);

EN=1;

delay1ms(1);

EN=0;

}

void lcd_init()//初始化设置//

{delay1ms(15);

wr_com(0x38);delay1ms(5);

wr_com(0x08);delay1ms(5);

wr_com(0x01);delay1ms(5);

wr_com(0x06);delay1ms(5);

wr_com(0x0c);delay1ms(5);

}

void display(unsigned char p)//显示//

{

while(p!='\0')

{

wr_dat(p);

p++;

delay1ms(1);

}

}

init_play()//初始化显示

{ lcd_init();

wr_com(0x80);

display(str1);

wr_com(0xc0);

display(str2);

}

/ds1820程序/

void delay_18B20(unsigned int i)//延时1微秒

{

while(i--);

}

void ds1820rst()/ds1820复位/

{ unsigned char x=0;

DQ = 1; //DQ复位

delay_18B20(4); //延时

DQ = 0; //DQ拉低

delay_18B20(100); //精确延时大于480us

DQ = 1; //拉高

delay_18B20(40);

}

uchar ds1820rd()/读数据/

{ unsigned char i=0;

unsigned char dat = 0;

for (i=8;i>0;i--)

{ DQ = 0; //给脉冲信号

dat>>=1;

DQ = 1; //给脉冲信号

if(DQ)

dat|=0x80;

delay_18B20(10);

}

return(dat);

}

void ds1820wr(uchar wdata)/写数据/

{unsigned char i=0;

for (i=8; i>0; i--)

{ DQ = 0;

DQ = wdata&0x01;

delay_18B20(10);

DQ = 1;

wdata>>=1;

}

}

read_temp()/读取温度值并转换/

{uchar a,b;

ds1820rst();

ds1820wr(0xcc);//跳过读序列号/

ds1820wr(0x44);//启动温度转换/

ds1820rst();

ds1820wr(0xcc);//跳过读序列号/

ds1820wr(0xbe);//读取温度/

a=ds1820rd();

b=ds1820rd();

tvalue=b;

tvalue<<=8;

tvalue=tvalue|a;

if(tvalue<0x0fff)

tflag=0;

else

{tvalue=~tvalue+1;

tflag=1;

}

tvalue=tvalue(0625);//温度值扩大10倍,精确到1位小数

return(tvalue);

}

//

void ds1820disp()//温度值显示

{ uchar flagdat;

disdata[0]=tvalue/1000+0x30;//百位数

disdata[1]=tvalue%1000/100+0x30;//十位数

disdata[2]=tvalue%100/10+0x30;//个位数

disdata[3]=tvalue%10+0x30;//小数位

if(tflag==0)

flagdat=0x20;//正温度不显示符号

else

flagdat=0x2d;//负温度显示负号:-

if(disdata[0]==0x30)

{disdata[0]=0x20;//如果百位为0,不显示

if(disdata[1]==0x30)

{disdata[1]=0x20;//如果百位为0,十位为0也不显示

}

}

wr_com(0xc0);

wr_dat(flagdat);//显示符号位

wr_com(0xc1);

wr_dat(disdata[0]);//显示百位

wr_com(0xc2);

wr_dat(disdata[1]);//显示十位

wr_com(0xc3);

wr_dat(disdata[2]);//显示个位

wr_com(0xc4);

wr_dat(0x2e);//显示小数点

wr_com(0xc5);

wr_dat(disdata[3]);//显示小数位

}

/主程序/

void main()

{ init_play();//初始化显示

while(1)

{read_temp();//读取温度

ds1820disp();//显示

}

}

这个是测温度的(18b20),你可以参考一下啊!!!!

以上就是关于对照式光电传感器 c语言 单片机 编程全部的内容,包括:对照式光电传感器 c语言 单片机 编程、基于51单片机和AD590温度传感器温度采集的程序、求一个单片机与传感器串口通信的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9338915.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存