参考书目:《单片机原理与接口技术》(朱晓辉 来婷)编著

  1. 单片机的应用:智能仪表;机电一体化;实时控制;分布式多机系统;人类生活中的应用。
  2. 单片机的主要发展趋势:CMOS化;低功耗化;低电压化;低噪声与高可靠性。
  3. 单片机的特点:8051单片机是把CPU、ROM、RAM、I/O口、定时器/计数器、中断功能全集成在一块芯片上。8051的CPU为8位;其片内有振荡器及时钟电路,有32根I/O线,对于外部存储器寻址范围,ROM、RAM各64KB,有2个16位的定时器/计数器,5个中断源,2个中断优先级;全双工串行口;布尔处理器。
  4. ①振荡周期:指振荡源的周期,若为内部产生方式,为石英晶体的振荡周期。
    ②时钟周期:为振满周期的2倍,时钟周期=振荡周P1+振荡周期P2。
    ③机器周期:一个机器周期含6个时钟周期。
    ④指令周期:完成一条指令周期占用的全部时间。
    8051的指令周期含1~4个机器周期,其中多数为单周期指令,还有2周期指令和4周期指令。
  5. 单片机的存储器的特点:采用哈佛结构,程序存储器与数据存储器分开,两者各有一个相互独立的64KB的寻址空间。
  6. 中断是指CPU在正常运行程序时,由于内部/外部事件或由程序预先安排的事件,引起CPU中断正在运行的程序,而转到为内部/外部事件或为预先安排的事件服务的程序中去,服务完毕,再返回去执行波暂时中断的程序。
  7. 在单片中一共有5个可以引起中断:两个外部中断,两个计数器/定时器中断,一个串口中断。
  8. 中断嵌套是指当CPU正在处理某个中断源即正在执行中断服务程序时,会出现先
    更高的中断源申请中断,为了使更急的中断源及时得到服务,需要暂时中断当前正在执行的级别较低的中断服务程序,去处理更高级别的中断源,待执行完毕后再返回来执行波中断3的中断服务程序。但中断级别低或更低的中断源不能中断级別高的中断服务。
  9. 中断源是指任何引起单片机中断的事件,一般一个单片机允许有多个中断源。外部中断0、外部中断1、片内定时器/计数器0、片内定时器/计数器1、片内串行口发送/接收中断。
  10. 中断服务函数的一般形式:返回值 函数名 interrupt n(using n)。bit不能指定位变量的绝对值,当需要指定位变量的绝对值时,需要用sbit来定义。
内部RAM地址 功能
00H 0区 4组通用寄存器R0~R7,也可作RAM使用,R0、R1可位寻址
08H 1区
10H 2区
1FH 3区
20H 位寻址区00H~7FH 全部可位寻址,共16个字节,128位
2FH
30H 数据缓冲区、堆栈区、工作单元 只能字节寻址
7FH
80H 特殊功能寄存器 可字节寻址,也可位寻址
FFH
中断号 中断源 入口地址
0 外部中断0(INT0) 0003H
1 定时器/计数器0(T0) 000BH
2 外部中断1(INT1) 0013H
3 定时器/计数器1(T1) 001BH
4 串行口中断 0023H

1. 把一个十六进制数转换为压缩的BCD码

#include<reg51.h>
#include<absacc.h>
main()
{  unsigned char data a[5],b;b=DBYTE[0x30];a[0]=b/100;a[1]=b%100/10;a[2]=b%10;a[3]=a[1] << 4;a[4]=a[3] | a[2];DBYTE[0x20]=a[0];DBYTE[0x21]=a[4];while(1);
}

2. 把一个压缩的BCD码转换为十六进制数

#include<reg51.h>
#include<absacc.h>
main()
{unsigned char data a[3],b;b=DBYTE[0x30];a[0]=b>>4;a[1]=b&0x0F;a[2]=a[0]*10+a[1];DBYTE[0x31]=a[2];while(1);
}

3. 把一个十六进制数转换为ASCII码

#include<reg51.h>
#include<absacc.h>
main()
{  unsigned char a,b,c;a=DBYTE[0x30];b=a >> 4;if(b>9) b=b-10+'A';else b=b+0x30;c=a & 0x0F;if(c>9) c=c-10+'A';else c=c+0x30;
XBYTE[0x30]=b; XBYTE[0x31]=c;while(1);
}

4. 把一个ASCII码转换为十六进制数

#include<reg51.h>
#include<absacc.h>
main()
{unsigned char a,b;a=DBYTE[0x30];
if(a>=0x30 && a<=0x39)b=a-0x30;
else if(a>=0x41 && a<=0x46)b=a-0x41+10;
else if(a>=0x61 && a<=0x66)b=a-0x61+10;
XBYTE[0x31]=b;
while(1);
}

5. 最小公倍数和最大公约数

#include<reg51.h>
#include<absacc.h>
main()
{ unsigned char a,b,c,d,i,j;
a=DBYTE[0x30]; b=DBYTE[0x31];
c=a*b;
for(i=1;i<=c;i++)
{if((c%i==0)&&(i%b==0)&&(i%a==0))
{DBYTE[0x0A]=i;break;}
else DBYTE[0x0A]=c;}
j=DBYTE[0x0A];
d=c/j;
DBYTE[0x0B]=d;
while(1);
}

6. 实现一个BCD码加法

#include<reg51.h>
#include<absacc.h>
void main()
{unsigned char a,b,c;
a=DBYTE[0x08];
b=DBYTE[0x09];
c=(a>>4)*10+(a&0x0F)+(b>>4)*10+(b&0x0F);
if(c>100)
{DBYTE[0x0A]=c-100;DBYTE[0x0B]=0x01;}
else DBYTE[0x0A]=c;
while(1);
}

7. 所有偶数的累加和奇数累加和

#include<reg51.h>
#include<absacc.h>
main()
{ unsigned char data a[5],i,sum;sum=0;for(i=0;i<5;i++){a[i]=DBYTE[0x30+i];if(!(a[i]&0x01)) {sum=sum+a[i];}
}DBYTE[0x08]=sum;while(1);
}#include<reg51.h>
#include<absacc.h>
main()
{   unsigned char data a[5],i,sum;sum=0;for(i=0;i<5;i++){a[i]=DBYTE[0x30+i];if(a[i] & 0x01) {sum=sum+a[i];}
}DBYTE[0x08]=sum;while(1);
}

8. 所有偶正数的累加和负数累加和

#include<reg51.h>
#include<absacc.h>
main()
{ unsigned char data a[5],i,sum;sum=0;for(i=0;i<5;i++)                                                           {a[i]=DBYTE[0x30+i];if(a[i]>=0x80) {sum=sum+a[i];}
}DBYTE[0x08]=sum; while(1);
}#include<reg51.h>
#include<absacc.h>
main()
{ unsigned char data a[5],i,sum;sum=0;
for(i=0;i<5;i++){a[i]=DBYTE[0x30+i];if(a[i]<0x80) {sum=sum+a[i];}
}
DBYTE[0x08]=sum;
while(1);
}

9. 判断是否为素数

#include<reg51.h>
#include<absacc.h>
main()
{unsigned char a,b,c;
a=DBYTE[0x08];
c=0xFF;
for(b=2;b<a;b++)
{  if(a%b==0)
{c=0;break;}
}
DBYTE[0x09]=c;
while(1);
}

10. 由小到大排序

#include<reg51.h>
#include<absacc.h>
void main()
{  unsigned char data a[10],t;
unsigned char i,j;for(i=0;i<10;i++)
{a[i]=DBYTE[i+0x30];}
for(i=0;i<9;i++){for(j=0;j<9-i;j++){if(a[j]>a[j+1]) {t=a[j];a[j]=a[j+1];a[j+1]=t;} }}
for(i=0;i<10;i++)
{DBYTE[i+0x30]=a[i];}
while(1);
}

11. 次数不确定的累加和

#include<reg51.h>
#include<absacc.h>
#include<math.h>
void main()
{  unsigned int sum,i,n,x;
n=DBYTE[0x30];
x=DBYTE[0x31];
sum=0;
for(i=1;i<=n;i++)
{sum=sum+pow(i,x);}
DBYTE[0x35]=sum;
while(1);
}#include<reg51.h>
#include<absacc.h>
void main()
{  unsigned int sum,i,n;n=DBYTE[0x30];sum=0;for(i=1;i<=n;i++){sum=sum+i*i;}DBYTE[0x35]=sum;while(1);
}#include<reg51.h>
#include<absacc.h>
main()
{ unsigned char a,b,i,j,sum;a=DBYTE[0x30];sum=0;for(i=1;i<=a;i++){b=1;for(j=1;j<=i;j++){b=j*b;}sum=sum+b;}DBYTE[0x31]=sum;
while(1);
}

12. 偶数拆分为两个素数之和

#include<reg51.h>
#include<absacc.h>
#include<math.h>
void main()
{  unsigned char a,b,c,d;
a=DBYTE[0x30];
for(b=3;b<=a/2;b+=2)
{ for(c=2;c<=sqrt(b);c++)
if(b%c==0) break;
if(c>sqrt(b)) d=a-b;
else break;
for(c=2;c<=sqrt(d);c++)
if(d%c==0) break;
if(c>sqrt(d))
{DBYTE[0x31]=b;
DBYTE[0x32]=d;} }
while(1);
}

13. 拆分为四个数的平方和

#include<reg51.h>
#include<absacc.h>
void main()
{  unsigned char a,b,c,d,x;
x=DBYTE[0x30];
for(a=1;a<=x/2;a++)
for(b=0;b<=a;b++)
for(c=0;c<=b;c++)
for(d=0;d<=c;d++)
if(x==a*a+b*b+c*c+d*d)
{ DBYTE[0x20]=a;
DBYTE[0x21]=b;
DBYTE[0x22]=c;
DBYTE[0x23]=d; }
while(1);
}

14.大写字母转换为小写字母,数字则不变

#include<reg51.h>
#include<absacc.h>
main()
{  unsigned char x;
x=DBYTE[0x30];
if(x>=0x30&&x<=0x39)  {DBYTE[0x08]=x;}
else    {x=x+0x20;}
DBYTE[0x08]=x;
while(1);
}

15.在P1口输出50个矩形脉冲

#include<reg51.h>
#include<absacc.h>
sbit u=P1^4; //将u位定义为P1.4
void delay30ms(void)
{  unsigned char m,n;
for(m=0;m<100;m++)
for(n=0;n<100;n++)
;  }
void main(void)
{  unsigned char i;
u=1; //初始化输出高电平
for(i=0;i<50;i++) //输出50个矩形脉冲
{  u=1;
delay30ms();
u=0;
delay30ms();  }
while(1) ; //无限循环,防止程序“跑飞”
}

《单片机原理与接口技术》小结相关推荐

  1. 《认知设计》-提升学习体验的艺术

    最近看完了<认知设计-提升学习体验的艺术>这本书,不得不说里面有很多关于设计学习体验的知识.同时也了解到自己也有很多在学习上面的误区.值得推荐给大家看一看.先上思维导图 这本书的封面: 首 ...

  2. 《认知设计:提升学习体验的艺术》——小结

    小结 成功的学习体验并不仅仅是使学习者学习到更多的知识,更应让他们能够运用这些知识做更多的事情. 有些时候,学习者的主要差距在于知识层面,但更多时候知识和信息是次要问题,主要问题是应培养学习者的技能. ...

  3. 《认知设计:提升学习体验的艺术》——学习者喜欢什么

    学习者喜欢什么 除了知道学习者想要什么外,你也需要了解他们喜欢什么.我的游戏设计师朋友同样提倡(主张)发现你的学习者的偏好(不同于爱好): --你能发现,如果我们专注于开发用户需要和喜爱的软件,本质上 ...

  4. 《认知设计:提升学习体验的艺术》——差距在哪里

    差距在哪里 差距是你的学习者当前的起点和他们希望达到的终点之间的距离.其中一部分可能是知识上的差距,但从我们之前的讨论可以看出,其实还有其他类型的差距. 如果你能够认识这些差距,那么你就能够设计出更好 ...

  5. Web用户体验设计提升实践

    本文首发于微信公众号"Shopee技术团队". 前言 本文是基于 Shopee 供应链团队内部 WMS(Warehouse Management System,仓库管理系统) 项目 ...

  6. Web 用户体验设计提升指南

    转载自:https://juejin.cn/post/6932647134944886797 前端优秀实践不完全指南 一个 Web 页面,一个 APP,想让别人用的爽,也就是所谓的良好的用户体验,我觉 ...

  7. 简单的文本设计就能影响游戏体验?游戏中提升玩家体验的小设计

    除去少部分以"折磨"玩家为己任的"受苦"游戏,电子游戏其本质上还是为了给予使用者美好的体验. 除去游戏的画面.手感.音乐等等一些会直接影响玩家体验的重要要素, ...

  8. 协众信息UI设计怎么提升用户体验呢

      随着软件行业的发展兴起的一个新的设计行业.UI设计除了对美观有要求外,还对用户体验有要求,这也是UI设计不同于其他设计的地方.那么,UI设计怎么提升用户体验呢?     1.层次结构     要确 ...

  9. 产品设计如何提升客户体验?

    在现如今多元化的市场发展,产品设计和制造不局限于制造企业,因而相近产品的选用愈来愈多.各行各业都在思索如何提高产品与顾客中间的黏性.由于产品设计公司归属于设计领域,因此在做产品设计前一定要进行市场调查 ...

  10. 4个方法教你增强你的UI设计,提升用户体验!

    在追求用户体验至上的时代,设计的简单直白显得尤为重要,而极简也成为现代很多年轻人所追崇的.为了迎合用户的的需求和喜好,UI设计师自然也需要向这一方向努力,那么怎么才能增强设计的极简化特征,提升用户体验 ...

最新文章

  1. 常用Maven收集以及Maven技巧
  2. numpy.argsort详解
  3. statistics DATA in jiangsu
  4. Git环境搭建与基本使用方法 (转自http://blog.csdn.net/fireelement/article/details/9618363)
  5. 挖漏经验:在密码重置请求包中添加X-Forwarded-Host实现受害者账户完全劫持
  6. 七个你可能不了解的CSS单位
  7. 如何利用BI搭建电商数据分析平台
  8. 2021年中国单输入K型温度计市场趋势报告、技术动态创新及2027年市场预测
  9. 梵语和藏语_藏语与梵文的区别
  10. Oracle查看表空间使用情况
  11. Eclipse下找不到“新建Web项目”
  12. C语言ALG什么文件,alg.exe进程是什么
  13. idou老师教你学Istio 29:Envoy启动流程
  14. hdu 4622 Reincarnation(后缀树组求子串个数)
  15. 计算机上没有端口DOT4,dot4_001端口
  16. 软文营销推广抓住写作风格让文案不再平庸
  17. Vue 2.x折腾记 - (17) 基于Ant Design Vue 封装一个配置式的表单组件
  18. 逆流而上,YEX虚拟盘是莽夫还是勇者?
  19. C++连接MySQL数据库(利用API)
  20. 联通vac订购关系web接口php代码,联通sp对接填坑备忘

热门文章

  1. 万字干货,Podman 保姆级中文使用教程
  2. mac 安装 PyAudio
  3. 基于asp.net C#中小型超市库存管理系统
  4. 【Ubuntu录屏软件】SimpleScreenRecorder的安装与使用
  5. 四个Python爬虫案例,带你掌握xpath数据解析方法!
  6. SSO —— 单点登录CAS与OAuth2
  7. 专访邱锡鹏:人工智能开源社区的「先行者」
  8. 启动jar包报错: 找不到或无法加载主类
  9. Arduino开发遥控小车(二)基于nRF24L01无线模块实现数据发送和接收
  10. EXCEL 基础函数大全