////////////////////////////////////////////////////////
//单片机串口发送字符
////////////////////////////////////////////////////////
#include<reg51.h> //51单片机头文件(单片机寄存器解释文件)
#include<stdio.h> //输入输出函数头文件
void main(void) //主函数
{ TI=1; //串口发送标志
while(1) //主循环
{
printf("HELLO C!\r\n");//字符串输出到串口
}
}
#include<reg51.h>
sbit LED=P3^7; //定义特殊功能寄存器P3^7为LED
void main(void)
{
unsigned int i; //定义无符号16位数i
while(1)
{
for(i=0;i<52000;i++) //for循环,用于延时
LED=~LED; //LED取反操作
}
}
#include<reg51.h>
void delay()//延时函数
{
unsigned int i;
for(i=0;i<52000;i++);
}
void main()
{
unsigned char i;
while(1)
{
for(i=0;i<8;i++)
{
P0=0x01<<i;//从右往左
P0=0x80>>i;//从左往右
delay();//调用延时函数
}
}
}
#include<reg51.h>
sbit POUT=P1^0;
void main(void)
{
TMOD=0x01; //设置工作方式
TH0=0xfc; //装初值
TL0=0x18;
TR0=1; //开定时器0
while(1)
{
if(TF0==1) //判断是否溢出
{
TF0=0; //清除溢出标志
TH0=0xfc;//重新装入初值
TL0=0x18;
POUT=!POUT;
}
}
}
(查询方式执行)在定时器程序中,当TR0=1时,定时器打开,定时器开始工作,计数器开始+1,但CPU并不知道什么时候定时器溢出。CPU通过不断反复查询TF0状态,判断是否溢出。
响应时间与查询次数之间存在矛盾:响应时间短——查询次数多。
解决办法:中断系统。
#include<reg51.h>
sbit POUT=P1^0;
void main(void)
{
TMOD=0x01; //设置工作方式
TH0=0xfc; //装初值
TL0=0x18;
TR0=1; //开定时器0
EA=1; //开中断总开关
ET0=1; //开定时0中断
while(1);
}
void time0() interrupt 1 //定时器1的中断服务函数
{
TH0=0xfc;//重新装入初值
TL0=0x18;
POUT=!POUT;
}
/***********************************************************
*程序功能:查询方式,定时器工作于方式1,每隔一秒发光二极管闪烁一次。(晶振11.0592M)
***********************************************************/
#include<reg51.h>
#define uint unsigned int
uint pp;
sbit POUT=P1^0;
void main(void)
{
TMOD=0x01; //设置工作方式,定时器0,工作模式1(M1=0,M0=1)
TH0=0xff; //装初值,定时设置为100us,定时10000次。
TL0=0xa4; //对于晶振为11.0592M晶振的单片机最大定时时长只有几十毫秒
TR0=1; //开定时器0
while(1)
{
if(TF0==1) //单片机反复查询定时器0的溢出标志位TF0
{
TF0=0;
pp++; //每定时一次PP+1
TH0=0xff;//重新装入初值
TL0=0xa4;
}
if(pp==10000)
{
POUT=~POUT;
pp=0;
}
}
}
/***********************************************************
*程序功能:中断方式,定时器工作于方式1,每隔一秒发光二极管闪烁一次。(晶振11.0592M)
***********************************************************/
#include<reg51.h>
#define uint unsigned int
uint pp;
sbit POUT=P1^0;
void main(void)
{
TMOD=0x01; //设置工作方式,定时器0,工作模式1(M1=0,M0=1)
TH0=0xff; //装初值,定时设置为100us,定时10000次。
TL0=0xa4; //对于晶振为11.0592M晶振的单片机最大定时时长只有几十毫秒
TR0=1; //开定时器0
EA=1; //开总中断
ET0=1; //开定时器0中断
while(1)
{
if(pp==10000)
{
POUT=~POUT;
pp=0;
}
}
}
void time0() interrupt 1
{
pp++; //每定时一次PP+1
TH0=0xff;//重新装入初值
TL0=0xa4;
}
/***********************************************************
*程序功能:外部中断方式,定时器工作于方式1,每隔一秒发光二极管闪烁一次。(晶振11.0592M)
***********************************************************/
#include<reg51.h>
sbit LED1=P0^0;
sbit LED2=P0^1;
void ISR0(void) interrupt 0 //外部中断0服务函数
{
LED1=~LED1;
}
void ISR1(void) interrupt 2 //外部中断1服务函数
{
LED2=~LED2;
}
void main(void)
{
IP=0x05; //外部中断0和外部中断1设置为高优先级
IT0=1; //外部中断0为下降沿触发(中断引脚P3.2输入下降沿信号时引发中断)
IT1=1; //外部中断1为下降沿触发(中断引脚P3.3输入下降沿信号时引发中断)
EX0=1; //开外部中断0
EX1=1; //开外部中断1
EA=1; //开中断总开关
while(1);
}
/*************************************************************
*程序功能:静态数码管,数码管轮流显示0-F
*************************************************************/
#include<reg51.h>
unsigned char code LED7code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数组,定义0-F显示码
void delay(void)
{
unsigned int i;
for(i=0;i<65000;i++);
}
void main(void)
{
unsigned char i;
P2=0xfe; //
while(1)
{
for(i=0;i<16;i++)//16个内容循环显示
{
P0=LED7code[i];//P0口连接数码管A-H
delay();
}
}
}
/*************************************************************
*程序功能:数码管动态显示
*************************************************************/
#include<reg51.h>
unsigned char code wei[]={~0x08,~0x04,~0x02,~0x01};//数码管各位码表
unsigned char code duan[]={0xc0,0xf9,0xa4,0xb0};//0-3码表
void delay(unsigned int i)
{
unsigned int m,n;
for(m=i;m>0;m--);
for(n=90;n>0;n--);
}
void main(void)
{
unsigned char num;
while(1)
{
for(num=0;num<4;num++)
{
P2= wei[num];
P0=duan[num];
delay(20);
}
}
}
计算机与外设/计算机与计算机之间的通信:并行通信、串行通信。
/*************************************************************
*程序功能:串口发送Hello
*************************************************************/
#include<reg51.h>
#include<stdio.h> //输入输出函数头文件
void main(void)
{
SCON=0X50; //串口方式1允许接收
TMOD=0X20; //定时器1定时方式2
TH1=0XF4; //11.0592M 2400波特率
TL1=0xF4;
TI=1; //串口发送标志
TR1=1; //启动定时器
while(1)
{
printf("Hello world!\r\n");//字符串输出到串口
}
}
/**************************************************
*串口通信实验:发送
**************************************************/
#include<reg51.h>
#include<stdio.h> //输入输出函数头文件
unsigned char code MESSAGE[]="My first serial data!\n";
unsigned char a;
void delay(unsigned int i)
{
unsigned char j;
for(i;i>0;i++)
for(j=200;j>0;j--);
}
void main(void)
{
SCON=0X50; //REN=1允许接收状态 串口方式1
TMOD|=0X20; //定时器1定时方式2
TH1=0XF4; //11.0592M 2400波特率 数据位8 停止位1
TL1=0xF4;
TI=1; //串口发送标志
TR1=1; //启动定时器
while(1)
{
a=0;
while(MESSAGE[a]!='\0') //数组最后一个位为'\0'
{
SBUF=MESSAGE[a]; //SBUF接收/发送缓冲器(串行通信特殊功能寄存器)
while(!TI); //等待数据传送(TI发送中断标志) TI=1时说明数据发送完成
TI=0; //清除数据传输标志
a++; //下一个字符
}
delay(1000);
}
}
/**************************************************
*串口通信实验:收发(数据转发功能:单片机收到了电脑发送的数据后又转发回给电脑)
**************************************************/
#include<reg51.h>
#define uchar unsigned char
uchar a,flag; //设置全局变量
void main()
{
SCON=0X50; //REN=1允许接收状态 串口方式1
TMOD=0X20; //定时器1定时方式2
TH1=0XF4; //11.0592M 2400波特率 数据位8 停止位1
TL1=0xF4;
TI=1; //串口发送标志
TR1=1; //启动定时器
EA=1; //开总中断
ES=1; //开串中断
while(1)
{
if(flag==1) //如果有数据则进入这个语句
{
ES=0; //进入发送数据时先关闭串行中断
flag=0;
SBUF=a; //将数据原样发回
while(!TI); //等待数据发完
TI=0;
ES=1; //退出再开串行中断
}
}
}
void serial() interrupt 4//串行中断函数
{
a=SBUF; //将收取的数据存到a
flag=1; //标志置位——表示单片机收到数据
RI=0; //接收标志清零
}