单片机各模块例程.docx
- 文档编号:12150464
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:44
- 大小:656.79KB
单片机各模块例程.docx
《单片机各模块例程.docx》由会员分享,可在线阅读,更多相关《单片机各模块例程.docx(44页珍藏版)》请在冰豆网上搜索。
单片机各模块例程
单片机
常用模块及例程
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 模块 例程
![提示](https://static.bdocx.com/images/bang_tan.gif)