您好,欢迎来到易妖游戏网。
搜索
您的当前位置:首页苏州科技学院-智能仪器实验报告

苏州科技学院-智能仪器实验报告

来源:易妖游戏网


苏州科技学院

电子与信息工程学院

智能仪器实验报告

班 级: 电子0911 姓 名: 学 号:

2012年6月

实验一 显示实验

说明:所有实验都是根据CT107D实验板的原理图来仿真的

程序:

#include #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 #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 #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 #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); // 15usinitflag = DQ; // initflag等于1初始化失败 delay2us(40); //< 60usvoid SEG_Latch(void) //段码锁存子程序 { P2 &= 0x1f; //清P2.7~P2.5 P2 |= 0xe0;//P2.7~P2.5=111,Y7=0,Y7C=1,即U7的LE=1,段码数据选通

_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 #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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务