单片机实验期末复习

一、流水灯
在这里插入图片描述

共阳极接法 N --P 流水灯接P级 0为亮 1为灭
共阴极 流水灯接N级 0为灭 1为亮
#include “reg51.h”
sbit LED0=P2^0;//位运算 led0是P2.0那一位 可以给P2.0那一位赋值 0/1
//现在是流水灯的共阳极接法 0为亮 1为灭

void delay(unsigned int n){
unsigned int i=0,j=0;
for(i=0;i<n;i++){
for(j=0;j<120;j++);
}

}

void led(){
int i=0;
for(i=0;i<8;i++){
P2=~(0x01<<i);//0x01--->0000 0001 ~0x01--->1111 1110取反 P2是从下往上的
//<<左移  <<1  0000 0010  <<2  0000  0100
//先移位 再取反
delay(500);
}
}
void main(){
while(1){
/*
用位运算来控制led的亮灭
LED0=0;亮
LED0=1;灭*/
led();
}
}

实现流水灯的通用方法

#include "reg51.h"
unsigned char leddat[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数组实现
void delay(unsigned int n){
unsigned int i=0,j=0;
for(i=0;i<n;i++){
for(j=0;j<120;j++);
}
}
void led(){
int i=0;
for(i=0;i<8;i++){

P2=~leddat[i];//取反
delay(500);
}
}

void main(){
while(1){
led();
}
}

二、数码管的原理及静态显示 动态显示
共阴极 高电平1有效 接地 共阳极 低电平0有效 接电源
共阳在共阴的前面取反即可
在这里插入图片描述

共阴静态数码管显示0~9

#include "reg51.h"
unsigned char s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴0-9

void delay(unsigned int n){
unsigned int i=0,j=0;
for(i=0;i<n;i++){
for(j=0;j<120;j++);
}
}

void seg(){
int i=0;
for(i=0;i<10;i++){
P2=s[i];
delay(500);
}
}

void main(){
while(1){
seg();
}

}

共阳极
#include "reg51.h"
unsigned char s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴0-9

void delay(unsigned int n){
unsigned int i=0,j=0;
for(i=0;i<n;i++){
for(j=0;j<120;j++);
}
}

void seg(){
int i=0;
for(i=0;i<10;i++){
P0=~s[i];
delay(500);
}
}

void main(){
while(1){
seg();
}

}

动态数码管
P2口控制hello的显示 p3口控制显示哪一个字符
当现实h的时候,p3口1;e p3口 2
在这里插入图片描述

#include "reg51.h"
unsigned char str[]={0x76,0x79,0x38,0x38,0x3F};//HELLO的二进制数码管显示 P2
unsigned char wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//P3  p3口为第一个的时候,显示数码管的第一个   为第二个的时候  显示数码管的第二个

void delay(unsigned int n){
unsigned int i=0,j=0;
for(i=0;i<n;i++){
for(j=0;j<120;j++);
}
}

void seg(){
int i=0;
for(i=0;i<5;i++){
P3=~wei[i];
P2=str[i];
delay(5);
}
}

void main(){
while(1){
seg();
}

}

三、按键的原理及独立式案件的实现
断开的时候高电平, 按下之后低电平
使用延时程序delay消抖,使用标志位flag
独立式按键
在这里插入图片描述

利用按键控制数码管 加 按下加1

#include "reg51.h"
sbit key0=P1^0;
unsigned char s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned flag=0,num=0;

void delay(unsigned int n){
unsigned int i=0,j=0;
for(i=0;i<n;i++){
for(j=0;j<120;j++);
}
}

void key(){//如果按下按键,标志位为1,当标志位为1并且按键弹起的时候,num加一,恢复标志位
if(key0==0){
flag=1;
}
if(flag==1&&key0==1){
num++;
flag=0;
}

}
void seg(){//p2跟着num往后移动 加一
P2=s[num];
if(num==10){
num=0;
}
}

void main(){
while(1){
key();
seg();
}
}

四、矩阵键盘的实现

五、定时器的原理和应用
在这里插入图片描述

定时器每隔1s数字加1

#include "reg51.h"
unsigned char s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned count=0,num=0;
//定时器的初始化
void inittimer(){
TMOD=0x01;//TMOD寄存器  0000 0001 选择工作方式为定时器0
TH0=(65535-50000)/256;//高位50ms=50000us  256=2^8  相当于>>8
TL0=(65535-50000)%256;
ET0=1;//开启定时器0的中断
EA=1;//开启总中断
TR0=1;//启动定时器0
}

void display(){
P2=s[num];
if(num==10){
num=0;
}
}

void main(){
inittimer();
while(1){
display();
}
}

void timer_isr() interrupt 1//0表示外部中断0  1表示定时器中断0  2表示外部中断1  3表示定时器中断1 4表示串口中断
{
TH0=(65535-50000)/256;//高位50ms=50000us  256=2^8  相当于>>8
TL0=(65535-50000)%256;
count++;
if(count==20)//定时1s
{
num++;
count=0;
}
}

六、计数器
计数器只能连P3的3.4 3.5的IO口
在这里插入图片描述

按三下按钮,数字加1
#include "reg51.h"
unsigned char s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned num=0;

void initcounter(){
TMOD=0x06l;//0000 0110
TH0=256-3;
TL0=256-3;
ET0=1;
EA=1;
TR0=1;
}

void display(){
P2=s[num];
if(num==10){
num=0;
}
}
void main(){
initcounter();
while(1){
display();
}
}

void counter_isr() interrupt 1{
num++;
}

七、中断原理以及外部中断的实现
外部中断连接在P3.2 P3.3 尽量选择边沿触发
P3.2一开始为高电平 下降沿触发
在这里插入图片描述

按下按钮 数值加1

#include "reg51.h"
unsigned char s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char num=0;
sbit ex=P3^2;
void initex(){
IT0=1;//边沿式触发
EX0=1;//外部中断
EA=1;//总中断
ex=1;
}

void display(){
P2=s[num];
if(num==10){
num=0;
}
}

void main(){
initex();
while(1){
display();
}
}

void ex_isr() interrupt 0{
num++;
}

八、串口通信
发送和接收用SBUF寄存器 TI为1发送完成 为0可以发送 RI为1 接收完成 为0可以接收 TI RI需要手动清0
SCON控制通信方式 方式1
PCON 电源控制寄存器
方式1 八位异步通信
在这里插入图片描述

在外设上接收 输出数据

#include "reg51.h"
unsigned char recdat=0,flag=0;
void initscon(){
SCON=0x50;//0101  0000
TMOD=0x20;//0010 0000
TH1=256-3;
TL1=256-3;
ES=1;
EA=1;
TR1=1;
}

void senddat(){
SBUF=recdat;
while(!TI);
TI=0;
}

void main(){
initscon();//初始化串口
while(1){
if(flag==1){如果数据接收到了
senddat();发送数据
flag=0;
}
}
}
void scon_isr() interrupt 4{
recdat=SBUF;//接收到的数据
RI=0;清0
flag=1;
}

九、LCD1602

在lcd上显示helloword

#include "reg51.h"
sbit RS=P3^0;
sbit RW=P3^1;
sbit E=P3^2;
unsigned char str[]={"Hello world!"};

void delay(unsigned int t){
unsigned int i=0,j=0;
for(i=0;i<t;i++){
for(j=0;j<120;j++);
}
}

void writedat(unsigned char dat){
RS=1;
RW=0;
E=0;
P2=dat;
delay(5);
E=1;
E=0;
}

void writecom(unsigned char com){
RS=0;
RW=0;
E=0;
P2=com;
delay(5);
E=1;
E=0;
}

void initlcd(){
writecom(0x38);
writecom(0x0c);
writecom(0x06);
writecom(0x01); 

}

void display(){
unsigned int i=0;
writecom(0x80);
delay(5);
/*writedat('A');
delay(5);*/
while(str[i]!='\0'){
writedat(str[i]);
delay(5);
i++;
}
}

void main(){
initlcd();
while(1){
display();
}
}
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值