当前位置:文档之家› 51单片机经典实例源码

51单片机经典实例源码

51单片机经典实例源码
51单片机经典实例源码

#include

#include "LCD1602.h"

uint Num=0;

uchar NumCode[4]={0,0,0,0};

//---------------中断加一--------------

void my_INT1(void) interrupt 0

{

Num++;

}

//-----------------------------

void Disp()

{

uint m;

NumCode[0]=Num/1000;

NumCode[1]=Num%1000/100;

NumCode[2]=Num%100/10;

NumCode[3]=Num%10;

for(m=0;m<4;m++)

{

LCD_Disp(0,5+m,NumCode[m]+0x30);

}

}

//---------------------

void main()

{

IT0=1;EA=1;EX0=1;

LCD_Init();

while(1)

{

Disp();

}

} #include

#include "LCD1602.h"

uint Num=3728;

uchar NumCode[4]={0,0,0,0};

//-----------------------自动加一------------------------- void Disp()

{

uchar m;

NumCode[0]=Num/1000;

NumCode[1]=Num%1000/100;

NumCode[2]=Num%100/10;

NumCode[3]=Num%10;

for(m=0;m<4;m++)

{

LCD_Disp(0,6+m,NumCode[m]+0x30);

}

}

//--------------------------------------------

void main()

{

LCD_Init();

while(1)

{

Disp();

Num++;

Delay(50000);

}

}

#include #include "LCD1602.h" uint Num=5432;

uchar NumCode[4]={0,0,0,0};

//----------定时器T0按键加一--------------- void T0Init() { TMOD=0x0d; TH0=5432/256; TL0=5432%256;

TR0=1; }

//------------------------------------------ void Disp() { int m;

NumCode[0]=Num/1000; NumCode[1]=Num%1000/100; NumCode[2]=Num%100/10; NumCode[3]=Num%10; for(m=0;m<4;m++) {

LCD_Disp(0,5+m,NumCode[m]+0x30); }

}

//------------------------------------------- void main() { T0Init(); LCD_Init(); while(1) { Num=TH0*256+TL0; Disp();

}

}

#include #define uchar unsigned char uchar T0Num; sbit LED=P1^0;

//--------定时器TO 使LED 自动一秒闪一下--------- void T0Init() { TMOD=0x01;

TH0=(65536-10000)/256; TL0=(65536-10000)%256; TR0=1; ET0=1; EA=1;

}

//--------------------------- void T0Sever() interrupt 1 { TH0=(65536-10000)/256; TL0=(65536-10000)%256; T0Num++; if(T0Num==100) { LED=~LED;

T0Num=0;

}

}

//--------------------------- void main() { T0Init(); while(1) {

}

}

#include

#define uchar unsigned char

#define uint unsigned int

uchar num[10]=

{

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f ,0x6f

};

uint shu;

//-----------外部中断按键加减一----------

void my_INT1(void) interrupt 0

{

shu--;

}

//-----------------------------------------------------

void my_INT2(void) interrupt 2

{

shu++;

}

//------------------------------------------------------

void main()

{

shu=5;

IT0=1;EA=1;EX0=1;

IT1=1;EA=1;EX1=1;

while(1)

{

P2=num[shu];

if(shu==10){shu=0;}

if(shu==-1){shu=9;}

}

}

#include

#define uint unsigned int

#define uchar unsigned char

uchar Disp[4]={0x9a,0xca,0xa9,0xac};

//------------------------交通灯--------------------- void delay3ms(uchar i)

{

uint n,j,k;

for(;i>=1;i--)

{

for(n=2;n>=1;n--)

{

for(j=250;j>=1;j--)

{

for(k=200;k>=1;k--);

}

}

}

}

//-------------------------------------

void main()

{

while(1)

{

P1=Disp[0];delay3ms(4);

P1=Disp[1];delay3ms(1);

P1=Disp[2];delay3ms(4);

P1=Disp[3];delay3ms(1);

}

}

#include

#define uchar unsigned char

uchar T0Num=0;

uchar PWM=50;

sbit LED=P3^7;

//------------PWM频率------

void T0Init()

{

TMOD=0x01;

TH0=(65536-100)/256;// 0.1ms

TL0=(65536-100)%256;

ET0=1;

EA=1;

TR0=1;

}

//-----------------------

void Ex0Init()

{

IT0=1;

EX0=1;

EA=1;

}

//------------------------

void main()

{

T0Init();

Ex0Init();

while(1)

{

}

}

//------------------------

void T0Server() interrupt 1

{

TH0=(65536-100)/256;// 0.1ms

TL0=(65536-100)%256;

T0Num++;

if(T0Num==PWM)

{

LED=1;

}

if(T0Num==100)

{

T0Num=0;

LED=0;

}

}

//--------------------------

void Int0Server() interrupt 0

{

PWM=PWM+5;

if(PWM>=100)

{

PWM=0;

}

}

include

#define uchar unsigned char

uchar i,Flagls,Scon,T0Num;

uchar code LedCode[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40, 0x80};

//-------串口74LS164驱动流水灯--------------

void T0_Init()

{

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;

ET0=1;

EA=1;

}

//----------------

void Serial_Init()

{

Scon=0x00;

}

//------------------

void SerialSend (uchar ch)

{

SBUF=ch;

while(TI==0)

{

}

TI=0;

}

//--------------

void main()

{

T0_Init();

Serial_Init();

while(1)

{

if(Flagls==1)

{

Flagls=0;

SerialSend(LedCode[i]);

i++;

if(i>7)

{

i=0;

}

}

}

}

//------------------

void Toserver() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

T0Num++;

if(T0Num>20)

{

T0Num=0;

Flagls=1;

}

}

#include

#define uchar unsigned char

#define uint unsigned int

uchar DispCode[10]={0xfc,0x60,0xda,0xf2,0x66,

0xb6,0x3e,0xe0,0xfe,0xe6}; uint Num=9995;

uchar NumCode[4]={0,0,0,0};

uchar T1Num;

bit Flag1s=0;

//---------串口74LS164驱动数码管---------------- void SerialInit()

{

SCON=0x00;

}

//-----------------------------------------

void T1Init()

{

TMOD=0x10;

TH1= -10000/256;

TL1= -10000%256;

TR1=1;

ET1=1;

EA=1;

}

//------------------------------------------

void Disp()

{

uchar i;

NumCode[0]=Num/1000;

NumCode[1]=Num%1000/100;

NumCode[2]=Num%100/10;

NumCode[3]=Num%10;

for(i=0;i<4;i++)

{

SBUF=DispCode[NumCode[3-i]];

while(TI==0)

{

}

TI=0;

}

}

//------------------------------------------ void main()

{

SerialInit();

T1Init();

while(1)

{

if(Flag1s==1)

{

Flag1s=0;

Disp();

}

}

}

//----------------------------------------- void T1Server() interrupt 3

{

TH1= -10000/256;

TL1= -10000%256;

T1Num++;

if(T1Num==100)

{

T1Num=0;

Flag1s=1;

Num++;

if(Num>9999)

{

Num=0;

}

}

}

#include

#define uchar unsigned char

#define uint unsigned int

uchar T0Num;

bit Flag1s=0;

uchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};

//--------MUC_MUC串口自发自收-----------

void SerialInit()

{

SCON=0x50; //方式1 允许接收

PCON=0x00; //串口波特率不加倍

TMOD|=0x20; //定时器1,方式2

TH1=0xfd; //波特率为9600

TL1=0xfd;

TR1=1; //启动定时器

ES=1;

EA=1;

}

//--------------------------------

void T0Init()

{

TMOD|=0x01;

TH0=-10000/256;

TL0=-10000%256;

ET0=1;

TR0=1;

EA=1;

}

//--------------------------------

void main()

{

uchar k;

SerialInit();

T0Init();

while(1)

{

if(Flag1s==1)

{

Flag1s=0;

SBUF=DispCode[k];

k++;

if(k>9)

{

k=0;

}

}

}

}

//--------------------------------

void SerialServer() interrupt 4

{

if(RI==1)

{

RI=0;

P2=SBUF;

}

else

{

TI=0;

}

}

//--------------------------------

void T0Server() interrupt 1

{

TH0=-10000/256;

TL0=-10000%256;

T0Num++;

if(T0Num==100)

{

T0Num=0;

Flag1s=1;

}

}

#include

#define uchar unsigned char

#define uint unsigned int

uchar T0Num;

bit Flag1s=0;

uchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};

//-----------两机通信(主机代码)---------------------- void SerialInit()

{

SCON=0x50; //方式1 允许接收

PCON=0x00; //串口波特率不加倍

ES=1;

EA=1;

}

//---------------------------------

void T1Init()

{

TMOD=0x20; //定时器1,方式2

TH1=0xfd; //波特率为9600

TL1=0xfd;

TR1=1; //启动定时器

}

//--------------------------------

void T0Init()

{

TMOD|=0x01;

TH0=-10000/256;

TL0=-10000%256;

ET0=1;

TR0=1;

EA=1;

}

//--------------------------------

void main()

{

uchar k;

SerialInit();

T1Init();

T0Init();

while(1)

{

if(Flag1s==1)

{

Flag1s=0;

P2=DispCode[k];

SBUF=DispCode[k];

k++;

if(k>9)

{

k=0;

}

}

}

}

//--------------------------------

void SerialServer() interrupt 4

{

if(RI==1)

{

RI=0;

}

else

{

TI=0;

}

}

//--------------------------------

void T0Server() interrupt 1

{

TH0=-10000/256;

TL0=-10000%256;

T0Num++;

if(T0Num==100)

{

T0Num=0;

Flag1s=1;

}

}

#include

#define uchar unsigned char

uchar Ch;

//------两机通信(从机代码)---------------- void SerialInit()

{

SCON=0x50; //方式1 允许接收

PCON=0x00; //串口波特率不加倍

ES=1;

EA=1;

}

//---------------------------------

void T1Init()

{

TMOD=0x20; //定时器1,方式2

TH1=0xfd; //波特率为9600

TL1=0xfd;

TR1=1; //启动定时器

}

//--------------------------------

void main()

{

SerialInit();

T1Init();

while(1)

{

P2=Ch;

}

}

//--------------------------------

void SerialServer() interrupt 4

{

if(RI==1)

{

RI=0;

Ch=SBUF;

}

else

{

TI=0;

}

}

#include

#define uchar unsigned char

uchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};

uchar Num=5;

//----------------多机通信(主机代码)------------ void ExInit()

{ IT0=1;

IT1=1;

EX0=1;

EX1=1;

EA=1;

}

//---------------------------------

void SerialInit()

{ SCON=0xd0; //方式3 允许接收

PCON=0x00; //串口波特率不加倍

TMOD=0x20; //定时器1,方式2

TH1=0xfd; //波特率为9600

TL1=0xfd;

TR1=1; //启动定时器

ES=1;

EA=1;

}

//--------------------------------

void SBUFSend(uchar Ch)

{ SBUF=Ch;

while(TI==0)

{ }

TI=0; }

//--------------------------------

void SendControl(uchar Addr,uchar Data) { TB8=1;

SBUFSend(Addr);

TB8=0;

SBUFSend(Data);

}

//--------------------------------

void main()

{ SerialInit();

ExInit();

while(1)

{ }

}

//--------------------------------

void SerialServer() interrupt 4

{ uchar Ch;

if(RI==1)

{ RI=0;

Ch=SBUF;

if(Ch=='b')

{

P2=DispCode[1];

}

if(Ch=='c')

{

P2=DispCode[2];

}

}

else

{TI=0;}

}

//-------------------------------

void Ex0Server() interrupt 0

{ Num++;

if(Num>9)

{

Num=0;

}

SendControl('b',Num);

}

//-----------------------------

void Ex1Server() interrupt 2

{

Num--;

if(Num==255)

{

Num=9;

}

SendControl('c',Num);

}

************************************* #include

#define uchar unsigned char

uchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};

//------------多机通信(从机1)--------------------- void SerialInit()

{

SCON=0xf0; //方式3 允许接收,SM2=1

PCON=0x00; //串口波特率不加倍

TMOD=0x20; //定时器1,方式2

TH1=0xfd; //波特率为9600

TL1=0xfd;

TR1=1; //启动定时器

ES=1;

EA=1;

}

//-------------------------------

void SBUFSend(uchar Ch)

{

SBUF=Ch;

while(TI==0)

{

}

TI=0;

}

//--------------------------------

void main()

{

SerialInit();

while(1)

{

}

}

//--------------------------------

void SerialServer() interrupt 4

{

uchar Ch;

if(RI==1)

{

RI=0;

Ch=SBUF;

if(RB8==1) //地址

{

if(Ch=='b')

{

SM2=0; //是自己的地址,置SM2=0,开始接收数据

SBUFSend('b');

}

else

{

SM2=1; //不是自己的地址,置SM2=1。

}

}

if(RB8==0)

{

P2=DispCode[Ch];

SM2=1;//接收完数据,准备下次接收地址。

}

}

}

************************************ #include

#define uchar unsigned char

uchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};

//----------多机通信(从机2)-----------

void SerialInit()

{ SCON=0xf0; //方式3 允许接收,SM2=1 PCON=0x00; //串口波特率不加倍

TMOD=0x20; //定时器1,方式2

TH1=0xfd; //波特率为9600

TL1=0xfd;

TR1=1; //启动定时器

ES=1;

EA=1;

} //-------------------------------

void SBUFSend(uchar Ch)

{ SBUF=Ch;

while(TI==0)

{

}

TI=0;

}

//--------------------------------

void main()

{ SerialInit();

while(1)

{

}

}

//--------------------------------

void SerialServer() interrupt 4

{ uchar Ch;

if(RI==1)

{

RI=0;

Ch=SBUF;

if(RB8==1) //地址

{

if(Ch=='c')

{

SM2=0; //是自己的地址,置SM2=0,开始接收数据

SBUFSend('c');

}

else

{

SM2=1; //不是自己的地址,置SM2=1。

}

}

if(RB8==0)//数据

{

P2=DispCode[Ch];

SM2=1;//接收完数据,准备下次接收地址。

}

}

}

#include

#define uchar unsigned char

#define uint unsigned int

uchar T0Num=0;

sbit DAWR=P3^6;

uchar code SinTab[128]={

64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106, 109,111,113,115,117,118,120,121,123,124,125,126,12 6,

127,127,127,127,127,127,127,126,126,125,124,123,1 21,

120,118,117,115,113,111,109,106,104,102,99,96,94,9 1,

88,85,82,79,76,73,70,67,64,60,57,54,51,48,45,42,39, 36,33,31,28,25,23,21,18,16,14,12,10,9,7,6,4,3,2,1, 1,0,0,0,0,0,0,0,1,1,2,3,4,6,7,9,10,12,14,16,18,21,23, 25,28,31,33,36,39,42,45,48,51,54,57,60};

//------------DAC0832(波形发生器)-------------- void T0Init()

{

TMOD=0x01;

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;

TR0=1;

ET0=1;

EA=1;

}

//--------------------------

void DA(uchar DA Value)

{

DAWR=0;

P0=DA Value;

DAWR=1;

}

//---------------------------

void main() {

IT0=1;EA=1;EX0=1;

IT1=1;EA=1;EX1=1;

T0Init();

while(1)

{

}

}

//--------------------------

void T0Server() interrupt 1 {

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;

DA(SinTab[T0Num]);

T0Num++;

if(T0Num>127)

{

T0Num=0;

}

}

#include

#define uchar unsigned char

#define uint unsigned int

uchar

DispCode[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0x3e ,0xe0,0xfe,0xe6};

uchar NumCode[4]={0,0,0,0};

uchar xdata Adc;

uint AdValue;

uchar T0Num;

bit Flag1s=0;

//----------AD0804电压转换-----------------

void T0Init()

{ TMOD=0x01;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

TR0=1;

ET0=1;

EA=1;

}

void SerialInit()

{ SCON=0x00; }

//------------------------

void Delay(uint n)

{ while(n--);}

//------------------------

void Ad()

{ Adc=0xff; //启动转换

Delay(100); //等待转换

AdValue=Adc; //读出转换结果

}

//-------------------------

void AdProcess()

{ uchar i;

uint Sum=0;

for(i=0;i<8;i++)

{ Ad();

Sum=Sum+AdValue;

}

Sum=Sum>>3;

AdValue=Sum*19.685;

}

//-----------------------

void Disp()

{ uchar k;

NumCode[0]=AdValue/1000;

NumCode[1]=AdValue%1000/100;

NumCode[2]=AdValue%100/10;

NumCode[3]=AdValue%10;

for(k=0;k<4;k++)

{ SBUF=DispCode[NumCode[3-k]];

while(TI==0)

{ }

TI=0;

}

}

//--------------------------------

void main()

{ T0Init();

SerialInit();

while(1)

{ if(Flag1s==1)

{ Flag1s=0;

Ad();

AdProcess();

Disp();

}

}

}

//------------------------------------

void T0Server() interrupt 1

{ TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

T0Num++;

if(T0Num==100)

{ T0Num=0;

Flag1s=1;

}

}

基于51单片机系统设计

基于51单片机的多路温度采集控制系统设计 言: 随着现代信息技术的飞速发展,温度测量控制系统在工业、农业及人们的日常生活中扮演着一个越来越重要的角色,它对人们的生活具有很大的影响,所以温度采集控制系统的设计与研究有十分重要的意义。 本次设计的目的在于学习基于51单片机的多路温度采集控制系统设计的基本流程。本设计采用单片机作为数据处理与控制单元,为了进行数据处理,单片机控制数字温度传感器,把温度信号通过单总线从数字温度传感器传递到单片机上。单片机数据处理之后,发出控制信息改变报警和控制执行模块的状态,同时将当前温度信息发送到LED进行显示。本系统可以实现多路温度信号采集与显示,可以使用按键来设置温度限定值,通过进行温度数据的运算处理,发出控制信号达到控制蜂鸣器和继电器的目的。 我所采用的控制芯片为AT89c51,此芯片功能较为强大,能够满足设计要求。通过对电路的设计,对芯片的外围扩展,来达到对某一车间温度的控制和调节功能。 关键词:温度多路温度采集驱动电路 正文: 1、温度控制器电路设计 本电路由89C51单片机温度传感器、模数转换器ADC0809、窜入并出移位寄存器74LS164、数码管、和LED显示电路等组成。由热敏电阻温度传感器测量环境温度,将其电压值送入ADC0809的IN0通道进行模数转换,转换所得的数字量由数据端D7-D0输出到89C51的P0口,经软件处理后将测量的温度值经单片机的RXD端窜行输出到74LS164,经74LS164 窜并转换后,输出到数码管的7个显示段,用数字形式显示出当前的温度值。89C51的P2.0、P2.1、P2.2分别接入ADC0809通道地址选择端A、B、C,因此ADC0809的IN0通道的地址为F0FFH。输出驱动控制信号由p1.0输出,4个LED为状态指示,其中,LED1为输出驱动指示,LED2为温度正常指示,LED3为高于上限温度指示,LED4为低于下限温度指示。当温度高于上限温度值时,有p1.0输出驱动信号,驱动外设电路工作,同时LED1亮、LED2灭、LED3亮、LED4灭。外设电路工作后,温度下降,当温度降到正常温度后,LED1亮、LED2亮、LED3灭、LED4灭。温度继续下降,当温度降到下限温度值时,p1.0信号停止输出,外设电路停止工作,同时LED1灭、LED2灭、LED3灭、LED4亮。当外设电路停止工作后,温度开始上升,接着进行下一工作周期。 2、温度控制器程序设计 本软件系统有1个主程序,6个子程序组成。6个子程序为定时/计数器0中断服务程序、温度采集及模数转换子程序ADCON、温度计算子程序CALCU、驱动控制子程序DRVCON、十进制转换子程序METRICCON 及数码管显示子程序DISP。 (1)主程序 主程序进行系统初始化操作,主要是进行定时/计数器的初始化。 (2)定时/计数器0中断服务程序 应用定时计数器0中断的目的是进行定时采样,消除数码管温度显示的闪烁现象,用户可以根据实际环境温度变化率进行采样时间调整。每当定时时间到,调用温度采集机模数转换子程序ADCON,得到一个温度样本,并将其转换为数字量,传送给89C51单片机,然后在调用温度计算子程序CALCU,驱动控制子程序DRVCON,十进制转换子程序MERTRICCON,温度数码显示子程序DISP。

C51单片机和电脑串口通信电路图

C51单片机和电脑串口通信电路图与源码 51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。 串口通讯的硬件电路如上图所示 在制作电路前我们先来看看要用的MAX232,这里我们不去具体讨论它,只要知道它是TTL和RS232电平相互转换的芯片和基本的引脚接线功能就行了。通常我会用两个小功率晶体管加少量的电路去替换MAX232,可以省一点,效果也不错,下图就是MAX232的基本接线图。

按图7-3加上MAX232就可以了。这大热天的拿烙铁焊焊,还真的是热气迫人来呀:P串口座用DB9的母头,这样就可以用买来的PC串口延长线进行和电脑相连接,也可以直接接到电脑com口上。

为了能够在电脑端看到单片机发出的数据,我们必须借助一个WINDOWS软件进行观察,这里我们利用一个免费的电脑串口调试软件。本串口软件在本网站https://www.doczj.com/doc/d41449392.html,可以找到 软件界面如上图,我们先要设置一下串口通讯的参数,将波特率调整为4800,勾选十六进制显示。串口选择为COM1,当然将网站提供的51单片机实验板的串口也要和电脑的COM1连接,将烧写有以下程序的单片机插入单片机实验板的万能插座中,并接通51单片机实验板的电源。

51单片机与PC机通信资料

《专业综合实习报告》 专业:电子信息工程 年级:2013级 指导教师: 学生:

目录 一:实验项目名称 二:前言 三:项目内容及要求 四:串口通信原理 五:设计思路 5.1虚拟串口的设置 5.2下位机电路和程序设计 5.3串口通信仿真 六:电路原理框图 七:相关硬件及配套软件 7.1 AT89C51器件简介 7.2 COMPIN简介 7.3 MAX232器件简介 7.4友善串口调试助手 7.5 虚拟串口软件Virtual Serial Port Driver 6.9八:程序设计 九:proteus仿真调试 十:总结 十一:参考文献 一:实验项目名称:

基于51单片机的单片机与PC机通信 二:前言 在国内外,以PC机作为上位机,单片机作为下位机的控制系统中,PC机通常以软件界面进行人机交互,以串行通信方式与单片机进行积极交互,而单片机系统根据被控对象配置相应的前向,后向信息通道,工作时作为主控机测对象,作为被控机接受PC机监督,指挥,定期或受命向上位机提供对象及本身的工作状态信息。 目前,随着集成电路集成度的增加,电子计算机向微型化和超微型化方向发展,微型计算机已成为导弹,智能机器人,人类宇宙和太空和太空奥妙复杂系统不可缺少的智能部件。在一些工业控制中,经常需要以多台单片机作为下位机执行对被控对象的直接控制,以一台PC机为上位机完成复杂的数据处理,组成一种以集中管理、分散控制为特点的集散控制系统。 为了提高系统管理的先进性和安全性,计算机工业自动控制和监测系统越来越多地采用集总分算系统。较为常见的形式是由一台做管理用的上位主计算机(主机)和一台直接参与控制检测的下位机(单片机)构成的主从式系统,主机和从机之间以通讯的方式来协调工作。主机的作用一是要向从机发送各种命令及参数:二是要及时收集、整理和分析从机发回的数据,供进一步的决策和报表。从机被动地接受、执行主机发来的命令,并且根据主机的要求向主机回传相应烦人实时数据,报告其运行状态。 用串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。同时,系统的更改和扩充极为容易。MCS-51系列单片机,由于内部带有一个可用于异步通讯的全双工的穿行通讯接口,阴齿可以很方便的构成一个主从式系统。 串口是计算机上一种非常通用的设备通讯协议,大多数计算机包容两个基于RS232的串口。串口同时也是仪器仪表设备通过用的通讯协议,很多GPIB兼容的设备也带有RS-232口。同时串口通讯协议也可以用于获取远程采集设备数据。所以,深入的理解学习和研究串口通信相关知识是非常必要的。此次毕业设计选题为“PC机与MCS-51单片机的串口通讯”,使用51单片机来实现一个主从式

51单片机用C语言实现交通灯(红绿灯)源程序

51单片机用C语言实现交通灯(红绿灯)源程序 2009-10-29 23:00 交通灯,红黄绿灯交替亮,怎样实现呢?其实就是根据单片机定时器及倒计时的程序修改。 源程序如下: /* 1、程序目的:使用定时器学习倒计时红绿灯原理主要程序和倒计时一样 2、硬件要求:数码管、晶振12M */ #include bit red,green,yellow,turnred; //定义红、黄、绿及转红标志 code unsigned char tab[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管 0-9 unsigned char Dis_Shiwei;//定义十位 unsigned char Dis_Gewei; //定义个位 void delay(unsigned int cnt) //用于动态扫描数码管的延时程序{ while(--cnt); } main() { TMOD |=0x01;//定时器设置 10ms in 12M crystal定时器0,工作方式1,16位定时器 TH0=0xd8; //65535-10000=55535=D8F0(十六进制) TL0=0xf0; IE= 0x82; //中断控制,EA=1开总中断,ET0=1:定时器0中断允许 TR0=1; //开定时器0中断 P1=0xfc;//红灯亮,根据红黄绿接灯的顺序。 red =1; while(1) { P0=Dis_Shiwei;//显示十位,这里实现用8位数码管,即左1位 P2=0; delay(300);//短暂延时 P0=Dis_Gewei; //显示个位,左数,2位 P2=1;

(完整word版)基于51单片机的温度控制系统设计

基于51单片机的水温自动控制系统 0 引言 在现代的各种工业生产中 ,很多地方都需要用到温度控制系统。而智能化的控制系统成为一种发展的趋势。本文所阐述的就是一种基于89C51单片机的温度控制系统。本温控系统可应用于温度范围30℃到96℃。 1 设计任务、要求和技术指标 1.1任务 设计并制作一水温自动控制系统,可以在一定范围(30℃到96℃)内自动调节温度,使水温保持在一定的范围(30℃到96℃)内。 1.2要求 (1)利用模拟温度传感器检测温度,要求检测电路尽可能简单。 (2)当液位低于某一值时,停止加热。 (3)用AD转换器把采集到的模拟温度值送入单片机。 (4)无竞争-冒险,无抖动。 1.3技术指标 (1)温度显示误差不超过1℃。 (2)温度显示范围为0℃—99℃。 (3)程序部分用PID算法实现温度自动控制。 (4)检测信号为电压信号。 2 方案分析与论证 2.1主控系统分析与论证 根据设计要求和所学的专业知识,采用AT89C51为本系统的核心控制器件。AT89C51是一种带4K字节闪存可编程可擦除只读存储器的低电压,高性能CMOS 8位微处理器。其引脚图如图1所示。 2.2显示系统分析与论证 显示模块主要用于显示时间,由于显示范围为0~99℃,因此可采用两个共阴的数码管作为显示元件。在显示驱动电路中拟订了两种设计方案: 方案一:采用静态显示的方案 采用三片移位寄存器74LS164作为显示电路,其优点在于占用主控系统的I/O口少,编程简单且静态显示的内容无闪烁,但电路消耗的电流较大。 方案二:采用动态显示的方案 由单片机的I/O口直接带数码管实现动态显示,占用资源少,动态控制节省了驱动芯片的成本,节省了电 ,但编程比较复杂,亮度不如静态的好。 由于对电路的功耗要求不大,因此就在尽量节省I/O口线的前提下选用方案一的静态显示。

51单片机与PC串口通讯

目录 第1章需求分析 ............................................................................................................................ - 1 - 1.1课题名称 (1) 1.2任务 (1) 1.3要求 (1) 1.4设计思想 (1) 1.5课程设计环境 (1) 1.6设备运行环境 (2) 1.7我在本实验中完成的任务 (2) 第2章概要设计 ............................................................................................................................ - 2 - 2.1程序流程图 (2) 2.2设计方法及原理 (3) 第3章详细设计 ............................................................................................................................ - 3 - 3.1电路原理 (3) 3.1.1STC89C52芯片 ............................................................................................................. - 3 -3.2串口通信协议 (4) 3.3程序设计 (5) 3.3.1主程序模块 .................................................................................................................... - 5 - 3.3.2串口通讯模块 ................................................................................................................ - 6 - 3.3.3控制部分文件 ................................................................................................................ - 8 - 3.3.4公共部分模块 .............................................................................................................. - 11 -3.4电路搭建 (12) 3.4.1电路原理图 .................................................................................................................. - 12 -第4章上位机关键代码分析 ...................................................................................................... - 12 - 4.1打开串口操作 (12) 4.2后台线程处理串口程序 (15) 4.3程序运行界面 (18) 第5章课程设计总结与体会 ...................................................................................................... - 19 -第6章致谢 .................................................................................................................................. - 19 -参考文献........................................................................................................................................... - 19 -

汇编语言实现串口通信(PC和单片机间)教学文案

8.用C语言或汇编语言实现串口通信(PC和单片机间) 上位机和下位机的主从工作方式为工业控制及自动控制系统所采用。由于PC 机分析能力强、处理速度更快及单片机使用灵活方便等特点,所以一般都将PC 机作为上位机,单片机作为下位机,二者通过RS-232或者RS-485接收、发送数据和传送指令。单片机可单独处理数据和控制任务,同时也将数据传送给PC机,由PC机对这些数据进行处理或显示 1 硬件电路的设计 MCS-51单片机有一个全双工的串行通讯口UART,利用其RXD和TXD与外界进行通信,其内部有2个物理上完全独立的接收、发送缓冲器SBUF,可同时发送和接收数据。所以单片机和PC机之间可以方便地进行串口通讯。单片机串口有3条引线:TXD(发送数据),RXD(接收数据)和GND(信号地)。因此在通信距离较短时可采用零MODEM方式,简单三连线结构。IBM-PC机有两个标准的RS-232串行口,其电平采用的是EIA电平,而MCS-51单片机的串行通信是由TXD(发送数据)和RXD(接收数据)来进行全双工通信的,它们的电平是TTL电平;为了PC机与MCS-51 机之间能可靠地进行串行通信,需要用电平转换芯片,可以采用MAXIM公司生产的专用芯片MAX232进行转换。电路如图1所示。硬件连接时,可从MAX232中的2路发送器和接收器中任选一路,只要注意发送与接收的引脚对应关系即可。接口电路如图3.5所示。

总体设计按照整体设计思路方案绘制原理图如下所示: 2 系统软件设计 软件设计分上位机软件设计和下位机软件设计。这两部分虽然在不同的机器上编写和运行,但它们要做的工作是对应的:一个发送,另一个接收。为了保证数据通信的可靠性,要制定通信协议,然后各自根据协议分别编制程序。现约定通信协议如下:PC机和单片机都可以发送和接收。上位机和下位机均采用查询方式发送控字符和数据、中断方式接收控制字符和数据。采用RS-232串口异步通信, 1上位PC机与下位单片机异步串行通信的通信协议

AT89C51单片机设计60s倒计时

目录 一、课程设计的目的、要求和设计目标 (1) 1、目的 (1) 2、要求 (1) 3、目标.................................................................. 1二、硬件要求 (2) 1、 AT89C51的芯片 (2) 2、 LED 数码管显示器概述 (3) 3、其他元器件介绍及参数选择.......................................... 6三、软件设计 (7) 1、程序流程图 (7) 2、程序导图 (7) 3、定时 /计数器初值计算 (7) 4、软件程序 (8) 5、软件仿真设计………………………………………………… 9四、软件调试………………………………………………………… 10 1、 <.HEX>文件的生成 (10) 2、PROTEUS …………………………………………………… 10五、心得体会………………………………………………………… 11 一、课程设计的目的、要求和设计目标 1、目的

单片机课程即将结束, 课程的最后一项是单片机的课程设计。通过课程设计, 我们要将在一个学期中所学的东西进行整理、归纳, 要把学到的知识转化成实际的运用,进一步的了解单片机的实质。通过动手设计,深入学习,体验单片机在日常生活中的运用,提升专业知识。 课程设计的总体包括:对单片机的了解、运用,设计思路的解析,报告文字的处理等。通过一系列的实际操作, 完善对课程的学习, 提升自我的学习能力和动手能力。 2、要求 (1用单片机 AT89C51的定时器实现 60s 倒计时。本例中用两位数码管静态显示倒计时秒值。 (2用 PROTEUS 设计,仿真基于 AT89c51单片机的 60s 倒计时实验。 (3通过 Keil uVision2软件,生成 .HEX 格式程序并植入 AT59C51单片机并调试、运行。 3、目标 通过自主完成课程设计内容, 整理学期中所学到的知识, 了解单片机的程序过程和一系列的基础操作,将理论和实践相结合,完善课业。 二、硬件要求 1、 AT89C51的芯片 芯片概述 AT89C51是一个低功耗,高性能 CMOS 8位单片机,片内含 4k Bytes ISP的可反复擦写 1000次的 Flash 只读程序存储器, 器件采用 ATMEL 公司的高密度、非易失性存储技术制造,兼容标准 MCS-51指令系统及 80C51引脚结构,芯片内集成了通用

基于51单片机的温度控制系统的设计

基于单片机的温度控制系统设计 1.设计要求 要求设计一个温度测量系统,在超过限制值的时候能进行声光报警。具体设计要求如下: ①数码管或液晶显示屏显示室内当前的温度; ②在不超过最高温度的情况下,能够通过按键设置想要的温度并显示;设有四个按键,分别是设置键、加1键、减1键和启动/复位键; ③DS18B20温度采集; ④超过设置值的±5℃时发出超限报警,采用声光报警,上限报警用红灯指示,下限报警用黄灯指示,正常用绿灯指示。 2.方案论证 根据设计要求,本次设计是基于单片机的课程设计,由于实现功能比较简单,我们学习中接触到的51系列单片机完全可以实现上述功能,因此可以选用AT89C51单片机。温度采集直接可以用设计要求中所要求的DS18B20。报警和指示模块中,可以选用3种不同颜色的LED灯作为指示灯,报警鸣笛采用蜂鸣器。显示模块有两种方案可供选择。 方案一:使用LED数码管显示采集温度和设定温度; 方案二:使用LCD液晶显示屏来显示采集温度和设定温度。 LED数码管结构简单,使用方便,但在使用时,若用动态显示则需要不断更改位选和段选信号,且显示时数码管不断闪动,使人眼容易疲劳;若采用静态显示则又需要更多硬件支持。LCD显示屏可识别性较好,背光亮度可调,而且比LED 数码管显示更多字符,但是编程要求比LED数码管要高。综合考虑之后,我选用了LCD显示屏作为温度显示器件,由于显示字符多,在进行上下限警戒值设定时同样可以采集并显示当前温度,可以直观的看到实际温度与警戒温度的对比。LCD 显示模块可以选用RT1602C。

3.硬件设计 根据设计要求,硬件系统主要包含6个部分,即单片机时钟电路、复位电路、键盘接口模块、温度采集模块、LCD 显示模块、报警与指示模块。其相互联系如下图1所示: 图1 硬件电路设计框图 单片机时钟电路 形成单片机时钟信号的方式有内部时钟方式和外部时钟方式。本次设计采用内部时钟方式,如图2所示。 单片机内部有一个用于构成振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别为此放大器的输入端和输出端,其频率范围为~12MHz ,经由片外晶体振荡器或陶瓷振荡器与两个匹配电容一 起形成了一个自激振荡电路,为单片机提供时钟源。 复位电路 复位是单片机的初始化操作,其作用是使CPU 和系统中的其他部件都处于一个确定的初始状态,并从这个状态开始工作,以防止电源系统不稳定造成CPU 工作不正常。在系统中,有时会出现工作不正常的情况,为了从异常状态中恢复,同时也为了系统调试方便,需要设计一个复位电路。 单片机的复位电路有上电复位和按键复位两种形式,因为本次设计要求需要有启动/复位键,因此本次设计采用按键复位,如图3。复位电路主要完成系统 图2 单片机内部时钟方式电路 图3 单片机按键复位电路

基于51单片机最小系统设计

基础强化训练任务书 学生姓名:董勇涛专业班级:电子0902 指导教师:洪建勋工作单位:信息工程学院 题目:基于51单片机最小系统设计 一、训练目的 主要目的就是对学生进行基础课程、基本技能、基本动手能力的强化训练,提高学生的基础理论知识、基本动手能力,提高人才培养的基本素质。 二、训练内容和要求 1、基础课程和基本技能强化训练 (1)设计一个基于51单片机最小系统电路; (2)对所设计电路的基本原理进行分析; 2、文献检索与利用、论文撰写规范强化训练 要求学生掌握基本的文献检索方法,科学查找和利用文献资料,同时要求学生获得正确地撰写论文的基本能力,其中包括基本格式、基本排版技巧和文献参考资料的写法、公式编排、图表规范制作、中英文摘要的写法等训练。 3、基本动手能力和知识应用能力强化训练 (1)学习PROTEL软件; (2)绘制电路的原理图和PCB版图,要求图纸绘制清晰、布线合理、符合绘图规范; 4、查阅至少5篇参考文献,按《武汉理工大学课程设计工作规范》要求撰写基础强化训练报告书,全文用A4纸打印。 三、初始条件 计算机;Microsoft Office Word 软件;PROTEL软件 四、时间安排 1、20011年7 月 11日集中,作基础强化训练具体实施计划与报告格式要求的说明; 学生查阅相关资料,学习电路的工作原理。 2、2011年7 月 12日,电路设计与分析。 3、2011年7 月 13日至2010年7 月 14日,相关电路原理图和PCB版图的绘制。 4、2011年7 月15日上交基础强化训练成果及报告,进行答辩。 指导教师签名:年月日系主任(或责任教师)签名:年月日 目录 摘要.................................................................................................................... 错误!未定义书签。

51单片机串口通信,232通信,485通信,程序

51单片机串口通信,232通信,485通信,程序代码1:232通信 #include #define uchar unsigned char #define uint unsigned int uchar flag,a,i; uchar code table[]="i get"; void init() { TMOD=0X20; TH1=0XFD; TH0=0XFD; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1; } void main() { init();

while(1) { if(flag==1) { ES=0; for(i=0;i<6;i++) { SBUF=table[i]; while(!TI); TI=0; } SBUF=a; while(!TI); TI=0; ES=1; flag=0; } } } void ser() interrupt 4 {

RI=0; a=SBUF; flag=1; } 代码2:485通信 #include #include"1602.h" #define uchar unsigned char #define uint unsigned int unsigned char flag,a,i; uchar code table[]="i get "; void init() { TMOD=0X20; TH1=0Xfd; TL1=0Xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1;

} void main() { init_1602(); init(); while(1) { if(flag==1) { display(0,a); } } } void ser() interrupt 4 { RI=0; a=SBUF; flag=1; }

51单片机usart通信程序(有CRC校验)

#include #include #include #define uchar unsigned char #define uint unsigned int //uchar const table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar p[]={0x01,0x03,0x25,0x23,0x00,0x01}; /* CRC 高位字节值表*/ uchar const crchi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0/**/, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 } ; /* CRC低位字节值表*/ uchar const crclo[] = { 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06/**/, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,

根据51单片机能实现任意时间倒计时

倒计时器 只要修改此文档15页源程序的(如下图)的到计时初值即可实现想要的倒计时。比如30分钟倒计时修改分钟十位和各位即可。 一、设计要求: 由单片机接收小键盘阵列设定倒计时时间,倒计时的范围最大为60分钟,由LED 显示模块显示剩余时间,显示格式为 XX(分):XX(秒).X,精确到0.1s的整数倍。倒计时到,由蜂鸣器发出报警。绘制系统硬件接线图,并进行系统仿真和实验。画出程序流程图并编写程序实现系统功能。 二、设计的作用目的: 此次设计是我们更进一步了解基本电路的设计流程,提高自己的设计理念,丰富自己的理论知识,巩固所学知识,使自己的动手动脑能力有更进一步提高,为自己今后的学习和工作打好基础,为自己的专业技能打好基础。通过解决实际问题,巩固和加深“单片机原理与应用”课程中所学的理论知识和实验能力,基本掌握单片机应用电路的一般设计方法,提高电子电路的设计和实验能力,加深对单片机软硬知识的理解,获得初步的应用经验,为以后从事生产和科研工作打下一定的基础。本次设计注重对单片机工作原理以及键盘控制及显示原理的理解,以便今后自己在单片机领域的学习和开发打下基础,提高自己的动手能力和设计能力,培养创新能力,丰富自己的理论知识,做到理论和实践相结合。本次设计的重要意义还在于对单片机的内部结构和工作状态做更进一步的了解,同时还对单片机的接口技术,中断技术,存储方式和控制方式作更深层次的了解。

三、具体设计: 1.问题分析: 在电子技术飞速发展的今天,电子产品的人性化和智能化已经非常成熟,其发展前景仍然不可估量。如今的人们需求的是一种能给自己带来方便的电子产品,当然最好是人性化和智能化的,如何能做到智能化呢?单片机的引入就是一个很好的例子。单片机又称单片微型计算机,也称为微控制器,是微型计算机的一个重要分支,单片机是20世纪70年代中期发展起来的一种大规模集成电路芯片,是集CPU,RAM,ROM,I/O接口和中断系统于同一硅片上的器件。单片机的诞生标志着计算机正式形成了通过计算机系统和嵌入式计算机系统两个分支。目前单片机已渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。单片机已在广阔的计算机应用领域中表现得淋漓尽致电器因此,单片机已成为电子类工作者必须掌握的专业技术之一。单片机就是一个微型中央处理器,通过编程即能完成很多智能化的工作,因此它的出现给电子技术智能化和微型化起到了很大的推动作用。 本设计将采用89C51单片机,89C51单片机是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。单片机自带5个中断,两个16位定时器32个I/O口,可擦除只读存储器可以反复擦除多次,功能相当强大。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器。89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 面对如此功能强大的单片机,结合本次设计要求,应该要用到单片机的内部时钟电路以及外围的显示接口电路和报警电路。 对与时钟,它有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间,它通常有两种实现方法:一是用软件实现,即用单片机内部的可编程定时/计数器来实现,但误差很大,主要用在对时间精度要求不高的场合;二是用专门的时钟芯片实现,在对时间精度要求很高的情况下,通常采用这种方法。 在显示方面,有着多种选择,但是8段LED数码管足以满足此次设计的要求了。LED 数码显示器是一种有LED发光二极管组合显示字符的显示器件。它使用了8个LED发光二极管,其中7个用于显示字符,一个用于显示小数点,故通常称之为8段发光二极管数码器。 其内部结构如下图(a)所示:

基于51单片机的交通控制系统模拟设计

基于51单片机的交通控制系统模拟设计 学院:电气与控制工程学院 专业:自动化 姓名:

目录 1. 设计思路 (2) 2.2显示界面方案 (2) 2.3输入方案: (2) 3 单片机交通控制系统总体设计 (2) 3.1单片机交通控制系统的通行方案设计 (2) 3.2单片机交通控制系统的功能要求 (3) 3.3单片机交通控制系统的基本构成及原理 (3) 4智能交通灯控制系统的硬件设计 (4) 4.1系统硬件总电路构成及原理 (4) 4.2系统硬件电路构成 (4) 4.3系统工作原理 (4) 5 系统软件程序的设计 (6) 5.1程序主体设计流程 (6) 参考文献 (17) 设计心得体会 (18) 附录 (19) 基于单片机的交通控制系统模拟设计

1. 设计思路 (1)分析目前交通路口的基本控制技术以及各种通行方案,并以此为基础提出自己的交通控制的初步方案。 (2)确定系统交通控制的总体设计,包括,十字路口具体的通行禁行方案设计以及系统应拥有的各项功能,在这里,本设计除了有信号灯状态控制能实现基本的交通功能,还增加了倒计时显示提示,基于实际情况,又增加了紧急状况处理和通行时间可调这两项特特殊功能。 (3)进行显示电路,灯状态电路,按键电路的设计和对各器件的选择及连接,大体分配各个器件及模块的基本功能要求。 (4)进行软件系统的设计,对于本系统,采用单片机C语言编写,对单片机内部结构和工作情况做了充足的研究,了解定时器,中断以及延时原理,总体上完成了软件的编写。 2.单片机交通控制系统方案的比较、设计与论证 2.1 电源提供方案 采用单片机控制模块提供电源。改方案的优点是系统简明扼要, 节约成本;缺点是输出功率不高。 2.2 显示界面方案 采用数码管显示。这种方案只显示有限的符号和数码字符,简单,方便。 2.3 输入方案: 由于该系统对于交通灯及数码管的控制,只用单片机本身的I/O 口就可实现,且本身的计数器及RAM已经够用,故选择方案二。 3 单片机交通控制系统总体设计 3.1单片机交通控制系统的通行方案设计 设在十字路口,分为东西向和南北向,在任一时刻只有一个方向通行,另一方向禁行,持续一定时间,经过短暂的过渡时间,将通行禁行方向对换。其具体状态如下所示。交通状态从状态1开始变换,直至状态6然后循环至状态1,周而复始。 通过具体的路口交通灯状态的演示分析我们可以把这四个状态归纳如下: ◆南北方向红灯灭,同时绿灯亮,东西方向黄灯灭,同时红灯亮,倒计时30秒。此状态下,东西向禁止通行,南北向允许通行。 ◆南北方向绿灯灭,东西方向红灯灭,同时黄灯亮,倒计时3秒。此状态下,除了已经正在通行中的其他所以车辆都需等待状态转换。

51单片机与蓝牙串口通信程序

#include #include #include #include "LCD1602.h" #include "matrix_key.h" #define uint unsigned int #define uchar unsigned char #define Nop() _nop_() sbit P10 = P1^0; /*定义独立对地按键端口*/ sbit P11 = P1^1; /*定义独立对地按键端口*/ sbit P12 = P1^2; /*定义独立对地按键端口*/ sbit P13 = P1^3; /*定义独立对地按键端口*/ //shift键 bit shift_flag; bit call_flag ; bit CallIn_flag=0; bit reci_flag; bit reci_flag1; sbit sled_en_port = P3^6; /*定义数码管数据锁存器控制端口*/ sbit led_en_port = P2^5; /*定义发光二极管数据锁存器控制端口*/ sbit ds1302_en_port = P2^2; /*定义时钟的选片脚*/ uchar CallIn_Num[15];//={"00000000000"}; uchar CallOut_Num[15]={" "}; uchar m=0; //拨号指针 uchar temp='?'; uchar code clr[16]={" "}; uchar code lcd_table[16] = {"Ky: Cm: Re: "}; //uchar send_buff[15]; uchar reci_buff[15]={" "}; uchar z; //接收缓冲区指针 uchar time;//定时器中断次数 uchar code mun_to_char[]={"0123456789ABCDEF"}; /*1MS为单位的延时程序*/ void init(); void send(uchar cc); void send_f(uchar ccc); void interrupt_pro(); void key_pro(); void call_out();

【最新编排】基于51单片机的DHT11串口通讯

//****************************************************************// // DHT 使用范例 //单片机 AT89S5 或 STC89C5 RC // 功能 串口发送温湿度数据波特率 9600 //硬件连接 P .0口为通讯口连接DHT ,DHT 地电源和地连接单片机地 电源和地 单片机串口加MAX 3 连接电脑 // 公司 济南联诚创发科技有限公司 //****************************************************************// #include #include // typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */ typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */ typedef unsigned int U 6; /* defined for unsigned 6-bits integer variable 无符号 6位整型变量 */ typedef signed int S 6; /* defined for signed 6-bits integer variable 有符号 6位整型变量 */ typedef unsigned long U3 ; /* defined for unsigned 3 -bits integer variable 无符号3 位整型变量 */ typedef signed long S3 ; /* defined for signed 3 -bits integer variable 有符号3 位整型变量 */ typedef float F3 ; /* single precision floating point variable (3 bits) 单精度浮点数 3 位长度 */ typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数 64位长度 */ // #define uchar unsigned char #define uint unsigned int #define Data_0_time 4 //----------------------------------------------// //----------------IO口定义区--------------------// //----------------------------------------------// sbit P _0 = P ^0 ; sbit P _ = P ^ ; sbit P _ = P ^ ; sbit P _3 = P ^3 ;

相关主题
文本预览
相关文档 最新文档