单片机各模块例程.docx

上传人:b****2 文档编号:2409453 上传时间:2023-05-03 格式:DOCX 页数:44 大小:656.79KB
下载 相关 举报
单片机各模块例程.docx_第1页
第1页 / 共44页
单片机各模块例程.docx_第2页
第2页 / 共44页
单片机各模块例程.docx_第3页
第3页 / 共44页
单片机各模块例程.docx_第4页
第4页 / 共44页
单片机各模块例程.docx_第5页
第5页 / 共44页
单片机各模块例程.docx_第6页
第6页 / 共44页
单片机各模块例程.docx_第7页
第7页 / 共44页
单片机各模块例程.docx_第8页
第8页 / 共44页
单片机各模块例程.docx_第9页
第9页 / 共44页
单片机各模块例程.docx_第10页
第10页 / 共44页
单片机各模块例程.docx_第11页
第11页 / 共44页
单片机各模块例程.docx_第12页
第12页 / 共44页
单片机各模块例程.docx_第13页
第13页 / 共44页
单片机各模块例程.docx_第14页
第14页 / 共44页
单片机各模块例程.docx_第15页
第15页 / 共44页
单片机各模块例程.docx_第16页
第16页 / 共44页
单片机各模块例程.docx_第17页
第17页 / 共44页
单片机各模块例程.docx_第18页
第18页 / 共44页
单片机各模块例程.docx_第19页
第19页 / 共44页
单片机各模块例程.docx_第20页
第20页 / 共44页
亲,该文档总共44页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

单片机各模块例程.docx

《单片机各模块例程.docx》由会员分享,可在线阅读,更多相关《单片机各模块例程.docx(44页珍藏版)》请在冰点文库上搜索。

单片机各模块例程.docx

单片机各模块例程

 

单片机

常用模块及例程

 

2012.5.25

1、模块电路图:

 

 

 

源程序:

1、流水灯

#include

#defineuintunsignedint

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=200;y>0;y--);

}

voidmain()

{

P1=0xfe;

delay(110);

P1<<=1;

P1|=0x01;

if(P1==0xf7)

{

P1=0xfe;

delay(110);

}

}

2、跑马灯

#include

#defineuintunsingedint

voiddelay(intz)

{

intx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

voidmain()

{

P1=0xfe;

while

(1)

{

delay(50);

P1=P1<<1;

if(P1==0x80)

{

delay(50);

P1=0xfe;

}

}

}

3、数码管部分

#include

#defineuintunsignedint

#defineucharunsignedchar

sbitduan=P2^0;

sbitwei=P2^1;

uchardat[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

voiddelay(intx)

{while(x--);}

voiddisplay(intshi,intge)

{

P0=0xff;

duan=1;

P0=dat[shi];//shi

duan=0;

P0=0;

wei=1;

P0=4;

wei=0;

delay(100);

P0=0xff;

duan=1;

P0=dat[ge];//ge

duan=0;

P0=0;

wei=1;

P0=8;

wei=0;

delay(100);

}

main()

{

inty,qian,bai,shi,ge;

y=4567;

shi=y%100/10;

ge=y%10;

while

(1)display(qian,bai,shi,ge);

}

4、矩阵键盘部分

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharc,m,n;

sbitdula=P2^6;

sbitwela=P2^7;

ucharcodetable[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

voiddelay(uintt)

{

while(t--);

}

unsignedcharpanduan(void)

{

inti,j;

P3=0x0f;

if(P3!

=0x0f)

{

delay(5);

if(P3!

=0x0f){

for(i=1;i<=4;i++)

{

if(!

P3&0x01)break;

P3>>=1;

}

P3=0xf0;

for(j=1;j<=4;j++)

{

if(!

P3&0x80)break;

P3<<=1;

}

P3=0xff;

return4*(j-1)+i;

}

}

P3=0xff;

return0;

}

另:

((unsignedcharpanduan(void)

{

unsignedchari,j,temp;

P3=0x0f;

if(P3!

=0x0f){

delay(5);

if(P3!

=0x0f){

for(temp=~(P3|0xf0),i=0;temp>>=1;i++);

P3=0xf0;

for(temp=~(P3|0x0f),j=1;temp<<=1;j++);

P3=0xff;

return4*j+i-3;

}

}

P3=0xff;

return0;

}))

voiddisplay(intm,intn)

{

P0=0xff;

dula=1;

P0=table[n];

dula=0;

P0=0;

wela=1;

P0=0x80;

wela=0;

delay(3);

P0=0xff;

dula=1;

P0=table[m];

dula=0;

P0=0;

wela=1;

P0=0x40;

wela=0;

delay(3);

}

voidmain()

{while

(1)

{

c=panduan();

m=c/10;

n=c%10;

display(m,n);

}

}

5、中断-时间中断

#include

sbitDuanxuan=P2^0;

sbitWeixuan=P2^1;

UnsignedcharShuma_code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

unsignedcharWei[4]={0x01,0x02,0x04,0x08};

voidDisplay(void)

{

staticunsignedchari;

P0=0x00;//位选清零防止重影

Weixuan=1;

Weixuan=0;

P0=Shuma_code[i+4];//此处可做显示的修改修改

Duanxuan=1;

Duanxuan=0;

P0=Wei[i];//位选

Weixuan=1;

Weixuan=0;

i++;

if(i==4)i=0;

}

voidTimer0_int(void)interrupt1//两毫秒****修改2000可修改中断时间

{

TH0=(65536-2000)/256;//重新赋值2ms

TL0=(65536-2000)%256;

Display();

}

voidInit_Timer0(void)//初始化

{

TMOD|=0x01;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响

TH0=0x00;//给定初值

TL0=0x00;

EA=1;//总中断打开

ET0=1;//定时器中断打开

TR0=1;//定时器开关打开

}

main(void)

{

Init_Timer0();

while

(1)

{;}//写入主体函数

}

外部中断

#include

main()

{

P0=0x55;

EA=1;

EX0=1;

IT0=1;

while

(1);

}

voidex0()interrupt0

{

P0=~P0;

}

6.直流电机

#include

#defineuintunsignedint

#defineucharunsignedchar

sbitkey=P1^7;

sbitkeygnd=P1^0;

sbitpwm=P2^0;

sbitpwmgnd=P2^1;

ucharpwmon,num,circle,cnt;

voiddelay(ucharx)

{

while(x--);

}

voidkeyscan()

{

if(!

key)

{

delay(1000);

if(!

key)

{

num++;

if(num==5)num=0;

}

}

}

voidinit()

{

TMOD|=0x01;

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;

EA=1;

ET0=1;

TR0=1;

}

main()

{

circle=10;cnt=0;num=0;pwm=0;pwmgnd=0;keygnd=0;

init();

while

(1)

{

keyscan();

switch(num)

{

case1:

pwmon=2;break;

case2:

pwmon=4;break;

case3:

pwmon=6;break;

case4:

pwmon=8;break;

}

}

}

voidTimer0()interrupt1

{

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;

if(cnt==pwmon)

{

pwm=0;

}

if(cnt==circle)

{

cnt=0;

pwm=1;

}

cnt++;

}

6、蜂鸣器模块

#include

sbitSPK=P1^0;//定义蜂鸣器端口

voiddelay(unsignedintcnt)//延时

{

while(--cnt);

}

main()

{

unsignedinti;

while

(1)

{

for(i=0;i<200;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短

{

delay(80);//参数决定发声的频率,估算值

SPK=!

SPK;

}

SPK=1;//喇叭停止工作,间歇的时间,可更改

delay(20000);

}

}

7、继电器

用杜邦线把继电器输入端口和P1.1连接起来按键s1吸合s2释放继电器*/

#include

sbitkey1=P3^0;//定义按键位置

sbitkey2=P3^1;//定义按键位置

sbitRELAY=P3^2;//继电器

voiddelay(unsignedintcnt)//延时

{

while(--cnt);

}

main()

{

RELAY=0;//初始化

while

(1)

{

if(!

key1)//按下相应的按键

{

delay(5000);//去抖

if(!

key1)//去抖后是否按下相应的按键

{

RELAY=1;//继电器吸合

}

}

if(!

key2)//按下相应的按键

{

delay(5000);//去抖

if(!

key2)//去抖后是否按下相应的按键

{

RELAY=0;//继电器释放

}

}

}

}

8、IIC协议

#include

#defineucharunsignedchar

sbitsda=P2^0;//位定义

sbitscl=P2^1;

uchara;

voiddelay()

{;;}

voidstart()//开始信号

{

sda=1;//时钟线为高时,数据线由低到高的变化为开始

delay();

scl=1;

delay();

sda=0;

delay();

}

voidstop()//停止

{

sda=0;//时钟先为高时,数据线由低到高的变化为结束

delay();

scl=1;

delay();

sda=1;

delay();

}

voidrespons()//应答

{

uchari;

scl=1;//在高电平时读取信号

delay();

while((sda==1)&&(i<250))i++;//检验收到信号

scl=0;//关闭第九个时钟

delay();

}

voidinit()//初始化

{

sda=1;//总线全部释放

delay();

scl=1;

delay();

}

voidwrite_byte(uchardate)//写字节

{

uchari,temp;

temp=date;

for(i=0;i<8;i++)//读取8个字节

{

temp=temp<<1;//移动8位,读取最高位

scl=0;//时钟线拉低时,允许数据线变化

delay();

sda=CY;//最高位移入CY中

delay();

scl=1;//时钟线为高时,稳定数据

delay();

}

scl=0;//读取低电平信号

delay();

sda=1;

delay();

}

ucharread_byte()//读字节

{

uchari,k;//k为0

scl=0;//时钟线拉低,允许数据线变化

delay();

sda=1;

delay();

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

{

scl=1;//时钟线为高以稳定数据

delay();

k=(k<<1)|sda;//将SDA中的高位赋给k输出

scl=0;

delay();

}

returnk;

}

voiddelay1(ucharx)//延时

{

uchara,b;

for(a=x;a>0;a--)

for(b=100;b>0;b--);

}

voidwrite_add(ucharaddress,uchardate)//写地址

{

start();

write_byte(0xa0);//器件地址

respons();

write_byte(address);//器件内部存储器地址

respons();

write_byte(date);//写字节

respons();

stop();

}

ucharread_add(ucharaddress)//读地址

{

uchardate;

start();

write_byte(0xa0);//读器件地址

respons();

write_byte(address);//读器件内部存储器地址

respons();

start();//换方向读

write_byte(0xa1);//读下一个数据

respons();

date=read_byte();

stop();

returndate;

}

voidmain()

{

init();

write_add(23,0xaa);//

delay1(100);

P3=read_add(23);//把读到的数据显示出来

while

(1);

}

9、AD转换

include

#defineuintunsignedint

#defineucharunsignedchar

sbitsda=P2^0;

sbitscl=P2^1;

sbitduan=P2^2;

sbitwei=P2^3;

ucharx1,x2,x3,x4,x5,x6,x7,x8;

uchardat[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

voiddelay()

{;;}

voiddelayx(ucharx)

{while(x--);}

voidinit()

{

sda=1;

delay();

scl=1;

delay();

}

voidstart()

{

sda=1;

delay();

scl=1;

delay();

sda=0;

delay();

}

 

voidstop()

{

sda=0;

delay();

scl=1;

delay();

sda=1;

delay();

}

voidack()

{

uchari;

scl=1;

delay();

if((sda==1)&&(i<250))i++;delay();

scl=0;

delay();

}

voidwritebyte(uchardat)

{

uchari;

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

{

scl=0;

delay();

dat=dat<<1;

sda=CY;delay();

scl=1;

delay();

}

scl=0;

delay();

sda=1;

delay();

}

ucharreadbyte()

{

uchari,dat;

scl=0;

delay();

sda=1;

delay();

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

{

scl=1;

delay();

dat=dat<<1;

if(sda)dat++;delay();

scl=0;

delay();

}

returndat;

}

voidwriteEEPROM(ucharadd,uchardat)

{

start();

writebyte(0xa0);

ack();

writebyte(add);

ack();

writebyte(dat);

ack();

stop();

}

ucharreadEEPROM(ucharadd)

{

uchartemp;

start();

writebyte(0xa0);

ack();

writebyte(add);

ack();

start();

writebyte(0xa1);

ack();

temp=readbyte();

stop();

returntemp;

}

ucharreadadc(ucharchl)

{

uchartemp;

start();

writebyte(0x90);

ack();

writebyte(0x40|chl);

ack();

start();

writebyte(0x91);

ack();

temp=readbyte();

stop();

returntemp;

}

 

voiddisplay(ucharx1,ucharx2,ucharx3,ucharx4,ucharx5,ucharx6,ucharx7,ucharx8)

{

P1=0xff;

duan=1;

P1=dat[x1];

duan=0;

P1=0;

wei=1;

P1=0x01;

wei=0;

delayx(100);

P1=0xff;

duan=1;

P1=dat[x2];

duan=0;

P1=0;

wei=1;

P1=0x02;

wei=0;

delayx(100);

P1=0xff;

duan=1;

P1=dat[x3];

duan=0;

P1=0;

wei=1;

P1=0x04;

wei=0;

delayx(100);

P1=0xff;

duan=1;

P1=dat[x4];

duan=0;

P1=0;

wei=1;

P1=0x08;

wei=0;

delayx(100);

P1=0xff;

duan=1;

P1=dat[x5];

duan=0;

P1=0;

wei=1;

P1=0x10;

wei=0;

delayx(100);

P1=0xff;

duan=1;

P1=dat[x6];

duan=0;

P1=0;

wei=1;

P1=0x20;

wei=0;

delayx(100);

P1=0xff;

duan=1;

P1=dat[x7];

duan=0;

P1=0;

wei=1;

P1=0x40;

wei=0;

delayx(100);

P1=0xff;

duan=1;

P1=dat[x8];

duan=0;

P1=0;

wei=1;

P1=0x80;

wei=0;

delayx(100);

}

voidzhuanhuan()

{

floattemp;

temp=readadc(0);

//delayx(1000);

x1=(int)temp/1000;

x2=(int)temp%1000/100;

x3=(int)temp%100/10;

x4=(int)temp%10;

}

main()

{

init();

writeEEPROM(23,0x55);

delayx(1000);

P3=readEEPROM(23);

while

(1)

{

P3=readadc(0);

zhuanhuan();display(x1,x2,x3,x4,x5,x6,x7,x8);

display(x1,x2,x3,x4,x5,x6,x7,x8);

}

}

 

10、18B20单线温度检测

#include

#defineucharunsignedchar

#defineuintunsignedint;

sbitseg1=P2^0;

sbitseg2=P2^1;

sbitseg3=P2^2;

sbitDQ=P3^0;//ds18b20端口

uchartemp;

ucharflag_get,count,num,minute,second;

ucharcodetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//7段数码管段码表共阳

ucharstr[3];

voiddelay1(ucharMS);

unsignedcharReadTemperature(void);

voidInit_DS18B20(void);

unsignedcharReadOneChar(void);

voidWriteOneChar(un

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2