苏州科技学院
电子与信息工程学院
智能仪器实验报告
班 级: 电子0911 姓 名: 学 号:
2012年6月
实验一 显示实验
说明:所有实验都是根据CT107D实验板的原理图来仿真的
程序:
#include #define uchar unsigned char #define uint unsigned int #define rst573 P2&=0x1f #define ledY4C P2|=0x80 #define beeY5C P2|=0xa0 #define smgY6C P2|=0xc0 #define smgY7C P2|=0xe0 sbit P36=P3^6; sbit P06=P0^6; sbit P04=P0^4; sbit S7=P3^0; sbit S6=P3^1; uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阳极编码 void delaynms(uint ms) //秒延迟程序 { uint x,y; for(x=ms;x;x--) for(y=110;y;y--); } void init107() { rst573; P36=0; //led P0=0xff; ledY4C; rst573; //bee P04=0; P06=0; beeY5C; rst573; //smg P0=0x00; smgY6C; rst573; } void disp1(uint num1) //数码管显示程序 { uint qian,bai,shi,ge; qian=num1/1000; //千,百,十,个处理 bai=num1/100%10; shi=num1/10%10; ge=num1%10; smgY6C; P0=0xfe; rst573; smgY7C; P0=table[qian]; rst573; delaynms(2); smgY6C; P0=0xfd; rst573; P0=table[bai]; smgY7C; rst573; delaynms(2); P0=0xfb; smgY6C; rst573; P0=table[shi]; smgY7C; rst573; delaynms(2); P0=0xf7; smgY6C; rst573; P0=table[ge]; smgY7C; rst573; delaynms(2); 第1页 } void disp2(uint num2) //数码管显示程序 { uint qian,bai,shi,ge; P0=table[shi]; smgY7C; qian=num2/1000; //千,百,十,个 rst573; 处理 bai=num2/100%10; delaynms(2); shi=num2/10%10; P0=0x7f; ge=num2%10; smgY6C; smgY6C; rst573; P0=0xef; P0=table[ge]; rst573; smgY7C; smgY7C; rst573; P0=table[qian]; delaynms(2); rst573; } delaynms(2); void main() smgY6C; { P0=0xdf; uint a=2233,b=6688; rst573; init107(); P0=table[bai]; while(1) smgY7C; { rst573; disp1(a); delaynms(2); disp2(b); P0=0xbf; } smgY6C; } rst573; 仿真图: 第2页 实验二 A/D转换实验 程序: #include #define uchar unsigned char #define uint unsigned int #define delay5nop(); {_nop_();_nop_();_nop_();_nop_();_nop_();}; #define delay2nop(); {_nop_();_nop_();}; #define rst573 P2&=0x1f #define ledY4C P2|=0x80 #define beeY5C P2|=0xa0 #define smgY6C P2|=0xc0 #define smgY7C P2|=0xe0 sbit P36=P3^6; sbit P06=P0^6; sbit P04=P0^4; sbit S7=P3^0; sbit S6=P3^1; sbit IICCLK=P2^0; sbit IICDAT=P2^1; sbit relay=P0^4; sbit buzz=P0^6; uchar dy[3]; uint dis[3]; uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阳编码 void ULN2003_Latch(void) // ULN2003锁存子程序 { P2 &= 0x1f;//清P2.7~P2.5 P2 |= 0xa0;//P2.7~P2.5=101,Y5=0,Y5C=1,即U9的LE=1,数据选通 _nop_(); P2 &= 0x1f;//P2.7~P2.5=000,Y5=1,Y5C=0,即U9的LE=0,数据被锁存 } void iicstart() //启动i2c { IICDAT=1; IICCLK=1; delay5nop(); IICDAT=0; delay5nop();; IICCLK=0; } void iicstop() //停止i2c { IICDAT=0; IICCLK=1; delay5nop(); IICDAT=1; delay5nop(); IICCLK=0; } void ack() // 发送应答信号ACK { IICDAT=0; IICCLK=1; delay5nop(); IICCLK=0; } void noack() //不发送ACK { IICDAT=1; IICCLK=1; delay5nop(); IICCLK=0; } void iicInt() // { IICCLK=0; iicstop(); } void iicWrite(uchar y) //向PCF8591写一个字节 { uchar i; for(i=0;i<8;i++) { IICDAT=(bit)(y&0x80); IICCLK=1; delay2nop(); IICCLK=0; y=y<<1; } } uchar iicRead() //从IIC设备读出一个字节 { uchar y=0,i; IICDAT=1; for(i=0;i<8;i++) { y=y<<1; IICCLK=1; delay2nop(); y=y|(uchar)(IICDAT); IICCLK=0; } return y; } void delayms() //秒延迟 { uchar i,j; for(i=8;i>0;i--) for(j=60;j>0;j--); // (((60*2)+1)+2)*8+1 } void delaynms(uint x) //纳秒延迟 { while(x--) delayms(); } void display(uchar y) { dis[0]=y/100; //下面这三个分离是把从通道读取到的数值转换为电第3页 压 dis[1]=y%100/10; //想一下 dis[2]=y%10; //1.8v是不是数值92 } 5V为255那么1v是不是代表51 void ADCPCF8591(uchar controlbyte){ uchar i=0; iicstart(); iicWrite(0x90); noack(); iicWrite(controlbyte); noack(); iicstart(); iicWrite(0x91); noack(); iicRead(); ack(); while(i<2){ dy[i++]=iicRead(); ack();} dy[i]=iicRead(); noack(); iicstop(); delaynms(1); } void init107() { rst573; P36=0; //led P0=0xff; ledY4C; rst573; //bee P04=0; P06=0; beeY5C; rst573; //smg P0=0x00; smgY6C; rst573; } void disp() //数码管显示 { P0=0xdf; smgY6C; rst573; P0=table[dis[0]]; smgY7C; rst573; delaynms(2); P0=0xbf; smgY6C; rst573; P0=table[dis[1]]; smgY7C; rst573; delaynms(2); P0=0x7f; smgY6C; rst573; P0=table[dis[2]]; smgY7C; rst573; delaynms(2); } main() { init107(); //消除蜂鸣器叫声 buzz=0; relay=0; ULN2003_Latch(); buzz=0; ULN2003_Latch(); delaynms(5); while(1) { iicInt(); ADCPCF8591(0x04); display(dy[1]); disp(); } } 第4页 实验三 D/A转换实验 程序: #include #define uchar unsigned char #define uint unsigned int #define delay5nop(); {_nop_();_nop_();_nop_();_nop_();_nop_();}; #define delay2nop(); {_nop_();_nop_();}; #define rst573 P2&=0x1f #define ledY4C P2|=0x80 #define beeY5C P2|=0xa0 #define smgY6C P2|=0xc0 #define smgY7C P2|=0xe0 sbit P36=P3^6; sbit P06=P0^6; sbit P04=P0^4; sbit S7=P3^0; sbit S6=P3^1; sbit IICCLK=P2^0; sbit IICDAT=P2^1; uchar dy[3]; uint dis[3]; uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阳编码 void iicstart() //启动i2c { IICDAT=1; IICCLK=1; delay5nop(); IICDAT=0; delay5nop();; IICCLK=0; } void iicstop() //停止i2c { IICDAT=0; IICCLK=1; delay5nop(); IICDAT=1; delay5nop(); IICCLK=0; } void ack() // 发送应答信号ACK { IICDAT=0; IICCLK=1; delay5nop(); IICCLK=0; } void noack() //不发送ACK { IICDAT=1; IICCLK=1; delay5nop(); IICCLK=0; } void iicInt() // { IICCLK=0; iicstop(); } void iicWrite(uchar y) //向PCF8591写一个字节 { uchar i; for(i=0;i<8;i++) { IICDAT=(bit)(y&0x80); IICCLK=1; delay2nop(); IICCLK=0; y=y<<1; } } uchar iicRead() //从IIC设备读出一个字节 { uchar y=0,i; 第5页 IICDAT=1; for(i=0;i<8;i++) { y=y<<1; IICCLK=1; delay2nop(); y=y|(uchar)(IICDAT); IICCLK=0; } return y; } void delayms() //秒延迟 { uchar i,j; for(i=8;i>0;i--) for(j=60;j>0;j--); // (((60*2)+1)+2)*8+1 } void delaynms(uint x) //纳秒延迟 { while(x--) delayms(); } void display(uchar y) { dis[0]=y/51; //下面这三个分离是把从通道读取到的数值转换为电压 void init107() { rst573; P36=0; //led P0=0xff; ledY4C; rst573; //bee P04=0; P06=0; beeY5C; rst573; //smg P0=0x00; smgY6C; rst573; } void disp() //数码管显示 { P0=0xdf; smgY6C; rst573; P0=table[dis[0]]|0x80; smgY7C; rst573; delaynms(1); dis[1]=(y%51)*10/51; //想一 下5V为255那么1v是不是代表51 dis[2]=((y%51)*10%51)*10/51; //1.8v是不是数值92 } void ADCPCF8591(uchar controlbyte){ uchar i=0; iicstart(); iicWrite(0x90); noack(); iicWrite(controlbyte); noack(); iicstart(); iicWrite(0x91); noack(); iicRead(); ack(); while(i<2){ dy[i++]=iicRead(); ack();} dy[i]=iicRead(); noack(); iicstop(); delaynms(1); } P0=0xbf; smgY6C; rst573; P0=table[dis[1]]; smgY7C; rst573; delaynms(1); P0=0x7f; smgY6C; rst573; P0=table[dis[2]]; smgY7C; rst573; delaynms(1); } main() { init107(); while(1) { iicInt(); ADCPCF8591(0x04); display(dy[1]); disp(); } } 仿真图: 第6页 第7页 实验四 综合实验 程序: #include #define uint unsigned int #define uchar unsigned char sbit DQ = P1^4; sbit S7=P3^0; sbit S6=P3^1; sbit relay=P0^4; sbit buzz=P0^6; unsigned char code DuanMa[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xf7}; //共阳 unsigned char code WeiMa[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//分别对应相应的数码管点亮,即位码 #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0替换 uchar disData[]={11,11,11,11,11,11,11,11}; uchar times=0; uchar temperature; uint read_value; uchar temp_integer,temp_decimal; bit OneSecFlag=0; void delay2us(unsigned char t) //2us { while(t--); } void ULN2003_Latch(void) // ULN2003锁存子程序 { P2 &= 0x1f;//清P2.7~P2.5 P2 |= 0xa0;//P2.7~P2.5=101,Y5=0,Y5C=1,即U9的LE=1,数据选通 _nop_(); P2 &= 0x1f;//P2.7~P2.5=000,Y5=1,Y5C=0,即U9的LE=0,数据被锁存 } //DS18B20初始化函数 bit init_ds18b20(void) { bit initflag = 0; DQ = 1; delay2us(1); DQ = 0; delay2us(250); // 延时大于480us DQ = 1; delay2us(10); // 15us _nop_(); P2 &= 0x1f;//P2.7~P2.5=000,Y7=1,Y7C=0,即U7的LE=0,段码数据被锁存 } void BIT_Latch(void) //位码锁存子程序 { P2 &= 0x1f; //清P2.7~P2.5 P2 |= 0xC0; //P2.7~P2.5=110,Y6=0,Y6C=1,即U8的LE=1,位码数据选通 _nop_(); P2 &= 0x1f; //P2.7~P2.5=000,Y6=1,Y6C=0,即U8的LE=0,位码数据被锁存 } void delay_50us(uint t) //50us 延时 { uchar j; for(;t>0;t--) for(j=19;j>0;j--) ; } void display(uchar *point,uchar dot) { unsigned char i=0; for(i=0;i<8;i++) { DataPort=WeiMa[i]; //取位码 BIT_Latch(); //数据锁存 if(i==dot) DataPort=DuanMa[*(point+i)]&0x7f; //根据dot的值在相应的位添加小数点 else DataPort=DuanMa[*(point+i)]; //取显示数据,段码 SEG_Latch(); //数据锁存 delay_50us(10); // 扫描间隙延时,时间太长会闪烁,太短不亮 DataPort=0xff; //关显示,消除重影 SEG_Latch(); //数据锁存 } } void Init_timer0() { TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; ET0=1; TR0=1; EA=1; } //通过单总线向从器件写一个字节 void WriteOneChar(unsigned char byt) { unsigned char i; for(i=0;i<8;i++) 第8页 { DQ = 1; _nop_(); DQ = 0; DQ = byt&0x01; delay2us(15); DQ = 1; byt >>= 1; } delay2us(5); } //通过单总线从从器件读一个字节 unsigned char ReadOneChar(void) { unsigned char i; unsigned char byt; for(i=0;i<8;i++) { DQ = 0; // 拉低开始读时间隙 byt >>= 1; DQ = 1; //单片机释放总线 if(DQ) //18b20有效数据出现 byt |= 0x80; delay2us(30); } return byt; } //温度转换、读取及数据处理器函数 unsigned int rd_temperature(void) { unsigned char low,high; unsigned int temp; init_ds18b20(); WriteOneChar(0xCC); WriteOneChar(0x44); //启动温度转换 init_ds18b20(); WriteOneChar(0xCC); WriteOneChar(0xBE); //读取寄存器 low = ReadOneChar(); //低字节 high = ReadOneChar(); //高字节 temp = high<<8; temp += low; //这两行必须分开写 //这样写temp=high<<8+low出现的结果不正确 return temp; } void main(void) { //消除蜂鸣器叫声 buzz=0; relay=0; ULN2003_Latch(); buzz=0; ULN2003_Latch(); Init_timer0(); while(1) { while(S7==0) //表示按键按下,开始计时 { if(OneSecFlag) { if(S7!=0) //表示按键松开,按键一次,下同 { read_value = rd_temperature(); if(read_value > 0xf800)//若是负数,对读取值作处理 { disData[3]=10;//显示数组中第10个是显示“-” read_value = ~read_value;//取反 read_value +=1;//加1 } else disData[3]=11;//显示数组中第11个是消隐 //整数、小数分布分离 temp_integer = (read_value&0x0ff0)>>4; temp_decimal = (read_value&0x000f); //整数部分处理 //因为18b20的测温范围是-10~85C,没有必要用百位 disData[4]=temp_integer/10; //取整数的十位 disData[5]=temp_integer%10; //取整数的个位 //小数部分处理 //0.ABCD,保留两位小数,需*100==>AB.CD,取AB即可 //小数部分=(0000~1111)*0.0625,保留2位小数,放大100倍 //小数部分=(0000~1111)*6.25 //可以变成=(0000~1111)*25/4 disData[6]=temp_decimal*25/4/10;//取小数的高位 disData[7]=temp_decimal*25/4%10;//取小数的次高位 OneSecFlag = 0; TR0=1; //开中断,开始计时 } } } while(S6==0) //暂停 { if(S6!=0) {TR0=0; } } } } void Timer0_isr(void) interrupt 1 using 1 { TH0=(65536-10000)/256; TL0=(65536-10000)%256; times++; display(disData,5);//中断扫描数码管显示,也可以放在while(1)中 if(times == 100)//1s { OneSecFlag = 1; times=0; } 第9页 } 自动售水系统大作业 程序: #include #define uchar unsigned char #define uint unsigned int #define delay5nop(); {_nop_();_nop_();_nop_();_nop_();_nop_();}; #define delay2nop(); {_nop_();_nop_();}; #define rst573 P2&=0x1f #define ledY4C P2|=0x80 #define beeY5C P2|=0xa0 #define smgY6C P2|=0xc0 #define smgY7C P2|=0xe0 sbit IICCLK=P2^0; sbit IICDAT=P2^1; sbit P36=P3^6; sbit P06=P0^6; sbit P04=P0^4; sbit S7=P3^0; sbit S6=P3^1; uint t1,t2,t3,t4,m; uchar dy[3]; uint dis[3]; uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴编码 uchar table1[]={0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; void display(uchar y) { dis[0]=y/33; } void delaynms(uint ms) //延迟 { uint x,y; for(x=ms;x;x--) for(y=110;y;y--); } /************************************** i2c定义模块 **************************************/ void iicstart() //启动i2c { IICDAT=1; IICCLK=1; delay5nop(); IICDAT=0; delay5nop();; IICCLK=0; } void iicstop() //停止i2c { IICDAT=0; IICCLK=1; delay5nop(); IICDAT=1; delay5nop(); IICCLK=0; } void ack() // 发送应答信号ACK { IICDAT=0; IICCLK=1; delay5nop(); IICCLK=0; } void noack() //不发送ACK { IICDAT=1; IICCLK=1; delay5nop(); IICCLK=0; } void iicInt() // { IICCLK=0; iicstop(); } void iicWrite(uchar y) //向PCF8591写一个字节 { uchar i; for(i=0;i<8;i++) { IICDAT=(bit)(y&0x80); IICCLK=1; delay2nop(); IICCLK=0; y=y<<1; } } uchar iicRead() //从IIC设备读出一个字节 { uchar y=0,i; IICDAT=1; for(i=0;i<8;i++) { y=y<<1; IICCLK=1; delay2nop(); y=y|(uchar)(IICDAT); IICCLK=0; } return y; } void ADCPCF8591(uchar controlbyte) //PCF8591方式控制字 { uchar i=0; iicstart(); iicWrite(0x90); noack(); iicWrite(controlbyte); noack(); 第10页 iicstart(); iicWrite(0x91); noack(); iicRead(); ack(); while(i<2) { dy[i++]=iicRead(); ack(); } dy[i]=iicRead(); noack(); iicstop(); delaynms(1); } void zhuanhuan() { iicInt(); ADCPCF8591(0x04); display(dy[1]); P0=table1[dis[0]]; ledY4C; rst573; } /****************************************** 38译码器选通模块 ******************************************/ void init107() { rst573; P36=0; //led P0=0xff; ledY4C; rst573; //bee P04=0; P06=0; beeY5C; rst573; //smg P0=0x00; smgY6C; rst573; } /******************************************** 显示模块 ********************************************/ void smg_fei(uint num1) //显示单价 { uint bai,shi,ge; bai=num1/100; shi=num1/10%10; ge=num1%10; P0=0xfd; smgY6C; rst573; P0=table[bai]|0x80; smgY7C; rst573; delaynms(2); P0=0xfb; smgY6C; rst573; P0=table[shi]; smgY7C; rst573; delaynms(2); P0=0xf7; smgY6C; rst573; P0=table[ge]; smgY7C; rst573; delaynms(2); } void smg_shui() //显示水的容量 { smgY6C; P0=0xef; rst573; smgY7C; P0=table[t4]; rst573; delaynms(2); P0=0xdf; smgY6C; rst573; P0=table[t3]|0x80; smgY7C; rst573; delaynms(2); P0=0xbf; smgY6C; rst573; P0=table[t2]; smgY7C; rst573; delaynms(2); P0=0x7f; smgY6C; rst573; P0=table[t1]; smgY7C; rst573; delaynms(2); } void zong() //显示总价格 { m=t4*500+t3*50+t2*5+t1/2; t4=m/1000; //千,百,十,个处理 t3=m/100%10; t2=m/10%10; t1=m%10; } void ULN2003_l() //控制L10亮 { P0=0x10; beeY5C; rst573; } void ULN2003_m() //控制L10灭 { P0=0x00; 第11页 beeY5C; rst573; } void t0intinit( ) //定时器T0初始化 { TMOD=0x01; TH0=0x3c; //设初值,50ms定时 TL0=0xb0; EA=1; //CPU开中断 ET0=1; //T0允许中断 } void Timer0Interrupt(void) interrupt 1 //定时器T0中断 方式1 { uchar time; TH0=0x3c; //装入处初值 TL0=0xb0; time++; if(time==10) //20*50ms=1s { time=0; t1++; //满1s,个位加一 if(t1==10) //个位满十进一 { t1=0; t2++; } if(t2==10) //十位满九回零 { t2=0; t3++; } if(t3==10) //百位满九回零 { t3=0; t4++; } if(t4==10) //千位满九回零 { t4=0; } } } void main() { uint a=50; init107(); t0intinit( ); while(1) { zhuanhuan(); smg_fei(a); smg_shui(); while(S7==0) //表示按键按下,开始计时 { smg_shui(); ULN2003_l(); if(S7) //表示按键松开,按键一次,下同 TR0=1; //开中断,开始计时 } while(S6==0) //暂停 { if(S6) { //关中断,停止计时 smg_shui(); ULN2003_m(); zong(); TR0=0; } } } } 按下S7自动售水仿真: 第12页 按下S6停止售水,并显示总价仿真图: 当光线比较弱时L1灯亮起仿真图: 第13页
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- vipyiyao.com 版权所有 湘ICP备2023022495号-8
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务