《CT107D编程手册-15页精选文档.doc》由会员分享,可在线阅读,更多相关《CT107D编程手册-15页精选文档.doc(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、如有侵权,请联系网站删除,仅供学习与交流CT107D编程手册【精品文档】第 15 页一、IO口编程IO编程,该开发板使用了573锁存器,通过P2口的5,6,7位连接3-8译码器,扩展出了8个口,其中4个口分别连接4个573锁存器,这里以的锁存器来举例:原理图:分析代码:();其中,与进行与运算,高三位清零,其余位保持原来状态,不改变,即把控制译码器的高三位留出来:接着再或上;容易发现;或运算,与或结果为,与或结果不变,所以或上只需看的高三位,则高三位为,对应译码器的话,;所以输出;再经过与非运算,看下图示:则输出;即对应的锁存器的片选信号被选中,锁存器打通,接下来就可以对口进行操作,操作完之后
2、,;高三位直接清零,此时Y4C=0,则把锁存器锁上了。类似的方法,数码管、蜂鸣器等都是如此操作,选中锁存器代码:P2=(P2&0x1f)|(这里填对应锁存器的位移号)。二、 数码管动态扫描和定时器数码管显示分为段选和位选,数码管定义和显示函数:Code unsigned char tab = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned chardspbuf=10,10,10,10,10,10,10,10;unsigned chardspcom=0;void display()/段选,消隐P2=(P2&0x1f)|0xe0
3、);P0=0xff;P2=P2&0x1f;/位选P2=(P2&0x1f)|0xc0);P0=(1因为秒的范围是0-59,所以6,5,4位表示秒的十位,3,2,1,0表示个位,十位最大是5,所以三位即可。第二行:跟上面一样;第三行:7位:1为12小时制,0为24小时制;5位:12小时制时为0表示上午,1表示下午,24小时制时,和4位一起表示小时的十位;其余的时间一样的表示。倒数第二行:只看7位:为1时禁止写数据,所以开始写数据时必须置0;读数时:!需要加“写操作这一行代码”。读的话直接按照命令读即可。DS1302进阶(BCD码转换):解决之前60秒不能进位的问题。1)写入初始值时,要把10十进制
4、数转换为码,例:写入时间:Ds1302_Single_Byte_Write(0x8e,0x00);/写操作Ds1302_Single_Byte_Write(0x85, (17/10)4 |(17);/写时 Ds1302_Single_Byte_Write(0x83, (58/10)4 |(58);/写分Ds1302_Single_Byte_Write(0x81, (50/10)4 |(50);/写秒Ds1302_Single_Byte_Write(0x8e,0x80);/写保护即转换的公式是:(Value/10)4)*10 +(ReadValue&0x0F);八进制转十进制-ReadValue
5、=Ds1302_Single_Byte_Read(0x85); hour=(ReadValue&0x70)4)*10 +(ReadValue&0x0F); !(这句一定不要省) Ds1302_Single_Byte_Write(0x00, 0x00);/写操作 ReadValue=Ds1302_Single_Byte_Read(0x83); minute=(ReadValue&0x70)4)*10 +(ReadValue&0x0F); Ds1302_Single_Byte_Write(0x00, 0x00);/写操作 ReadValue=Ds1302_Single_Byte_Read(0x81
6、); sec=(ReadValue&0x70)4)*10 +(ReadValue&0x0F); Ds1302_Single_Byte_Write(0x00, 0x00);/写操作显示: dspbuf0=hour/10; dspbuf1=hour; dspbuf2=minute/10; dspbuf3=minute; dspbuf4=sec/10; dspbuf5=sec;七、 PCF8591与IIC总线的使用(1) IIC总线的使用:比赛提供了IIC的两个库文件,IIC.h;IIC.c,其中需要注意的函数是:其中,该函数是初始化的,当使用AD转换的时候需要在main函数开始时调用,该函数内部只
7、需看这句代码即可:i2c_sendbyte(0x03);/ADC通道3,板上有4个模拟输入口,分别为0,1,2,3;设置哪一个模拟输入口就是根据这句代码,0x03表示通道3,这是根据芯片手册配置的,如图:8位前6位不用管,都为0,最后两位就是配置选择哪一个通道的。第二个函数:读取AD转换后的数值,这个函数直接调用就可以了,函数内部如何实现不用管,但是需要注意的是:该函数扫描调用最好是100ms。第三个函数,上面的都是转换,即模拟信号转数字信号,下面这个函数是DA转换,数字信号转换成模拟信号,就是单片机输出数字信号,用万能表去量单片机引出的引脚,量一下电压大小,这个估计比赛不会考,不过预防万一:
8、该函数和上面两个函数分离开来的,一、二函数是要在一起使用,初始化后之后才能调用,第三个加入头文件,直接调用即可,比较简单!上面说法有误,A/D转换的初始化函数和读取转换后的数值都需要自己写。这里了解一下PCF8591只需根据时序格式发送地址字节和控制字节:,这是地址字节,其中A2,A1,A0硬件已经接地,故都为0,最低位表示的是你要从IIC总线上读数还是写数据,1表示读,0表示写,即读数据发的地址是:0x91;写数据发的地址是0x90;控制字节:由芯片资料知,控制字节有8位,有两位固定是0,除了第0、1位需要自己设置,其他的我们都设为0,那些位都是一些具体的功能,我们暂时用不着,不用管先,第0
9、、1位是模拟通道选择,PCF8591上提供了4路模拟通道,根据需求进行选择,如选择通道3即发送控制字节:0x03;地址字节和控制字节都明白了,接下来根据时序要求进行配置,A/D转换需要一个初始化函数:Init_ADpcf8591();和一个获得AD转换后的数值的函数:adc_pcf8591(); 其中初始化函数的作用是发送AD转换的控制字节;adc_pcf8591()发送读取得地址并读回数据,先写指令才能读;格式如下:这个是初始化的协议:分别是startIIC、(地址写)发送0x90、等待应答、发送控制字节(AD这里是选择通道的指令,如选择通道3,0x03)0x03、等待应答、(达到目的,没有
10、后续的操作,直接停止总线)StopIIC.初始化的函数就是如此写;adc_pcf8591的协议:依次是:startIIc、发送读地址0x91、等待应答、读回AD转换后的数值、读回后发送应答给PCF8591,表示收到,并且不需要再返回应答,要传参数1,如图红圈示,即函数Ack(1);、最后stopIIC总线。D/A转换(其实挺麻烦,先前太自信了,哈):所谓D/A转换其实就是把数字信号转换成模拟信号输出,用单片机发数字通过D/A转换成电压输出,检测的方法可以用电压表测量。配置的方法跟A/D类似,先发地址字节,再发控制字节,然后把数字发出去(AD这里是接收模拟信号,是相反的机制)。控制字节:如图示,
11、控制字节的第6位是1的话是模拟输出模式,其余位全为0,发送格式跟AD一样:代码如一开始图示。(2) EEPROM的使用,AT24C02,可以掉电依旧保存上一次操作的数据,下次上电后接着运行。需要注意两个函数,一个是写进EEPROM里面保存,再次上电再从里面读回来:其中写函数需要指定AT24C02的地址以及需要写入的数据,读函数要想取回写进的数据,需要从相同的地址里面读:其中AT24C02的存储地址是0x00,可以是其他地址,如0x02,但是读和写的地址必须一致。写与读的协议与AD或相同,由芯片资料及原理图知()的写地址为;读地址为;注意:读数的时候读出一个数之后发送一个应答信号,若()表示还想
12、继续读下一个字节,若();则不想再读数,让停止发送。八、 DS18B20时钟芯片的使用比赛有提供代码,只需记住这个函数:读取温度值,整数(其中,提示EA总中断要打开、关闭,也可以不用)。浮点数的表示。注意,只有提供函数,没有提供读取温度的函数,即上面的那个,只有下面:这几个函数。编写读取温度的函数需要记住DS13B20的三条指令,0xCC,跳过ROM检测;然后启动温度转换:0x44;转换需要时间,这里精确延时Delay_OneWire(200);然后再次初始化,再次执行跳过,然后读取温度指令:0xBE.;注意读出的温度是低字节先,然后才是高字节,分别用两个变量保存还要通过公式转换成我们需要的整
13、数或浮点数。完整代码如上图示。九、 超声波传感器的使用#includereg52.h/定义51单片机特殊功能寄存器#include intrins.h#include absacc.h/12M用这个/11.0592用这个#define somenop_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();sbit TX =P10;/发射引脚sbit RX =P11;/接收引脚code unsigned char tab = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xff;u
14、nsigned char dspbuf8 =10,10,10,10,10,10,10,10;/显示缓冲区unsigned char dspcom =0;unsigned int intr =0;bit s_flag;unsigned int t = 0;voidsend_wave(void);void display(void);void main(void) unsigned int distance; TMOD|= 0x11;/配置定时器工作模式 TH0= (65536-2000)/256; TL0= (65536-2000)%6; TH1= 0; TL1= 0; EA =1; ET0=
15、1;/打开定时器0中断 TR0= 1;/启动定时器 while(1) if(s_flag) s_flag = 0; t = TH1; t = 8; t |= TL1; distance = (unsigned int)(t*0.017); /计算距离 TH1 = 0; TL1 = 0; dspbuf5 = distance/100; dspbuf6 = distance0/10; dspbuf7 =distance; /定时器0中断服务函数voidisr_timer_0(void)interrupt 1 /默认中断优先级 1 TH0= (65536-2000)/256; TL0= (65536
16、-2000)%6;/定时器重载display(); /2ms执行一次if(+intr = 200) s_flag = 1; intr = 0;/显示函数 void display(void) XBYTE0xE000 = 0xff;/去除鬼影 XBYTE0xC000 = (1dspcom); XBYTE0xE000 = tabdspbufdspcom;if(+dspcom = 8) dspcom = 0;/TX引脚发送40KHz方波信号驱动超声波发送探头void send_wave(void)unsigned char i =8;/发送8个脉冲do TX = 1; somenop; TX = 0
17、; somenop;while(i-);必要时还可以加个看门狗: WDT_CONTR=0x34;十、 步进电机与直流电机的使用参考代码如下:#includesbit A1=P14;/定义步进电机连接端口sbit B1=P13;sbit C1=P12;sbit D1=P11;void qudong1();#define Dy_A1A1=1;B1=0;C1=0;D1=0;/A相通电,其他相断电#define Dy_B1A1=0;B1=1;C1=0;D1=0;/B相通电,其他相断电#define Dy_C1A1=0;B1=0;C1=1;D1=0;/C相通电,其他相断电#define Dy_D1A1=
18、0;B1=0;C1=0;D1=1;/D相通电,其他相断电 /采用1相励磁#define Dy_OFFA1=0;B1=0;C1=0;D1=0;/全部断电unsigned charSpeed,Speed1;void DelayUs2x(unsigned chart)while(-t);void DelayMs(unsigned chart)while(t-) /大致延时1mS DelayUs2x(245); DelayUs2x(245);main()Dy_OFF;for(;) qudong1();void qudong1()unsigned inti=470;/旋转一周时间Speed=5;whil
19、e(i-)/正向 Dy_A1 /遇到Coil_A1用A1=1;B1=0;C1=0;D1=0;代替 DelayMs(Speed); /改变这个参数可以调整电机转速, /数字越小,转速越大,力矩越小 Dy_B1 /顺序从A1-D1相通电如果为正转,那么顺序从D1-A1相通电则为反转 DelayMs(Speed); Dy_C1 DelayMs(Speed); Dy_D1 DelayMs(Speed);Dy_OFFi=512;while(i-)/反向 Dy_D1 /遇到Coil_A1用A1=1;B1=0;C1=0;D1=0;代替 DelayMs(Speed); /改变这个参数可以调整电机转速, /数字
20、越小,转速越大,力矩越小 Dy_C1 DelayMs(Speed); Dy_B1 DelayMs(Speed); Dy_A1 DelayMs(Speed);直流电机:#include#define uint unsigned intvoiddrive();voiddelay(uint);sbitdj1=P10; /电机,1引脚uintset; /set为电机转角标志位unsigned charangle,angle1;/angle为电机PWM变化打角voidTime0_Init() /中断初始化TMOD=0X01;IE=0X82;TH0=(65536-58)/256; TL0=(65536-58)%6;TR0=1;voidmain()