完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
` {:soso_e163:}{:soso_e163:}{:soso_e179:}纯手工打造,走过路过不要错过。。内含:图片+视频+原理图。。。。 本帖会持续更新,更多精彩尽请关注(不足之处,请给位大侠提出宝贵意见) {:soso_e181:}` 评分
|
||
相关推荐
94 个讨论
|
||
那就一起努力啦!!!嘻嘻
//------------------------------------------------------------------ #include #define uchar unsigned char #define uint unsigned int uchar code scan[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar code word[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; void delay(uint); void ledscan() { uint i; for(i=0;i<8;i++) { P0=word[i]; P2=scan[i]; delay(200); } } void main() { while(1) { ledscan(); } } void delay(uint z) { uchar x,y; for(x=150;x>0;x--) for(y=z;y>0;y--); } |
|
|
|
|
|
#include
#define uint unsigned int #define uchar unsigned char void delay(uint); main() { uchar i,disp1,disp2,disp; while(1) { disp1=0x01; disp2=0x80; disp=disp1+disp2; P1=~disp; delay(200); for(i=0;i<7;i++) { disp1=disp1<<1; disp2=disp2>>1; disp=disp1+disp2; P1=~disp; delay(200); } } } void delay(uint z) { uint x,y; for(x=150;x>0;x--) for(y=z;y>0;y--); } |
|
|
|
|
|
// 描述: 数码管显示 遥控键值读取器 ,138可加,可不加! *
#include #include #define NOP() _nop_() /* 定义空指令 */ //译码器管脚定义 ***it LS138A=P2^2; //管脚定义 ***it LS138B=P2^3; ***it LS138C=P2^4; //此表为 LED 的字模, 共阴数码管 0-9 - unsigned char code Disp_Tab[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; unsigned long LedOut[5],LedNumVal; extern unsigned char IRCOM[7]; void delay(unsigned int i); //函数声名 void display(unsigned char Key_Val); extern void IRInit(); //extern 是引用IR.C中的函数 main() { IRInit(); while(1) { //显示红外键码 display(IRCOM[2]); } } void delay(unsigned int i) { char j; for(i; i > 0; i--) for(j = 200; j > 0; j--); } void display(unsigned char Key_Val) { unsigned char i; /********以下将键值送到LED数码管显示*************/ LedNumVal=Key_Val; //把键值送到LedNumVal变量中 LedOut[0]=Disp_Tab[LedNumVal%10000/1000]; LedOut[1]=Disp_Tab[LedNumVal%1000/100]; LedOut[2]=Disp_Tab[LedNumVal%100/10]; //十位 LedOut[3]=Disp_Tab[LedNumVal%10]; //个位 for(i=0; i<4; i++) { P0 = LedOut[i] ; switch(i) { //138译码 case 0:LS138A=0; LS138B=0; LS138C=0; break; case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; } delay(100); } P0 = 0; } |
|
|
|
|
|
//红外接收器
#include ***it IRIN = P3^2; //红外接收器数据线 void IRdelay(char x); //x*0.14MS void beep(); unsigned char IRCOM[7]; extern unsigned char Y0; extern void display(unsigned char Key_Val); /*******************************************************************/ void IRInit() { IE |= 0x81; //允许总中断中断,使能 INT0 外部中断 TCON |= 0x01; //触发方式为脉冲负边沿触发 IRIN=1; //I/O口初始化 } /**********************************************************/ void IR_IN(void) interrupt 0 { unsigned char j,k,N=0; EX0 = 0; IRdelay(5); if (IRIN==1) { EX0 =1; return; } //确认IR信号出现 while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。 {IRdelay(1);} for (j=0;j<4;j++) //收集四组数据 { for (k=0;k<8;k++) //每组数据有8位 { while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。 {IRdelay(1);} while (!IRIN) //等 IR 变为高电平 {IRdelay(1);} while (IRIN) //计算IR高电平时长 { IRdelay(1); N++; if (N>=30) { EX0=1; return;} //0.14ms计数过长自动离开。 } //高电平计数完毕 IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0” if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1” N=0; }//end for k }//end for j if (IRCOM[2]!=~IRCOM[3]) { EX0=1; return; } EX0 = 1; } /**********************************************************/ void IRdelay(unsigned char x) //x*0.14MS { unsigned char i; while(x--) { for (i = 0; i<13; i++) {} } } |
|
|
|
|
|
//试验数码管显示时钟,万年历参考程序 *
#include #include ***it SCK=P3^6; //时钟 ***it SDA=P3^4; //数据 ***it RST = P3^5;// DS1302复位 ***it LS138A=P2^2; ***it LS138B=P2^3; ***it LS138C=P2^4; bit ReadRTC_Flag;//定义读DS1302标志 unsigned char l_tmpdate[7]={0,0,12,15,5,3,8};//秒分时日月周年08-05-15 12:00:00 unsigned char l_tmpdisplay[8]; code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年 最低位读写位 code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共阴数码管 0-9 '-' '熄灭‘表 /******************************************************************/ /* 函数声明 */ /******************************************************************/ void Write_Ds1302_byte(unsigned char temp); void Write_Ds1302( unsigned char address,unsigned char dat ); unsigned char Read_Ds1302 ( unsigned char address ); void Read_RTC(void);//read RTC void Set_RTC(void); //set RTC void InitTIMER0(void);//inital timer0 /******************************************************************/ /* 主函数 */ /******************************************************************/ void main(void) { InitTIMER0(); //初始化定时器0 Set_RTC(); //写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽 while(1) { if(ReadRTC_Flag) { ReadRTC_Flag=0; Read_RTC(); l_tmpdisplay[0]=l_tmpdate[2]/16; //数据的转换,因我们采用数码管0~9的显示,将数据分开 l_tmpdisplay[1]=l_tmpdate[2]&0x0f; l_tmpdisplay[2]=10; //加入"-" l_tmpdisplay[3]=l_tmpdate[1]/16; l_tmpdisplay[4]=l_tmpdate[1]&0x0f; l_tmpdisplay[5]=10; l_tmpdisplay[6]=l_tmpdate[0]/16; l_tmpdisplay[7]=l_tmpdate[0]&0x0f; } } } /******************************************************************/ /* 定时器0初始化 */ /******************************************************************/ void InitTIMER0(void) { TMOD|=0x01;//定时器设置 16位 TH0=0xef;//初始化值 TL0=0xf0; ET0=1; TR0=1; EA=1; } /******************************************************************/ /* 写一个字节 */ /******************************************************************/ void Write_Ds1302_Byte(unsigned char temp) { unsigned char i; for (i=0;i<8;i++) //循环8次 写入数据 { SCK=0; SDA=temp&0x01; //每次传输低字节 temp>>=1; //右移一位 SCK=1; } } /******************************************************************/ /* 写入DS1302 */ /******************************************************************/ void Write_Ds1302( unsigned char address,unsigned char dat ) { RST=0; _nop_(); SCK=0; _nop_(); RST=1; _nop_(); //启动 Write_Ds1302_Byte(address); //发送地址 Write_Ds1302_Byte(dat); //发送数据 RST=0; //恢复 } /******************************************************************/ /* 读出DS1302数据 */ /******************************************************************/ unsigned char Read_Ds1302 ( unsigned char address ) { unsigned char i,temp=0x00; RST=0; _nop_(); _nop_(); SCK=0; _nop_(); _nop_(); RST=1; _nop_(); _nop_(); Write_Ds1302_Byte(address); for (i=0;i<8;i++) //循环8次 读取数据 { if(SDA) temp|=0x80; //每次传输低字节 SCK=0; temp>>=1; //右移一位 _nop_(); _nop_(); _nop_(); SCK=1; } RST=0; _nop_(); //以下为DS1302复位的稳定时间 _nop_(); RST=0; SCK=0; _nop_(); _nop_(); _nop_(); _nop_(); SCK=1; _nop_(); _nop_(); SDA=0; _nop_(); _nop_(); SDA=1; _nop_(); _nop_(); return (temp); //返回 } /******************************************************************/ /* 读时钟数据 */ /******************************************************************/ void Read_RTC(void) //读取 日历 { unsigned char i,*p; p=read_rtc_address; //地址传递 for(i=0;i<7;i++) //分7次读取 秒分时日月周年 { l_tmpdate[i]=Read_Ds1302(*p); p++; } } /******************************************************************/ /* 设定时钟数据 */ /******************************************************************/ void Set_RTC(void) //设定 日历 { unsigned char i,*p,tmp; for(i=0;i<7;i++){ //BCD处理 tmp=l_tmpdate[i]/10; l_tmpdate[i]=l_tmpdate[i]%10; l_tmpdate[i]=l_tmpdate[i]+tmp*16; } Write_Ds1302(0x8E,0X00); p=write_rtc_address; //传地址 for(i=0;i<7;i++) //7次写入 秒分时日月周年 { Write_Ds1302(*p,l_tmpdate[i]); p++; } Write_Ds1302(0x8E,0x80); } /******************************************************************/ /* 定时器中断函数 */ /******************************************************************/ void tim(void) interrupt 1 using 1 //中断,用于数码管扫描 { static unsigned char i,num; TH0=0xf5; TL0=0xe0; P0=table[l_tmpdisplay[i]]; //查表法得到要显示数字的数码段 switch(i) { case 0:LS138A=0; LS138B=0; LS138C=0; break; case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; case 4:LS138A=0; LS138B=0; LS138C=1; break; case 5:LS138A=1; LS138B=0; LS138C=1; break; case 6:LS138A=0; LS138B=1; LS138C=1; break; case 7:LS138A=1; LS138B=1; LS138C=1; break; } i++; if(i==8) { i=0; num++; if(10==num) //隔段时间读取1302的数据。时间间隔可以调整 { ReadRTC_Flag=1; //使用标志位判断 num=0; } } } |
|
|
|
|
|
好像还有些程序和模块没得呢
|
|
|
|
|
|
速度弄好咯 时间到啦
|
|
|
|
|
|
|
|
|
|
半个月来都忙着备考,心思都花在小抄上咯!做过小抄的孩童有同感不?~~~~好久没更新了!!!
// 通过单片机演奏音乐 八月桂花 #include #include ***it Beep = P1^5 ; unsigned char n=0; //n为节拍常数变量 unsigned char code music_tab[] ={ 0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数, 0x20, 0x40, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x10, 0x1C, 0x10, 0x18 , 0x40, 0x1C, 0x20, 0x20 , 0x20, 0x1C, 0x20, 0x18 , 0x20, 0x20, 0x80, 0xFF , 0x20, 0x30, 0x1C, 0x10 , 0x18, 0x20, 0x15, 0x20 , 0x1C, 0x20, 0x20, 0x20 , 0x26, 0x40, 0x20, 0x20 , 0x2B, 0x20, 0x26, 0x20 , 0x20, 0x20, 0x30, 0x80 , 0xFF, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x80, 0x20, 0x30, 0x1C , 0x10, 0x20, 0x10, 0x1C , 0x10, 0x20, 0x20, 0x26 , 0x20, 0x2B, 0x20, 0x30 , 0x20, 0x2B, 0x40, 0x20 , 0x15, 0x1F, 0x05, 0x20 , 0x10, 0x1C, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x30, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x40, 0x1C , 0x20, 0x20, 0x20, 0x26 , 0x40, 0x13, 0x60, 0x18 , 0x20, 0x15, 0x40, 0x13 , 0x40, 0x18, 0x80, 0x00 }; void int0() interrupt 1 //采用中断0 控制节拍 { TH0=0xd8; TL0=0xef; n--; } void delay (unsigned char m) //控制频率延时 { unsigned i=3*m; while(--i); } void delayms(unsigned char a) //豪秒延时子程序 { while(--a); //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了! } void main() { unsigned char p,m; //m为频率常数变量 unsigned char i=0; TMOD&=0x0f; TMOD|=0x01; TH0=0xd8;TL0=0xef; IE=0x82; play: while(1) { a: p=music_tab[i]; if(p==0x00) { i=0, delayms(1000); goto play;} //如果碰到结束符,延时1秒,回到开始再来一遍 else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延时100ms,继续取下一音符 else {m=music_tab[i++], n=music_tab[i++];} //取频率常数 和 节拍常数 TR0=1; //开定时器1 while(n!=0) Beep=~Beep,delay(m); //等待节拍完成, 通过P1口输出音频(可多声道哦!) TR0=0; //关定时器1 } } |
|
|
|
|
|
//蜂鸣器翁叫
//第一次听会兴奋,好奇,第二次平常,。。。。第N次,可能会XX的,不提倡bao li #include ***it buzz = P3^5; void T0_irq(void) interrupt 1 using 1 { TH0 = -(300/256); TL0 =- (300%256); buzz = ~buzz; } main() { TMOD = 0x01; TH0 = -(1000/256); TL0 =- (1000%256); EA = 1; ET0 = 1; TR0 = 1; for(;;){ } } |
|
|
|
|
|
有点长,涉及的知识面有点广,可能对一部分初学者来说有点难理解,不过一部分一部分来分析,还是可以入手的!
//* 标题: ************* DA-AD****************** * #include #include #define PCF8591 0x90 //PCF8591 地址 //else IO ***it LS138A=P2^2; ***it LS138B=P2^3; ***it LS138C=P2^4; //此表为 LED 的字模, 共阴数码管 0-9 - unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char AD_CHANNEL; unsigned long xdata LedOut[8]; unsigned int D[32]; /******************************************************************* DAC 变换, 转化函数 *******************************************************************/ bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val) { Start_I2c(); //启动总线 SendByte(sla); //发送器件地址 if(ack==0)return(0); SendByte(c); //发送控制字节 if(ack==0)return(0); SendByte(Val); //发送DAC的数值 if(ack==0)return(0); Stop_I2c(); //结束总线 return(1); } /******************************************************************* ADC发送字节[命令]数据函数 *******************************************************************/ bit ISendByte(unsigned char sla,unsigned char c) { Start_I2c(); //启动总线 SendByte(sla); //发送器件地址 if(ack==0)return(0); SendByte(c); //发送数据 if(ack==0)return(0); Stop_I2c(); //结束总线 return(1); } /******************************************************************* ADC读字节数据函数 *******************************************************************/ unsigned char IRcvByte(unsigned char sla) { unsigned char c; Start_I2c(); //启动总线 SendByte(sla+1); //发送器件地址 if(ack==0)return(0); c=RcvByte(); //读取数据0 Ack_I2c(1); //发送非就答位 Stop_I2c(); //结束总线 return(c); } //******************************************************************/ main() { char i,j; while(1) {/********以下AD-DA处理*************/ switch(AD_CHANNEL) { case 0: ISendByte(PCF8591,0x41); D[0]=IRcvByte(PCF8591)*2; //ADC0 模数转换1 放大2倍显示 break; case 1: ISendByte(PCF8591,0x42); D[1]=IRcvByte(PCF8591)*2; //ADC1 模数转换2 break; case 2: ISendByte(PCF8591,0x43); D[2]=IRcvByte(PCF8591)*2; //ADC2 模数转换3 break; case 3: ISendByte(PCF8591,0x40); D[3]=IRcvByte(PCF8591)*2; //ADC3 模数转换4 break; case 4: DACconversion(PCF8591,0x40, D[4]/4); //DAC 数模转换 break; } // D[4]=400; //数字--->>模拟输出 D[4]=D[3]; // 把模拟输入 采样的信号 通过数模转换输出 if(++AD_CHANNEL>4) AD_CHANNEL=0; /********以下将AD的值送到LED数码管显示*************/ LedOut[0]=Disp_Tab[D[1]%10000/1000]; LedOut[1]=Disp_Tab[D[1]%1000/100]; LedOut[2]=Disp_Tab[D[1]%100/10]|0x80; LedOut[3]=Disp_Tab[D[1]%10]; LedOut[4]=Disp_Tab[D[0]%10000/1000]; LedOut[5]=Disp_Tab[D[0]%1000/100]; LedOut[6]=Disp_Tab[D[0]%100/10]|0x80; LedOut[7]=Disp_Tab[D[0]%10]; for( i=0; i<8; i++) { P0 = LedOut[i]; switch(i) //使用switch 语句控制138译码器 也可以是用查表的方式 学员可以试着自己修改 { case 0:LS138A=0; LS138B=0; LS138C=0; break; case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; case 4:LS138A=0; LS138B=0; LS138C=1; break; case 5:LS138A=1; LS138B=0; LS138C=1; break; case 6:LS138A=0; LS138B=1; LS138C=1; break; case 7:LS138A=1; LS138B=1; LS138C=1; break; } for (j = 0 ; j<90 ;j++) { ;} //扫描间隔时间 } P0 = 0; } } |
|
|
|
|
|
/*************************此部分为I2C总线的驱动程序*************************************/
#include #include #include #define NOP() _nop_() /* 定义空指令 */ #define _Nop() _nop_() /*定义空指令*/ ***it SCL=P2^1; //I2C 时钟 ***it SDA=P2^0; //I2C 数据 bit ack; /*应答标志位*/ /******************************************************************* 起动总线函数 函数原型: void Start_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. ********************************************************************/ void Start_I2c() { SDA=1; /*发送起始条件的数据信号*/ _Nop(); SCL=1; _Nop(); /*起始条件建立时间大于4.7us,延时*/ _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; /*发送起始信号*/ _Nop(); /* 起始条件锁定时间大于4μs*/ _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; /*钳住I2C总线,准备发送或接收数据 */ _Nop(); _Nop(); } void Stop_I2c() { SDA=0; /*发送结束条件的数据信号*/ _Nop(); /*发送结束条件的时钟信号*/ SCL=1; /*结束条件建立时间大于4μs*/ _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; /*发送I2C总线结束信号*/ _Nop(); _Nop(); _Nop(); _Nop(); } void SendByte(unsigned char c) { unsigned char BitCnt; for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/ { if((c< _Nop(); SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/ _Nop(); _Nop(); /*保证时钟高电平周期大于4μs*/ _Nop(); _Nop(); _Nop(); SCL=0; } _Nop(); _Nop(); SDA=1; /*8位发送完后释放数据线,准备接收应答位*/ _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA==1)ack=0; else ack=1; /*判断是否接收到应答信号*/ SCL=0; _Nop(); _Nop(); } unsigned char RcvByte() { unsigned char retc; unsigned char BitCnt; retc=0; SDA=1; /*置数据线为输入方式*/ for(BitCnt=0;BitCnt<8;BitCnt++) { _Nop(); SCL=0; /*置时钟线为低,准备接收数据位*/ _Nop(); _Nop(); /*时钟低电平周期大于4.7μs*/ _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); retc=retc<<1; if(SDA==1)retc=retc+1; _Nop(); _Nop(); } SCL=0; _Nop(); _Nop(); return(retc); } void Ack_I2c(bit a) { if(a==0)SDA=0; else SDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); } |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 11:05 , Processed in 0.876697 second(s), Total 85, Slave 74 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号