- 使用定时器实现流水灯
- 按键控制流水灯速度
- 串口信息放入指定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个中断源和两个优先级嵌套中断结构



