栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

单片机期末复习

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

单片机期末复习

单片机期末复习
  • 使用定时器实现流水灯
  • 按键控制流水灯速度
  • 串口信息放入指定RAM
  • INT0中断计数、数码管显示
  • 8只数码管滚动显示8~F
  • RAM中的运算问题
  • 单片机内部结构
  • 存储器扩展

使用定时器实现流水灯
#include "reg52.h"

unsigned char count = 0,i = 0;
unsigned char LED[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};	//依次点亮流水灯
//0xfe:1111 1110
//0xfd:1111 1101
//0xfb:1111 1011
//0xf7:1111 0111

void Init_Time0()
{
	TMOD = 0x01;				//选择定时器0
	TH0 = (65536-50000)/256;	//定时50ms
	TL0 = (65536-50000)%256;	//定时50ms
	ET0 = 1;					//开启中断定时器0
	EA = 1;						//开启中断总开关
	TR0 = 1;					//定时器0启动计时
}

void Time0() interrupt 1
{
	TH0 = (65536-50000)/256;
	TL0 = (65536-50000)%256;
	count++;
	if(count == 10)			//10×50ms = 500ms,500ms换一个灯
	{
		P1 = LED[i];		//依次点亮LED灯0,1...7
		i++;
		if(i == 8)
		{
			i = 0;
		}
		count = 0;
	}
}

void main()
{
	Init_Time0();
	while(1)
	{
	
	}
}
按键控制流水灯速度
#include "reg52.h"

sbit K0 = P1^4;
sbit K1 = P1^5;
sbit K2 = P1^6;
sbit K3 = P1^7;

unsigned int speed = 100,i = 0,j =0;
unsigned char LED[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void Delay_1ms(unsigned int t)		//1ms延时函数
{
	unsigned int x,y;
	for(x = t;x > 0;x--)
		for(y = 123;y > 0;y--);
}

void time() interrupt 1 
{
	TR0 = 0;
	P1 = 0xff;
	if((P1&0xf0) != 0xf0)		//检验是否有按键按下
	{
		Delay_1ms(20);			//延时20ms消抖
		if((P1&(0xf0)) != 0xf0)		//再次检测是否有按键按下
		{
			if(K0 == 0)						//K0按下,间隔500ms
				speed = 500;
			if(K1 == 0)						//K1按下,间隔1000ms
				speed = 1000;
			if(K2 == 0)						//K2按下,间隔1500ms
				speed = 1500;
			if(K3 == 0)						//K3按下,间隔2000ms
				speed = 2000;
		}
	}
	while((P1 & 0xf0) != 0xf0);		//按键松开消抖
	TR0 = 1;
}

void main()
{
	TMOD = 0x02;     //使用定时器T0的模式2
	EA = 1;          //开总中断
	ET0 = 1;         //定时器T0中断允许
	TR0 = 1;         //定时器T0开始运行
	TH0 = 256 - 200;		//200us进入一次中断
	TL0 = 256 - 200;
	speed = 100;        //默认流水灯速度位100ms
	P0 = 0xff;
	while(1)
	{
		if(j == 8)
		j=0;
		P0 = LED[j];
		Delay_1ms(speed);
		j++;
	}
}
串口信息放入指定RAM
//=====================================//
//===从串口接受的16字节信息放入RAM的===//
//===0x50-0x5H中,波特率设置为2400b/s==//
//===做奇偶校验,晶振位12MHz===========//
//=====================================//




#include "reg52.h"

unsigned char i = 0;
unsigned char array[] _at_ 0x50;

void InitUart()
{
	SCON = 0xd0;		//串口方式3,允许接收
	TMOD = 0x20;		//定时器1,方式2
	TH1 = 243;			//波特率计算:12,000,000/((256-TH1)*32*12)=2400则有TH1=243
	TL1 = 243;
	ES = 1;				//打开串口中断
	EA = 1;				//打开中断总开关
	TR1 = 1;			//打开定时器1开关
}

void UART() interrupt 4
{
	if(TI)
		TI = 0;			//手动清0,为下次发送做准备
	else
	{
		RI = 0;			//手动清0,为下次接收做准备
		ACC = SBUF;		//将SBUF中内容放入累加器
		if(RB8 == P)	//检验位判断
		{
			array[++i] = ACC;	//累加器中内容送入数组
			if(i > 15)			//接收16个字节后关闭串口
				ES = 0;
		}
		else
		{
			F0 = 1;
			err();
		}
	}
}

void main()
{
	InitUart();
	while(1)
	{
	
	}
}
INT0中断计数、数码管显示
//中断使用P3.2端口

#include "reg52.h"

unsigned char code LED_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};
unsigned char Buffer_Counts[]={0,0,0};		//
unsigned char Count=0;				//计数数值

sbit K2 = P3^5;						//清零计数按键定义

void delay(unsigned int t)		//延时1ms函数
{
	unsigned int i,j;
	for(i = t; i > 0; i --)
		for(j = 123; j > 0; j --);		
}

void Show_Counts()		//次数显示
{
 	unsigned char i;
	Buffer_Counts[2] = Count / 100;				//百位
	Buffer_Counts[1] = Count % 100 /10;			//十位
	Buffer_Counts[0] = Count % 10;				//个位
	if(Buffer_Counts[2] == 0)
	{
	 	Buffer_Counts[2] = 10;			//百位为0时,百位放入LED_CODE[10],关闭不显示
		if(Buffer_Counts[1] == 0)	
			Buffer_Counts[1] = 10;		//十位为0时,十位放入LED_CODE[10],关闭不显示		
	}
	for(i = 0;i < 3;i ++)
	{
		P0 = 0xFF;
	 	P2 = 0x80 >> i;		//依次显示数码管
		P0 = LED_CODE[Buffer_Counts[i]];
		delay(2);
	}
}

void main()
{
	IT0 = 1;		//中断0下降沿触发
	EX0 = 1;		//打开中断0
	EA = 1;			//打开终端总开关
	while(1)
	{
		if(K2 == 0) 
		Count = 0;
		Show_Counts();
	}
}

void ISR0() interrupt 0
{
 	Count++;
}
8只数码管滚动显示8~F
#include "reg52.h"

unsigned char code LED_CODE[] = {0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8E};   //七段码显示数组
unsigned char i = 0;

void delay(unsigned int t)   //延时子程序1ms
{
	unsigned char i,j;
	for(i = t; i > 0; i --)
		for(j = 123; j > 0; j --);		
}

void main()
{
	while(1)
	{
		for(i = 0; i < 8; i ++)
		{
			P0 = 0xFF;				 //关闭所有数码管
			P3 = 0x01 << i;    		 //0x01左移i位,依次点亮第一个,第二个....
			P0 = LED_CODE[i];  		 //调用显示数组数据
			delay(500);				 //亮500ms
		}
	}
}
RAM中的运算问题
//============================================//
//===RAM中的运算问题,给出一个地址空间,20H===//
//===中给一个y值,分段计算,输出相应的值。====//
//============================================//

#include "reg52.h"

char data x,*p,*y;

void main()
{
	p = 0x20;		//地址20H
	y = 0x21;		//地址21H
	while(1)
	{
		x = *p;			//20H中的数据送入x
		if(x > 0)		//如果x>0,将x送入21H
			*y = x;
		if(x < 0)		//如果x<0,将x+5送入21H
			*y = x + 5;
		if(x == 0)		//如果x=0,将数值20H送入21H
			*y = 0x20;
	}
}
单片机内部结构

1、CPU
2、片内振荡器以及时钟电路
3、ROM程序存储器
4、RAM数据存储器
5、外部程序存储器,外部数据存储器
6、可编程I/O线
7、定时/计数器
8、可编程全双工串行接口
9、5个中断源和两个优先级嵌套中断结构

存储器扩展


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/928095.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号