⑴ 用c语言做电路编程设计
本设计是在51单片机与PC机上实现基于RS232串行通讯功能的,制定和实现可靠的上下位机通讯协议,完成显示数据的下传和读取,图形和文字有静止、移入移出等多种显示方式是本设计的最大特点。
第二章 系统组成与工作原理2.1系统设计要求和技术指标
此次设计的系统将由五部分(主要分为上位机部分和下位机部分,其中下位机主要分成,显示信息存储器﹑LED显示屏行驱动电路和LED点阵显示屏)组成来实现,分别为:上位PC机﹑串行电平转换器﹑显示信息存储器﹑LED显示屏行驱动电路和LED点阵显示屏。控制系统的结构框图如图2.1所示。
设计要求系统能控制中文LED汉字显示,主控板采用以单片机为核心的单片机系统。MCS-51单片机具有扩展性强﹑功能强盛﹑价格较低等长处,因此,采用Atmel公司的AT89C52单片机。采用MAX232作为RS-232与TTL电平的转换器件。PC机发送到下位机的数据先由SBUF(数据缓冲区)接收,再存入EEPROM器件AT24C256中。
汉字点阵显示屏可分为屏体和控制器两部分。屏体的主要部分是LED点阵屏,还有行列驱动电路。LED点阵显示屏采用8*8LED显示模块拼接而成。控制电路负责有序地选通各行,选通每一行之前还要把该行该列的数据预备好,一旦该行选通,这一行上的LED发光器件就可以根据列数据进行显示。
从理论上讲,不论显示图形还是文字,只要控制这些组成图形或文字的各个点所在位置相应的LED器件发光,就可以得到想要的显示结果,这种同时控制各个发光点亮灭的方法称为静态驱动显示方式。16*16点阵共有256个发光二极管,显然单片机没有这么多的端口,假如采用锁存器来扩展端口,按8位的锁存器来计算,16*16的点阵需要256/8=32个锁存器。这个数字很大,因为这里仅仅是16*16的点阵,但是在实际应用中的显示屏往往要大的多,这样在锁存器上花的成本也就将是一个很大的数字。因此,在实际应用中的显示屏几乎都不采用静态驱动显示方式之中设计,而是采用另一种称为动态扫描的显示方式。
所谓动态扫描,简朴地说就是逐行轮流点亮,这样扫描驱动电路就可以实现多行同名列共用一套列驱动器。以本次设计的16*16点阵为例,把所有的同一行发光管的阳极连在一起,把所有同一列发光管的阴极连在一起(共阳极接法),先发送出对应第一行发光管亮灭的数据并锁存,然后选通第一行使其点亮一定的时间,然后熄灭;再发送出第二行的数据并锁存,然后选通第二行使其点亮一定的时间,然后熄灭;……第十六行之后又重新点亮第一行,这样反复轮回。当这样轮回的速度足够快时(每秒24次以上),由于人眼的视觉暂留现象,就能看到显示屏上稳定的图形。
采用串行传输方案,控制电路可以只用一根信号线,将列数据一位一位传往列驱动器,在硬件方面,这无疑是十分经济的。但是,串行传输过程较长,数据按顺序一位一位地输出给列驱动器,只有一行的各列数据都已传输到位之后,这一行的各列才能并行地进行显示。这样,对于一行的显示过程就可以分解成列数据准备(传输)和列数据显示两部分。对于串行传输方式来说,列数据准备时间可能相称长,在行扫描周期确定的情况下,留给行显示的时间就太少了,以至影响LED的亮度。
为解决串行传输中列数据准备与列数据显示的时间矛盾问题,可以采用重叠处理的方法,即在显示本行各列数据的同时,传送下一行的列数据。为达到重叠处理的目的,列数据的显示就需要具有锁存功能。经过上述的分析,可以归纳出列驱动器电路应具备的主要功能。对于列数据准备来说,它应能实现串入并出的移位功能;对于列数据显示来说,应具有并行锁存的功能。这样,本行已准备好的数据送入并行锁存器进行显示时,串并移位寄存器就可以准备下一行的列数据,而会不影响本行的显示。
⑵ 51单片机如何用C语言控制继电器
①继电器属于电扮返汪平控制类型的输出设备,单片机可以通过 IO 电平输出去控制继电器。但继电器的工作电流(线圈端)相对单片机来讲,比较大,多数都超出单片机限制电流总和,所以一般都需要通过驱动电路去控制继电器(如使用:NPN三极管、达厅仔林顿管(ULN2003)等)。
②世陵多数继电器的电压都高于单片机的电压,单片机的输出无法与 继电器的 电平逻辑匹配,这也需要驱动电路进行转换(如上述例子)
③继电器还有不同种类,如交流/直流继电器、固态继电器等,上面的描述,都是针对常用 的 直流继电器说明的。
⑶ C语言控制单片机的详细原理是怎样的
C语言源程序----->C编译器----->汇编代码----->汇编器----->机器代码
所谓的单片机C语言的意思是拿C语言来编写单片机程序,没有什么C语言控制单片机这回说法。具体过程是:C语言源程序通过特定的C编译器编译为针对某种单片机的汇编代码,再由汇编器将汇编代码汇编为单片机可执行的机器代码,然后下载到单片机的存储器运行。当前一般的集成开发环境(如Keil C)可以一次搞定生成机器代码。
需要补充一点的是,单片机也是一种计算机,不要以为只有在PC机上才可以用C语言编程,C语言可以用作为任何计算机的编程语言,当然包括单片机,但有一个条件就是,你必需要有针对某种架构的计算机的C编译器。目前来讲,C语言的编译器种类非常多,有用于各种单片机以及微处理器架构的编译器版本,所以可以用C来做为单片机的编程语言。不同的是,你用TC或者VC编译得到的是X86(如Intel,AMD)的目标代码,只能在PC机上运行,而如果用单片机C编译器(比如Keil C)编译的代码是单片机代码,只能在特定的单片机上运行。目前C/C++是最流行的单片机/微处理器编程语言。
⑷ C51单片机程序设计题,要求用C语言做,模拟交通灯控制单片机电路,答案要详细具体。
晚上随手写,也未调试,权当看看
程序有不严谨地方还得调试修改
#include<REGX51.H>
#defineSTATUS_1S 1
#defineSTATUS_2S 2
#defineSTATUS_3S 3
#defineSTATUS_4S 4
#defineSTATUS_5S 5
#defineSTATUS_15S 15
#defineSTATUS_28S 28
#defineSTATUS_29S 29
#defineSTATUS_30S 30
unsignedcharflag,status,status_temp=1,status_temp_;
sbitK1 = P0^0;
sbitK2 = P0^1;
sbitRLED = P0^2;
sbitYLED = P0^3;
sbitGLED = P0^4;
voidInit(void)
{
ET0=1;
TR0=1;
RLED=0; //亮
YLED=0;
GLED=0;
while(status_temp)
{
switch(status)
{
caseSTATUS_1S: //1S
{
RLED=1; //灭,闪一次
YLED=1;
GLED=1;
} break;
caseSTATUS_2S: //1S
{
RLED=0; //亮,闪一次
YLED=0;
GLED=0;
} break;
caseSTATUS_3S: //1S
{
RLED=1; //灭
YLED=1;
GLED=1;
status_temp=0;
} break;
}
}
status_temp=1;
ET0=0;
TR0=0;
}
voidInit_Timer0(void)
{
TMOD=0x01;
// ET0=1;
// TR0=1;
EA=1;
TH0=0X3C;
TL0=0XB0; //未计算,偷楼上的
}
voidM_Start(void)
{
TH0=0X3C;
TL0=0XB0;
ET0=1;
TR0=1;
RLED=0; //红亮
while(status_temp)
{
switch(status)
{
caseSTATUS_1S:
{
if(status_temp_==1)
{
YLED=0;
}
} break;
caseSTATUS_2S:
{
if(status_temp_==1)
{
YLED=1;
}
} break;
caseSTATUS_3S:
{
if(status_temp_==1)
{
YLED=0;
status_temp_=0;
}
} break;
caseSTATUS_15S: //15S灭,绿亮
{
RLED=1;
GLED=0;
} break;
caseSTATUS_28S:
{
GLED=1;
} break;
caseSTATUS_29S:
{
GLED=0;
} break;
caseSTATUS_30S:
{
GLED=1;
status=0;
status_temp_=1;
} break;
}
}
ET0=0;
TR0=0;
status=0;
status_temp=1;
YLED=1;
}
voidM_End(void)
{
TH0=0X3C;
TL0=0XB0;
ET0=1;
TR0=1;
RLED=0; //亮1次
YLED=0;
GLED=0;
while(status_temp)
{
switch(status)
{
caseSTATUS_1S: //1S
{
RLED=1; //灭一次
YLED=1;
GLED=1;
} break;
caseSTATUS_2S: //1S
{
RLED=0; //亮二次
YLED=0;
GLED=0;
} break;
caseSTATUS_3S: //1S
{
RLED=1; ////灭二次
YLED=1;
GLED=1;
} break;
caseSTATUS_4S: //1S
{
RLED=0; ////亮三次
YLED=0;
GLED=0;
} break;
caseSTATUS_5S: //1S
{
RLED=1; ////灭三次
YLED=1;
GLED=1;
status_temp=0;
} break;
}
}
status_temp=1;
ET0=0;
TR0=0;
}
main()
{
Init();//单片机初始化
Init_Timer0();//定时器初始化
while(1)
{
if(K1==0)
M_Start();//模拟开始
if(K2==0)
M_End();//模拟结束
}
}
voidinterrupt_time0()interrupt1 //核对头文件,一致就好
{
TH0=0X3C;
TL0=0XB0;
flag++;
if(flag==20)
{
status++;
flag=0;
}
}
⑸ 51单片机中如何用c语言控制直流电机正反转
#include"reg52.h"
#include"intrins.h"
#define unint unsigned int
#define unchar unsigned char
#define PLAY_OUT P1
unchar sec=0;
unchar min=0;
unchar count=0;
bit gj=0; //光和遥控的切换
unchar r6,r7;
bit time0=1;
bit time1=1;
sbit PLAY_Q_Q=P3^0;
sbit PLAY_Z=P3^1;
sbit PLAY_Y=P3^4;
sbit PLAY_QH=P3^5;
sbit PLAY_Q_H=P3^6;
sbit PLAY_T=P3^7;
unchar r0,r1,r2=0x00,r3=0x00,r4=0x00,r5=0x00;
unchar code TAB_Q[4]={0xf9,0xf5,0xf6,0xfa};//前进
unchar code TAB_H[4]={0xfa,0xf6,0xf5,0xf9};//后退
unchar code TAB_Y[4]={0x9f,0x5f,0x6f,0xaf};//右转
unchar code TAB_Z[4]={0xaf,0x6f,0x5f,0x9f};//左转
/*************************/
void intiaton(void);
void int_time3(void);
void int_time0(void);
void fanzhuan_Y(void);
void fanzhuan_Z(void);
void zhenzhuan_Q(void);
void zhenzhuan_H(void);
void zhenzhuan_AQ(void);
void zhenzhuan_AH(void);
void cankey(void);
/*************************/
delay(unint t) //0.6ms
{unint i;
for(i=55;i>t;i--) ;
}
/**************************/
delayms(unint k) //k=1延迟0.884毫秒
{unint i;
for(i=80;i>k;i--)
;
}
/*************************/
void delay238(void) //2.38ms
{
unint i,j;
for(j=125;j>0;j--)
for(i=0;i<1;i++);
}
/************************/
void intiaton(void) //初始化
{
TMOD=0x11;
TH1=0XFA;
TL1=0X56;
ET1=1;
TR1=1;
EA=1;
}
/*********************/
void int_time3() interrupt 3 using 3
{
TH1=0XFA;
TL1=0X56;
sec++;
if(sec==2)
{
sec=0;
min++;
}
}
/*************************/ //光感与按键控制
void cankey()
{
if(gj)
{
if(!PLAY_Q_Q)
{
count=1;
}
if(!PLAY_T)
{
count=2;
}
if(!PLAY_Q_H)
{
count=3;
}
}
if((PLAY_Z==0)||(PLAY_Y==0))
{
delayms(1);
if(PLAY_Z==0)
{
fanzhuan_Z();count=1;
}
else
{
fanzhuan_Y();count=1;
}
}
if(PLAY_QH==0)
{
delayms(10);
if(PLAY_QH==0)
{
count++;
if(count==4)
{
count=0;
}
}
while(PLAY_QH==0);
}
switch(count)
{
case 0: PLAY_OUT=0xff;break;
case 1: zhenzhuan_AQ();break;
case 2: PLAY_OUT=0xff;break;
case 3: zhenzhuan_AH();break;
default :break;
}
}
/*******************************/ //按键前进
void zhenzhuan_AQ(void)
{
for(r6=0;r6<4;r6++)
{
PLAY_OUT=TAB_Q[r6];
while(sec==0);
sec=0;
}
}
/*******************/ //按键后退
void zhenzhuan_AH(void)
{
for(r6=0;r6<4;r6++)
{
PLAY_OUT=TAB_H[r6];
while(sec==0);
sec=0;
}
}
/**********************/ //左转
void fanzhuan_Z(void)
{
unchar i;
for(i=0;i<22;i++)
{
for(r7=0;r7<4;r7++)
{
PLAY_OUT=TAB_Z[r7];
while(sec==0);
sec=0;
}
}
cankey();
}
/**********************/ //右转
void fanzhuan_Y(void)
{
unchar i;
for(i=0;i<22;i++)
{
for(r7=0;r7<4;r7++)
{
PLAY_OUT=TAB_Y[r7];
while(sec==0);
sec=0;
}
}
cankey();
}
/***************************/
void main()
{
intiaton();
while(1)
{
cankey();
}
这是加了感光跟按键控制的智能小车,是读大一时候写的,现在看起来呵呵。。。垃圾代码一大堆,不过好象还可以用。