您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 招聘面试 > 第三部分 8051扩展资源的C编程
课程:单片机技术教材:单片机的C语言应用程序设计教学基本要求:(1)、熟悉8255、8155接口的C编程;(2)、掌握DAC0832接口的C编程;(3)、掌握ADC0809接口的C编程;(4)、掌握键盘接口的C编程;(5)、掌握LED显示器接口的C编程。教学重点:(1)、键盘接口的C编程;(2)、LED显示器接口的C编程。教学难点:(1)、在Keil中调试各接口程序第三部分8051扩展资源的C编程课程:单片机技术教材:单片机的C语言应用程序设计一、8255应用的C编程例:用8255控制打印机8255采用方式0。打印机忙时,BUSY=1。/STB上升沿锁存时数据。假设高8位不用的地址线为0,低8位不用为1,则A口、B口、C口和命令口地址为:007CH(0000000001111100),B口为007DH,C口为007EH,命令口为007FH;8EH(10001110)A口方式0输出,C口高为输入,C口低为输出,方式选择命令字为:课程:单片机技术教材:单片机的C语言应用程序设计向打印机输出字符串“WELCOME”#includeabsacc.h#includereg51.h#defineucharunsignedchar#defineCOM8255XBYTE[0x007f]#definePA8255XBYTE[0x007c]#definePC8255XBYTE[0x007e]voidtoprn(uchar*p)/*打印字符串函数*/{while(*p!=‘\0’){while((0x80&PC8255)!=0);/*查询等待打印机的BUSY状态*/PA8255=*p;/*输出字符*/COM8255=0x00;/*产生STB上升沿*/COM8255=0x01;p++;}}课程:单片机技术教材:单片机的C语言应用程序设计voidmain(void){ucharidataprn[]=“WELCOME”;COM8255=0x8e;/*输出方式选择命令字*/COM8255=0x01;toprn(prn);/*打印字符串*/}课程:单片机技术教材:单片机的C语言应用程序设计8155应用的C编程8155可直接与8051接口,8155的RAM和I/O编址由IO/M和ALE锁存地址决定:IO/M=0,选择RAM,编址为00H—0FFH;IO/M=1,对8155的I/O进行读写,编址如下;A2A1A0I/O口000命令口状态口001PA口010PB口011PC口100定时器低8位101定时器高6位和方式课程:单片机技术教材:单片机的C语言应用程序设计例:用8155控制打印机课程:单片机技术教材:单片机的C语言应用程序设计下面是打印“北京SPRING1999”的程序,其中汉字“北京”在硬汉字库的标准机内代码为B1B1H和BEA9H。打印机与8051采用中断的方式联络。程序名prnbyte.c.#includeabsacc.h#includereg51.h#defineucharunsignedchar#defineCOM8155XBYTE[0x7ff0]#definePA8155XBYTE[0x7ff1]#definePC8155XBYTE[0x7ff3]sbitBUSY=P3^3;ucharcodetrb[17]={0xb1,0xb1,0xbe,0xa9,0x20,0x53,0x50,0x52,0x49,0x4e,0x47,0x20,0x31,0x39,0x39,0x39,0x0a};/*北京SPRING1999*/uchart1=17;voidprt(uchard)/*打印一字符函数*/{PA8155=d;/*送打印字代码*/PC8155=0x00;/*产生/STB低电平*/PC8155=0x01;/*产生/STB上升沿*/while(BUSY);}课程:单片机技术教材:单片机的C语言应用程序设计voidmain(void){COM8155=0x0f;/*置命令字*/prt(0x1c);/*送中文打印方式命令字高字节*/prt(0x26);/*送中文打印方式命令字低字节*/EA=1;/*开CPU中断*/EX1=1;/*开外中断1*/while(1){}}voidint1()inerrupt2using1/*打印机中断服务函数*/{uchari;EA=0;for(i=0;it1;i++)/*打印一串字符*/prt(tab[i]);EA=1;EX1=0;/*关打印机中断*/}课程:单片机技术教材:单片机的C语言应用程序设计二、DAC0832应用的C编程例1:8051与DAC0832双缓冲接口的数据转换程序举例。两片DAC0832的输入寄存器地址分别为8FFFH和A7FFH,两芯片的DAC寄存器地址为2FFFH。课程:单片机技术教材:单片机的C语言应用程序设计将data1和data2数据同时转换为模拟量的C51程序如下:#includeabsacc.h#includereg51.h#defineINPUTR1XBYTE[0x8fff]#defineINPUTR2XBYTE[0xa7ff]#defineDACRXBYTE[0x2fff]#defineucharunsignedcharvoiddac2b(data1,data2)uchardata1,data2;{INPUTR1=data1;/*送数据到一片0832*/INPUTR2=data2;/*送数据到另一片0832*/DACR=0;/*启动两路D/A同时转换*/}课程:单片机技术教材:单片机的C语言应用程序设计例2:8051与DAC0832单缓冲区接口的数据转换举例。课程:单片机技术教材:单片机的C语言应用程序设计根据片选线确定FFFEH为DAC0832的端口地址。使运行输出端输出一个锯齿波电压信号的C51程序如下:#includeabsacc.h#includereg51.h#defineDA0832XBYTE[0xfffe]#defineucharunsignedchar#defineuintunsignedintvoidstair(void){uchari;while(1){for(i=0;i=255;i=I++)/*形成锯齿波输出值,最大值为255*/{DA0832=i;/*D/A转换输出*/}}}课程:单片机技术教材:单片机的C语言应用程序设计三、ADC0809应用的C编程例:ADC0809与8051接口的数据采集程序举例。课程:单片机技术教材:单片机的C语言应用程序设计从ADC0809的8通道轮流采集一次数据,结果送数组ad。程序如下:#includeabsacc.h#includereg51.h#defineucharunsignedchar#defineIN0XBYTE[0x7ff8]/*设置AD0809的通道0地址*/sbitad_busy=P3^3;/*即EOC状态*/voidad0809(ucharidata*x)/*采样结果放指针中的A/D采集函数*/{uchari;ucharxdata*ad_adr;ad_adr=&IN0;课程:单片机技术教材:单片机的C语言应用程序设计for(i=0;i8;i++)/*处理8通道*/{*ad_adr=0;/*启动转换*/i=i;/*延时*/i=i;while(ad_busy==0);/*查询等待转换结束*/x[i]=*ad_adr;/*存转换结果*/ad_adr++;/*下一通道*/}}voidmain(void){staticucharidataad[10];ad0809(ad);/*采样AD0809通道的值*/}课程:单片机技术教材:单片机的C语言应用程序设计例:4×4键盘的扫描程序。四、键盘接口的C编程课程:单片机技术教材:单片机的C语言应用程序设计扫描程序查询的内容为:(1)查询是否有键按下。首先单片机向行扫描P1.0~P1.3输出全为0扫描码F0H,然后从列检查口P1.4~P1.7输入列扫描信号,只要有一列信号不为1,即P1口不为F0H,则表示有键按下。接着要查出按下键所在的行、列位置。课程:单片机技术教材:单片机的C语言应用程序设计(2)查询按下键所在的行列位置。单片机将得到的信号取反,P1.4~P1.7中的为1的位便是键所在的列。接下来要确定键所在的行,需要进行逐行扫描。单片机首先使P1.0为0,P1.1~P1.7为1,即向P1口发送扫描码FEH,接着输入列检查信号,若全为1,表示不在第一行。接着使P1.1接地,其余为1,再读入列信号……这样逐行发0扫描码,直到找到按下键所在的行,将该行扫描码取反保留。当各行都扫描以后仍没有找到,则放弃扫描,认为是键的误动作。课程:单片机技术教材:单片机的C语言应用程序设计(3)对得到的行号和列号译码,得到键值。(4)键的抖动处理。当用手按下一个键时,往往会出现所按键在闭合位置和断开位置之间跳几下才稳定到闭合状态的情况。在释放一个键时,也会出现类似的情况,这就是键抖动,抖动的持续时间不一,通常不会大于10ms,若抖动问题不解决,就会引起对闭合键的多次读入,对于键抖动最方便的解决方法就是当发现有键按下后,不是立即进行逐行扫描,而是延时10ms后再进行。由于键按下的时间持续上百毫秒,延时后再也不迟。课程:单片机技术教材:单片机的C语言应用程序设计扫描函数的返回值为键特征码,若无键按下,返回值为0。程序如下:#includereg51.h#defineucharunsignedchar#defineuintunsignedintvoiddlms(void);voidkbscan(void);voidmain(void){ucharkey;课程:单片机技术教材:单片机的C语言应用程序设计while(1){key=kbscan();dlms();}}voiddlms(void){uchari;for(i=200;i0;i--){}}ucharkbscan(void)/*键扫描函数*/{ucharscode,recode;P1=0xf0;if((P1&0xf0)!=0xf0)/*若有键按下*/{dlms();/*延时去抖动*/if((P1&0xf0)!=0xf0){scode=0xfe;/*逐行扫描初值*/while((scode&0x10)!=0){P1=scode;/*输出扫描码*/课程:单片机技术教材:单片机的C语言应用程序设计if((P1&0xf0)!=0xf0)/*本行有键按下*/{recode=(P1&0xf0)|0x0f;return((~scode)+(~recode));/*返回特征字节码*/}elsescode=(scode1)|0x01;/*行扫描左移一位*/}}}return(0);}课程:单片机技术教材:单片机的C语言应用程序设计五、LED数码管显示器的C编程例1:LED数码管显示器程序设计举例。课程:单片机技术教材:单片机的C语言应用程序设计8155片内4个端口地址如下:命令/状态口:FFF0H口A:FFF1H口B:FFF2H口C:FFF3H6位待显示字符从左到右依次放在dis_buf数组中,显示次序从右向左顺序进行。程序中的table为段选码表,表中段选码表存放的次序为0~F等。以下为循环动态显示6位字符的程序,8155命令字为07H。课程:单片机技术教材:单片机的C语言应用程序设计#includeabsacc.h#includereg51.h#defineucharunsignedchar#defineCOM8155XBYTE[0xfff0]#definePA8155XBYTE[0xfff1]#definePB8155XBYTE[0xfff2]#definePC8155XBYTE[0xfff3]ucharidatadis_buf[6]={2,4,6,8,10,12};ucharcodetable[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f
本文标题:第三部分 8051扩展资源的C编程
链接地址:https://www.777doc.com/doc-3370761 .html