单片机复习选择程序解释

合集下载

51单片机常见程序,附带注释

51单片机常见程序,附带注释

51 单片机常见程序附带注释三位数分离成 3 个一位数,截取bai=num/100;// 输出百位数shi=num%100/10;// 输出十位数ge=num/10;// 输出个位数//跑马灯程序。

当时间约为20ms形成动态扫描,#include<intrins.h>#define uint unsigned int // 无符号整型,占16 位数,表示围0~65536#define uchar unsigned char // 无符号字符型占八位数,表示围0~255void delayms(uint);uchar aa;// 定义变量void main(){aa=0xfe;while(1){aa=_crol_(aa, 1);P2=aa; // 控制单片机接口p2, 循环亮delayms(500); 灯一直亮灭,原因是视觉延迟// 当500 换成5,看起来全亮,实际上#include<reg52.h> 看上去全亮。

void delayms(uint xms) // 子程序,延时,通过数数uint i, j; for(i=xms;i>0;i--) for(j=110;j>0;j--);#include<reg52.h> // 跑马灯程序。

现在时间较长,多以是亮灭的流动,当时间约为20ms形成动态扫描,看上去全亮。

#include<intrins.h>#define uint unsigned int #define uchar unsigned char void delayms(uint);uchar aa;void main(){aa=0xfe;while(1){P2=aa; delayms(500); 灯一直亮灭,原因是视觉延迟// 无符号整型,占16 位数,表示围0~65536 // 无符号字符型占八位数,表示围0~255// 定义变量// 控制单片机接口p2, 循环亮// 当500 换成5,看起来全亮,实际上aa=_crol_(aa, 1); }}void delayms(uint xms) // 子程序,延时,通过数数 {uint i, j; for(i=xms;i>0;i--) for(j=110;j>0;j--);}#include <reg52.h> //52 系列单片机头文件 (目标:用单片机和两个共阴极数码 管:使用单片机的引脚 1和 2,控制两个数码管静态显示 00到59) #define uchar unsigned char #define uint unsigned int sbit dula1=P1A7;uchar num,num1; // 共阴极数码管 0123456789abcdef0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delayms(uint) ; void main (){while(1){for(num1=0;num1<=5;num1++)// 申明 U1 锁存器锁存端 段选 sbit dula2=P0A7;// 申明 U1 锁存器锁存端段选uchar code table[]={{for(num=0;num<=9;num++){dula2=1; // 打开U1 锁存端P1=table[num]; // 送入位选信号器dula2=0; // 关闭U1 锁存500 毫秒约0.3sdelayms(100); // 延时dula1=1; // 打开U1 锁存端P2=table[num1]; // 送入位选信号器dula1=0;// 关闭U1 锁存500 毫秒约0.3s}delayms(100); // 延时}}}void delayms (uint xms){uint x, y ;dula1=0;// 关闭 U1 锁存器for (y=200;y>0;y--);}#include <reg52.h> //52 系列单片机头文件 (目标:用单片机和两个共阴极数码 管)#define uchar unsigned char #define uint unsigned int sbit dula1=P1A7; sbit dula2=P2A7; uchar num,num1; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delayms(uint) ; void main (){while(1){for(num1=0;num1<=9;num1++){dula1=1; //打开U1锁存端P1=table[num1]; // 送入位选信号for (x=xms;x>0;x--) //x=xms 即延时约为 xms 毫秒// 申明 U1 锁存器锁存端 段选 // 申明 U1 锁存器锁存端段选// 共阴极数码管 0123456789abcdefdelayms(1000);// 延时 500 毫秒约0xc0,0xf9,0xa4, 0xb0,// 共阳极数字: 0123456789abcdefg0.3s for(num=0;num<=9;num++)dula2=1; // 打开 U1 锁存端P1=table[num]; // 送入位选信号 dula2=0;// 关闭 U1 锁存器 500 毫秒约 0.3s }} } void delayms (uint xms) { uint x, y ; for (x=xms;x>0;x--) delayms(1000);// 延时//x=xms 即延时约为 xms 毫秒for (y=200;y>0;y--); 有语法错误 #include <reg52.h> //52 系列单片机头文件 #define uchar unsigned char // 无符号字符型占八位数,表示围 0~255 #define uint unsigned int //无符号整型 占 16 位数,表示围 sbit dula1=P1A 6; //申明U1锁存器锁存端 段选 sbit dula2=P0A7; //申明U1锁存器锁存端段选uchar code table[]={0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83, 0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void display(uchar,uchar) ;uchar num,num2,shi,ge;void main (){TMOD=Ox11;〃设置定时器0和1为工作方式1 (M1M0为01, 0001 00THO= (65535-50000)/256;// 装初值12.00M 晶振定时50s 数为50000 TL0= (65535-50000)%256;TH1= (65535-50000)/256;// 装初值12.00M 晶振定时50s 数为50000 TL1= (65535-50000)%256;EA=1;// 开总中断ET0=1; // 开定时器0 中断ET1=1; // 开定时器 1 中断TR0=1;// 启动定时器0TR1=1;// 启动定时器 1while(1)// 程序停止在这里不停的对数码管动态扫描同时等待中断的发生display(shi,ge);dula2=1; // 打开U1 锁存端P1=table[shi]; // 送入位选信号dula2=0; // 关闭U1 锁存器delayms(1175); // 延时0.1 毫秒void delayms(uint xms) // 延时子程序{uint i,j;for (i=xms;i>0;i--)//i=xms 即延时约为xms 毫秒for (j=110;j>0;j--); }void T1_time()interrupt 1{TH1= (65536-50000)/256; // 重装初值TL1= (65536-50000)%256;num2++; //num 每加 1 次判断一次是否到20 次if(num2==20){num2=0; // 然后把num2 清0 重新再计数20 次num++;if (num==60) // 这个数用来送数码管显示,到60 后归0num=0;shi=num/10; // 把一个 2 位数分离后分别送数码管显示,十位数ge=num%10; // 个位数#include <reg52.h> //52 系列单片机头文件 (目标:控制时间24 小时一循环) #define uchar unsigned char#define uint unsigned intsbit dula1=P1A7; //申明U1锁存器锁存端段选sbit dula2=P0A7; //申明U1锁存器锁存端段选uchar num,num1,num2,num3,num4;uchar code table[]={0xc0,0xf9,0xa4, 0xb0, // 共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83, 0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void main (){while(1){for(num3=0;num3<=23;num3++) // 每天24 小时进位一{for(num2=0;num2<=59;num2++)// 每60 分进位一{for(num1=0;num1<=5;num1++) //每6*10s 进位一{dula2=1; // 打开U1 锁存端P1=table[num1]; // 送入位选信号dula2=0; // 关闭U1 锁存0.1 毫秒// 每1s 进位一打开U1锁存端// 送入位选信号// 关闭U1 锁存器// 延时0.1 毫秒}}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--)for (y=110;y>0;y--); }delayms(1175); //for(num=0;num<=9;num++){dula2=1;P1=table[num];dula2=0;delayms(1000);}//x=xms 即延时约为xms 毫秒延时//#include <reg52.h> //52 系列单片机头文件 (目标:控制时间 24 小时一循环,蜂鸣器每过一段时间响一次)#define uchar unsigned char #define uint unsigned int sbit dula1=P1A7; sbit dula2=P2A7; sbit f=P0;// 声明单片机 P0 口的第一位 ,也就是三极管基级的位置单片机第 39 接口uchar num,num1,num2,num3,num4; uchar code table[]={ 0xc0,0xf9,0xa4, 0xb0,// 共阳极数字: 0123456789abcdefg0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,// 申明 U1 锁存器锁存端// 申明 U1 锁存器锁存段选 段选0xcd,0xa1,0x86,0x8e}; void delayms(uint) ; void main (){while(1)f=0; // 控制蜂鸣器的不响 每 1ms 进位一for(num=0;num<=9;num++)//{锁存端dula2=1;// 打开 U1选信号P2=table[num];// 送入位U1锁存器dula2=0;// 关闭// 延时 0.1 毫秒delayms(1074);}// 控制蜂鸣器的响delayms(1000); }}}{进位一for(num2=0;num2<=59;num2++){for(num4=0;num2<=59;num4++)// 每 60 分// 每 60s 进位一{for(num3=0;num3<=23;num3++) // 每天进位一f=1;void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms 即延时约为xms 毫秒for (y=10;y>0;y--);}#include <reg52.h> //52 系列单片机头文件(目标:用单片机和两个共阳极数码管,控制依次显示0到59,然后循环,有合适的时间间隔,程序停止)#define uchar unsigned char#define uint unsigned intsbit dula1=P1A7; // 申明U1 锁存器锁存端段选sbit dula2=P2A7; // 申明U1 锁存器锁存端段选uchar num,num1;uchar code table[]={0xc0,0xf9,0xa4, 0xb0,// 共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,}void delayms (uint xms)uint x, y ;0x80,0x90,0x88,0x83, 0xcd,0xa1,0x86,0x8e}; void delayms(uint) ; void main (){while(1)for(num1=0;num1<6;num1++){dula1=1; P1=table[num1]; dula1=0;delayms(100);// 打开 U1 锁存端 // 送入位选信号 // 关闭 U1 锁存器// 延时 500 毫秒约0.3s器500 毫秒约 0.3s for(num=0;num<=9;num++){dula2=1; P2=table[num]; dula2=0;delayms(100);// 打开 U1 锁存端 // 送入位选信号 // 关闭 U1 锁存// 延时dula1=0; // 关闭 U1 锁存器uchar num,num1; uchar code table[]={0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xcd,0xa1,0x86,0x8e};void delayms(uint) ; void main ()while(1){for(num=0;num1<6;num1++){dula1=1;//打开U1锁存端P1=table[num1]; // 送入位选信号for (x=xms;x>0;x--)//x=xms 即延时约为 xms 毫秒for (y=200;y>0;y--);}#include <reg52.h> //52 管,控制依次显示 0到 59, 系列单片机头文件 (目标:用单片机和两个共阳极数码 时间间隔约 0.5, 程序停止) #define uchar unsigned char #define uint unsigned int sbit dula1=P1A7; // 申明 U1 锁存器锁存端 段选 sbit dula2=P2A7;// 申明 U1 锁存器锁存端段选0xc0,0xf9,0xa4, 0xb0, // 共阳极数字: 0123456789abcdefgdelayms(100); // 延时500 毫秒约0.3sfor(num=0;num<=9;num++){dula2=1; // 打开U1 锁存端P2=table[num]; // 送入位选信号器dula2=0; // 关闭U1 锁存500 毫秒约0.3sdelayms(100);// 延时}}}}void delayms (uint xms)//延时子程序{uint x, y ;for (x=xms;x>0;x--) //x=xms 即延时约为xms毫秒for (y=300;y>0;y--);0.3sfor(num=0;num<=9;num++){dula2=1; //打开U2锁存端 P2=table[num];// 送入位选信号#include <reg52.h> //52 系列单片机头文件 (目标:用单片机和两个共阳极数码 管,控制依次显示 0到 59,时间间隔约 0.5, 程序停止) #define uchar unsigned char #define uint unsigned intsbit dula1=P1A7; sbit dula2=P2A7; // 申明 U1 锁存器锁存端段选 段选uchar num,num1; uchar code table[]={ 0xc0,0xf9,0xa4, 0xb0, // 共阳极数字: 0123456789abcdefg0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xcd,0xa1,0x86,0x8e}; voiddelayms(uint) ; void main ()while(1){for(num=0;num1<6;num1++) {dula1=1; P1=table[num1]; dula1=0; delayms(100);// 打开 U1 锁存端 // 送入位选信号 // 关闭 U1 锁存器// 延时 500 毫秒约#include <reg52.h> //52 系列单片机头文件 (目标:用单片机和共阳极数码管, 控制依次显示 0到 9,时间间隔约 0.5s ;)#define uchar unsigned char #define uint unsigned int500 毫秒约 0.3sdelayms(100);// 延时}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--)〃x=xms 即延时约为xms 毫秒for (y=300;y>0;y--);器// 关闭 U1 锁存}dula2=0;sbit dula1=P1A7;// 申明 U1 锁存器锁存端 段选// 打开 U1 锁存端 // 送入位选信号 // 关闭 U1 锁存器// 延时 500 毫秒约 0.3//打开U2锁存端 // 送入位选信号//关闭U2锁存器// 延时 500 毫秒约 0.3sbit dula2=P2A7; // 申明 U2 锁存器锁存端 段选uchar num; uchar codetable[]={ 0xc0,0xf9,0x a4, 0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xcd,0xa1,0x86,0x8e}; void delayms(uint) ; void main (){while(1)// 共阳极数字: 0123456789abcdefgfor(num=0;num<10;num++){dula1=1; P1=table[num]; dula1=0; delayms(100);dula2=1; P2=table[num]; dula2=0; delayms(100);void delayms (uint xms) {uint x, y ;for (x=xms;x>0;x--)//x=xms 即延时约为xms 毫秒for (y=300;y>0;y--);}#include <reg52.h> //52 系列单片机头文件(目标:用定时器0 的方式 1 实现第一个灯管以200ms闪烁;用定时器1的方式1实现数码管前两位59s循环计时)#define uchar unsigned char // 无符号字符型占八位数,表示围0~255#define uint unsigned int // 无符号整型,占16 位数,表示围sbit dula=P2A6; //申明U1锁存器锁存端段选sbit wela=P2A7; //申明U2锁存器锁存位选sbit led1=P1A0; // 申明灯 1 点0uchar code table[]={ // 共阴极数码管0123456789abcdef0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delayms(uint) ; voiddisplay(uchar,uchar) ; uchar num,num1,num2,shi,ge; void main (){TMOD=0x01;〃设置定时器0和1为工作方式1 (M1M0为01, 0001 00THO= (65535-50000)/256;// 装初值12.00M 晶振定时50s 数为50000 TL0= (65535-50000)%256; TH1= (65535-50000)/256;// 装初值12.00M 晶振定时50s 数为50000 TL1= (65535-50000)%256; EA=1;// 开总中断ET0=1; // 开定时器0 中断ET1=1; // 开定时器 1 中断TR0=1;// 启动定时器 0TR1=1;// 启动定时器 1while(1)//程序停止在这里不停的对数码管动态扫描同时等待中断的发生 {display(shi,ge);}}void display (uchar shi,uchar ge) // 控制数码管{ dula=1;// 打开 U1 锁存端 段选 P0=table[shi];//送入段选信号 dula=0;// 关闭 U1 锁存器 P0=0xff;// 送位选数据前关闭所有显示,防止打开位选锁存器时 wela=1;// 原来的段选数据通过位选锁存器造成混乱 P0=0xfe;// 送位选数据 wela=0;delayms(5); // 延时dula=1; // 打开 U1 锁存端 段选P0=table[ge]; // 送入段选信号dula=0;// 关闭 U1 锁存器 P0=0xff;// 送位选数据前关闭所有显示,防止打开位选锁存器时 wela=1; // 原来的段选数据通过位选锁存器造成混乱P0=0xfe; // 送位选数据wela=0;delayms(5); // 延时} void delayms(uint xms) // 延时子程序{uint i,j;for (i=xms;i>0;i--) //i=xms 即延时约为 xms 毫秒for (j=110;j>0;j--);} void T0_time()interrupt 1{TH0= (65536-50000)/256; TL0= (65536-50000)%256;num++;//num1 每加 1次判断一次是否到 4次 ,时间间隔200ms // 重装初值if(num1==4)num1=0; // 然后把num1 清0 重新再计数 4 次led1=~led1; // 让发光管状态取反}} void T1_time()interrupt 3{TH1= (65536-50000)/256; // 重装初值TL1= (65536-50000)%256;num2++; //num 每加 1 次判断一次是否到20 次if(num2==20){num2=0; // 然后把num2 清0 重新再计数20 次num++;if (num==60) // 这个数用来送数码管显示,到60 后归0num=0;shi=num/10; // 把一个 2 位数分离后分别送数码管显示,十位数ge=num%10; // 个位数// 共阴极数码管 0123456789abcdef0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delayms(uint) ;void display(uchar,uchar) ;uchar num,num1,num2,shi,ge;void main (){TMOD=0x01;〃 设置定时器0和1为工作方式1 ( M1M (为01, 0001 0001 )TH0= (65535-50000)/256;// 装初值 12.00M 晶振定时 50s 数为 50000TL0= (65535-50000)%256;TH1= (65535-50000)/256;// 装初值 12.00M 晶振定时 50s 数为 50000 TL1=(65535-50000)%256;EA=1;// 开总中断ET0=1; // 开定时器 0 中断ET1=1; // 开定时器 1 中断TR0=1;// 启动定时器 0TR1=1;// 启动定时器 1#include <reg52.h> //52 系列单片机头文件 (目标:用定时器 0 的方式 1 实现第 一个灯管以200ms 闪烁;用定时器1的方式1实现数码管前两位59s 循环计时)#define uchar unsigned char 占八位数,表示围 0~255// 无符号字符型 #define uint unsignedint 数,表示围// 无符号整型, 占 16位 sbit dula=P2A 6;//申明U1锁存器锁存端 段选 sbit wela=P2A7;//申明U2锁存器锁存 位选sbit led1=P1A0;// 申明灯 1 点 0 uchar code table[]={while(1)// 程序停止在这里不停的对数码管动态扫描同时等待中断的发生{display(shi,ge);}}void display (uchar shi,uchar ge) // 控制数码管{dula=1; // 打开U1 锁存端段选P0=table[shi];//送入段选信号dula=0; // 关闭U1 锁存器P0=0xff;// 送位选数据前关闭所有显示,防止打开位选锁存器时wela=1; // 原来的段选数据通过位选锁存器造成混乱P0=0xfe; // 送位选数据wela=0;delayms(5); // 延时dula=1; // 打开U1 锁存端段选P0=table[ge];//送入段选信号dula=0; // 关闭U1 锁存器P0=0xff; // 送位选数据前关闭所有显示,防止打开位选锁存器时wela=1; // 原来的段选数据通过位选锁存器造成混乱P0=0xfe; // 送位选数据wela=0;delayms(5); // 延时{void delayms(uint xms) // 延时子程序uint i,j;for (i=xms;i>O;i--) 〃i=xms 即延时约为xms毫秒for (j=110;j>0;j--);}#include <reg52.h> //52 系列单片机头文件 (目标:中断程序,控制 1 点0 二极管10ms闪烁)#define uchar unsigned char#define uint unsigned intsbit led1=P1A0; II声明单片机P1 口的第一位uchar num;void main (){TMOD=0x01;〃设置定时器0为工作方式1 (M1M(为01)TH0= (65535-50000)/256;// 装初值12.00M 晶振定时50ms数为50000TL0= (65535-50000)%256;EA=1;// 开总中断ET0=1; // 开定时器0 中断TR0=1;// 启动定时器0while(1)// 程序停止在这里等待中断的发生{if(num==200)// 判断一次是否到20{num=0; // 然后把num 清0 重新再计数20 次led1=~led1; // 让发光管状态取反}}}void T0_time()interrupt 1{TH0= (65535-50000)/256; // 重装初值TL0= (65535-50000)%256;num++; //num 加上1#include <reg52.h> //52 系列单片机头文件 (目标:中断程序,控制 1 点0 二极管100ms 闪烁,若num=10则0.05s闪烁,换句话控制5000或者num都可以控制时间。

单片机原理及应用复习内容

单片机原理及应用复习内容

单片机原理及应用复习内容单片机原理及应用复习内容第1章复习内容1. 微处理器、微计算机、微处理机、CPU、单片机、嵌入式处理器它们之间有何区别?答:微处理器、微处理机和CPU它们都是中央处理器的不同称谓,微处理器芯片本身不是计算机。

而微计算机、单片机它们都是一个完整的计算机系统,单片机是集成在一个芯片上的用于测控目的的单片微计算机。

2. AT89S51单片机相当于MCS-51系列单片机中的哪一型号的产品?“S”的含义是什么?答:相当于MCS-51系列中的87C51,只不过是AT89S51芯片内的4K字节Flash 存储器取代了87C51片内的4K字节的EPROM。

3. 单片机可分为商用、工业用、汽车用以及军用产品,它们的使用温度范围各为多少?答:商用:温度范围为0~+70℃;工业用:温度范围为-40~+85℃;汽车用:温度范围为-40~+125℃;军用:温度范围为-55~+150℃。

4. 解释什么是单片机的在系统编程(ISP)与在线应用编程(IAP)。

答:单片机的在系统编程ISP(In System Program),也称在线编程,只需一条与PC机USB口或串口相连的ISP下载线,就可把仿真调试通过的程序代码从PC机在线写入单片机的Flash存储器内,省去了编程器。

在线应用编程(IAP)就是可将单片机的闪存内的应用程序在线修改升级。

5. 什么是“嵌入式系统”? 系统中嵌入了单片机作为控制器,是否可称其为“嵌入式系统”?答:广义上讲,凡是系统中嵌入了“嵌入式处理器”,如单片机、DSP、嵌入式微处理器,都称其为“嵌入式系统”。

但多数人把“嵌入”嵌入式微处理器的系统,称为“嵌入式系统”。

目前“嵌入式系统”还没有一个严格和权威的定义。

目前人们所说的“嵌入式系统”,多指后者。

6. 嵌入式处理器家族中的单片机、DSP、嵌入式微处理器各有何特点?它们的应用领域有何不同?答:单片机体积小、价格低且易于掌握和普及,很容易嵌入到各种通用目的的系统中,实现各种方式的检测和控制。

单片机考试复习

单片机考试复习

单片机考试复习单片机是嵌入式系统中的关键组成部分,掌握单片机的原理和编程技巧对于学习和应用嵌入式系统有着重要的意义。

为了备考单片机考试,以下是一些复习的重点内容,帮助大家系统地进行复习。

1. 单片机基础知识1.1 单片机的概念和发展历程单片机是一种集成度很高的微型计算机系统,具有片上集成的特点。

从早期的8位单片机到现在的32位单片机,单片机的发展经历了几个重要的阶段。

1.2 单片机的工作原理单片机通过执行存储在其内部存储器中的指令,在控制下完成特定功能。

了解单片机的架构和工作原理是学习和理解单片机编程的基础。

2. 单片机编程基础2.1 汇编语言单片机的底层程序一般使用汇编语言进行编写。

掌握汇编语言的语法和指令集是了解单片机底层运行机制的关键。

2.2 C语言C语言虽然是高级语言,但是在单片机编程中也得到了广泛的应用。

掌握C语言在单片机编程中的基本语法和特点,能够更加高效地进行程序开发。

2.3 嵌入式编程技巧在单片机编程中,还需要掌握一些嵌入式编程技巧,如中断处理、时钟配置、IO口控制等。

这些技巧能够提高单片机程序的可靠性和性能。

3. 单片机外部设备接口3.1 数字输入输出口单片机常用的数字输入输出口是与外部设备进行信息交互的重要接口。

了解数字输入输出口的特点和编程方法,能够灵活地控制和读取外部设备的状态。

3.2 模拟输入输出口模拟输入输出口常用于与模拟信号进行交互。

掌握模拟输入输出口的工作原理和编程方法,能够实现对模拟信号的采集和处理。

3.3 串口通信串口通信是单片机与外部设备进行通信的一种常见方式。

了解串口通信的原理和常用协议,能够实现单片机与其他设备的数据交换。

4. 单片机应用案例4.1 LED显示控制LED显示控制是单片机最基础的应用之一,通过控制LED的亮灭状态可以实现各种显示效果。

了解LED显示控制的原理和编程方法,能够实现对LED的动态控制。

4.2 按键输入和响应按键输入和响应是单片机与外部设备交互的一种常见方式。

单片机程序介绍

单片机程序介绍

单片机程序介绍单片机(Microcontroller)是一种集成为了微处理器、存储器和各种输入输出接口的集成电路,广泛应用于嵌入式系统中。

单片机程序是指在单片机上运行的一段指令集合,用于控制硬件设备的操作和实现特定功能。

一、单片机程序的基本结构单片机程序通常由以下几个部份组成:1. 引用头文件(Include Header Files):在编写单片机程序时,通常会引用一些头文件,这些头文件包含了一些预定义的函数和常量,方便程序员使用。

比如,可以引用头文件"reg51.h",该头文件包含了对51系列单片机寄存器的定义。

2. 定义宏(Define Macros):在程序中,可以使用宏定义来定义一些常量或者函数。

通过使用宏定义,可以提高程序的可读性和可维护性。

比如,可以使用宏定义"#define LED_PIN P1_0"来定义LED的引脚。

3. 全局变量定义(Global Variable Definition):在程序中,可以定义一些全局变量,这些变量可以在整个程序中被访问和修改。

比如,可以定义一个全局变量int count = 0,用于记录某个事件的次数。

4. 函数声明(Function Declaration):在程序中,可以声明一些函数,这些函数可以在其他函数中被调用。

函数声明的目的是为了告诉编译器函数的存在和函数的参数类型。

比如,可以声明一个函数void delay(unsigned int ms),用于实现延时功能。

5. 主函数(Main Function):主函数是单片机程序的入口函数,程序从主函数开始执行。

在主函数中,可以调用其他函数,实现各种功能。

比如,可以在主函数中调用delay函数实现延时,然后控制LED灯的闪烁。

二、单片机程序的编写步骤编写单片机程序的普通步骤如下:1. 确定需求和功能:首先需要明确程序的需求和功能,确定需要控制的硬件设备和所需的操作。

单片机复习题

单片机复习题

单片机复习提纲(1)一.单项选择题:(10分)1.MC-51单片机复位后,程序计数器PC的内容是 C 。

A.00H B.FFH C.0000H D.FFFFH2.8031单片机芯片要使用时应把EA信号引脚 B 。

A.接高电平B.接地C.悬空D.接地址锁存器选通端3.MCS-51的程序计数器PC为16位计数器,因此其寻址范围是 D 。

A.8K B.16K C.32K D.64K4.在MCS-51单片机中,唯一一个可供用户使用的16位寄存器是 B 。

A.PSW B.DPTR C.IP D.PC5.在MCS-51单片机中,唯一一个用户不能直接使用的寄存器是 D 。

A.PSW B.DPTR C.IE D.PC6.在单片机中,用作标志寄存器的一个特殊功能寄存器是 A 。

A.PSW B.DPTR C.TCON D.PC7.单片机的指令地址存放在 D 中。

A.PSW B.DPTR C.SP D.PC8.提高单片机的晶振频率,则机器周期信号 C 。

A.不变B.变长C.变短D.变长变短不定9.8031不具有第二功能的I/O口是:( B )A、P0 口B、P1口C、P2口D、P3口10.在M C S-51单片机的中断中,如果出现同级中断申请时,就按硬件查询序列来处理响应次序,其优先级别中第三个为:( D )A、定时/计数器中断0B、定时/计数器中断1C、外部中断0D、外部中断1E、串行口中断11.MSC-51在响应中断时,必须由用户清除的标志为( B )A、TF0B、RIC、IE0D、TF112.设(A)=F0H,若执行4次指令RL A ,则执行完后,A 中的内容为:(C )A、FFHB、00HC、0FHD、F0H13.乘法指令是MCS-51单片机中执行时间最长的指令之一,当执行完MUL AB 后,积的高8位在:(B )A、在寄存器A中B、在寄存器B中C、在Cy中D、在PSW中14.设执行ADD 指令后,A 中的内容为10011010B ,再执行DA A 指令后,A 的内容应为( D )A、10100000B、10010000C、00010000D、0000000015.设A=56H,R0=20H,(20H)=7AH,若执行XCHD A,@R0, 则A 中的内容为:(C )A、76HB、A6HC、5AHD、50H16.执行PUSH direct 指令时,SP 将进行何种操作?( B )A、SP + 0B、SP + 1C、SP + 2D、SP - 117.定时器T1中断的入口地址为:( C )A、0023HB、000BHC、001BHD、0013H18.下列哪一个指令助记符是非法字符?( D )A、RLCB、CLRC、RRCD、ORC19.MCS-51响应中断时,下面哪一个条件不是必须的( C )。

单片机复习程序

单片机复习程序

LED流水灯#include<reg52.h>#define INT16U unsigned int#define INT8U unsigned charvoid Delay(INT16U s);void main(){INT8U led,i;led = 0xfe;while(1){for(i=0;i<8;i++){P1 = led;Delay(100);led = led<<1;led = led|0x01;if(led==0xff){led = 0xfe;}}}}void Delay(INT16U s){INT16U i,j;for(i=0;i<s;i++)for(j=0;j<100;j++);}分析程序如下:以上程序第一行为包含头文件“reg52.h”,此文件的作用是定义了52系列单片机的特殊功能寄存器,所以MCS-51系列单片机的C源文件都要写这个语句。

下面define是对“unsigned int”、“unsigned char”做宏定义,即给“unsigned int”、“unsigned char”重新起个名称,以便我们使用方便。

接下来是主函数,基于C语言的单片机项目,可以认为单片机是从main函数开始执行的,直到main函数结束,所以项目中必须是有且只有一个main函数,至于main函数的位置可以任意。

在main函数进入循环体while(1)后,进入for循环8次,即将led变量的值赋给P1,因led初值为0xfe,可点亮第一个二极管;再延时一段时间后,将led的值做处理,使再次进入循环后可点亮下一个二极管,这样循环8次后,可依次点亮二极管。

由于for语句是在while(1)循环体里面的,所以循环点亮8次后会再次进入for语句,一直循环下去,这样我们就可以看到发光二极管在不停的逐个点亮了。

定时器的使用#include<reg52.h>#define INT16U unsigned int#define INT8U unsigned charsbit FANGBO_1ms = P1^0;sbit FANGBO_500us = P1^1;void main(){INT8U i;TMOD = 0x02;TL0 = 0x06;TH0 = 0X06;TR0 = 1;while(1){for(i=0;i<2;i++){while(!TF0);TF0 = 0;FANGBO_500us = !FANGBO_500us;}FANGBO_1ms = !FANGBO_1ms;}}程序分析如下:在主程序一开始时设置TMOD寄存器,TL0和TH0计数器赋初值,这几条语句通常叫做定时器初始化,即在定时器工作前,先将定时器配置好。

单片机c51程序结构中的4种选择语句

单片机c51程序结构中的4种选择语句

单片机c51程序结构中的4种选择语句单片机C51程序结构中的4种选择语句包括if语句、if-else语句、switch语句和三目运算符。

下面将分别对这四种选择语句进行详细介绍。

一、if语句if语句是单片机程序中最常用的选择语句之一,用于根据条件的真假来执行不同的代码块。

语法结构如下:```cif (条件){// 条件为真时执行的代码}```其中,条件可以是任意的逻辑表达式,当条件为真时,if语句后面的代码块将会被执行;当条件为假时,if语句后面的代码块将被跳过。

例如,下面的代码示例中,通过if语句判断变量x的值是否大于10,若成立则执行打印语句:```cif (x > 10){printf("x大于10");}二、if-else语句if-else语句是在if语句的基础上增加了“否则”的情况,用于在条件为真和条件为假时执行不同的代码块。

语法结构如下:```cif (条件){// 条件为真时执行的代码} else {// 条件为假时执行的代码}```当条件为真时,if语句后面的代码块将会被执行;当条件为假时,else语句后面的代码块将会被执行。

例如,下面的代码示例中,通过if-else语句判断变量x的值是否大于10,若成立则执行打印语句,否则执行另外一个打印语句:```cif (x > 10){printf("x大于10");} else {printf("x小于等于10");}三、switch语句switch语句用于根据不同的条件值执行不同的代码块,可以避免使用大量的if-else语句。

语法结构如下:```cswitch (表达式){case 值1:// 当表达式的值等于值1时执行的代码break;case 值2:// 当表达式的值等于值2时执行的代码break;// 可以添加更多的casedefault:// 当表达式的值不等于任何一个case时执行的代码break;}```switch语句首先根据表达式的值与每个case后面的值进行比较,当找到与表达式值相等的case时,执行该case后面的代码,并使用break语句跳出switch语句;若表达式的值不等于任何一个case时,执行default后面的代码。

单片机复习题-程序分析题(含答案)

单片机复习题-程序分析题(含答案)

程序分析题(含答案)1.设(A)=38H, (20H)=49H, PSW=00H, (B)=02H,填写以下结果。

SETB CADDC A, 20HRLC A(A)= ______;(CY)= ______;(P)= ______;MUL AB (B)= ______;2.阅读程序并回答下列问题:X DA TA 50HY DA TA 51HORG 00HJMP STARTORG 100HSTART: MOV SP,#60HMOV X,#10MOV Y,#10LCALL SUBSUB: NOPINC XDEC YMOV A,YJZ SUBRETLCALL SUBSUBRET: NOPRET计算X和Y的值是多少?(X)=;(Y)=;3.执行下列程序后,R2,R3的内容是什么?请在要求注释的地方给程序加上注释MOV R3,#45HMOV DPTR,#TABL ;注释:MOV A,R3ANL A,#0FH ;注释:MOVC A,@A+DPTR ;注释:MOV R2,AMOV A,R3ANL A,#0F0HSWAP AMOVC A,@A+DPTRMOV R3,A………………………..TABL:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,98H(R2)=;(R3)=;4.51单片机振荡频率为12MHz,阅读程序后说明ORG 0000HLJMP MAINORG 001BHLJMP INTT1ORG 0040HINTT1:MOV TH1, #3CHMOV TL1, #0B0HDJNZ R7, L2MOV R7, #20CPL P1.2L2:RETIORG 0100HMOV SP, #5FHMOV R7, #20MOV TMOD, ①MOV TH1, #3CHMOV TL1, #0B0HSETB EASETB ②SETB TR1SJMP $1) 根据程序内容填空:①;②;2) 定时器T1的定时时间是多少?3) 寄存器R7在程序中的作用是什么?4) 该程序完成什么功能?5.执行下面一段程序;填写运行结果MOV SP, #60HMOV A, #10HMOV B, #01HPUSH APUSH BPOP APOP BA , B的内容是:(A)=(B)= ;6.设自变量为X,存放在ARE单元,应变量Y存放在BUF单元。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单项选择题(80)1. 89C51复位后,程序计数器PC中的内容是()。

A. 0030 HB. 0000HC. FFFFHD. 不确定2. 89C51的直接寻址方式的寻址空间是()。

A. 片内RAM的低128B和SFRB. 片内RAM和ROM的256BC. 片外RAM的低256BD. 片内、片外RAM的00~FFH和SFR3. CPU访问片内RAM的指令类型用()。

A. MOVCB. MOVXC. MOVD. MOVD4. 当CPU响应定时/计数器T1的中断时,()。

A. 需用软件将TF1置1B. 需用软件将TF1清0C. 硬件将自动对TF1置1D. 硬件将自动对TF1清05. 指令()用于启动89C51的定时器T1。

A. CLR TR1B. MOV TR1,00HC. SETB TR1D. MOV TR1,0FFH6. 89C51复位后,P1口状态是()。

A. 00HB. 11HC. FFHD. 10H9. 如8051的SP的内容是30H,顺序执行PUSH ACC和POP B两句指令后,()。

A. 寄存器SP中的内容为32HB. 累加器A中的内容与寄存器B中的内容是一样的C. 寄存器B中的内容与原来累加器A中的内容一样,此时A中的内容是0D. 累加器A中的内容是30H,寄存器B中的内容是31H10. 指令MOV @R1, A与MOVX @R1, A比较,()。

A. 指令的功能一样B. 前一条指令的目的地址在片内RAM,后一条指令的目的地址在片外RAMC. 前一条指令属于寄存器间接寻址,后一条指令属于直接寻址D. 前一条指令用于访问片内RAM,后一条指令只能访问片内的SFR区11. 当执行指令时,PC中的内容总是指示出()。

A. 正在执行的当前指令的地址B.状态字寄存器中的内容C. 将要执行的下一条指令地址D.中断的断点的地址12. 当CPU响应外部中断0时,()。

A. 硬件将自动对IE0清0B. 硬件将自动对IE0置1C. 需用软件将IE0清0D. 需用软件将IE0置113. 将89C51片外RAM某单元中的内容送累加器A,应采用()这样的指令。

A. MOV A, @DPTRB. MOVX @DPTR, AC. MOV @DPTR, AD. MOVX A, @DPTR14. 属于立即数寻址的指令是()。

A. MOV A,#8DHB. MOV A,40HC. MOV A,R1D. MOV A,@R015. 89C51的TMOD寄存器中的()位用于设置定时器的工作模式。

A. M1.M0B. C/TC. GA TED. TMOD.716. 89C51的()口作为扩展片外数据存储器时的数据总线和地址总线的一部分。

A. P3B. P2C. P1D. P019. 如89C51的SP的内容是30H,执行LCALL SUBRTN这样的指令后,()。

A. 当前寄存器SP中的内容为32HB. 当前寄存器SP中的内容为31HC. 当前寄存器SP中的内容为SUBRTN所对应的地址单元的内容D. 内存RAM的31H.32H单元中存放SUBRTN所对应的地址20. 执行下面的指令或指令组合,(),两(组)指令执行结果一样。

A. 指令MOV @R0,A和指令MOVX @R0,A比较B. 指令MOV A,B和指令组合PUSH B。

MOV A,07H比较C. 指令CLR 00H和指令ANL 20H,#0FEH比较D. 指令INC A和指令组合MOV R1,#01H。

ADD A,@R1比较21. 89C51产生中断时,CPU将自动将()装入程序计数器PC中。

A. 中断入口地址B. 累加器A的内容C. 主程序中的断点地址D. DPTR中的内容22. 当CPU响应串行口发送中断时,()。

A. 需用软件将TI置1B. 需用软件将TI清0C. 硬件将自动对TI置1D. 硬件将自动对TI清023. 单片机对ROM的操作是()。

A. 只能读B. 只能写C. 可读可写D. 只能存数据24. 属于寄存器间接寻址的指令是()。

A. MOV A,40HB. MOV A,#8DHC. MOV A,R1D. MOV A,@R025. 将89C51的定时器T0设定为16位计数器定时方式,则T0应工作在()。

A. 模式0B. 模式1C. 模式2D. 模式326. 89C51的()口作为扩展片外数据存储器时16位地址总线中的高8位。

A. P0B. P1C. P2D. P329. 如8051的SP的内容是40H,执行RET这样的指令后,()。

A. 当前寄存器SP中的内容为38HB. 当前寄存器SP中的内容为3EHC. 当前寄存器SP中的内容为RET所对应的地址单元的内容D. 内存RAM的41H、42H单元中存放RET指令所对应的PC值30. 执行下面的指令或指令组合,(),两(组)指令执行结果一样。

A. 指令DEC A和指令组合MOV R1,#01H。

SUBB A,@R1比较B. 指令MOV A,B和指令组合PUSH A。

POP B比较C. 指令MOV A,@R0和指令MOVX A,@R0比较D. 指令SETB 00H和指令ORL 20H,#01H比较31. 执行返回指令RET后,()中的内容将会变化。

A. 累加器AB. 工作寄存器C. 程序计数器PCD. 程序存储器0000H单元32. 要开放89C51的所有中断,可用()指令来设置IE寄存器。

A. MOV IE,#00HB. MOV IE,#10HC. MOV IE,#1FHD. MOV IE,#9FH33. CPU访问片外ROM的指令类型用()。

A. MOVCB. MOVXC. MOVD. PUSH34. 访问89C51特殊功能寄存器只能用()方式。

A. 立即数寻址B. 寄存器间接寻址C. 直接寻址D. 变址寻址35. 定时器T0工作在模式2 计数方式,要求计一个脉冲就溢出,则计数初值为()。

A. 00HB. FFHC. 01HD. FFFFH38. 89C51的P3口除了用作外部中断、串口输入/输出等第二功能外,也可用作()。

A. 数据总线B. 通用的I/O口C. 地址总线高8位D. 地址总线低8位39. 如89C51的寄存器SP的内容是07H,执行PUSH A指令后,()。

A. 片内RAM 07H单元内容与累加器A的内容一样B. 片外RAM 07H单元内容与累加器A的内容一样C. 片外RAM 08H单元内容与累加器A的内容一样D. 片内RAM 08H单元内容与累加器A的内容一样40. 执行下面的指令或指令组合,(),两(组)指令执行结果一样。

A. 指令SETB 20H和指令MOV 20H,#0FFH比较B. 指令SETB 20H和指令组合MOV R0,#20H。

MOV @R0,#0FFH比较C. 指令SETB 20H和指令组合MOV 20H,#11H比较D. 指令CLR A和指令组合MOV R2,A。

XRL A,R2比较41. 改变()中的内容就可改变程序执行的方向。

A. 程序计数器PCB. 累加器AC. 堆栈指针SPD. 状态字寄存器PSW42. 指令MOVC A,@A+DPTR可以访问()。

A. 片外RAM的64 KB空间B. 片内RAM空间C. 程序存储器空间D. 片内和片外的RAM空间43. 对RAM的操作是()。

A. 只能读B. 只能写C. 可读可写D. 只能存数据44. 要关闭89C51的所有中断,可用()指令来设置IE寄存器。

A. MOV IE,#00HB. MOV IE,#11HC. MOV IE,#1FHD. MOV IE,#9FH45. 关于89C51定时器T1溢出标志位TF1正确的描述是()。

A. 溢出时,硬件自动将TF1清0B. 溢出时,需用软件将TF1置1C. 溢出时,硬件自动将TF1置1D. 中断响应后必须用软件将TF1清046. 当89C51采用12MHz晶振,则引脚ALE输出的频率不会超过()。

A. 1MHzB. 1.2MHzC. 500kHzD. 2MHz49. 执行指令CJNE @R0,#3CH,TABL0,下面描述正确的是()。

A. 如R0中的内容等3CH,程序跳转到TABL0处执行B. 如R0中的内容不等于3CH,程序跳转到TABL0处执行C. 如R0中的内容所指地址单元内容等于3CH,程序跳转到TABL0处执行D. 如R0中的内容所指地址单元内容不等于3CH,程序跳转到TABL0处执行50. P1口地址为90H,执行下面指令或指令组合,(),两(组)指令执行结果一样。

A. 指令MOV P1,@R1和指令组合MOV A,R1。

MOV P1,A比较B. 指令MOV A,P1和指令组合MOV R1,P1。

MOV A,@R1比较C. 指令SETB P1.7和指令组合MOV A,#17H。

ORL P1,A比较D. 指令MOV P1,A和MOV 90H,A比较51. 89C51产生中断时,CPU将自动改变()中的内容。

A. 累加器AB. 工作寄存器C. 程序计数器PCD. 程序存储器0000H单元52. 89C51的立即数寻址方式的寻址空间是()。

A. 片外RAMB. 程序存储器ROMC. 片内RAMD. 片内和片外RAM53. CPU访问片外RAM的指令类型用()。

A. MOVCB. MOVXC. MOVD. PUSH54. 当CPU响应定时/计数器T0的中断时,()压入堆栈。

A. 需用软件将当前PC值B. 需用软件将中断入口地址C. 硬件自动将当前PC值D. 硬件自动将中断入口地址55. 关于89C51定时器T1溢出标志位TF1正确的描述是()。

A. 溢出时,硬件自动将TF1置1B. 溢出时,需用软件将TF1置1C. 溢出时,硬件自动将TF1清0D. 中断响应后必须用软件将TF1清056. 如果要P1口作为输入口用,可以先用指令()对P1口进行操作。

A. MOV P1,#0FFHB. MOV @P1,#0FFHC. MOV P1,#00HD. MOV @P1,#00H59. 执行查表指令MOVC A,@A+PC后,当前A中的内容是()。

A. 原来A中的内容与PC中的内容之和B. 执行该指令时,当前PC所指地址单元中的内容与原来A中的内容之和C. 执行该指令时,当前指令下一条指令对应PC中的内容与原来A中的内容之和所指地址单元的内容D. 原来A中的内容60. 执行下面的指令或指令组合,(),两(组)指令执行结果一样。

A. 指令SETB 01H和指令ORL 20H,#01H比较B. 指令SW AP A和执行四遍指令RL A比较C. 指令SW AP A和执行四遍指令RLC A比较D. 指令SW AP A和执行四遍指令RRC A比较61. 在程序开始执行前,必须将其起始地址送入()。

相关文档
最新文档