南阳理工单片机题库-编程题

更新时间:2023-09-09 14:06:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1、设计一个2*2的行列式键盘(同在P1口)电路并编写键扫描程序。

#include unsigned char key() {

unsigned char row,col=0,k =-1; P1=0xfc;

if((P1&0xfc)==0xfc) return(k); delay20ms(); if((P1&0xfc)==0xfc) return(k);

for(row=0;row<2;row++) {

P1=~(1<

while(k&(1<<(col+2))) col++; k=row*2+col; P1=0xfc;

while(P1&0xfc!=0xfc); break; } } return k; }

2、 编写一函数to_asc,把传送给它的低半字节数据转换成ASCII码,并将其返回。 unsigned char to_asc(char d) { d+=0x30; if(d>0x39) d+=7; return d; }

3、 使用89C52串行口以工作方式3进行串口通信,假定波特率为9600b/s,单片机晶振频率为11.0592MHz。请编写全双工通信程序,以中断方式接受和发送数据,并对数据进行奇偶校验。设发送的50个数据在片外数据区,地址从0x0010开始的区域,接收的数据保存0x80开始的区域,接收到‘$’后表示结束。

#include

unsigned char xdata *SendBuffer=0x0010;

unsigned char xdata *RecvBuffer=0x0080; unsigned char i,j; bit SendOver,RecvOver; void main() {

TMOD=0x20; TH1=0xfd; Tl1=0xfd; TR1=1; SCON=0xc0; ES=1; EA=1;

ACC=SendBuffer[i++]; TB8=P; SBUF=ACC; while(1); }

void Serial() interrupt 4 { if(TI) { TI=0;

ACC=SendBuffer[i++]; TB8=P; SBUF=ACC; if(i==50) SendOver=1; } else { RI=0 ACC=SBUF; if(RB8==P) { RecvBuffer[j++]=ACC; if(ACC=='$') RecvOver=1; } } }

4、写出单片机C语言程序中语句“TMOD=0x23;”的功能。

设置T以模式2定时,设置T0以模式3定时。

5、编写一函数,查找片外RAM区域中从0x0100开始的200个单元中出现的0xaa的次数,并将查找的结果从函数中返回。

unsigned char find(void) { unsigned char data i, d=0; unsigned char xdata *p; i=200; p=0x0100; while(i--) if(*(p++)==0xaa) d++; return d; }

6、对89C52单片机编写程序,使串行口以方式1查询方式自收自发(接收和发送都需要查询),波特率为4800b/s.设单片机的晶振为11.0592MHZ。

#include void main() {

unsigned char c; TMOD=0x20; TH1=0xfa;

TL1=0xfa; TR1=1; SCON=0x50; while(1) {

while(RI==0); RI=0; c=SBUF; SBUF=c; while(TI==0); TI=0; } }

7、用单片机P0口输出端选码,P口输出位选码,写出数码管显示程序。

#include unsigned char code LED[]=

{0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f, 0x7c,0x39,0x5e, 0x79, 0x71,0x40,0x00}

0x6f, 0x77, unsigned char dispbuf[6]; void disp() {

unsigned char i; for(i=0;i<6;i++) {

P0=LED[dispbuf[i]]; P1=1<

8、设fsoc=11.0592MHz,试编写一段程序,其功能 为对串行口初始化, 使之工作与方式1,波特率为1200b/s;并用查询串行口状态的方法,读出接收缓冲区的数据并回送到发送缓冲区。

#include void main() {

unsigned char c; TMOD=2; TH1=0xe8; TL1=0xe8;

TR1=1; SCON=0x50; while(1) {

while(!RI); RI=0; c=SBUF; SBUF=c; while(!TI); TI=0; } }

9、 某MCS-51单片机系统使用定时器/计数器T0定时,从P1.0产生频率为100kHz等宽矩形波。假定单片机的晶振频率为12MHz,不考虑T1。完成下列各问题: (1)计算方波周期和T0的定时时间。 (2)计算T0在定时时间内的计算值;

(3)应该选T0以何种模式工作最恰当?写出模式字TMOD的值; (4)计算T0的定时初值;

(5)编写主函数和T0中断服务函数,使T0以中断方式P1.0产生方波。

(1)10μs,5μs

(2)5

(3)模式2,TMOD=0X22 (4)251 (5)C语言程序 #include sbit P1_0=0x90; 主函数 main() { TMOD=0x22; TL0=251, TH0=251; EA=1, ET0=1; TR0=1; while(1); }

T0中断服务函数: void int_t0(void) interrupt 1 { P1_0=~P1_0; }

9-1、某MCS-51单片机系统使用定时器/计数器T1定时,产生频率为1000Hz方波声音信号,要求方波信号从P3.5引脚输出。设fosc=6MHz,不考虑T0.完成下列各问题: (1)计算声音信号的周期和T0的定时时间。 (2)计算T1在定时时间内的计数值;

(3)应该选T1以何种模式工作最恰当?写出模式字TMOD的值; (4)计算T1的定时初值;

(5)编写主函数和T1中断服务函数,使T1以中断方式P3.5引脚产生方波。

(1)1ms,500μs (2)250

(3)模式2,TMOD=0X25 (4)6

(5)C语言程序 #include sbit P35=P3^5; 主函数: main() { TMOD=0x25; TL1=6, TH1=6; EA=1, ET1=1; TR1=1; while(1); }

T1中断服务函数: void int_t1(void) interrupt 3 { P35=~P35; }

10、写出单片机C语言程序中语句“TMOD=0x92;\

设置T1以模式1定时、外部门控制运行,设置T0以模式2定时。

11、编写一密码锁开锁时的密码核对函数,函数入口参数为开锁者输入的6位十进制数(长整型),系统已经保存有10组密码passw,函数的功能是把输入的数与保存的密码逐个比较,正确时返回1,错误时返回0。

bit check_password(long dd) { unsigned char i; for(i=0;i<10;i++) if(passw[i]==dd) return 1; return 0; }

12、编写函数,查找code区域中从0x0030开始的100个单元中出现0x55的次数,并将查找的结果从函数中返回。

unsigned char find(void) {

unsigned char i,dd=0;

unsigned char code *p; i=100; p=0x0030; while(i--)

if(*(p++)==0x55) dd++; return dd; }

13、设89C52单片机的晶振为11.0592MHz,串行口工作于方式3做数据收发,波特率为4800b/s。完成以下串行通信的初始化工作。

(1)写出T1以模式2定时作为波特率发生器的模式字; (2)计算T1的计数初值;

(3)写出串行口控制寄存器的控制字;

(4)写出初始化程序段(包括定时器和串行口)。

(1)TMOD=0x20 (2)0xfa (3)SCON=0xc0 (4)TMOD=0x20; TH1=0xfa; TL1=0xfa;

TR1=1; SCON=0xc0;

14、编写一函数move—data,把程序存储器地址0x30开始的20个字节数据,传送到片内RAM的数组array中。 unsigned char data array[20]; void move_data() { unsigned char i; unsigned char code *pp; pp=0x30;

for(i=0;i<20;i++) array[i]=*(pp+i); }

14-3、编写一函数move—xdata,把程序存储器地址0x200开始的50个字节数据,传送到片内RAM的数组array中。 unsigned char xdata array[50]; void move_xdata() { unsigned char i; unsigned char code *pp; pp=0x200; for(i=0;i<50;i++) array[i]=*(pp+i);

}

15、设89C52单片机的晶振为11.0592MHz,串行口工作于方式3做数据收发,波特率为9600b/s。完成以下串行通信的初始化工作。

(1)写出T1以模式2定时作为波特率发生器的模式字; (2)计算T1的计数初值;

(3)写出串行口控制寄存器的控制字;

(4)写出初始化程序段(包括定时器和串行口)。

(1)TMOD=0x20 (2)0xfa (3)SCON=0xc0 (4)TMOD=0x20; TH1=0xfa; TL1=0xfa; TR1=1; SCON=0x50;

16、编写一函数move_idata,把片外数据存储器地址从0x0000开始的30个字节数据,传送到片内数据存储器地址从0x80开始的地方。

void move_idata() { unsigned char i;

unsigned char idata *pi; unsigned char xdata *px; pi=0x80; px=0; for(i=0;i<30;i++) *(pi+i]=*(px+i); } }

17、某89C52单片机的P1口接8个发光二极管,拟用T1定时中断,控制P1口每250ms输出一次做右移流水灯显示,电路如图所示。设晶振为6MHz,不考虑T0。完成下列各问题:

(1)P1口各位输出高电平还是低电平发光二极管亮? (2)拟使T1定时多少ms、中断多少次使P1输出一次? (3)拟选T1以模式几定时?写出模式字TMOD的值; (4)计算T1的定时初值;

(5)编写主函数和T1中断服务函数,实现流水灯功能。

(1)低电平发光二极管亮 (2)125ms;2次

(3)模式1,TMOD=OX11 (4)3036 (5)C语言程序 #include

unsigned char aa=0x80; 主函数: main() { TMOD=0x21; TL1=220,TH1=11; EA=1,ET1=1; TR1=1; P1=~aa; while(1); }

T1中断服务函数: void int_t1(void) interrupt 3 { TL0=220,TH0=11; aa<<=1; P1=~aa; }

18、编写一函数,对无符号字符型数组用冒泡法从小到大进行排序,函数的入口参数为拟排序的数组aa的数组的长度m。

void sort(unsigned char aa, unsigned char m) { unsigned char I,j,n,tem; for(i=0;i

{ n=m-i-1; for(j=0;jaa[j+1]) { tem=aa[j]; aa[j]=aa[j+1]; aa[j+1]=tem; } } } }

19、在一个fosc为12MHz的89C52系统中接有一片ADC0809,它的地址为7FFFH,试编写ADC0809初始化程序和定时采样通道2的程序(假设采样频率为1ms/次,每次采样4个数据)。 #include #include

define DAC0809 XBYTE[0x7fff] unsigned char xdata buffer[4] _at_ 0xa0;

void main() {

TMOD=0x01; TH0=0xFC; TL0=0x18;

EA=1; ET0=1; TR0=1; DAC0809=2; while(1); }

void time0_srv() interrupt 1 {

unsigned char i; TH0=0xFC; TL0=0x18; for(i=0;i<4;i++) {

DAC0809=2; delay();

buffer[i]=DAC0809; } }

20、设某MCS-51单片机系统的振荡频率为12MHz,编写程序,用定时器/计数器T0以模式1定时,中断方式在P1.0引脚产生周期为1000μs的方波。假设没有使用T0. (1)定时时间为1000μs/2,

计数值为1000μs/2/机器周期=500,T0初值为65036 (2)C语言程序: #include sbit P10=P1^0; 主函数: main() { TMOD=0x21; TL0=12; TH0=254; EA=1; ET0=1; TR0=1; while(1); }

T0中断服务函数: void int_t0(void) interrupt 1

{ TL0=12; TH0=254; P10=~P10; }

本文来源:https://www.bwwdw.com/article/udnh.html

Top