完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
超赞,不错的啊,支持楼主
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{:6:}{:6:}{:6:}{:6:}
|
|
|
|
|
|
hello 还是我,Stone_up。 经过几个小时的奋战,74HC165驱动按键程序和大家见面了,还是老规矩,C51平台。 我喜欢实战,不喜欢在仿真软件里面仿真,我觉得那样没有感觉。但是合理的利用仿真软件有助于开发。 另外我喜欢搞模块,不管是硬件还是软件,总是模块思想,这样有很多好处,有了现成的模块,小的项目,3分钟搭建起来,大点的项目,10分钟搭建起来。哈哈,是不是很爽呢? 以我的经验,在做实物之前,一定要再三确认电路是否有问题,然后才开始干,作用是不言而喻的。 本次焊接这个板子,画了3个小时,是不是有点多呢?呵呵,万能板焊接,大家看看图片就知道了,各种不好焊接,要的是耐心 ok,言归正传,老规矩,有图有真相。 不好意思,今晚上图片传不上来,改天补上。 直接上代码 CPU:STC89C52RC 晶振:11.0592MHz #include #include ***it HC165_SH = P2 ^ 0; // 移位控制端/置入控制端(Pin1) ***it HC165_CLK = P2 ^ 1; // 时钟输入端(上升沿有效)(Pin2) ***it HC165_SDA = P2 ^ 2; // 串行数据输出端(Pin10) ***it LED = P2 ^ 7; ***it BUZZER = P1 ^ 7; typedef unsigned char u8; typedef unsigned int u16; typedef unsigned char uint8; typedef unsigned int uint16; #define CNT_DELAY_CNT1 25 // 按键去抖动延时阀值 #define CNT_DELAY_CNT2 5 // 按键列输出信号稳定的小延时 #define CNT_BUZZER_TIME 60 u16 key_status = 0; u8 key_sec = 0; u8 key_lock1, key_lock2, key_lock3, key_lock4, key_lock5, key_lock6, key_lock7, key_lock8, key_lock9, key_lock10, key_lock11, key_lock12, key_lock13, key_lock14, key_lock15, key_lock16; u8 delay_cnt1, delay_cnt2, delay_cnt3, delay_cnt4, delay_cnt5, delay_cnt6, delay_cnt7, delay_cnt8, delay_cnt9, delay_cnt10, delay_cnt11, delay_cnt12, delay_cnt13, delay_cnt14, delay_cnt15, delay_cnt16; u8 buzzer_time_cnt; void interrupt_init(void); void key_scan(void); void key_service(void); int main(void) { interrupt_init(); // 定时器中断初始化 BUZZER = 1; // 关闭蜂鸣器(其实不关闭也可以,因为这是51单片机,上电时IO是高电平),但是写程序需要有这个意识 while(1) { key_service(); // 按键服务函数 } return 0; } void timer0_interrupt(void) interrupt 1 { ET0 = 0; // 关闭定时器中断,避免二次中断 LED = 0; key_scan(); // 按键扫描函数 if(buzzer_time_cnt) // 控制蜂鸣器声音的长短 { BUZZER = 0; // 开启蜂鸣器 --buzzer_time_cnt; // 蜂鸣器声音长短的计数延时 } else { BUZZER = 1; // 关闭蜂鸣器 } // TH0 = (65536-2000)/256; // TL0 = (65536-2000)%256; TH0 = 0xfe; TL0 = 0x33; ET0 = 1; } void interrupt_init(void) { TMOD = TMOD | 0x01; TMOD = TMOD & 0xFD; // TH0 = (65536-2000)/256; // TL0 = (65536-2000)%256; TH0 = 0xfe; TL0 = 0x33; // 定时0.5ms TR0 = 1; ET0 = 1; // 开启外部中断 EA = 1; // 开启总中断 } void key_scan(void) { u8 i = 0; key_status = 0x0000; // 通过驱动2片74HC165来获取16个按键状态 HC165_SH = 0; // 锁存并行数据开始 _nop_(); _nop_(); HC165_SH = 1; // 锁存并行数据结束 _nop_(); _nop_(); for(i=0; i<16; i++) { HC165_CLK = 0; // 拉低时钟 _nop_(); _nop_(); key_status <<= 1; if(HC165_SDA == 1) // 1-有按键按下 0-无按键按下 { key_status = key_status | 0x0001; // 先处理最高位(H为最高位,第一片hc165在先) } HC165_CLK = 1; // 拉高时钟 _nop_(); _nop_(); } // 通过解析每一位电平状态来确定哪个按键被触发 if((key_status & 0x0100) == 0x0100) { key_lock1 = 0; delay_cnt1 = 0; } else if(key_lock1 == 0) { ++delay_cnt1; if(delay_cnt1 > CNT_DELAY_CNT1) { delay_cnt1 = 0; key_lock1 = 1; key_sec = 1; } } if((key_status & 0x0200) == 0x0200) { key_lock2 = 0; delay_cnt2 = 0; } else if(key_lock2 == 0) { ++delay_cnt2; if(delay_cnt2 > CNT_DELAY_CNT1) { delay_cnt2 = 0; key_lock2 = 1; key_sec = 2; } } if((key_status & 0x0400) == 0x0400) { key_lock3 = 0; delay_cnt3 = 0; } else if(key_lock3 == 0) { ++delay_cnt3; if(delay_cnt3 > CNT_DELAY_CNT1) { delay_cnt3 = 0; key_lock3 = 1; key_sec = 3; } } if((key_status & 0x0800) == 0x0800) { key_lock4 = 0; delay_cnt4 = 0; } else if(key_lock4 == 0) { ++delay_cnt4; if(delay_cnt4 > CNT_DELAY_CNT1) { delay_cnt4 = 0; key_lock4 = 1; key_sec = 4; } } if((key_status & 0x1000) == 0x1000) { key_lock5 = 0; delay_cnt5 = 0; } else if(key_lock5 == 0) { ++delay_cnt5; if(delay_cnt5 > CNT_DELAY_CNT1) { delay_cnt5 = 0; key_lock5 = 1; key_sec = 5; } } if((key_status & 0x2000) == 0x2000) { key_lock6 = 0; delay_cnt6 = 0; } else if(key_lock6 == 0) { ++delay_cnt6; if(delay_cnt6 > CNT_DELAY_CNT1) { delay_cnt6 = 0; key_lock6 = 1; key_sec = 6; } } if((key_status & 0x4000) == 0x4000) { key_lock7 = 0; delay_cnt7 = 0; } else if(key_lock7 == 0) { ++delay_cnt7; if(delay_cnt7 > CNT_DELAY_CNT1) { delay_cnt7 = 0; key_lock7 = 1; key_sec = 7; } } if((key_status & 0x8000) == 0x8000) { key_lock8 = 0; delay_cnt8 = 0; } else if(key_lock8 == 0) { ++delay_cnt8; if(delay_cnt8 > CNT_DELAY_CNT1) { delay_cnt8 = 0; key_lock8 = 1; key_sec = 8; } } if((key_status & 0x0001) == 0x0001) { key_lock9 = 0; delay_cnt9 = 0; } else if(key_lock9 == 0) { ++delay_cnt9; if(delay_cnt9 > CNT_DELAY_CNT1) { delay_cnt9 = 0; key_lock9 = 1; key_sec = 9; } } if((key_status & 0x0002) == 0x0002) { key_lock10 = 0; delay_cnt10 = 0; } else if(key_lock10 == 0) { ++delay_cnt10; if(delay_cnt10 > CNT_DELAY_CNT1) { delay_cnt10 = 0; key_lock10 = 1; key_sec = 10; } } if((key_status & 0x0004) == 0x0004) { key_lock11 = 0; delay_cnt11 = 0; } else if(key_lock11 == 0) { ++delay_cnt11; if(delay_cnt11 > CNT_DELAY_CNT1) { delay_cnt11 = 0; key_lock11 = 1; key_sec = 11; } } if((key_status & 0x0008) == 0x0008) { key_lock12 = 0; delay_cnt12 = 0; } else if(key_lock12 == 0) { ++delay_cnt12; if(delay_cnt12 > CNT_DELAY_CNT1) { delay_cnt12 = 0; key_lock12 = 1; key_sec = 12; } } if((key_status & 0x0010) == 0x0010) { key_lock13 = 0; delay_cnt13 = 0; } else if(key_lock13 == 0) { ++delay_cnt13; if(delay_cnt13 > CNT_DELAY_CNT1) { delay_cnt13 = 0; key_lock13 = 1; key_sec = 13; } } if((key_status & 0x0020) == 0x0020) { key_lock14 = 0; delay_cnt14 = 0; } else if(key_lock14 == 0) { ++delay_cnt14; if(delay_cnt14 > CNT_DELAY_CNT1) { delay_cnt14 = 0; key_lock14 = 1; key_sec = 14; } } if((key_status & 0x0040) == 0x0040) { key_lock15 = 0; delay_cnt15 = 0; } else if(key_lock15 == 0) { ++delay_cnt15; if(delay_cnt15 > CNT_DELAY_CNT1) { delay_cnt15 = 0; key_lock15 = 1; key_sec = 15; } } if((key_status & 0x0080) == 0x0080) { key_lock16 = 0; delay_cnt16 = 0; } else if(key_lock16 == 0) { ++delay_cnt16; if(delay_cnt16 > CNT_DELAY_CNT1) { delay_cnt16 = 0; key_lock16 = 1; key_sec = 16; } } } /* * Function Name : void key_service(void) * Description : 按键服务函数 放在main函数里面 * Input : -- * Output : -- */ void key_service(void) { switch(key_sec) { case 1: // 1 号按键 buzzer_time_cnt = CNT_BUZZER_TIME; key_sec = 0; // 处理完相应按键程序后,把按键选择变量清零,避免一直触发 break; case 2: // 2 号按键 buzzer_time_cnt = CNT_BUZZER_TIME; key_sec = 0; break; case 3: // 3 号按键 buzzer_time_cnt = CNT_BUZZER_TIME; key_sec = 0; break; case 4: // 4 号按键 buzzer_time_cnt = CNT_BUZZER_TIME; key_sec = 0; break; case 5: // 5 号按键 buzzer_time_cnt = CNT_BUZZER_TIME; key_sec = 0; // 处理完相应按键程序后,把按键选择变量清零,避免一直触发 break; case 6: // 6 号按键 buzzer_time_cnt = CNT_BUZZER_TIME; key_sec = 0; break; case 7: // 7 号按键 buzzer_time_cnt = CNT_BUZZER_TIME; key_sec = 0; break; case 8: // 8 号按键 buzzer_time_cnt = CNT_BUZZER_TIME; key_sec = 0; break; case 9: // 9 号按键 buzzer_time_cnt = CNT_BUZZER_TIME; key_sec = 0; // 处理完相应按键程序后,把按键选择变量清零,避免一直触发 break; case 10: // 10 号按键 buzzer_time_cnt = CNT_BUZZER_TIME; key_sec = 0; break; case 11: // 11 号按键 buzzer_time_cnt = CNT_BUZZER_TIME; key_sec = 0; break; case 12: // 12 号按键 buzzer_time_cnt = CNT_BUZZER_TIME; key_sec = 0; break; case 13: // 13 号按键 buzzer_time_cnt = CNT_BUZZER_TIME; key_sec = 0; // 处理完相应按键程序后,把按键选择变量清零,避免一直触发 break; case 14: // 14 号按键 buzzer_time_cnt = CNT_BUZZER_TIME; key_sec = 0; break; case 15: // 15 号按键 buzzer_time_cnt = CNT_BUZZER_TIME; key_sec = 0; break; case 16: // 16 号按键 buzzer_time_cnt = CNT_BUZZER_TIME; key_sec = 0; break; } } |
|
|
|
|
|
上图,有图有真相。
不知道大家发现没有,我每次的实验都有一个LED,呵呵。有我的道理,调试程序方便,除了用串口发送数据到上位机等, 可以用一个LED来指示程序的运行状况。 键盘在工作中.... 坑爹的万能板焊接,花了整整3个小时,但是值得高兴的是,一次焊接成功,没有存在短路的情况,我做事比较认真,呵呵。 每次焊接一个东西,焊接完毕之后,第一件事是写测试程序,测试是否好使。 |
|
|
|
|
|
第三十三节:温度篇--利用MAX6675和K型热电偶来采集超高温度
开场白: 当K型热电偶冷热两端的温度不一样时,热电偶的回路就会产生微弱电压,这个电压跟两端的温差有关系。我们需要把这个微弱电压信号放大,利用AD读取出这个电压数值,再进行温度补偿,最后通过查表才能得出温度值。这个过程很繁琐,涉及到的硬件电路和软件编程的工作量还是挺多的,因此MAX6675就干脆帮我们把这一系列的工作都做完了,我们只要用单片机的3根IO口跟MAX6675通讯,直接把它的温度值读取出来就可以了。 MAX6675本质上是一个12位的AD转换芯片,内部自带温度补偿和查表的功能。利用MAX6675和K型热电偶的方案,可以采集的温度范围是0至1023.75度。特别适合于用在工业现场的高温控制项目。每一位AD数值代表0.25度,所以我们把读取出来的AD数值乘以0.25就是实际温度,操作起来非常简单。 MAX6675输出的是16位的数据。最左边是高位第15位,最右边是低位第0位。其中第0,1,15这三位的数据我们可以不管。而第2位的数据是用来判断热电偶是否连接断开,如果是1表示热电偶连接已经断开,如果是0表示热电偶连接正常。而第3位至第14位就是有效的12位AD数据。 (1)功能需求: 利用6位数码管显示当前环境的温度,温度范围是0度到1023.75度。如果热电偶连接断开,那么数码管什么都不显示。 (2)硬件原理: (a)动态扫描数码管的电路请参考第二十一节。 (d)MAX6675和K型热电偶以及单片机的连接电路请参考MAX6675的pdf文档。 (3)源码适合的单片机: PIC16F73,晶振为3.579545MHz。 (4)单片机的C语言源代码讲解如下: #include //补充说明:吴坚鸿程序风格是这样的,凡是输出IO后缀都是_dr,凡是输入的IO后缀都是_sr #define seg_0_dr RB6 //任意7个IO口接数码管的seg引脚 #define seg_1_dr RB5 #define seg_2_dr RB4 #define seg_3_dr RB3 #define seg_4_dr RC7 #define seg_5_dr RB0 #define seg_6_dr RB1 #define com_6_dr RC2 //6个IO口接数码管的com引脚 #define com_5_dr RC5 #define com_4_dr RB2 #define com_3_dr RB7 #define com_2_dr RC0 #define com_1_dr RC1 #define M_CE_dr RC3 //MAX6675片选线 #define M_SCK_dr RC4 //MAX6675时钟线 #define M_IO_sr RC6 //MAX6675数据线 void initial();//初始化 void delay1(unsigned int de) ;//小延时程序,时间不宜太长,因为内部没有喂看门狗 void display_drive(); //数码管驱动程序,放在定时中断里 void display_seg(unsigned char seg); //编码转换程序,放在display_drive里 unsigned long read_max6675();//读取Max6675的16位数据 unsigned char number_6=0; //第6位数码管显示的内容 unsigned char number_5=0; //第5位数码管显示的内容 unsigned char number_4=0; //第4位数码管显示的内容 unsigned char number_3=0; //第3位数码管显示的内容 unsigned char number_2=0; //第2位数码管显示的内容 unsigned char number_1=0; //第1位数码管显示的内容 unsigned char number_6_temp=0; //第6位数码管显示内容的中间变量 unsigned char number_5_temp=0; //第5位数码管显示内容的中间变量 unsigned char number_4_temp=0; //第4位数码管显示内容的中间变量 unsigned char number_3_temp=0; //第3位数码管显示内容的中间变量 unsigned char number_2_temp=0; //第2位数码管显示内容的中间变量 unsigned char number_1_temp=0; //第1位数码管显示内容的中间变量 unsigned char dis_step=1; //扫描的步骤 unsigned char open_flag=0; //判断热电偶是否断开的标志位,0表示正常,1表示断开。 unsigned long read_data=0; //读取MAX6675的16位数据中间变量。 unsigned long m_long=0; //中间变量 unsigned long temper=0; //实际的温度值,用来去显示 unsigned int time_dly=0; //每次采集温度的时间间隔。由于本系统的实时性要求不高,不用时刻采集AD,每采集一次可以“休息一会再继续采集” main() //主程序 { initial(); //初始化 while(1) { CLRWDT(); //喂单片机内部自带的看门狗,大家可以不管它 if(time_dly>=20) //每次采集温度的时间间隔。由于本系统的实时性要求不高,不用时刻采集AD,每采集一次可以“休息一会再继续采集” { time_dly=0; //时间间隔计数器清零 read_data=read_max6675();//读取Max6675的16位数据 if((read_data&0x0004)==0x0004) //第2位数据为1时,热电偶断开 { open_flag=1; //判断热电偶是否断开的标志位,0表示正常,1表示断开。 } else { open_flag=0; //判断热电偶是否断开的标志位,0表示正常,1表示断开。 } read_data=read_data>>3; //截取中间12位有效AD数据 read_data=read_data&0x00000fff; //截取12位有效AD数据 read_data=read_data*25; //计算出实际的温度值。保留小数点后面两位,因此不用除以100. temper=read_data; //把运算完后的结果付给实际温度的变量 if(open_flag==0) //热电偶连接正常 { number_6_temp=temper/100000; //分解出千位数据 m_long=temper%100000; //分解出百位数据 number_5_temp=m_long/10000; m_long=temper%10000; //分解出十位数据 number_4_temp=m_long/1000; m_long=temper%1000; //分解出个位数据 number_3_temp=m_long/100; m_long=temper%100; //分解出小数点后面第1位数据 number_2_temp=m_long/10; number_1_temp=temper%10; //分解出小数点后面第2位数据 TMR1IE=0; //禁止定时中断 防止在传递显示数据时被定时中断了,导致显示的数据不完整,里面的代码执行的时间尽可能小 number_6=number_6_temp; //显示实际温度数值,保留小数点后面两位 number_5=number_5_temp; number_4=number_4_temp; number_3=number_3_temp; number_2=number_2_temp; number_1=number_1_temp; TMR1IE=1; //允许定时中断 } else //热电偶断开 ,数码管什么都不显示 { TMR1IE=0; //禁止定时中断 防止在传递显示数据时被定时中断了,导致显示的数据不完整,里面的代码执行的时间尽可能小 number_6=10; //显示空编码,也就是灭的状态 number_5=10; //显示空编码,也就是灭的状态 number_4=10; //显示空编码,也就是灭的状态 number_3=10; //显示空编码,也就是灭的状态 number_2=10; //显示空编码,也就是灭的状态 number_1=10; //显示空编码,也就是灭的状态 TMR1IE=1; //允许定时中断 } } } } //读取Max6675的16位数据 unsigned long read_max6675() { unsigned long max6675_data=0; unsigned char tempdata2=0; //中间循环变量 M_IO_sr=1; //对于PIC单片机,这条语句可以不要,但是51单片机必须要。因为“读取数据之前先置1” M_SCK_dr=0; asm("nop"); M_CE_dr=0; asm("nop");asm("nop"); asm("nop");asm("nop"); for(tempdata2=0;tempdata2<16;tempdata2++) { CLRWDT(); M_SCK_dr=0; max6675_data<<=1; if(M_IO_sr==1)max6675_data++; M_SCK_dr=1; asm("nop");asm("nop"); } M_CE_dr=1; asm("nop"); M_SCK_dr=0; return max6675_data; //返回16位数据 } void interrupt timer1rbint(void) //中断程序入口 { if(TMR1IE==1&&TMR1IF==1) //定时中断程序 { TMR1IF=0; TMR1ON=0; if(time_dly<20)++time_dly; //每次采集温度的时间间隔。由于本系统的实时性要求不高,不用时刻采集AD,每采集一次可以“休息一会再继续采集” display_drive(); //数码管驱动程序,放在定时中断里 TMR1H=0xFF; TMR1L=0xC8; TMR1ON=1; } } void initial()//初始化 { ADCON0=0x41; //设置AD模式 ADCON1=0x04; //RA0作为AD输入通道,本程序中没有用到AD,不用管它 TRISB=0x00; //数码管IO口设置成输出 TRISC7=0; TRISC0=0; TRISC1=0; TRISC2=0; TRISC5=0; TRISC3=0; //MAX6675 TRISC4=0; TRISC6=1; T1CON=0x24; //定时中断配置 TMR1H=0xFE; TMR1L=0xEF; INTCON=0xC0; TMR1IF=0; TMR1IE=1; PEIE=1; //外围中断允许 GIE=1; TMR1ON=1; } void display_drive() //数码管驱动程序,放在定时中断里 { seg_0_dr=0; seg_1_dr=0; seg_2_dr=0; seg_3_dr=0; seg_4_dr=0; seg_5_dr=0; seg_6_dr=0; com_6_dr=1; //在即将更换下一位数码管时,先把让6个数码管什么都不显示,让显示过度更加平稳 com_5_dr=1; com_4_dr=1; com_3_dr=1; com_2_dr=1; com_1_dr=1; asm("nop"); //空指令延时 asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); switch(dis_step) { case 1: //扫描第6位的数码管 display_seg(number_6); //如果不是任意IO口,可以直接用查表的方式取代此子程序 com_6_dr=0; //选中第6位数码管 com_5_dr=1; com_4_dr=1; com_3_dr=1; com_2_dr=1; com_1_dr=1; break; case 2: //扫描第5位的数码管 display_seg(number_5); //如果不是任意IO口,可以直接用查表的方式取代此子程序 com_6_dr=1; //选中第5位数码管 com_5_dr=0; com_4_dr=1; com_3_dr=1; com_2_dr=1; com_1_dr=1; break; case 3: //扫描第4位的数码管 display_seg(number_4); //如果不是任意IO口,可以直接用查表的方式取代此子程序 com_6_dr=1; //选中第5位数码管 com_5_dr=1; com_4_dr=0; com_3_dr=1; com_2_dr=1; com_1_dr=1; break; case 4: //扫描第3位的数码管 display_seg(number_3); //如果不是任意IO口,可以直接用查表的方式取代此子程序 com_6_dr=1; //选中第5位数码管 com_5_dr=1; com_4_dr=1; com_3_dr=0; com_2_dr=1; com_1_dr=1; break; case 5: //扫描第2位的数码管 display_seg(number_2); //如果不是任意IO口,可以直接用查表的方式取代此子程序 com_6_dr=1; //选中第5位数码管 com_5_dr=1; com_4_dr=1; com_3_dr=1; com_2_dr=0; com_1_dr=1; break; case 6: //扫描第1位的数码管 display_seg(number_1); //如果不是任意IO口,可以直接用查表的方式取代此子程序 com_6_dr=1; //选中第5位数码管 com_5_dr=1; com_4_dr=1; com_3_dr=1; com_2_dr=1; com_1_dr=0; break; } delay1(50); //每一位数码管显示的停留延时时间,嫌它耗时太长的朋友请自己尝试改成计数延时的方式, //鸿哥认为在此种环境下,在定时中断里用死延时delay1(50)是最佳的方式 ++dis_step; //下一次中断扫描另外一位的数码管,轮流扫描 if(dis_step>6) { dis_step=1; } } //不是鸿哥不懂爱,如果不是用任意IO口,而是直接用一个并口(比如51单片机中的P1口),那么就不用那么费力, //直接用查数组(俗称查表)的方式就可以替代display_seg这个编码转换程序, void display_seg(unsigned char seg) //编码转换程序,,放在display_drive里 { switch(seg) //switch指令,单片机中的战斗机,鸿哥的最爱! { case 0: //显示"0" seg_0_dr=1; seg_1_dr=1; seg_2_dr=1; seg_3_dr=1; seg_4_dr=0; seg_5_dr=1; seg_6_dr=1; break; case 1: //显示"1" seg_0_dr=1; seg_1_dr=1; seg_2_dr=0; seg_3_dr=0; seg_4_dr=0; seg_5_dr=0; seg_6_dr=0; break; case 2: //显示"2" seg_0_dr=1; seg_1_dr=0; seg_2_dr=1; seg_3_dr=1; seg_4_dr=1; seg_5_dr=1; seg_6_dr=0; break; case 3: //显示"3" seg_0_dr=1; seg_1_dr=1; seg_2_dr=0; seg_3_dr=1; seg_4_dr=1; seg_5_dr=1; seg_6_dr=0; break; case 4: //显示"4" seg_0_dr=1; seg_1_dr=1; seg_2_dr=0; seg_3_dr=0; seg_4_dr=1; seg_5_dr=0; seg_6_dr=1; break; case 5: //显示"5" seg_0_dr=0; seg_1_dr=1; seg_2_dr=0; seg_3_dr=1; seg_4_dr=1; seg_5_dr=1; seg_6_dr=1; break; case 6: //显示"6" seg_0_dr=0; seg_1_dr=1; seg_2_dr=1; seg_3_dr=1; seg_4_dr=1; seg_5_dr=1; seg_6_dr=1; break; case 7: //显示"7" seg_0_dr=1; seg_1_dr=1; seg_2_dr=0; seg_3_dr=0; seg_4_dr=0; seg_5_dr=1; seg_6_dr=0; break; case 8: //显示"8" seg_0_dr=1; seg_1_dr=1; seg_2_dr=1; seg_3_dr=1; seg_4_dr=1; seg_5_dr=1; seg_6_dr=1; break; case 9: //显示"9" seg_0_dr=1; seg_1_dr=1; seg_2_dr=0; seg_3_dr=1; seg_4_dr=1; seg_5_dr=1; seg_6_dr=1; break; case 10: //什么也不显示,空 seg_0_dr=0; seg_1_dr=0; seg_2_dr=0; seg_3_dr=0; seg_4_dr=0; seg_5_dr=0; seg_6_dr=0; break; } } void delay1(unsigned int de) { unsigned int t; for(t=0;t (5)下集预告: 温度篇--利用DS18B20来采集温度。 (未完待续,下节更精彩,不要走开哦!) |
|
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2086 浏览 1 评论
3630 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2336 浏览 2 评论
2763 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4029 浏览 5 评论
978浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6365浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 18:55 , Processed in 1.121927 second(s), Total 89, Slave 80 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号