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

时间:2022-05-30 22:12:54  热度:1°C

1、苏州科技学院 电子与信息工程学院 智能仪器实验报告 班班 级级: : 电电子子 0911 姓姓 名:名: 学学 号:号: 2012 年年 6 月月 实验一实验一 显示实验显示实验 说明:所有实验都是根据 CT107D 实验板的原理图来仿真的 程序: #include #include #define uchar unsigned char #define uint unsigned int #define rst573 P2 sbit P06=P06/ sbit P04=P04/ sbit S7=P30/ sbit S6=P31/ uchar table=0x3f/0x06/0x5b/0x4f

2、/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

3、/1000/ /千,百,十,个 处理 bai=num1/100%10/ shi=num1/10%10/ ge=num1%10/ smgY6C/ P0=0xfe/ rst573/ smgY7C/ P0=tableqian/ rst573/ delaynms(2)/ smgY6C/ P0=0xfd/ rst573/ P0=tablebai/ smgY7C/ rst573/ delaynms(2)/ P0=0xfb/ smgY6C/ rst573/ P0=tableshi/ smgY7C/ rst573/ delaynms(2)/ P0=0xf7/ smgY6C/ rst573/ P0=tableg

4、e/ smgY7C/ rst573/ delaynms(2)/ 第 2 页 void disp2(uint num2) /数码管显示程序 uint qian/bai/shi/ge/ qian=num2/1000/ /千,百,十,个 处理 bai=num2/100%10/ shi=num2/10%10/ ge=num2%10/ smgY6C/ P0=0xef/ rst573/ smgY7C/ P0=tableqian/ rst573/ delaynms(2)/ smgY6C/ P0=0xdf/ rst573/ P0=tablebai/ smgY7C/ rst573/ delaynms(2)/ P

5、0=0xbf/ smgY6C/ rst573/ P0=tableshi/ smgY7C/ rst573/ delaynms(2)/ P0=0x7f/ smgY6C/ rst573/ P0=tablege/ smgY7C/ rst573/ delaynms(2)/ void main() uint a=2233/b=6688/ init107()/ while(1) disp1(a)/ disp2(b)/ 仿真图: 实验二实验二 A/DA/D 转换实验转换实验 程序: #include #include #define uchar unsigned char #define uint unsig

6、ned int #define delay5nop()/ _nop_()/_nop_()/_nop_()/_nop_()/_nop_()/ #define delay2nop()/ _nop_()/_nop_()/ #define rst573 P2 sbit P06=P06/ sbit P04=P04/ sbit S7=P30/ sbit S6=P31/ sbit IICCLK=P20/ sbit IICDAT=P21/ sbit relay=P04/ sbit buzz=P06/ uchar dy3/ uint dis3/ uchar table=0x3f/0x06/0x5b/0x4f/0

7、x66/0x6d/0x7d/0x07/0x 7f/0x6f/ /共阳编码 void ULN2003_Latch(void) / ULN2003 锁存子程 序 P2 /清 P2/7P2/5 P2 |= 0xa0//P2/7P2/5=101/Y5=0/Y5C=1/即 U9 的 LE=1/数据选通 _nop_()/ P2 /P2/7P2/5=000/Y5=1/Y5C=0/即 U9 的 LE=0/数据被锁存 void iicstart() /启动 i2c IICDAT=1/ IICCLK=1/ delay5nop()/ IICDAT=0/ delay5nop()/ IICCLK=0/ void iic

8、stop() /停止 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/ f

9、or(i=0/i0/i-) for(j=60/j0/j-)// (60*2)+1)+2)*8+1 void delaynms(uint x) /纳秒延迟 while(x-) delayms()/ void display(uchar y) dis0=y/100/ /下 面这三个分离是把从通道读取到的数值转换为电 第 4 页 压 dis1=y%100/10/ /想一下 5V 为 255 那么 1v 是不是代表 51 dis2=y%10/ /1/8v 是不是数值 92 void ADCPCF8591(uchar controlbyte) uchar i=0/ iicstart()/ iicWrit

10、e(0x90)/ noack()/ iicWrite(controlbyte)/ noack()/ iicstart()/ iicWrite(0x91)/ noack()/ iicRead()/ ack()/ while(i #include #define uchar unsigned char #define uint unsigned int #define delay5nop()/ _nop_()/_nop_()/_nop_()/_nop_()/_nop_()/ #define delay2nop()/ _nop_()/_nop_()/ #define rst573 P2 sbit P

11、06=P06/ sbit P04=P04/ sbit S7=P30/ sbit S6=P31/ sbit IICCLK=P20/ sbit IICDAT=P21/ uchar dy3/ uint dis3/ uchar table=0x3f/0x06/0x5b/0x4f/0x66/0x6d/0x7d/0x07/0x 7f/0x6f/ /共阳编码 void iicstart() /启动 i2c IICDAT=1/ IICCLK=1/ delay5nop()/ IICDAT=0/ delay5nop()/ IICCLK=0/ void iicstop() /停止 i2c IICDAT=0/ IIC

12、CLK=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/i0/i-) for(j=60/j0/j-

13、)// (60*2)+1)+2)*8+1 void delaynms(uint x) /纳秒延迟 while(x-) delayms()/ void display(uchar y) dis0=y/51/ /下面 这三个分离是把从通道读取到的数值转换为电压 dis1=(y%51)*10/51/ /想一 下 5V 为 255 那么 1v 是不是代表 51 dis2=(y%51)*10%51)*10/51/ /1/8v 是不是数值 92 void ADCPCF8591(uchar controlbyte) uchar i=0/ iicstart()/ iicWrite(0x90)/ noack()

14、/ iicWrite(controlbyte)/ noack()/ iicstart()/ iicWrite(0x91)/ noack()/ iicRead()/ ack()/ while(i #include #define uint unsigned int #define uchar unsigned char sbit DQ = P14/ sbit S7=P30/ sbit S6=P31/ sbit relay=P04/ sbit buzz=P06/ unsigned char code DuanMa=0xc0/0xf9/0xa4/0xb0/0x99/0x92/0x82/0xf8/0

15、x80/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 OneSecFla

16、g=0/ void delay2us(unsigned char t)/2us while(t-)/ void ULN2003_Latch(void) / ULN2003 锁存子程 序 P2 /清 P2/7P2/5 P2 |= 0xa0//P2/7P2/5=101/Y5=0/Y5C=1/即 U9 的 LE=1/数据选通 _nop_()/ P2 /P2/7P2/5=000/Y5=1/Y5C=0/即 U9 的 LE=0/数据被锁存 /DS18B20 初始化函数 bit init_ds18b20(void) bit initflag = 0/ DQ = 1/ delay2us(1)/ DQ = 0/

17、 delay2us(250)/ / 延时大于 480us DQ = 1/ delay2us(10)/ / 15us0/t-) for(j=19/j0/j-) / void display(uchar *point/uchar dot) unsigned char i=0/ for(i=0/i= 1/ delay2us(5)/ /通过单总线从从器件读一个字节 unsigned char ReadOneChar(void) unsigned char i/ unsigned char byt/ for(i=0/i= 1/ DQ = 1/ /单片机释放总线 if(DQ) /18b20 有效数据出现

18、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 = ReadOne

19、Char()/ /高字节 temp = high 0xf800)/若是负数/对读取值 作处理 disData3=10//显示数组中第 10 个是 显示“-” read_value = read_value//取反 read_value +=1//加 1 else disData3=11//显示数组中第 11 个是消 隐 /整数、小数分布分离 temp_integer = (read_value temp_decimal = (read_value /整数部分处理 /因为 18b20 的测温范围是-1085C/没有必 要用百位 disData4=temp_integer/10/ /取整数的 十位

20、 disData5=temp_integer%10/ /取整数的 个位 /小数部分处理 /0/ABCD/保留两位小数/需*100=AB/CD/取 AB 即可 /小数部分=(00001111)*0/0625/保留 2 位小 数/放大 100 倍 /小数部分=(00001111)*6/25 /可以变成=(00001111)*25/4 disData6=temp_decimal*25/4/10//取小数 的高位 disData7=temp_decimal*25/4%10//取小数 的次高位 OneSecFlag = 0/ TR0=1/ /开中断,开始计时 while(S6=0) /暂停 if(S6!

21、=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/ 第 10 页 自动售水系统大作业自动售水系统大作业 程序: #include #include #define uchar unsigned char #define uint unsigned int

22、#define delay5nop()/ _nop_()/_nop_()/_nop_()/_nop_()/_nop_()/ #define delay2nop()/ _nop_()/_nop_()/ #define rst573 P2 sbit IICDAT=P21/ sbit P36=P36/ sbit P06=P06/ sbit P04=P04/ sbit S7=P30/ sbit S6=P31/ uint t1/t2/t3/t4/m/ uchar dy3/ uint dis3/ uchar table=0x3f/0x06/0x5b/0x4f/0x66/0x6d/0x7d/0x07/0x

23、7f/0x6f/ /共***编码 uchar table1=0xfe/0xfe/0xff/0xff/0xff/0xff/0xff/0xff/0xff/0xf f/0xff/0xff/0xff/0xff/0xff/0xff/ void display(uchar y) dis0=y/33/ void delaynms(uint ms) /延迟 uint x/y/ for(x=ms/x/x-) for(y=110/y/y-)/ void iicstart() /启动 i2c IICDAT=1/ IICCLK=1/ delay5nop()/ IICDAT=0/ delay5

24、nop()/ 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) /向

25、 PCF8591 写一个字节 uchar i/ for(i=0/i8/i+) IICDAT=(bit)(y IICCLK=1/ delay2nop()/ IICCLK=0/ y=y1/ uchar iicRead() /从 IIC 设备读出一个字节 uchar y=0/i/ IICDAT=1/ for(i=0/i8/i+) y=y1/ IICCLK=1/ delay2nop()/ y=y|(uchar)(IICDAT)/ IICCLK=0/ return y/ void ADCPCF8591(uchar controlbyte) /PCF8591 方式控制字 uchar i=0/ iicsta

26、rt()/ iicWrite(0x90)/ noack()/ iicWrite(controlbyte)/ noack()/ iicstart()/ iicWrite(0x91)/ noack()/ iicRead()/ ack()/ while(i2) dyi+=iicRead()/ ack()/ dyi=iicRead()/ noack()/ iicstop()/ delaynms(1)/ void zhuanhuan() iicInt()/ ADCPCF8591(0x04)/ display(dy1)/ P0=table1dis0/ ledY4C/ rst573/ 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=tablebai|0x80/ smgY7C/ rst573/ delayn

28、ms(2)/ P0=0xfb/ smgY6C/ rst573/ P0=tableshi/ smgY7C/ rst573/ delaynms(2)/ P0=0xf7/ smgY6C/ rst573/ P0=tablege/ smgY7C/ rst573/ delaynms(2)/ void smg_shui() /显示水的容量 smgY6C/ P0=0xef/ rst573/ smgY7C/ P0=tablet4/ rst573/ delaynms(2)/ P0=0xdf/ smgY6C/ rst573/ P0=tablet3|0x80/ smgY7C/ rst573/ delaynms(2)/

29、 P0=0xbf/ smgY6C/ rst573/ P0=tablet2/ smgY7C/ rst573/ delaynms(2)/ P0=0x7f/ smgY6C/ rst573/ P0=tablet1/ 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

30、() /控制 L10 灭 P0=0x00/ beeY5C/ rst573/ void t0intinit( )/定时器 T0 初始化 TMOD=0x01/ 第 12 页 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

31、(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 自动售水仿真: 按下 S6 停止售水,并显示总价仿真图: 当光线比较弱时 L1 灯亮起仿真图:

免责声明:
1. 《苏州科技学院-智能仪器实验报告》内容来源于互联网,版权归原著者或相关公司所有。
2. 若《86561825文库网》收录的文本内容侵犯了您的权益或隐私,请立即通知我们删除。