1、单片机各模块例程 单片机 常用模块及例程 2012.5.25 1、模块电路图:源程序:1、流水灯#include #define uint unsigned intvoid delay (uint z) uint x,y; for(x=z;x0;x-) for(y=200;y0;y-);void main() P1=0xfe; delay(110); P1=1; P1|=0x01; if(P1=0xf7) P1=0xfe; delay(110); 2、跑马灯#include #define uint unsinged intvoid delay(int z) int x,y; for(x=z;
2、x0;x-) for(y=110;y0;y-);void main() P1=0xfe; while(1) delay(50); P1=P11; if(P1=0x80) delay(50); P1=0xfe; 3、数码管部分#include#define uint unsigned int#define uchar unsigned charsbit duan=P20;sbit wei=P21;uchar dat=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;void delay(int x)while(x-);void display(i
3、nt shi,int ge) P0=0xff; duan=1; P0=datshi; /shi duan=0; P0=0 ; wei=1; P0=4; wei=0; delay(100); P0=0xff; duan=1; P0=datge; /ge duan=0; P0=0 ; wei=1; P0=8; wei=0; delay(100); main() int y,qian,bai,shi,ge; y=4567; shi=y%100/10; ge=y%10; while(1)display(qian,bai,shi,ge); 4、矩阵键盘部分#include #define uchar u
4、nsigned char#define uint unsigned intuchar c,m,n;sbit dula=P26;sbit wela=P27; uchar code table10 = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;void delay(uint t) while(t-);unsigned char panduan(void) int i,j; P3=0x0f; if(P3!=0x0f) delay(5); if(P3!=0x0f) for(i=1;i=1; P3=0xf0; for(j=1;j=4;j+) if
5、(!P3&0x80) break; P3= 1;i+); P3 = 0xf0; for(temp = (P3|0x0f),j=1;temp = 1;j+); P3 = 0xff; return 4*j+i-3; P3 = 0xff; return 0; )void display(int m,int n) P0=0xff; dula=1; P0=tablen; dula=0; P0=0; wela=1; P0=0x80; wela=0; delay(3); P0=0xff; dula=1; P0=tablem; dula=0; P0=0; wela=1; P0=0x40; wela=0; de
6、lay(3);void main() while(1) c=panduan(); m=c/10; n=c%10; display(m,n); 5、中断-时间中断#include sbit Duanxuan=P20;sbit Weixuan=P21;Unsigned char Shuma_code10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned char Wei4=0x01,0x02,0x04,0x08;void Display(void) static unsigned char i; P0=0x00; /位选清零 防止
7、重影 Weixuan =1; Weixuan=0; P0=Shuma_codei+4; /此处可做显示的修改修改 Duanxuan=1; Duanxuan=0; P0=Weii; / 位选 Weixuan=1; Weixuan=0; i+; if(i=4)i=0;void Timer0_int(void) interrupt 1/两毫秒*修改2000可修改中断时间 TH0=(65536-2000)/256; /重新赋值 2ms TL0=(65536-2000)%256; Display();void Init_Timer0(void) /初始化 TMOD |= 0x01; /使用模式1,16位
8、定时器,使用|符号可以在使用多个定时器时不受影响 TH0=0x00; /给定初值 TL0=0x00; EA=1; /总中断打开 ET0=1; /定时器中断打开 TR0=1; /定时器开关打开 main (void) Init_Timer0(); while(1) ;/写入主体函数外部中断#includemain() P0=0x55; EA=1; EX0=1; IT0=1; while(1);void ex0() interrupt 0 P0=P0;6.直流电机#include#define uint unsigned int#define uchar unsigned charsbit key
9、=P17;sbit keygnd=P10;sbit pwm=P20;sbit pwmgnd=P21;uchar pwmon,num,circle,cnt;void delay(uchar x) while(x-);void keyscan() if(!key) delay(1000); if(!key) num+; if(num=5) num=0; void init() 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
10、; pwmgnd=0;keygnd=0; init(); while(1) keyscan(); switch(num) case 1: pwmon=2;break; case 2: pwmon=4;break; case 3: pwmon=6;break; case 4: pwmon=8;break; void Timer0() interrupt 1 TH0=(65536-1000)/256; TL0=(65536-1000)%256; if(cnt=pwmon) pwm=0; if(cnt=circle) cnt=0; pwm=1; cnt+;6、蜂鸣器模块#includesbit SP
11、K=P10;/定义蜂鸣器端口void delay(unsigned int cnt)/延时 while(-cnt);main() unsigned int i; while(1) for(i=0;i200;i+)/喇叭发声的时间循环,改变大小可以改变发声时间长短 delay(80);/参数决定发声的频率,估算值 SPK=!SPK; SPK=1; /喇叭停止工作,间歇的时间,可更改 delay(20000); 7、继电器用杜邦线把继电器输入端口和P1.1连接起来 按键s1吸合 s2释放继电器*/#include sbit key1=P30;/定义按键位置sbit key2=P31;/定义按键位置
12、sbit RELAY = P32;/继电器void delay(unsigned int cnt) /延时 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#define uchar unsigned charsbit sda=P2
13、0; /位定义sbit scl=P21;uchar a;void delay() ; void start() /开始信号 sda=1; /时钟线为高时,数据线由低到高的变化为开始 delay(); scl=1; delay(); sda=0; delay();void stop() /停止 sda=0; /时钟先为高时,数据线由低到高的变化为结束 delay(); scl=1; delay(); sda=1; delay();void respons() /应答 uchar i; scl=1; /在高电平时读取信号 delay(); while(sda=1)&(i250)i+; /检验收到信
14、号 scl=0; /关闭第九个时钟 delay();void init() /初始化 sda=1; /总线全部释放 delay(); scl=1; delay();void write_byte(uchar date) /写字节 uchar i,temp; temp=date; for(i=0;i8;i+) /读取8个字节 temp=temp1; /移动8位,读取最高位 scl=0; /时钟线拉低时,允许数据线变化 delay(); sda=CY; /最高位移入CY中 delay(); scl=1; /时钟线为高时,稳定数据 delay(); scl=0; /读取低电平信号 delay();
15、sda=1; delay();uchar read_byte() /读字节 uchar i,k; /k为0 scl=0; /时钟线拉低,允许数据线变化 delay(); sda=1; delay(); for(i=0;i8;i+) scl=1; /时钟线为高以稳定数据 delay(); k=(k0;a-) for(b=100;b0;b-);void write_add(uchar address,uchar date) /写地址 start(); write_byte(0xa0); /器件地址 respons(); write_byte(address); /器件内部存储器地址 respons
16、(); write_byte(date); /写字节 respons(); stop();uchar read_add(uchar address) /读地址 uchar date; start(); write_byte(0xa0); /读器件地址 respons(); write_byte(address); /读器件内部存储器地址 respons(); start(); /换方向读 write_byte(0xa1); /读下一个数据 respons(); date=read_byte(); stop(); return date;void main() init(); write_add
17、(23,0xaa); / delay1(100); P3=read_add(23); / 把读到的数据显示出来 while(1);9、AD转换include#define uint unsigned int#define uchar unsigned charsbit sda=P20;sbit scl=P21;sbit duan=P22;sbit wei=P23;uchar x1,x2,x3,x4,x5,x6,x7,x8;uchar dat=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 ;void delay();void delayx(u
18、char x)while(x-);void init() sda=1; delay(); scl=1; delay();void start() sda=1; delay(); scl=1; delay(); sda=0; delay();void stop() sda=0; delay(); scl=1; delay(); sda=1; delay();void ack() uchar i; scl=1; delay(); if(sda=1)&(i250) i+; delay(); scl=0; delay();void writebyte(uchar dat) uchar i; for(i
19、=0;i8;i+) scl=0; delay(); dat=dat1; sda=CY;delay(); scl=1; delay(); scl=0; delay(); sda=1; delay();uchar readbyte() uchar i,dat; scl=0; delay(); sda=1; delay(); for(i=0;i8;i+) scl=1; delay(); dat=dat1; if(sda) dat+; delay(); scl=0; delay(); return dat;void writeEEPROM(uchar add,uchar dat) start(); w
20、ritebyte(0xa0); ack(); writebyte(add); ack(); writebyte(dat); ack(); stop();uchar readEEPROM(uchar add) uchar temp; start(); writebyte(0xa0); ack(); writebyte(add); ack(); start(); writebyte(0xa1); ack(); temp=readbyte() ; stop(); return temp;uchar readadc(uchar chl) uchar temp; start(); writebyte(0
21、x90); ack(); writebyte(0x40|chl); ack(); start(); writebyte(0x91); ack(); temp=readbyte() ; stop(); return temp;void display(uchar x1,uchar x2,uchar x3,uchar x4,uchar x5,uchar x6,uchar x7,uchar x8) P1=0xff; duan=1; P1=datx1; duan=0; P1=0; wei=1; P1=0x01; wei=0; delayx(100); P1=0xff; duan=1; P1=datx2
22、; duan=0; P1=0; wei=1; P1=0x02; wei=0; delayx(100); P1=0xff; duan=1; P1=datx3; duan=0; P1=0; wei=1; P1=0x04; wei=0; delayx(100); P1=0xff; duan=1; P1=datx4; duan=0; P1=0; wei=1; P1=0x08; wei=0; delayx(100); P1=0xff; duan=1; P1=datx5; duan=0; P1=0; wei=1; P1=0x10; wei=0; delayx(100); P1=0xff; duan=1;
23、P1=datx6; duan=0; P1=0; wei=1; P1=0x20; wei=0; delayx(100); P1=0xff; duan=1; P1=datx7; duan=0; P1=0; wei=1; P1=0x40; wei=0; delayx(100); P1=0xff; duan=1; P1=datx8; duan=0; P1=0; wei=1; P1=0x80; wei=0; delayx(100);void zhuanhuan() float temp; temp=readadc(0); / delayx(1000); x1=(int)temp/1000; x2=(in
24、t)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#define uchar unsigned char#define uint unsigned i
25、nt;sbit seg1=P20;sbit seg2=P21;sbit seg3=P22;sbit DQ=P30; /ds18b20 端口uchar temp;uchar flag_get,count,num,minute,second;uchar code tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/7段数码管段码表共阳uchar str3;void delay1(uchar MS);unsigned char ReadTemperature(void);void Init_DS18B20(void);unsigned char ReadOneChar(void);void WriteOneChar(un
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2