单片机各模块例程Word文档格式.docx
《单片机各模块例程Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机各模块例程Word文档格式.docx(44页珍藏版)》请在冰点文库上搜索。
![单片机各模块例程Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/2/807ddb4f-eeb7-449e-8ccc-cc67726c8cc3/807ddb4f-eeb7-449e-8ccc-cc67726c8cc31.gif)
3、数码管部分
#include<
#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);
duan=1;
P0=dat[ge];
//ge
P0=8;
main()
inty,qian,bai,shi,ge;
y=4567;
shi=y%100/10;
ge=y%10;
while
(1)display(qian,bai,shi,ge);
4、矩阵键盘部分
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);
=0x0f){
for(i=1;
i<
=4;
i++)
{
if(!
P3&
0x01)break;
P3>
>
}
P3=0xf0;
for(j=1;
j<
j++)
0x80)break;
P3<
P3=0xff;
return4*(j-1)+i;
P3=0xff;
return0;
}
另:
((unsignedcharpanduan(void)
unsignedchari,j,temp;
P3=0x0f;
=0x0f){
delay(5);
if(P3!
for(temp=~(P3|0xf0),i=0;
temp>
=1;
i++);
P3=0xf0;
for(temp=~(P3|0x0f),j=1;
temp<
j++);
P3=0xff;
return4*j+i-3;
P3=0xff;
}))
voiddisplay(intm,intn)
dula=1;
P0=table[n];
dula=0;
P0=0;
wela=1;
P0=0x80;
wela=0;
delay(3);
P0=table[m];
P0=0x40;
{while
(1)
{
c=panduan();
m=c/10;
n=c%10;
display(m,n);
5、中断-时间中断
reg51.h>
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;
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();
{;
}//写入主体函数
外部中断
main()
P0=0x55;
EX0=1;
IT0=1;
while
(1);
voidex0()interrupt0
P0=~P0;
6.直流电机
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);
num++;
if(num==5)num=0;
voidinit()
TMOD|=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
circle=10;
cnt=0;
num=0;
pwm=0;
pwmgnd=0;
keygnd=0;
init();
keyscan();
switch(num)
case1:
pwmon=2;
break;
case2:
pwmon=4;
case3:
pwmon=6;
case4:
pwmon=8;
voidTimer0()interrupt1
if(cnt==pwmon)
if(cnt==circle)
pwm=1;
cnt++;
6、蜂鸣器模块
sbitSPK=P1^0;
//定义蜂鸣器端口
voiddelay(unsignedintcnt)//延时
while(--cnt);
unsignedinti;
for(i=0;
200;
i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短
delay(80);
//参数决定发声的频率,估算值
SPK=!
SPK;
SPK=1;
//喇叭停止工作,间歇的时间,可更改
delay(20000);
7、继电器
用杜邦线把继电器输入端口和P1.1连接起来按键s1吸合s2释放继电器*/
sbitkey1=P3^0;
//定义按键位置
sbitkey2=P3^1;
sbitRELAY=P3^2;
//继电器
voiddelay(unsignedintcnt)//延时
RELAY=0;
//初始化
key1)//按下相应的按键
delay(5000);
//去抖
key1)//去抖后是否按下相应的按键
RELAY=1;
//继电器吸合
key2)//按下相应的按键
//去抖
key2)//去抖后是否按下相应的按键
RELAY=0;
//继电器释放
8、IIC协议
sbitsda=P2^0;
//位定义
sbitscl=P2^1;
uchara;
voiddelay()
{;
;
voidstart()//开始信号
{
sda=1;
//时钟线为高时,数据线由低到高的变化为开始
delay();
scl=1;
sda=0;
voidstop()//停止
//时钟先为高时,数据线由低到高的变化为结束
voidrespons()//应答
uchari;
//在高电平时读取信号
while((sda==1)&
&
(i<
250))i++;
//检验收到信号
scl=0;
//关闭第九个时钟
voidinit()//初始化
//总线全部释放
voidwrite_byte(uchardate)//写字节
uchari,temp;
temp=date;
8;
i++)//读取8个字节
temp=temp<
//移动8位,读取最高位
scl=0;
//时钟线拉低时,允许数据线变化
sda=CY;
//最高位移入CY中
delay();
scl=1;
//时钟线为高时,稳定数据
//读取低电平信号
ucharread_byte()//读字节
uchari,k;
//k为0
//时钟线拉低,允许数据线变化
//时钟线为高以稳定数据
k=(k<
1)|sda;
//将SDA中的高位赋给k输出
returnk;
voiddelay1(ucharx)//延时
uchara,b;
for(a=x;
a>
a--)
for(b=100;
b>
b--);
voidwrite_add(ucharaddress,uchardate)//写地址
start();
write_byte(0xa0);
//器件地址
respons();
write_byte(address);
//器件内部存储器地址
write_byte(date);
//写字节
stop();
ucharread_add(ucharaddress)//读地址
uchardate;
//读器件地址
//读器件内部存储器地址
//换方向读
write_byte(0xa1);
//读下一个数据
date=read_byte();
returndate;
write_add(23,0xaa);
//
delay1(100);
P3=read_add(23);
//把读到的数据显示出来
9、AD转换
include<
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};
{;
voiddelayx(ucharx)
voidstart()
voidstop()
voidack()
if((sda==1)&
250))i++;
voidwritebyte(uchardat)
dat=dat<
delay();
sda=1;
ucharreadbyte()
uchari,dat;
if(sda)dat++;
returndat;
voidwriteEEPROM(ucharadd,uchardat)
writebyte(0xa0);
ack();
writebyte(add);
writebyte(dat);
ucharreadEEPROM(ucharadd)
uchartemp;
writebyte(0xa1);
temp=readbyte();
returntemp;
ucharreadadc(ucharchl)
writebyte(0x90);
writebyte(0x40|chl);
writebyte(0x91);
voiddisplay(ucharx1,ucharx2,ucharx3,ucharx4,ucharx5,ucharx6,ucharx7,ucharx8)
P1=0xff;
P1=dat[x1];
P1=0;
P1=0x01;
delayx(100);
P1=dat[x2];
P1=0x02;
P1=dat[x3];
P1=0x04;
P1=dat[x4];
P1=0x08;
P1=dat[x5];
P1=0x10;
P1=dat[x6];
P1=0x20;
P1=dat[x7];
P1=0x40;
P1=dat[x8];
P1=0x80;
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;
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单线温度检测
REG52.H>
#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