最全单片机参考答案(姜志海)

发布时间 : 星期六 文章最全单片机参考答案(姜志海)更新完毕开始阅读

l_code=l_code&0x0f; if(l_code!=0xef) {

h_code=0xfe; /*逐行输出0*/ while(h_code!=0xff) {

H_PORT=h_code; l_code=L_PORT; l_code=l_code&0x0f; if(l_code==0x0f) {

h_code=h_code<<1; h_code=h_code|0x01; } }

h_code^=0xff; /*计算键值,方法是先把行值与0xff相异或,使对应的0的那一位变为1*/

for(i=0;i<=x;i++) /* 然后把行值与2的指数幂作比较,若想等,则把其对应的幂值赋给行值*/

{ /*最后,把得到的行值放在高四位,与列值相或可得到键值*/ if(h_code==Exp(2,x)) {

h_code=x; break; } }

h_code=h_code<<4; key_code=h_code|l_code;

21

switch(key_code) {

case 0x0e: case 0x1e: ……

case 0x67: case 0x77:

goto k14 goto k15 goto k0; goto k1

default:break; } } }

ulint Exp(uint m,uint x) /*指数函数*/ {uint i; ulint temp=1; for(i=0;i<=x;i++) {

temp*=m; }

return temp; }

3.编写出8位LED共阴极显示器的动态显示的C51程序。

#include #include

#define uchar unsigned char #define COM8255 XBYTE[0xbfff] #define PA8255 XBYTE[0xbcff]

22

#define PB8255 XBYTE[0xbdff] #define PC8255 XBYTE[0xbeff]

uchar idata dis_buf[8]={1,2,3,4,5,6,7,8}; /*显示缓冲区*/

uchar code table[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71, 0x40,0x00}; void dl_ms(uchar d); void display(void)

{ uchar esgcode,bitcode,i; bitcode=0xfe; for(i=0;i<=7;i++) { esgcode=dis_buf[i]; PB8255=table[esgcode]; PA8255=bitcode; dl_ms(1);

bitcode=bitcode<<1; bitcode=bitcode|0x01; } }

void main(void) { COM8255=0x80; while(1) { display(); } }

23

4.与8051单片机接口的8255的4个端口地址分别为:0DFFCH、0DFFDH、0DFFEH、0DFFFH。对8255编程:口A输出数据0AAH,口B输入10个数据到片内RAM区,由PC4位产生一个负脉冲,低电平宽度为10μs。

#include #include

#define uchar unsigned char #define COM8255 XBYTE[0xdfff] #define PA8255 XBYTE[0xdffc] #define PB8255 XBYTE[0xdffd] #define PC8255 XBYTE[0xdffe] data uchar Buffer[10] _at_0x30;

void main(void) { uchar index; int j;

COM8255=0x82; PA8255=0XAA;

for(index=0;index<10;index++) { Buffer[index]=PB8255; }

PC8255=0xef; for(j=0;j<1;j++); }

5.设某个生产过程有6道工序,每道工序的时间分别为10s、8s、12s、15s、9s和6s。设延迟程序DYLA的延时为1s。用单片机通过8255的口A来进行控制。口A中的每一位可以控制某一位的起停,试编写有关程序。

24

联系合同范文客服:xxxxx#qq.com(#替换为@)