这是关于蓝桥杯备赛路上练习的小程序,蓝桥杯的竞赛路上希望大家互相勉励。
祝大家有个好成绩。
以下代码是我利用手头上小红板(JW-51)训练的小程序。
希望大家一同进步。
这次程序是在大家的帮助下完成的,再次感谢大家的帮助。
/*数码管+ds18b20*/ #include<reg52.h> #include<intrins.h> typedef unsigned char u8; typedef unsigned int u16; sbit ds=P2^2; sbit ser=P2^7; sbit srclk=P2^6; sbit rclk=P2^5; bit flag; u8 a,b; unsigned char code smgduan[]={0x3f, 0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71}; unsigned char code smgwei[]={0xfe, 0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void delayms(u16 n); void TempDelay(u16 us); void send_595(u8 dat); void ds_reset() { ds=1; _nop_(); ds=0; TempDelay(80);//520us ds=1; TempDelay(5); if(ds==0) flag=1; else flag=0; TempDelay(20); ds=1; } bit ds_read_bit() { bit dat; ds=0; _nop_(); _nop_(); ds=1; _nop_(); dat=ds; TempDelay(12); return dat; } u8 ds_read_byte() { u8 i,j,value; for(i=0;i<8;i++) { j=ds_read_bit(); value=(j<<7)|(value>>1); } return value; } void ds_write_byte(u8 dat) { u8 i,onebit; for(i=0;i<8;i++) { onebit=dat&0x01; if(onebit) //?1 { ds=0; TempDelay(1); ds=1; _nop_(); } else //?0 { ds=0; TempDelay(11); ds=1; _nop_(); } dat>>=1; } } u8 get_temperature() { u16 temp,temp1; ds_reset(); ds_write_byte(0xcc); ds_write_byte(0x44); ds_reset(); ds_write_byte(0xcc); ds_write_byte(0xbe); a=ds_read_byte(); b=ds_read_byte(); temp=b; temp<<=8; temp|=a; temp1 = temp*0.0625; return temp1 ; } void main() { u16 j,d; while(1){ j=get_temperature(); send_595(smgwei[0]); send_595(smgduan[j/100]); rclk=0; rclk=1; delayms(1); send_595(smgwei[1]); send_595(smgduan[j%100/10]); rclk=0; rclk=1; delayms(1); send_595(smgwei[2]); send_595(smgduan[j%10]); rclk=0; rclk=1; delayms(1); send_595(smgwei[3]); send_595(0X80); rclk=0; rclk=1; delayms(1); d=(a%16)*10/16; send_595(smgwei[4]); send_595(smgduan[d%10]); rclk=0; rclk=1; delayms(1); send_595(smgwei[5]); send_595(smgduan[12]); rclk=0; rclk=1; delayms(1); } } void delayms(u16 n) { u8 i; while(n--) for(i=0;i<113;i++); } void TempDelay(u8 us) { while(us--); } void send_595(u8 dat) { u8 i; for(i=0;i<8;i++) { if(dat&0x80) ser=1; else ser=0; srclk=0; srclk=1; dat=dat<<1; } } /*1602屏+ds18b20其实只要返回值正确,用什么显示出来都一样, 因为先做的1602显示就干脆一起发出来了。*/ #include<reg52.h> #include<intrins.h> typedef unsigned char u8; typedef unsigned int u16; sbit ds=P2^2; sbit RS=P3^5; sbit RW=P3^6; sbit EN=P3^4; bit flag; u8 a,b; void delayms(u16 n); void TempDelay(u16 us); void W_cmd(u8 cmd); void W_dat(u8 dat); void init(); void ds_reset() { ds=1; _nop_(); ds=0; TempDelay(80);//520us ds=1; TempDelay(5); if(ds==0) flag=1; else flag=0; TempDelay(20); ds=1; } bit ds_read_bit() { bit dat; ds=0; _nop_(); _nop_(); ds=1; _nop_(); dat=ds; TempDelay(12); return dat; } u8 ds_read_byte() { u8 i,j,value; for(i=0;i<8;i++) { j=ds_read_bit(); value=(j<<7)|(value>>1); } return value; } void ds_write_byte(u8 dat) { u8 i,onebit; for(i=0;i<8;i++) { onebit=dat&0x01; if(onebit) //?1 { ds=0; TempDelay(1); ds=1; _nop_(); } else //?0 { ds=0; TempDelay(11); ds=1; _nop_(); } dat>>=1; } } u8 get_temperature() { u16 temp,temp1; ds_reset(); ds_write_byte(0xcc); ds_write_byte(0x44); ds_reset(); ds_write_byte(0xcc); ds_write_byte(0xbe); a=ds_read_byte(); b=ds_read_byte(); temp=b; temp<<=8; temp|=a; temp1 = temp*0.0625; return temp1 ; } void main() { u16 j,d; init(); while(1){ j=get_temperature(); W_cmd(0x80); W_dat(j/100+0x30); W_cmd(0x81); W_dat(j%100/10+0x30); W_cmd(0x82); W_dat(j%10+0x30); W_cmd(0x83); W_dat(0x2e); d=(a%16)*10/16; W_cmd(0x84); W_dat(d%10+0x30); W_cmd(0x85); W_dat('C'); } } void delayms(u16 n) { u8 i; while(n--) for(i=0;i<113;i++); } void TempDelay(u8 us) { while(us--); } void W_cmd(u8 cmd) { EN=0; RS=0; RW=0; EN=1; P0=cmd; delayms(2); EN=0; } void W_dat(u8 dat) { EN=0; RS=1; RW=0; EN=1; P0=dat; delayms(2); EN=0; } void init() { W_cmd(0x38); W_cmd(0x0f); W_cmd(0x06); W_cmd(0x01); }