c51步进电机如何接单片机高低电平范围,如何写断码

怎样用驱动器控制步进电机正反转接线图_百度知道
怎样用驱动器控制步进电机正反转接线图
我有更好的答案
首先步进电机驱动器是不能控制步进电机正反转的(有一种带自检的可以),但一般发送的是模拟量讯号,控制步进电机正反转的主要是控制器的高低电平。
采纳率:77%
hiphotos.baidu.com/zhidao/wh%3D600%2C800/sign=c2fdff41bd5ad6eddc4d68bcf5f3bdbb6fd://h.baidu,速度可以通过电位器来调://h.jpg" esrc="http.com/zhidao/pic/item/0ff41bd5ad6eddc4d68bcf5f3bdbb6fd.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http。<a href="http://h.hiphotos,可以参考下面的接线图,改变方向信号即可如果只是控制步进电机正反转.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=ba99a8abd5ad6eddc4d68bcf5f3bdbb6fd
为您推荐:
其他类似问题
您可能关注的内容
步进电机的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。单片机怎么发脉冲给步进电机驱动_百度知道
单片机怎么发脉冲给步进电机驱动
  脉冲其实就是高低电平的组合。  任意一个IO口都可以实现。给某一引脚写1,输出高电平,写0则输出低电平。  单片机,全称单片微型计算机(英语:Single-Chip Microcomputer),又称微控制器(Microcontroller),是把中央处理器、存储器、定时/计数器(Timer/Counter)、各种输入输出接口等都集成在一块集成电路芯片上的微型计算机。与应用在个人电脑中的通用型微处理器相比,它更强调自供应(不用外接硬件)和节约成本。它的最大优点是体积小,可放在仪表内部,但存储量小,输入输出接口简单,功能较低。由于其发展非常迅速,旧的单片机的定义已不能满足,所以在很多应用场合被称为范围更广的微控制器;由于单芯片微电脑常用于当控制器故又名single chip microcontroller,但是目前在中国大陆仍多沿用“单片机”的称呼。
采纳率:90%
来自团队:
脉冲其实就是高低电平的组合。任意一个IO口都可以实现。给某一引脚写1,输出高电平,写0则输出低电平。
能说具体些吗,我试了不行~#include&reg52.h&sbit led1=P1^0;void main(){ led1=1; led1=0; }
led1=1; 和 led1=0; 之间要加延时,否则高电平只会持续一条指令的时间(通常小于1us),根本没有效果。
可以了,谢谢
本回答被提问者采纳
你写的什么程序啊 连循环都没有 主函数中加死循环 while(1)啊
为您推荐:
其他类似问题
您可能关注的内容
步进电机驱动的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。步进电机如何接线,高手请进。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。_百度知道
步进电机如何接线,高手请进。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
PLC如何控制,ENA-,SW8,SW7,SW6,SW5,SW4,SW3,SW2,SW1,GND,VDC,A+,B-分别代表什么意思?如何接线,PUL-,DIR+步进电机驱动器上有PUL+ ,DIR-,ENA+,A-,B+
我有更好的答案
SW4设置全流和半流没什么作用,SW5-SW8设置细分,ENA+,ENA-接使能信号又称脱机信号或断电信号。PUL+PUL-这两个是接脉冲信号的,DIR+,那是设置电流和细分的,一般SW1-SW3是来调节电流的比如你用的控制器为PLC。A+,A-,Y2是使能信号,Y1是方向信号,Y0是脉冲信号,,GND,VDC这两个是驱动器电源的供电口,DIR-接方向信号。至于SW1---SW8,B+,B-是接步进电机的电机线。意思就是说Y0接PUL-,Y1接DIR-,Y2接ENA-,然后+24V串接一个2000欧姆的电阻后接入PUL+DIR+ENA+
我看到别人接线如下图,我不明白什么意思,请高手解答,多谢。PUL+ 接+24V,,PUL-接Y0,DIR+接+24V,,DIR-接Y1,ENA+,ENA-,SW8,SW7,SW6,SW5,SW4,SW3,SW2,SW1这几个没接线,GND接V-,VDC接+24V,A+接红色线,A-接蓝色线,B+接绿色线,B-接黑色线PUL-只能接Y0?DIR-只能接Y1?
PUL+ 接+24V,,DIR+接+24V,是因为+24V串联了一个2K电阻,本来这两个脚位是接+5V电的。,PUL-接Y0,DIR-接Y1这个是因为程序里面把Y0设置成脉冲输出口,Y1设置成方向输出口ENA+,ENA-这个是使能信号,一般不需要这个而功能,所以不用接SW8,SW7,SW6,SW5,SW4,SW3,SW2,SW1这几个是拨码开关,只是负责设置电流和细分的,当然不用接线A+A-B+B-这个电机上面的电机线接口,至于颜色要看电机了,不同的厂家不同的颜色
高手你好,还有疑问
第一,A+接红色线,A-接蓝色线,B+接绿色线,B-接黑色线
可不可以换成B+接红色线,B-接蓝色线,A+接绿色线,A-接黑色线
也就是A相和B相的线换一下,如果可以换会有什么后果?PLC程序要不要改?第二,A+接红色线,A-接蓝色线,可不可以换成A+接蓝色线,A-接红色线?如果可以换会有什么后果?PLC程序要不要改?
可以调换,换了后电机运行方向会反掉A、B两相互相调换和A相里面正负调换的结果都是一样的即电机运行方向反掉
那电机反转我怎么知道是A相里面正负反了还是A、B两相反了? PUL+ 接+24V,,DIR+接+24V,是因为+24V串联了一个2K电阻,本来这两个脚位是接+5V电的。2K电阻在哪?为什么又是+5V?
①那电机反转我怎么知道是A相里面正负反了还是A、B两相反了?
这问题无法回答,因为步进电机有A、B相,但相序没有固定死②PUL+ 接+24V,,DIR+接+24V,是因为+24V串联了一个2K电阻,本来这两个脚位是接+5V电的。2K电阻在哪?为什么又是+5V?
2K电阻需要用户自己去购买,为什么要接+5V,因为步进电机驱动器脉冲和方向信号需要5V信号。你问的这些问题没有办法回答了
采纳率:56%
嗯 。这度娘都不可以留下联系方式的。要不然你qq我。
看说明书啊
为您推荐:
其他类似问题
您可能关注的内容
步进电机的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。怎样用51单片机接两相步进电机驱动器来控制步进电机?_百度知道
怎样用51单片机接两相步进电机驱动器来控制步进电机?
AT89S52的单片机,步进电机驱动器需要一个脉冲信号来驱动电机运转,还需要一个方向信号来控制方向。刚接触硬件,想做一个小东西来玩的。请各位大仙帮帮忙,能有带注释的源码最好。
我有更好的答案
}}void main(){ while(1) {
P10=0你说的是步进电机是2相步进的电机吗?脉冲信号就是像流水灯差不多的;P11=0;y&124;y++):#include &reg52.h&quot,P11制高电平延时一段时间后然后P10制高电平 P11制低电平如此循环 看程序;
delay(1000);void delay(unsigned int x){ for(;x&P11=1;sbit P11=P1^1;x--) {
for(y=0;sbit P10=P1^0,用两个口例如:用到P1^0和P1^1先把P10制低电平;
delay(1000)
两相四线,有另外配了一个专用的驱动器,卖的人说只要接入单片机的5V,以及一个脉冲信号来驱动电机运转,一个方向信号来控制方向,就可以了。
两相四线程序
接P1口 #include &reg52.h&#define uint unsigned int#define uchar unsigned charuchar code tab[]={0xfd,0xfb,0xf7,0xef};void delay(uint x){ for(;x&0;x--) {
for(y=0;y&124;y++);
void main(){ while(1) {
P1=tab[i];
delay(20); }}
很感谢了,另外就是不知道那个方向信号,是什么东西来着?
方向信号 dir
是用高低电平来控制步进电机的方向的
采纳率:23%
哇,大神啊!!
大神都是从菜鸟出来的吧。或者说你有爱因斯坦的智商,那我甘拜下风。
为您推荐:
其他类似问题
您可能关注的内容
步进电机驱动器的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。当前位置: >>
记住这23个程序单片机就入门了
1、/*点阵扫描原理是先输出行字模码,再列扫描点阵*/ /*程序功能点阵循环显示 1~9 数字*/ #include&reg51.h& #define uchar unsigned char #define uint unsigned int sbit we=P2^7; sbit du=P2^6; uchar rowtab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar coltab[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; uchar zhong[]={0x10,0xFE,0x92,0x92,0xFE,0x92,0x10,0x10}; uchar ling[]={0x18,0x24,0x24,0x24,0x24,0x24,0x24,0x18}; uchar yi[]={0x8,0x18,0x28,0x8,0x8,0x8,0x8,0x8}; uchar er[]={0x30,0x48,0x48,0x8,0x10,0x20,0x78,0x0}; uchar san[]={0x30,0x48,0x8,0x10,0x30,0x8,0x48,0x30}; uchar si[]={0x24,0x24,0x24,0x24,0x3F,0x4,0x4,0x4}; uchar wu[]={0x3C,0x20,0x20,0x3C,0x4,0x4,0x3C,0x0}; uchar liu[]={0x1C,0x20,0x20,0x20,0x3C,0x24,0x24,0x18}; uchar qi[]={0x7C,0x4,0x8,0x10,0x10,0x10,0x10,0x10}; uchar ba[]={0x18,0x24,0x24,0x18,0x18,0x24,0x24,0x18}; uchar jiu[]={0x18,0x24,0x24,0x1C,0x4,0x8,0x10,0x0}; #define aport P1 #define kport P0 void delay(uint x) { for(;x&0;x--) for(y=100;y&0;y--); } void main() { uchar i,j; we=0; du=0;//关闭数码管 while(1) { for(i=0;i&8;i++)//列扫描 { aport=coltab[i]; kport=0; delay(1000); } for(j=0;j&200;j++) { for(i=0;i&8;i++)-1- { kport=rowtab[i]; aport=yi[i]; delay(10); } } for(j=0;j&200;j++) { for(i=0;i&8;i++) { kport=rowtab[i]; aport=er[i]; delay(10); } } for(j=0;j&200;j++) { for(i=0;i&8;i++) { kport=rowtab[i]; aport=san[i]; delay(10); } } for(j=0;j&200;j++) { for(i=0;i&8;i++) { kport=rowtab[i]; aport=si[i]; delay(10); } } for(j=0;j&200;j++) { for(i=0;i&8;i++) { kport=rowtab[i]; aport=wu[i]; delay(10); } } for(j=0;j&200;j++) {-2- for(i=0;i&8;i++) { kport=rowtab[i]; aport=liu[i]; delay(10); } } for(j=0;j&200;j++) { for(i=0;i&8;i++) { kport=rowtab[i]; aport=qi[i]; delay(10); } } for(j=0;j&200;j++) { for(i=0;i&8;i++) { kport=rowtab[i]; aport=ba[i]; delay(10); } } for(j=0;j&200;j++) { for(i=0;i&8;i++) { kport=rowtab[i]; aport=jiu[i]; delay(10); } } } } 2、/************************************************** 24C02.C 功能描述: PC 端发送 3 个数据 n0,n1,n2. n0=0,写,将 n1 写入 n2 地址中 n0=1,读,读出 n1 地址中的数据,n2 不起作用,但必须有 收到一个字节后,将其地址值显示在数码管第 1、2 位上,数值显示在第 5、6 位上 读出一个字节后,将其地址值显示在数码管第 1、2 位上,读出的值显示在第 5、6 位上-3- ;**************************************************/ #define uchar unsigned char #define uint unsigned int #define Slaw 0x0a; //写命令字 #define Slar 0xa1; //读命令字 #include &reg52.h& #include &intrins.h& sbit Scl=P2^1; //串行时钟 sbit Sda=P2^0; //串行数据 bit R //接收到数据的标志 uchar RecBuf[3]; //接收缓冲区 #define Hidden 0x10; //消隐字符在字形码表中的位置 sbit we=P2^7; sbit du=P2^6; uchar code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; uchar code disptab[]={0x3f,0x6,0x5b,0x4f,0x66, 0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x0}; uchar DispBuf[6]; uchar code TH0Val=()/256; uchar code TL0Val=()%256; uchar code th1=0 uchar code tl1=0 //以下是中断程序,用于显示 void timer0() interrupt 1 { P0|=0x3f; we=1; tmp=dispbit[count]; P0&= we=0; du=1; tmp=DispBuf[count]; tmp=disptab[tmp]; P0= du=0; count++; if(count==6) count=0; TH0=TH0V TL0=TL0V-4- } /*发送起始条件*/ void Start(void) /*起始条件*/ { Sda=1; Scl=1; _nop_ (); _nop_ (); _nop_ (); _nop_ (); Sda=0; _nop_ (); _nop_ (); _nop_ (); _nop_ (); } void Stop(void) /*停止条件*/ { Sda=0; Scl=1; _nop_ (); _nop_ (); _nop_ (); _nop_ (); Sda=1; _nop_ (); _nop_ (); _nop_ (); _nop_ (); } void Ack(void) /*应答位*/ { Sda=0; _nop_ (); _nop_ (); _nop_ (); _nop_ (); Scl=1; _nop_ (); _nop_ (); _nop_ (); _nop_ (); Scl=0; }-5- void {NoAck(void) Sda=1; _nop_ (); _nop_ (); _nop_ (); _nop_ (); Scl=1; _nop_ (); _nop_ (); _nop_ (); _nop_ (); Scl=0;/*反向应答位*/} void Send(uchar Data) /*发送数据子程序,Data 为要求发送的数据*/ { uchar BitCounter=8; /*位数控制*/ /*中间变量控制*/ do { temp=D Scl=0; _nop_ (); _nop_ (); _nop_ (); _nop_ (); if((temp&0x80)==0x80)/* 如果最高位是 1*/ Sda=1; else Sda=0; Scl=1; temp=Data&&1; /*RLC*/ Data= BitCounter--; }while(BitCounter); Scl=0; } uchar Read(void) /*读一个字节的数据,并返回该字节值*/ { uchar temp=0; uchar temp1=0; uchar BitCounter=8; Sda=1; do{-6- Scl=0; _nop_ (); _nop_ (); _nop_ (); _nop_ (); Scl=1; _nop_ (); _nop_ (); _nop_ (); _nop_ (); if(Sda) /*如果 Sda=1;*/ temp=temp|0x01; /*temp 的最低位置 1*/ else temp=temp&0 /*否则 temp 的最低位清 0*/ if(BitCounter-1) { temp1=temp&&1; temp=temp1; } BitCounter--; }while(BitCounter); return(temp); } void WrToROM(uchar Data[],uchar Address,uchar Num) { uchar i=0; uchar *PD PData=D Start(); Send(0xa0); Ack(); Send(Address); Ack(); for(i=0;i&Ni++) { Send(*(PData+i)); Ack(); } Stop(); } void RdFromROM(uchar Data[],uchar Address,uchar Num) { uchar i=0; uchar *PD PData=D-7- for(i=0;i&Ni++) { Start(); Send(0xa0); Ack(); Send(Address+i); Ack(); Start(); Send(0xa1); Ack(); *(PData+i)=Read(); Scl=0; NoAck(); Stop(); } } void Recive() interrupt 4 //串行中断程序 { static uchar Count=0; if(TI) { TI=0; //如果是发送中断,直接退出 } RI=0; //清 RI 标志 RecBuf[Count]=SBUF; Count++; Rec=0; if(Count&=3) { Count=0; Rec=1; //置位标志 } } void Init() { TMOD=0x21; RI=0; TH1=0 TL1=0 PCON|=0x80; TR1=1; SCON=0x50; TH0=TH0V TL0=TL0V ET0=1;//开 T0 中断-8- EA=1; ES=1; TR0=1; TR1=1;//开总中断 //T0 开始运行} void Calc(uchar Dat1,uchar Dat2) //第一个参数放在第 1、2 位,第二个参数放入第 5、6 位 { DispBuf[0]=Dat1/16; DispBuf[1]=Dat1%16; DispBuf[4]=Dat2/16; DispBuf[5]=Dat2%16; } void main() { uchar RomDat[4]; Init(); //初始化 DispBuf[2]=H DispBuf[3]=H for(;;) { Calc(RecBuf[1],RomDat[0]); //分别显示地址和数据 if(Rec) //接收到数据 { Rec=0; //清除标志 if(RecBuf[0]==0) //第一种功能,写入 { RomDat[0]=RecBuf[2]; WrToROM(RomDat,RecBuf[1],1); SBUF=RomDat[0]; } else { RdFromROM(RomDat,RecBuf[1],1); SBUF=RomDat[0]; } } } } 3、/*程序功能:向 0x03 地址写入 0xAA(170),然后读取显示 接线顺序 P3.3--------CS P3.4--------CLK P3.5--------DI P3.6--------DO */ /*********************************包含头文件******************************/ #include &reg51.h&-9- #include &intrins.h& /*********************************数据定义********************************/ #define OP_EWEN_H 0x00 // 00 write enable #define OP_EWEN_L 0x60 // 11X XXXX write enable #define OP_EWDS_H 0x00 // 00 disable #define OP_EWDS_L 0x00 // 00X XXXX disable #define OP_WRITE_H 0x40 // 01 A6-A0 write data #define OP_READ_H 0x80 // 10 A6-A0 read data #define OP_ERASE_H 0xc0// 11 A6-A0 erase a word #define OP_ERAL_H 0x00 // 00 erase all #define OP_ERAL_L 0x40 // 10X XXXX erase all #define OP_WRAL_H 0x00 // 00 write all #define OP_WRAL_L 0x20 // 01X XXXX write all /*********************************端口定义**********************************/ sbit CS = P3^3; sbit SK = P3^4; sbit DI = P3^5; sbit DO = P3^6; sbit we=P2^7; sbit du=P2^6; code unsigned char disptab[]={0x3f,0x6,0x5b,0x4f,0x66, 0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x0}; code unsigned char dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; unsigned int dispbuf[6]; /********************************定义全局变量*******************************/ un //从 93C46 读出的数据 /**************************************************************************** 函数功能:读写延时子程序 入口参数:ms 出口参数: ****************************************************************************/ void delayms(unsigned char ms) { while(ms--) { for(i = 0; i & 120; i++); } } /**************************************************************************** 函数功能:数码管显示子程序 入口参数: 出口参数:- 10 - ****************************************************************************/ void display() { static unsigned char count=0; P0=0x80; we=1; tmp=dispbit[count]; P0=P0| we=0; P0=disptab[16]; du=1; tmp=dispbuf[count]; tmp=disptab[tmp]; P0= du=0; count++; if(count==6) { count=0; } } /**************************************************************************** 函数功能:写入指令和地址子程序 入口参数:op_h,op_l 出口参数: ****************************************************************************/ void inop(unsigned char op_h, unsigned char op_l) { SK = 0; // 开始位 DI = 1; CS = 1; _nop_(); _nop_(); SK = 1; _nop_(); _nop_(); SK = 0; // 开始位结束 DI = (bit)(op_h & 0x80); // 移入指令码高位 SK = 1; op_h &&= 1; SK = 0; DI = (bit)(op_h & 0x80); // 移入指令码低位- 11 - SK = 1; _nop_(); _nop_(); SK = 0; op_l &&= 1; // 移入余下的指令码或地址数据 for(i = 0; i & 7; i++) { DI = (bit)(op_l & 0x80);// 先移入高位 SK = 1; op_l &&= 1; SK = 0; } DI = 1; } /**************************************************************************** 函数功能:写入数据子程序 入口参数:indata 出口参数: ****************************************************************************/ void shin(unsigned char indata) { for(i = 0; i & 8; i++) { DI = (bit)(indata & 0x80); // 先移入高位 SK = 1; indata &&= 1; SK = 0; } DI = 1; } /**************************************************************************** 函数功能:写入数据使能子程序 入口参数: 出口参数: ****************************************************************************/ void ewen() { inop(OP_EWEN_H, OP_EWEN_L); CS= 0; } /**************************************************************************** 函数功能:写入数据禁止子程序- 12 - 入口参数: 出口参数: ****************************************************************************/ void ewds() { inop(OP_EWDS_H, OP_EWDS_L); CS= 0; } /**************************************************************************** 函数功能:数据清除子程序 入口参数: 出口参数: ****************************************************************************/ void erase() { inop(OP_ERAL_H, OP_ERAL_L); delayms(30); CS = 0; } /**************************************************************************** 函数功能:写入数据子程序 入口参数:addr,indata 出口参数: ****************************************************************************/ void write(unsigned char addr, unsigned char indata) { inop(OP_WRITE_H, addr); //写入指令和地址 shin(indata); //写入数据 CS = 0; delayms(10); } /*************************************************************************** 函数功能:读出数据子程序 入口参数: 出口参数:outdata ****************************************************************************/ unsigned char shout(void) { unsigned char i, out_ for(i = 0; i & 8; i++) { SK = 1; out_data &&= 1; SK = 0;- 13 - out_data |= (unsigned char)DO; } return(out_data); } /**************************************************************************** 函数功能:读出某地址数据子程序 入口参数:addr 出口参数:out_data ****************************************************************************/ unsigned char read(unsigned char addr) { unsigned char out_ inop(OP_READ_H, addr); out_data = shout(); CS = 0; return out_ } /**************************************************************************** 函数功能:主程序 入口参数: 出口参数: ****************************************************************************/ void main(void) { CS = 0; //初始化端口 SK = 0; DI = 1; DO = 1; ewen(); //使能写入操作 erase(); //擦除全部内容 write(0x08, 0x55); //向 0x02 地址写入 0x55(85) write(0x09, 0xAA); //向 0x03 地址写入 0xAA(170) while(1) { readdata=read(0x09); //读取其中一个地址内数据验证 dispbuf[0]=readdata/1000; dispbuf[1]=readdata/100; dispbuf[2]=readdata%100/10; dispbuf[3]=readdata%100%10; display(); } //显示数据- 14 - } 4、/*============================================================ 使用 1602 液晶显示 PS/2 键盘输入的字符 =============================================================*/ #include &reg51.h& #include &scancodes.h& #define uchar unsigned char #define uint unsigned int #define lcd_Data P0 sbit du=P2^6; sbit we=P2^7; sbit rs=P3^5;//H 数据,L 命令 sbit lcden=P3^4;//高脉冲使能,使能脉宽最小 150ns sbit Key_Data=P3^2 ;//定义 Keyboard 引脚 sbit Key_CLK=P3^3; unsigned char code ceshi[] = {& Keyboard Test &}; unsigned char code shuzi[] = {&
&}; unsigned char code cls[] = {& &}; static unsigned char IntNum = 0; //中断次数计数 static unsigned char KeyV; //键值 static unsigned char DisNum = 0; //显示用指针 static unsigned char Key_UP=0, Shift = 0;//Key_UP 是键松开标识,Shift 是 Shift 键按下标识 static unsigned char BF = 0; //标识是否有字符被收到 void delay(uchar x) { for(;x&0;x--) { for(y=100;y&0;y--) {}; } } void lcdwrdata(uchar dat) { rs=1;//写数据时 RS 拉高 lcden=1; lcd_Data= delay(6); lcden=0; delay(6); } void lcdwrcom(uchar cdat)//写指令数据到 LCD { rs=0;//写指令时 RS 拉低 lcden=1; lcd_Data=//- 15 - delay(6);//不加此延时将导致不能写入指令,但能写入显示数据 lcden=0; delay(6); } void lcd_init() { lcdwrcom(0x38);//0x38 设置显示模式为:16X2 显示,5X7 点阵,8 位数据接口 lcdwrcom(0x0c);//打开显示光标闪烁 lcdwrcom(0x06);// lcdwrcom(0x01);// } //按指定位置显示一个字符 void DisplayOneChar(uchar X, uchar Y, uchar DData) { Y &= 0x1; X &= 0xF; //限制 X 不能大于 15,Y 不能大于 1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40; X |= 0x80; //算出指令码 lcdwrcom(X); //发命令字 lcdwrdata(DData); //发数据 } //按指定位置显示一串字符 void DisplayListChar(uchar X, uchar Y, uchar code *DData) { uchar ListL ListLength = 0; Y &= 0x1; X &= 0xF; //限制 X 不能大于 15,Y 不能大于 1 while (DData[ListLength]&0x19) //若到达字串尾则退出 { if (X &= 0xF) //X 坐标应小于 0xF { DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符 ListLength++; X++; } } } void Keyboard_out(void) interrupt 2 { if ((IntNum & 0) && (IntNum & 9))- 16 - { KeyV = KeyV && 1; //因键盘数据是低&&高,结合上一句所以右移一位 if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为 1 时为 1 到最高位 } IntNum++; while (!Key_CLK); //等待 PS/2CLK 拉高 if (IntNum & 10) { IntNum = 0; //当中断 11 次后表示一帧数据收完,清变量准备下一次接收 BF = 1; //标识有字符输入完了 EA = 0; //关中断等显示完后再开中断 (注:如这里不用 BF 和关中断直接调 Decode()则所 Decode 中所调用的所有函数要声明为再入函数) } } void Decode(uchar ScanCode) //注意:如 SHIFT+G 为 12H 34H F0H 34H F0H 12H,也就是说 shift 的通码+G 的通码+shift 的断码+G 的断码 { unsigned char TempC if (!Key_UP) //当键盘松开时 { switch (ScanCode) { case 0xF0 : // 当收到 0xF0,Key_UP 置 1 表示断码开始 Key_UP = 1; case 0x12 : // 左 SHIFT Shift = 1; case 0x59 : // 右 SHIFT Shift = 1; default: if (DisNum & 15) { DisplayListChar(0, 1, cls);//清 LCD 第二行 DisNum = 0; } if(!Shift) //如果 SHIFT 没按下- 17 - { for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc&59); TempCyc++); //查表显示 if (UnShifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, UnShifted[TempCyc][1]); DisNum++; } else //按下 SHIFT { for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc&59); TempCyc++); //查表显示 if (Shifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, Shifted[TempCyc][1]); DisNum++; } } } else { Key_UP = 0; switch (ScanCode) //当键松开时不处理判码,如 G 34H F0H 34H 那么第二个 34H 不会被处理 { case 0x12 : // 左 SHIFT Shift = 0; case 0x59 : // 右 SHIFT Shift = 0; } } BF = 0; //标识字符处理完了 } void main() { du=0; we=0;//关闭数码管 lcd_init(); //LCM 初始 DisplayListChar(0, 0, ceshi); DisplayListChar(0, 1, shuzi);- 18 - delay(250); delay(250); delay(250);//延时 DisplayListChar(0, 1, cls); IT1 = 0; //设外部中断 1 为低电平触发 EA = 1; EX1 = 1; //开中断 do { if (BF) Decode(KeyV); else EA = 1; //开中断 } while(1); } 5、/*程序功能调节 W3 电位器 ADC0804 模数转换后的数字量会显示在数码管上*/ #include &reg51.h& #define uchar unsigned char #define uint unsigned int sbit wr=P3^6; sbit rd=P3^7; sbit we=P2^7; sbit du=P2^6; sbit dio=P2^5; uchar code th0=()/256; uchar code tl0=()%256; uchar dispbuf[6]; uchar code disptab[]={0x3f,0x6,0x5b,0x4f,0x66, 0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x0}; uchar code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; void delay( uint x) { for(;x&0;x--) for(y=100;y&0;y--); } void Init_timer0() { TMOD=0x01;- 19 - TH0=th0; TL0=tl0; EA=1; ET0=1; TR0=1; } void timer0() interrupt 1 { P0|=0x3f; we=1; tmp=dispbit[count]; P0&= we=0; du=1; tmp=dispbuf[count]; tmp=disptab[tmp]; P0= du=0; count++; if(count==6) { count=0; } TH0=th0; TL0=tl0; dispbuf[0]=a/100; dispbuf[1]=a%100/10; dispbuf[2]=a%100%10; } void main() { Init_timer0(); dispbuf[5]=16; dispbuf[4]=16; dispbuf[3]=16;//关闭数码管 dio=1; we=1; P0&=0x7f; we=0; while(1) { wr=0;- 20 - delay(1); wr=1; delay(20); rd=0; delay(1); rd=1; a=P1; delay(200); } } 6、/*D15 发光二极管做亮暗显示,指示 DAC0832 将数字量转换为模拟量的结果*/ #include &reg52.h& #define uchar unsigned char #define uint unsigned int sbit we=P2^7; sbit du=P2^6; sbit csda=P3^2; sbit wr=P3^6; void delay(uchar x) { for(;x&0;x--) for(y=500;y&0;y--); } void main() { we=0; du=0; csda=0; while(1) { wr=0; P0=0x0; wr=1; delay(200); wr=0; P0=0x38; wr=1; delay(200); wr=0; P0=0x82; wr=1; delay(200); wr=0; P0=0- 21 - wr=1; delay(200); } } 7、//程序功能:通过 DS18B20 测试当前环境温度, 并通过数码管显示当前温度值 #include &reg52.h& #include&intrins.h& #include &math.H& //要用到取绝对值函数 abs() #define uchar unsigned char #define uint unsigned int sbit we=P2^7;//数码管位选 sbit du=P2^6; //数码管段选 sbit dio=P2^5; sbit ds=P2^2; int tempValue1; uchar code th0=()/256; uchar code tl0=()%256; uchar dispbuf[6]; uchar code disptab[]={0x3f,0x6,0x5b,0x4f,0x66, 0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x0}; uchar code disptabwithdot[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0xa7,0xff,0xef,0xf7, 0xfc,0xb9,0xf9,0xf1}; uchar code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //延时函数, 对于 11.0592MHz 时钟, 例 i=10,则大概延时 10ms. void delay(unsigned int i) { while(i--) { for(j = 0; j & 125; j++); } } void dsInit() { //对于 11.0592MHz 时钟, unsigned int 型的 i, 作一个 i++操作的时间大于? ds = 0; i = 100; //拉低约 800us, 符合协议要求的 480us 以上 while(i&0) i--; ds = 1; //产生一个上升沿, 进入等待应答状态 i = 4; while(i&0) i--;- 22 - } void dsWait() { while(ds); while(~ds); //检测到应答脉冲 i = 4; while(i & 0) i--; } //向 DS18B20 读取一位数据 //读一位, 让 DS18B20 一小周期低电平, 然后两小周期高电平, //之后 DS18B20 则会输出持续一段时间的一位数据 bit readBit() { ds = 0; i++; //延时约 8us, 符合协议要求至少保持 1us ds = 1; i++; i++; //延时约 16us, 符合协议要求的至少延时 15us 以上 b = i = 8; while(i&0) i--; //延时约 64us, 符合读时隙不低于 60us 要求 } //读取一字节数据, 通过调用 readBit()来实现 unsigned char readByte() { unsigned char j, dat = 0; for(i=0; i&8; i++) { j = readBit(); //最先读出的是最低位数据 dat = (j && 7) | (dat && 1); } } //向 DS18B20 写入一字节数据 void writeByte(unsigned char dat) {- 23 -
for(j = 0; j & 8; j++) { b = dat & 0x01; dat &&= 1; //写&1&, 将 DQ 拉低 15us 后, 在 15us~60us 内将 DQ 拉高, 即完成写 1 if(b) { ds = 0; i++; i++; //拉低约 16us, 符号要求 15~60us 内 ds = 1; i = 8; while(i&0) i--; //延时约 64us, 符合写时隙不低于 60us 要求 } else //写&0&, 将 DQ 拉低 60us~120us ds = 0; i = 8; while(i&0) i--; //拉低约 64us, 符号要求 ds = 1; i++; i++; //整个写 0 时隙过程已经超过 60us, 这里就不用像写 1 那样, 再延时 64us 了 } } //向 DS18B20 发送温度转换命令 void sendChangeCmd() { dsInit(); //初始化 DS18B20, 无论什么命令, 首先都要发起初始化 dsWait(); //等待 DS18B20 应答 delay(1); //延时 1ms, 因为 DS18B20 会拉低 DQ 60~240us 作为应答信号 writeByte(0xcc); //写入跳过序列号命令字 Skip Rom writeByte(0x44); //写入温度转换命令字 Convert T } //向 DS18B20 发送读取数据命令 void sendReadCmd() { EA=0;//关闭中断是因为进入显示中断会影响到 DS18B20 的读写时序 dsInit(); dsWait(); delay(1); writeByte(0xcc); //写入跳过序列号命令字 Skip Rom writeByte(0xbe); //写入读取数据令字 Read Scratchpad EA=1; } //获取当前温度值 int getTmpValue() {- 24 - u //存放温度数值 unsigned char low, EA=0; sendReadCmd(); //连续读取两个字节数据 low = readByte(); high = readByte(); //将高低两个字节合成一个整形变量 //计算机中对于负数是利用补码来表示的 //若是负值, 读取出来的数值是用补码表示的, 可直接赋值给 int 型的 value tmpvalue = tmpvalue &&= 8; tmpvalue |= value = //使用 DS18B20 的默认分辨率 12 位, 精确度为 0.0625 度, 即读回数据的最低位代表 0.0625 度 t = value * 0.0625; //将它放大 100 倍, 使显示时可显示小数点后两位, 并对小数点后第三进行 4 舍 5 入 //如 t=11.0625, 进行计数后, 得到 value = 1106, 即 11.06 度 //如 t=-11.0625, 进行计数后, 得到 value = -1106, 即-11.06 度 value = t * 100 + (value & 0 ? 0.5 : -0.5); //大于 0 加 0.5, 小于 0 减 0.5 EA=1; } void Init_timer0() { TMOD=0x01; TH0=th0; TL0=tl0; EA=1; ET0=1; TR0=1; } void timer0() interrupt 1 { uchar tmp1; P0|=0x3f; we=1;- 25 - tmp=dispbit[count]; tmp1= P0&= we=0; du=1; tmp=dispbuf[count]; if(tmp1==0xfb) { tmp=disptabwithdot[tmp]; } else { tmp=disptab[tmp]; } P0= du=0; count++; if(count==6) { count=0; } //unsigned int temp = abs(tempValue); dispbuf[0] = temp/ 10000; dispbuf[1] = temp % 10000 / 1000; dispbuf[2] =temp % 1000 / 100; dispbuf[3] = temp % 100 / 10; dispbuf[4] = temp % 10; TH0=th0; TL0=tl0; } void main() { dio=0; Init_timer0(); /*dispbuf[5]=0 dispbuf[4]=0 dispbuf[3]=0 dispbuf[2]=0; dispbuf[1]=0; dispbuf[0]=0;*/ while(1) { //启动温度转换- 26 - //sendChangeCmd(); tempValue1 = getTmpValue(); temp = abs(tempValue1); temp=getTmpValue(); }} 8、/*DS1302 测试程序程序功能:写入 一个时间 09 年 12 月 12 日星期六 21:21:00*/ #include &reg51.h& #include &intrins.h& #define uchar unsigned char sbit we=P2^7; sbit du=P2^6; sbit DS1302_CLK = P1^0; sbit DS1302_IO = P1^1; sbit DS1302_RST = P1^2; sbit ACC0=ACC^0; sbit ACC7=ACC^7; code unsigned char disptab[]={0x3f,0x6,0x5b,0x4f,0x66, 0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x0}; code unsigned char dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; uchar dispbuf[6]; unsigned char second,minute,hour,week,day,month, //秒、分、时、星期、日、月、 年 unsigned char time[]={0x09,0x12,0x12,0x06,0x21,0x21,0x00}; //初始时间数组 09 年 12 月 12 日 21 点 21 分 00 秒 /**************************************************************************** 函数功能:数码管显示子程序 入口参数: 出口参数: ****************************************************************************/ void display() { static uchar count=0; P0=0x80; we=1; tmp=dispbit[count]; P0=P0| we=0; P0=disptab[16]; du=1;- 27 - tmp=dispbuf[count]; tmp=disptab[tmp]; P0= du=0; count++; if(count==6) { count=0; } } /***************************************************************************** 函数功能:向 DS1302 送一字节数据子程序 入口参数: 出口参数: *****************************************************************************/ void InputByte(unsigned char byte1) { ACC=byte1; for(i=8;i&0;i--) { DS1302_IO=ACC0; DS1302_CLK=1; DS1302_CLK=0; ACC=ACC&&1; } } /***************************************************************************** 函数功能:读 DS1302 一个字节子程序 入口参数: 出口参数: *****************************************************************************/ unsigned char OutputByte() { for(i=8;i&0;i--) { ACC=ACC&&1; ACC7=DS1302_IO; DS1302_CLK=1; DS1302_CLK=0; } return(ACC); }- 28 - /***************************************************************************** 函数功能:向 DS1302 某地址写一字节数据子程序 入口参数:addr,TDat 出口参数: *****************************************************************************/ void write_ds1302(unsigned char addr,unsigned char TDat) { DS1302_RST=0; _nop_(); DS1302_CLK=0; _nop_(); DS1302_RST=1; InputByte(addr); _nop_(); InputByte(TDat); DS1302_CLK=1; _nop_(); DS1302_RST=0; } /***************************************************************************** 函数功能:读 DS1302 地址子程序 入口参数:add 出口参数:timedata *****************************************************************************/ unsigned char read_ds1302(unsigned char addr) { un DS1302_RST=0; _nop_(); DS1302_CLK=0; _nop_(); DS1302_RST=1; InputByte(addr); timedata=OutputByte(); DS1302_CLK=1; _nop_(); DS1302_RST=0; return(timedata); } /***************************************************************************** 函数功能:初始化 DS1302 子程序- 29 - 入口参数:time[](全局变量) 出口参数: *****************************************************************************/ void initial_ds1302() { write_dse,0x00); //写保护寄存器, 在对时钟或 RAM 写前 WP 一定要为0 write_dsc,time[0]); //年 write_ds,time[1]); //月 write_ds,time[2]); //日 write_dsA,time[3]); //星期 write_ds,time[4]); //时 write_ds,time[5]); //分 write_ds,time[6]); //秒 write_dse,0x80); //写保护寄存器 } /***************************************************************************** 函数功能:读 DS1302 时间子程序 入口参数: 出口参数:全局变量(second,minute,hour,week,day,month,year) *****************************************************************************/ void read_time() { second=read_ds); //秒寄存器 minute=read_ds); //分 hour=read_ds); //时 week=read_dsB); //星期 day=read_ds); //日 month=read_ds); //月 year=read_dsd); //年 } /***************************************************************************** 函数功能:主程序 入口参数: 出口参数: *****************************************************************************/ void main() { initial_ds1302(); //初始化 DS1302 while(1) { read_time();//读取时间 dispbuf[5]=second%16;- 30 - dispbuf[4]=second/16; dispbuf[3]=minute%16; dispbuf[2]=minute/16; dispbuf[1]=hour%16; dispbuf[0]=hour/16; display(); } }//显示时间9、 //程序功能 1602 液晶第一行显示&ABCDEF&;第二行显示&!@#$%^&*()&&{}?+&; #include &reg52.h& #define uchar unsigned char #define uint unsigned int sbit du=P2^6; sbit we=P2^7; sbit rs=P3^5;//H 数据,L 命令 sbit lcden=P3^4;//高脉冲使能,使能脉宽最小 150ns //sbit rw=P2^1; uchar code table[]=&ABCDEF&; uchar code table1[]=&!@#$%^&*()&&{}?+&; void delay(uchar x) { for(;x&0;x--) { for(y=100;y&0;y--) {}; } } void lcdwrdata(uchar dat) { rs=1;//写数据时 RS 拉高 lcden=1; P0= delay(6); lcden=0; delay(6); } void lcdwrcom(uchar cdat)//写指令数据到 LCD { rs=0;//写指令时 RS 拉低 lcden=1; P0=// delay(6);//不加此延时将导致不能写入指令,但能写入显示数据 lcden=0; delay(6); }- 31 - void lcd_init() { lcdwrcom(0x38);//0x38 设置显示模式为:16X2 显示,5X7 点阵,8 位数据接口 lcdwrcom(0x0c);//打开显示光标闪烁 lcdwrcom(0x06);// lcdwrcom(0x01);// } void main() { du=0; we=0; delay(200); lcden=0; lcd_init(); lcdwrcom(0x00|0x80); for(n=0;n&16;n++) { lcdwrdata(table[n]); delay(100); } lcdwrcom(0x40|0x80); for(n=0;n&16;n++) { lcdwrdata(table1[n]); delay(100); } while(1) { } } 10、LED #include &reg52.h& #include &intrins.h& #define uchar unsigned char #define uint unsigned int void delay ( uchar x) { for (; x & 0 ; x-- ) for( y=500 ;y&0;y--); } void main()- 32 - {uchar a=0x7f; uchar b=0x7f; while(1) { for( c=7;c&0;c--) { P1=b; b=_cror_(a,1); a=b; delay(100); } for( c=7 ;c &0;c--) { P1=b; b=_crol_(a,1); a=b; delay(100); } a=0x7f; b=0x7f; }} 11、不带字库的 12864 显示 #include &reg51.h& #define uint unsigned int #define uchar unsigned char sbit en=P3^4; sbit rw=P3^6;//写 rw=0 sbit rs=P3^5;//写数据 rs=1 sbit cs1=P3^7; sbit cs2=P2^4; sbit rst=P2^0; sbit we=P2^6; sbit du=P2^7; #define Lcdbus P0 #define lcdon 0x3f #define lcdoff 0x3e #define lcdstart0 0xc0 #define lcdpage0 0xb8 #define lcdy0 0x40 code uchar yi[]={/*-- 文字: 1 --*/ /*-- 宋体 12; 此字体下对应的点阵为:宽 x 高=8x16--*/- 33 - 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, }; code uchar dan[]={/*-- 文字: 单 --*/ /*-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 --*/ 0x00,0x00,0xF8,0x28,0x29,0x2E,0x2A,0xF8,0x28,0x2C,0x2B,0x2A,0xF8,0x00,0x00,0x00, 0x08,0x08,0x0B,0x09,0x09,0x09,0x09,0xFF,0x09,0x09,0x09,0x09,0x0B,0x08,0x08,0x00, }; code uchar pian[]={/*-- 文字: 片 --*/ /*-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 --*/ 0x00,0x00,0x00,0xFE,0x10,0x10,0x10,0x10,0x10,0x1F,0x10,0x10,0x10,0x18,0x10,0x00, 0x80,0x40,0x30,0x0F,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,0x00,0x00,0x00,0x00, }; code uchar ji[]={/*-- 文字: 机 --*/ /*-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 --*/ 0x08,0x08,0xC8,0xFF,0x48,0x88,0x08,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00, 0x04,0x03,0x00,0xFF,0x00,0x41,0x30,0x0C,0x03,0x00,0x00,0x00,0x3F,0x40,0x78,0x00, }; code uchar kai[]={/*-- 文字: 开 --*/ /*-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 --*/ 0x40,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x00, 0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00, }; code uchar fa[]={/*-- 文字: 发 --*/ /*-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 --*/ 0x00,0x10,0x3E,0x10,0x10,0xF0,0x9F,0x90,0x90,0x92,0x94,0x1C,0x10,0x10,0x10,0x00, 0x40,0x20,0x10,0x88,0x87,0x41,0x46,0x28,0x10,0x28,0x27,0x40,0xC0,0x40,0x00,0x00,}; code uchar ban[]={/*-- 文字: 板 --*/ /*-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 --*/ 0x10,0x10,0xD0,0xFF,0x50,0x90,0x00,0xFE,0x62,0xA2,0x22,0x21,0xA1,0x61,0x00,0x00, 0x04,0x03,0x00,0x7F,0x00,0x11,0x0E,0x41,0x20,0x11,0x0A,0x0E,0x31,0x60,0x20,0x00,}; void delay(uchar x) { for(;x&0;x--) for(z=1000;z&0;z--); } void Lcd_writei(uchar dat) { rs=0; rw=0; en=1; Lcdbus= en=0; delay(1);- 34 - } void Lcd_writed(uchar datd) { rs=1; rw=0; en=1; Lcdbus= en=0; delay(1); } void sz_disp8(uchar pag,uchar col,uchar *szk) { uchar j,i; for(j=0;j&2;j++) { Lcd_writei(lcdpage0+pag+j); Lcd_writei(lcdy0+col); for(i=0;i&8;i++) { Lcd_writed(szk[8*j+i]); } } } void hz_disp16(uchar pag,uchar col,uchar *hzk) { uchar j,i; for(j=0;j&2;j++) { Lcd_writei(lcdpage0+pag+j); Lcd_writei(lcdy0+col); for(i=0;i&16;i++) { Lcd_writed(hzk[16*j+i]); } } } void main() { uchar a,b; rst=0; delay(1); rst=1; cs1=1; cs2=0;- 35 - //delay(1); Lcd_writei(lcdon); Lcd_writei(lcdstart0); Lcd_writei(lcdpage0); Lcd_writei(lcdy0); for(b=0;b&8;b++) { Lcd_writei(lcdpage0+b); Lcd_writei(lcdy0); for(a=64;a&0;a--) { Lcd_writed(0x00); } }hz_disp16(0,16,dan); hz_disp16(0,31,pian); hz_disp16(0,47,ji); hz_disp16(6,0,kai); hz_disp16(6,16,fa); hz_disp16(6,31,ban); delay(10); cs1=0; cs2=1; //delay(1); Lcd_writei(lcdon); // Lcd_writei(lcdstart0); // Lcd_writei(lcdpage0); // Lcd_writei(lcdy0); for(b=0;b&8;b++) { Lcd_writei(lcdpage0+b); Lcd_writei(lcdy0); for(a=64;a&0;a--) { Lcd_writed(0x00); } } hz_disp16(0,0,dan); hz_disp16(0,16,pian); hz_disp16(0,31,ji); while(1) {- 36 - } } 12、/*单片机 P10~P13 输出脉冲驱动步进电机旋转 步进电机试验程序的接线顺序如下: P1.0------------A P1.1------------B P1.2------------C P1.3------------D */ #include &reg51.h& #define uchar unsigned char #define uint unsigned int sbit wela=P2^7; sbit dula=P2^6; sbit diola=P2^5; sbit LA=P1^0;//步进电机控制 I/O sbit LB=P1^1; sbit LC=P1^2; sbit LD=P1^3; void delay(uint x) { for(;x&0;x--) for(y=10;y&0;y--); } void main() { wela=0; dula=0; diola=0; P1=0; while (1) { LA=1; delay(100); LA=0; LB=1; delay(100); LB=0; LC=1; delay(100); LC=0; LD=1; delay(100); LD=0;- 37 - } } 13、//用串口助手向开发板发送 16 进制数据开发板数码管上将显示 #include &reg52.h& #define uchar unsigned char #define uint unsigned int uchar th0=()/256; uchar tl0=(0)%256; sbit we=P2^7; sbit du=P2^6; code uchar disptab[]={0x3f,0x6,0x5b,0x4f,0x66, 0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x0}; code uchar dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; uchar dispbuf[6]; void delay(uint x) { for(;x&0;x--) for(y=1000;y&0;y--); } void Init_timer0() { TMOD|=0x01; TH0=th0; TL0=tl0; EA=1; ET0=1; TR0=1; } void timer0() interrupt 1 { static uchar count=0; P0|=0x3f; we=1; tmp=dispbit[count]; P0&= we=0; du=1; tmp=dispbuf[count]; tmp=disptab[tmp]; P0= du=0; count++;- 38 - if(count==6) count=0; TH0=th0; TL0=tl0; } void Init_ser() { TMOD|=0x20;//T1 作为波特率发生器 TH1=0 TL1=0 SM0=0; SM1=1; REN=1; PCON|=0x80;//波特率设置为 19200 TR1=1; EA=1; ES=1; } void ser() interrupt 4 { static uchar R if(TI) { TI=0; } else { RI=0; Rdat=SBUF; dispbuf[0]=Rdat/16; dispbuf[1]=Rdat%16; } } void send(uchar Dat) { SBUF=D for(;;) { if(TI) { TI=0; } }- 39 - } void main() { Init_timer0(); Init_ser(); dispbuf[5]=16; dispbuf[4]=16; dispbuf[3]=16; dispbuf[2]=16; while (1) { send(0xff); delay(100); } } 14、带汉字库 12864 显示 #include &reg51.h& #include &intrins.h& /*定义管脚*/ sbit RS = P3^5; sbit RW = P3^6; sbit E = P3^4; sbit RES = P1^6; sbit PSB = P3^7; sbit we=P2^7; sbit du=P2^6; sbit io=P2^5; #define Lcd_Bus P0 //MCU P2&------& LCM #define FIRST_ADDR 0 //定义字符/汉字显示起始位置 unsigned char code zk[]={ 0x08,0x20,0x1c,0x10,0x1c,0x1c,0xff,0x9e,0x7f,0x1e,0x1c,0x1f,0x3e,0x1f,0x3e,0x1f, 0x77,0x1f,0x41,0x3f,0x00,0x7e,0x00,0xfe,0x83,0xfc,0x7f,0xf8,0x3f,0xf0,0x0f,0xc0, }; unsigned char code BMP1[]={ /*-- 一幅图像 KISS- 正向取模,字节正序*/ /*-- 宽度 x 高度=128x64 --*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xFF,0xFF,0xFF,0x9F,0x00,0x00,0x0F,0x0E,0x00,0x00,0x00,0x00,0x19,0xFF,0xFF,0xFF, 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xBF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFD,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xFF,0xFF,0xF3,0xE0,0x00,0x00,0x1F,0xFD,0x80,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF, 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFA,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xF4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,- 40 - 0xFF,0xFF,0xF0,0x00,0x00,0x00,0x03,0xF8,0x01,0xFF,0xFF,0xE0,0x00,0x07,0xFF,0xFF, 0x00,0x00,0x00,0x0F,0xFF,0xFC,0x00,0xF0,0x3F,0xFF,0xFF,0xFE,0x00,0x30,0x00,0x00, 0x00,0x00,0x00,0x7F,0xFF,0xFF,0x80,0x41,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00, 0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xF0,0x02,0x7F,0xFF,0xFF,0xFF,0xE0,0x03,0xFF,0xFF, 0x00,0x00,0x03,0xFF,0xFF,0xFF,0xF8,0x04,0x3F,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00, 0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFC,0x08,0x73,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00, 0xFF,0xE4,0x3F,0x7F,0xFF,0xFF,0xFF,0x30,0x2F,0xFF,0xFF,0xFF,0xFE,0x00,0x7F,0xFF, 0x00,0x00,0xFE,0x9F,0xFF,0xFF,0xFF,0xB0,0x1D,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00, 0x00,0x00,0xFF,0x7F,0xFF,0xFF,0xFF,0xC2,0x23,0x3F,0xFF,0xFE,0x1F,0x80,0x00,0x00, /*****************************************************************************/ 0xFF,0xE1,0xFF,0xFF,0xFF,0xFF,0xFC,0xC5,0x92,0xFF,0xB7,0xB8,0xC9,0x80,0x7F,0xFF, 0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFC,0x4F,0xEF,0x3F,0xC8,0x1A,0x20,0xC0,0x00,0x00, 0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0x75,0x86,0xF6,0xC0,0x00,0x00, 0xFF,0x03,0xEF,0x9F,0xFB,0xFF,0xF8,0x7F,0xFF,0xFF,0xFB,0xDF,0xFE,0xC0,0x7F,0xFF, 0x00,0x07,0xDE,0x7F,0xC7,0xFF,0xF0,0x7E,0x7F,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00, 0x00,0x07,0x1C,0xF7,0x9F,0xDF,0xF0,0x7E,0x7F,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00, 0xFC,0x07,0x00,0x8C,0x1F,0xBF,0xE7,0x3C,0x3F,0xFF,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF, 0x00,0x07,0x00,0x08,0x1C,0x3F,0x88,0x3C,0x7F,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00, 0x00,0x06,0x0C,0x08,0x98,0x7F,0x80,0x0D,0x9F,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00, 0xFC,0x06,0x1C,0xE3,0x99,0xFF,0x00,0x0C,0x0F,0xFF,0xFF,0xFF,0xFF,0xC0,0x5F,0xFF, 0x00,0x06,0xF1,0xE3,0x83,0xFE,0x00,0x08,0x03,0xDF,0xFF,0xFF,0xFF,0xC0,0x00,0x00, 0x00,0x06,0xF1,0xF7,0xC7,0xFE,0x00,0x08,0x01,0xCF,0xFF,0xFF,0xFF,0xC0,0x00,0x00, 0xFC,0x06,0xF3,0xF7,0xC7,0xFC,0x03,0x08,0x00,0x01,0xFF,0xFF,0xFF,0xC0,0xBF,0xFF, 0x00,0x07,0xF3,0xFF,0xE7,0xF0,0x03,0x09,0x80,0x00,0xFF,0xFF,0xFF,0xC0,0x00,0x00, 0x00,0x07,0xFF,0xFF,0xFF,0xE0,0x03,0x09,0x80,0x00,0x3F,0xFF,0xFF,0x80,0x00,0x00, 0xFC,0x07,0xFF,0xFF,0xFF,0xC0,0x03,0x09,0x80,0x00,0x0F,0xFF,0xFF,0x83,0xFF,0xFF, /*****************************************************************************/ 0x00,0x07,0xFF,0xE0,0xFE,0x00,0x03,0x09,0x80,0x00,0x07,0xFF,0xFF,0x80,0x00,0x00, 0x00,0x07,0xFF,0x80,0x7C,0x00,0x07,0xB1,0x80,0x00,0x07,0x83,0xFF,0x00,0x00,0x00, 0xFF,0x07,0xFF,0x0C,0x00,0x00,0x7F,0xB3,0xC0,0x00,0x06,0x01,0xFE,0x03,0xFF,0xFF, 0x00,0x07,0xFF,0x03,0x00,0x00,0x1F,0x43,0xFC,0x00,0x06,0x38,0xFE,0x00,0x00,0x00, 0x00,0x07,0xFF,0x03,0x00,0x00,0x00,0x81,0xF0,0x00,0x04,0x40,0xF8,0x00,0x00,0x00, 0xFC,0x87,0xFF,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x04,0x40,0xF0,0x07,0xFF,0xFF, 0x00,0x07,0xFF,0x80,0x00,0x2C,0x00,0x80,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00, 0x00,0x07,0xFF,0x80,0x00,0x52,0x00,0x40,0x00,0x00,0x00,0x01,0xE0,0x00,0x00,0x00, 0xFF,0x83,0xFF,0xF0,0x80,0x2C,0x00,0x40,0x00,0x00,0x00,0x01,0xC0,0x7F,0xFF,0xFF, 0x00,0x03,0xFF,0xFF,0x80,0x00,0x00,0x30,0x00,0x00,0x01,0x86,0x00,0x00,0x00,0x00, 0x00,0x03,0xFF,0xFF,0x80,0x00,0x00,0x38,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x00, 0xFF,0xA3,0xFF,0xFF,0x80,0x00,0x00,0x44,0x00,0x00,0x01,0xFF,0x00,0x7F,0xFF,0xFF, 0x00,0x03,0xFF,0xFF,0x80,0x00,0x03,0x82,0x00,0x00,0x01,0xC0,0xC0,0x00,0x00,0x00, 0x00,0x03,0xFF,0xFF,0x80,0x00,0x1C,0x01,0xC0,0x00,0x00,0x78,0xC0,0x00,0x00,0x00, 0xFF,0x81,0xFF,0xFF,0xC0,0x3F,0xE0,0x00,0x3C,0x00,0x07,0x80,0x20,0x7F,0xFF,0xFF, 0x00,0x01,0xFF,0xFF,0xE0,0x40,0x00,0x00,0x03,0xFE,0x78,0x00,0x20,0x00,0x00,0x00, /*****************************************************************************/- 41 - 0x00,0x01,0xFF,0xFF,0xF8,0x40,0x00,0x00,0x00,0x21,0x80,0x00,0x10,0x00,0x00,0x00, 0xFF,0xC1,0xFF,0xFF,0xFC,0x40,0x00,0x00,0x00,0x2E,0x00,0x00,0x10,0x4F,0xFF,0xFF, 0x00,0x01,0xFF,0xFF,0xFE,0x20,0x00,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x00, 0x00,0x00,0xFF,0xFF,0xFF,0xA0,0x00,0x00,0x00,0xC0,0x00,0x01,0xF8,0x00,0x00,0x00, 0xFF,0xE0,0xFF,0xFF,0xFB,0xE0,0x00,0x00,0x00,0xC0,0x00,0x03,0xFE,0x07,0xFF,0xFF, 0x00,0x00,0xFF,0xFF,0xFD,0xE0,0x00,0x00,0x00,0xC0,0x00,0x1F,0xFF,0x00,0x00,0x00, 0x00,0x00,0xFF,0xFF,0xFE,0x70,0x00,0x00,0x01,0xE0,0x00,0x3F,0xFF,0x80,0x00,0x00, 0xFF,0xC0,0xFF,0xFF,0xFF,0xB0,0x00,0x00,0x01,0xE0,0x00,0x7F,0xFF,0xC0,0x3F,0xFF, 0x00,0x00,0xFF,0xFF,0xFF,0xDC,0x00,0x00,0x03,0xF7,0x81,0xFF,0xFF,0xF0,0x00,0x00, 0x00,0x01,0xFF,0x80,0x7F,0xDC,0x00,0x00,0x0F,0xFF,0xC3,0xFF,0xFF,0xF8,0x00,0x00, 0xFF,0x01,0xFF,0x00,0x1F,0xEE,0x00,0x00,0x13,0xFF,0xF7,0xFF,0xFF,0xFC,0x07,0xFF, 0x00,0x01,0xFE,0x00,0x07,0xEF,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, 0x00,0x01,0xFC,0x00,0x03,0xF3,0x00,0x00,0x13,0xFF,0xBF,0xFF,0xFF,0xFF,0x80,0x00, 0xFF,0x01,0xFC,0x00,0x01,0xF3,0x80,0x00,0x1F,0xFF,0xBF,0xFF,0xFF,0xFF,0x83,0xFF, 0x00,0x01,0xF0,0x00,0x01,0xFD,0x80,0x00,0x0F,0xFF,0x7F,0xFF,0xFF,0xFF,0xC0,0x00, 0x00,0x03,0xF0,0x00,0x00,0x72,0xE0,0x00,0x03,0xFE,0xFF,0xFF,0xFF,0xFF,0xC0,0x00 }; unsigned char code BMP[]={ //一幅图像 - 正向取模,字节正序 /*-- 宽度 x 高度=128x64 --*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x40,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x40,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x40,0x38,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x60,0x00,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x01,0x80,0x00,0x38,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x03,0xC0,0x00,0x03,0xC0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x1C,0x38,0x00,0x1C,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x04,0x00,0xE0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF0,0x01,0x00,0x00,0x80,0x00,0x00,0x00, /*****************************************************************************/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x01,0x00,0x00,0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE1,0x00,0x00,0x80,0x00,0x00,0x00, 0x00,0x00,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x18,0xC0,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x10,0x40,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x41,0xC0,0x00,0x00,- 42 - 0x00,0x00,0x30,0x60,0x3F,0xC0,0x00,0x00,0x00,0x02,0x00,0x00,0x40,0x3E,0x00,0x00, 0x00,0x00,0x20,0x23,0xC0,0x60,0x00,0x00,0x00,0x61,0x00,0x00,0x80,0x01,0xC0,0x00, 0x00,0x00,0x40,0x3C,0x00,0x18,0x00,0xC0,0x07,0xC1,0x00,0x00,0x80,0x00,0x00,0x00, 0x00,0x00,0x40,0x18,0x00,0x04,0x01,0xA0,0x1C,0x01,0x00,0x00,0x80,0x00,0x00,0x00, 0x00,0x00,0x40,0x08,0x00,0x06,0x02,0x1C,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xC0,0x08,0x00,0x01,0x8C,0x03,0x80,0x00,0x40,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x0C,0x00,0x00,0x58,0x00,0x60,0x06,0x20,0x04,0x20,0x00,0x00,0x00, 0x00,0x01,0x00,0x04,0x00,0x00,0x20,0x00,0x10,0x1C,0x1C,0x38,0x18,0x00,0x00,0x00, 0x00,0x01,0x00,0x06,0x00,0x00,0x30,0x00,0x08,0x30,0x03,0xC0,0x07,0x00,0x00,0x00, 0x00,0x01,0x00,0x02,0x00,0x00,0x18,0x00,0x04,0x60,0x00,0x00,0x01,0x80,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x00,0x0C,0x00,0x03,0x00,0x00,0x00,0x00,0x40,0x00,0x00, /*****************************************************************************/ 0x00,0x02,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x80,0x02,0x08,0x00,0x30,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x02,0x08,0x00,0x18,0x00,0x00, 0x00,0x0C,0x00,0x00,0x7F,0xFC,0x00,0x00,0x00,0x20,0x02,0x04,0x00,0x00,0x00,0x00, 0x00,0x0C,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x18,0x02,0x04,0x00,0x00,0x00,0x00, 0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x07,0xF2,0x02,0x00,0x00,0x00,0x00, 0x00,0x30,0x00,0x00,0x0F,0xFC,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x00, 0x00,0x60,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x40,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x01,0x80,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x80,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0xCC,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00, /* &太&, &阳&, &出&, &来&, &喜&, &洋&, &洋&, &喽&,*/ 0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x22,0x10,0x22,0x10,0x00,0x48, 0x01,0x00,0x7D,0xFC,0x01,0x00,0x01,0x00,0x7F,0xFC,0x11,0x10,0x11,0x10,0x02,0x4C, 0x01,0x00,0x45,0x04,0x21,0x04,0x3F,0xFC,0x01,0x00,0x11,0x20,0x11,0x20,0xF1,0x50, 0x01,0x00,0x49,0x04,0x21,0x04,0x01,0x00,0x3F,0xF8,0x07,0xFC,0x07,0xFC,0x97,0xFE, 0x7F,0xFE,0x49,0x04,0x21,0x04,0x09,0x30,0x00,0x00,0x80,0x40,0x80,0x40,0x90,0xE0, 0x01,0x00,0x51,0x04,0x21,0x04,0x05,0x20,0x1F,0xF0,0x50,0x40,0x50,0x40,0x91,0x50, 0x01,0x00,0x49,0xFC,0x3F,0xFC,0x03,0x40,0x10,0x10,0x57,0xFC,0x57,0xFC,0x92,0x4E, 0x01,0x00,0x45,0x04,0x21,0x04,0x7F,0xFE,0x1F,0xF0,0x10,0x40,0x10,0x40,0x9D,0x44, 0x02,0x80,0x45,0x04,0x01,0x00,0x01,0x80,0x04,0x40,0x20,0x40,0x20,0x40,0x91,0x00, 0x02,0x40,0x45,0x04,0x21,0x04,0x03,0x40,0xFF,0xFE,0x2F,0xFE,0x2F,0xFE,0xF7,0xFC, 0x04,0x20,0x69,0x04,0x21,0x04,0x05,0x20,0x00,0x00,0xE0,0x40,0xE0,0x40,0x92,0x10, 0x05,0x10,0x51,0x04,0x21,0x04,0x09,0x18,0x1F,0xF0,0x20,0x40,0x20,0x40,0x83,0x20, 0x08,0x98,0x41,0xFC,0x21,0x04,0x31,0x0E,0x10,0x10,0x20,0x40,0x20,0x40,0x00,0xE0,- 43 - 0x10,0xCC,0x41,0x04,0x3F,0xFC,0xC1,0x04,0x10,0x10,0x20,0x40,0x20,0x40,0x01,0x18, 0x20,0x86,0x40,0x00,0x01,0x00,0x01,0x00,0x1F,0xF0,0x20,0x40,0x20,0x40,0x02,0x0C, 0x40,0x04,0x40,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x40,0x20,0x40,0x04,0x08 }; /*------------------检查忙位-----------------------------*/ void chk_busy() { RS=0; RW=1; E=1; Lcd_Bus=0 while((Lcd_Bus&0x80)==0x80); E=0; } /*------------------延时子程序-----------------------------*/ void delay(unsigned int t) { unsigned int i,j; for(i=0;i&t;i++) for(j=0;j&10;j++); } /*------------------写命令到 LCD------------------------------*/ void write_com(unsigned char cmdcode) { chk_busy(); RS=0; RW=0; E=1; Lcd_Bus= delay(5);////////////////////在数据写入的时候加入适当的延时 E=0; delay(5); } /*-------------------写数据到 LCD----------------------------*/ void write_data(unsigned char Dispdata) { chk_busy(); RS=1; RW=0; E=1; Lcd_Bus=D delay(5);///////////////////在数据写入的时候加入适当的延时 E=0; delay(5); }- 44 - /*------------------初始化 LCD 屏--------------------------*/ void lcdreset() { delay(2000); write_com(0x30); delay(10); //选择基本指令集 write_com(0x30); //选择 8bit 数据流 delay(5); write_com(0x0c); //开显示(无游标、不反白) delay(10); write_com(0x01); //清除显示,并且设定地址指针为 00H delay(500); write_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示 的移位 delay(0); } /*------------------自定义一个字符代码(一个星星和月亮)--------------------------*/ void CGRAM() { write_com(0x30); write_com(0x40); for(i=0;i&16;i++) {write_data(zk[i*2]); write_data(zk[i*2+1]); } } /*------------------显示字符串--------------------------*/ void hzkdis(unsigned char code *s) { while(*s&0) { write_data(*s); s++; delay(50); } } /*------------------首屏显示--------------------------*/ void ceshi() {write_com(0x01);//清除显示,并且设定地址指针为 00H delay(5); write_com(0x80);//第一行(如果是地址是:80H,即 LCD 的第一行的第一个位置显示) hzkdis(&欢迎使用&); write_com(0x90);//第二行(如果是地址是:90H,即 LCD 的第二行的第一个位置显示) hzkdis(&东滨单片机开发板&);- 45 - write_com(0x88);//第三行(如果是地址是:88H,即 LCD 的第二行的第一个位置显示) hzkdis(&TEL&); write_com(0x98);//第四行(如果是地址是:98H,即 LCD 的第二行的第一个位置显示) hzkdis(&测试程序&); } /*------------------显示图片------------------------*/ void Disp_Img(unsigned char code *img) { unsigned int j=0; unsigned char x,y,i; for(i=0;i&9;i+=8) for(y=0;y&32;y++)/*原来 为 y&26 ,上下两个半屏不能正常对接显示,导致显示的图 片中间有空隙*/ for(x=0;x&8;x++) { write_com(0x36);//功能设置---8BIT 控制界面,扩充指令集 write_com(y+0x80); //行地址 write_com(x+0x80+i); //列地址 write_com(0x30); write_data(img[j++]); write_data(img[j++]); } } /*------------------清整个 GDRAM 空间----------------------------*/ void clrgdram() { unsigned char x,y; for(y=0;y&64;y++) for(x=0;x&16;x++) { write_com(0x34); write_com(y+0x80); //行地址 write_com(x+0x80); //列地址 write_com(0x30); write_data(0x00); write_data(0x00); } } /*------------------整屏写入数据:全亮,或者竖条-----------------------------*/ void lcdfill(unsigned char disdata) { unsigned char x,y; for(y=0;y&32;y++) for(x=0;x&16;x++) { write_com(0x36); write_com(y+0x80); //行地址 write_com(x+0x80); //列地址- 46 - write_com(0x30); write_data(disdata); write_data(disdata); } write_com(0x34); write_com(0x36); } /*------------------显示横-----------------------------*/ void Disp_H_Line() { unsigned char x,y; unsigned char k=0x00; for(y=0;y&32;y++) { k=~k; for(x=0;x&16;x++) { write_com(0x36); write_com(y+0x80); //行地址 write_com(x+0x80); //列地址 write_com(0x30); write_data(k); write_data(k); }; } write_com(0x34); write_com(0x36); } /*------------------显示边框-------------------------------*/ void Frame() {unsigned char x,y; lcdfill(0x00); for(x=0;x&9;x+=8) for(y=0;y&32;y++) { write_com(0x36); write_com(y+0x80); //行地址 write_com(x+0x80); //列地址 write_com(0x30); write_data(0x80); write_data(0x00); write_com(0x36); write_com(y+0x80); write_com(x+0x87); write_com(0x30); write_data(0x00); write_data(0x01);//行地址 //列地址- 47 - } for(y=0;y&2;y++) for(x=0;x&8;x++) {write_com(0x36); write_com(y*31+0x80); write_com(x+0x80+8*y); write_com(0x30); write_data(0xff); write_data(0xff); } write_com(0x34); write_com(0x36); }//行地址 //列地址/*------------------在第 7 列的位置加入两条竖线--------------------------*/ void shuxian() { unsigned char x,y; for(x=0;x&9;x+=8) for(y=0;y&32;y++) { write_com(0x36); write_com(y+0x80); write_com(x+0x86); write_com(0x30); write_data(0x00); write_data(0x14); }; } /*------------------清屏命令--------------------------*/ void clrscreen() { write_com(0x01); delay(10); } /*------------------唐诗《静夜思》--------------------------*/ void gushi_display() { write_com(0x30); clrscreen(); write_com(0x80+FIRST_ADDR); hzkdis(&白日依山尽,&); write_com(0x90+FIRST_ADDR); hzkdis(&黄河入海流。&);//行地址 //列地址- 48 - write_com(0x88+FIRST_ADDR); hzkdis(&欲穷千里目,&); write_com(0x98+FIRST_ADDR); hzkdis(&更上一层楼。&); write_com(0xb3+FIRST_ADDR); hzkdis(&登鹳雀楼&); write_com(0xaa+FIRST_ADDR); hzkdis(&( 唐 )王之焕&); } main() { du=0; we=0; while(1) { PSB=0; delay(300); PSB=1; RW=0; lcdreset(); CGRAM(); ceshi(); delay(2000); clrgdram(); clrscreen(); Disp_Img(BMP); delay(30000); Disp_Img(BMP1); delay(20000); lcdfill(0xff); delay(2000); Disp_H_Line(); delay(2000); lcdfill(0xaa); delay(2000); Frame(); delay(2000);//初始化 LCD 屏 //显示测试字样//清屏 //调入一幅图画//调入一幅图画//显示全开//显示横条//显示竖条//显示边框- 49 - gushi_display(); clrgdram(); write_com(0x87); write_data(0x00); write_data(0x00); delay(400); shuxian(); delay(8000); write_com(0x30); delay(2000); gushi_display(); delay(6000); for(i=0;i&8;i++) {write_com(0x18); delay(2000);} gushi_display(); delay(6000); write_com(0x36); write_com(0x04); delay(6000); write_com(0x04); delay(6000); write_com(0x05); delay(6000); write_com(0x05); delay(6000); write_com(0x03); write_com(0x60); delay(6000); } }//显示唐诗//调用自定义的 CGRAM 的代码//加入两条竖线//字符循环左移//第一行反白显示 //第一行恢复正常 //第二行反白显示 //第二行恢复正常//垂直滚动屏幕的内容15、/*程序功能:按 S18 流水灯启动流动,按 S20 自右往左移 ?按 S19 自左往右移,按 S17 停止流动*/ #include &reg52.h& #include &intrins.h& #define uchar unsigned char #define uint unsigned int- 50 -
void delayms(uchar x) { for(;x&0;x--) for(y=0;y&124;y++); } uchar key() { P3|=0xf0; keyvalue=P3; keyvalue|=0x0f; if(keyvalue==0xff) { return (0) ; } delayms(5); keyvalue=P3; keyvalue|=0x0f; if(keyvalue==0xff) { return (0) ; } else { for(;;) { tmp=P3; if((tmp|0x0f)==0xff) { } } return (keyvalue); } } void keyproc(uchar keyv) { switch(keyv) { case 0xef:startend=0;- 51 - case 0xdf:startend=1; case 0xbf:leftright=0; case 0x7f:leftright=1; } } void main() { uchar outdat=0 while (1) { keyval=key(); if(keyval) { keyproc(keyval); } if(startend) { P1= if(leftright) { outdat=_crol_(outdat,1); } else outdat=_cror_(outdat,1); } delayms(500);{ } else {P1=0 } } } 16、蜂鸣器 #include &reg51.h& #define uchar unsigned char #define uint unsigned int sbit FM=P2^3; void delay ( uchar x) { for (; x & 0 ; x-- ) for( y=500 ;y&0;y--);- 52 - } void main() { FM=0; while(1) { delay(20); FM=1; delay(20); FM=0; } } 17、/*程序说明: 51 单片机红外遥控解码程序 单片机采用外部中断 INTI 管脚和红外接收头的信号线相连, 中断方式为边沿触发方式。并用定时器 0 计算中断的间隔时间, 来区分前导码、二进制的 1,0;8 位操作码提取出来在数码管上显示。 解码值在 Im[2]中,当 IrOK=1 时解码有效。 用遥控器对准红外接收头,按下遥控器按键,在数码管的两位上就会显示对应按键的编码 */ #include &reg52.h& #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; #define Imax 14000 //此处为晶振为 11.0592 时的取值, #define Imin 8000 //如用其它频率的晶振时, #define Inum1 1450 //要改变相应的取值。 #define Inum2 700 #define Inum3 3000 unsigned char Im[4]={0x00,0x00,0x00,0x00}; uchar show[2]={0,0}; unsigned long m,Tc; unsigned char IrOK; void delay(uchar i) { uchar j,k; for(j=i;j&0;j--) for(k=125;k&0;k--); }- 53 - void display() { dula=0; P0=table[show[1]]; dula=1; dula=0; wela=0; P0=0 wela=1; wela=0; delay(5); P0=table[show[0]]; dula=1; dula=0; P0=0 wela=1; wela=0; delay(5); } //外部中断解码程序 void intersvr1(void) interrupt 2 using 1 { Tc=TH0*256+TL0; 隔时长 TH0=0; TL0=0; //定时中断重新置零 if((Tc&Imin)&&(Tc&Imax)) { m=0; f=1; } //找到启始码 if(f==1) { if(Tc&Inum1&&Tc&Inum3) { Im[m/8]=Im[m/8]&&1|0x80; m++; } if(Tc&Inum2&&Tc&Inum1)//提取中断时间间- 54 - { Im[m/8]=Im[m/8]&&1; m++; //取码 } if(m==32) { m=0; f=0; if(Im[2]==~Im[3]) { IrOK=1; } else IrOK=0; //取码完成后判断读码是否正确 } //准备读下一码 } } /*演示主程序*/ void main(void) { m=0; f=0; EA=1; IT1=1;EX1=1; TMOD=0x11; TH0=0;TL0=0; TR0=1;//ET0=1; while(1) { if(IrOK==1) { show[1]=Im[2] & 0x0F; show[0]=Im[2] && 4; IrOK=0; } for(a=100;a&0;a--) { display(); } //取键码的低四位- 55 - } } 18、//程序功能:P1.0 控制继电器吸合断开 //接线方法 P1.0-------RELAY(J17) #include &reg51.h& #define uchar unsigned char #define uint unsigned int sbit RELAY=P1^0; void delay ( uchar x) { for (; x & 0 ; x-- ) for( y=500 ;y&0;y--); } void main() { RELAY=0; while(1) { delay(80); RELAY=1; delay(80); RELAY=0; } } 19、//程序功能:按下按键 S1~S20 数码管显示相应的键值 #include &reg52.h& #define uchar unsigned char #define uint unsigned int uchar code disptab[]={0x3f,0x6,0x5b,0x4f,0x66, 0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x0}; uchar code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; uchar dispbuf[6]; uchar code th0=()/256; uchar code tl0=()%256; sbit we=P2^7; sbit du=P2^6; void dlms(uchar x) { for(;x&0;x--) for(y=200;y&0;y--); } uchar keyscan()- 56 - { P3=0xf0; if((P3&0xf0)!=0xf0) { dlms(2); if((P3&0xf0)!=0xf0) { sccode=0while((sccode&0x10)!=0) { P3= if((P3&0xf0)!=0xf0) { recode=(P3&0xf0)|0x0f; return(~recode+~sccode); } else { sccode=(sccode&&1)|0x01; } } } } return(0); } void Init_timer0() { TMOD=0x01; TH0=th0; TL0=tl0; EA=1; ET0=1; TR0=1; } void timer0() interrupt 1 { P0|=0x3f; we=1;- 57 - tmp=dispbit[count]; P0= we=0; du=1; tmp=dispbuf[count]; tmp=disptab[tmp]; P0= du=0; count++; if(count==6) { count=0; } TH0=th0; TL0=tl0; } void main() { Init_timer0(); P1=0 dispbuf[5]=16; dispbuf[4]=16; dispbuf[3]=16; dispbuf[2]=16;//关闭其余位 while(1) { key=keyscan(); if(key) { dispbuf[1]=key/16; dispbuf[0]=key%16; } } } 20、数码管动态显示 #include &reg52.h& #define uchar unsigned char #define uint unsigned int sbit we=P2^7; sbit du=P2^6; uchar th0=()/256; uchar tl0=()%256;- 58 - code uchar disptab[]={0x3f,0x6,0x5b,0x4f,0x66, 0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x0}; code uchar dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; uchar dispbuf[6]; void delay1(uchar x) { for(;x&0;x--) for(y=1000;y&0;y--); } void timer0() interrupt 1 { static uchar count=0; P0|=0x3f; we=1; tmp=dispbit[count]; P0=P0& we=0; P0=disptab[16]; du=1; tmp=dispbuf[count]; tmp=disptab[tmp]; P0= du=0; count++; if(count==6) { count=0; } TH0=th0; TL0=tl0; } void Inittimer0() { TMOD=0x01; TH0=th0; TL0=tl0; EA=1; ET0=1; TR0=1; }- 59 - void main() { Inittimer0(); dispbuf[1]=0x8; dispbuf[5]=0x8; dispbuf[3]=0x8; dispbuf[4]=0x8; dispbuf[0]=0x8; while(1) { dispbuf[2]=c; c++; if(c==10) c=0; delay1(50); } } 21、数码管段测试 #include &reg51.h& #define uchar unsigned char #define uint unsigned int sbit P27=P2^7; void delay(uchar a); void main() { P27=1; P0=0; delay(1); P27=0; while(1) { P0=0x01; delay(100); P0=0x02; delay(100); P0=0x04; delay(100); P0=0x08; delay(100); P0=0x10; delay(100); P0=0x20; delay(100); P0=0x40;- 60 - delay(100); P0=0x80; delay(100); } } void delay(uchar a) { for(;a&0;a--) for(b=0;b&1000;b++); } 22、数码管静态显示 #include &reg51.h& #define uchar unsigned char #define uint unsigned int sbit p27=P2^7; uchar code disptab[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delay(uchar x); void main() { p27=1; P0=0; p27=0; a=0; for(;;) { if(a==16) a=0; P0=disptab[a]; delay(100); a++; } } void delay(uchar x) { for(;x&0;x++) for(y=0;y&1000;y++); } 23、/*程序功能:P1.0 输出 PWM 信号,按 S19 键直流电机加速 ?按 S20 键直流电机减速旋转*/ #include &reg52.h&- 61 - sbit P1_0=P1^0; sbit P1_1=P3^6; sbit P1_2=P3^7; unsigned char PWMH; unsigned char PWM; unsigned char COUNTER; void K1CHECK(); void K2CHECK(); void INTTO() interrupt 1 { COUNTER++; //计数值加 1 if((COUNTER!=PWMH)&&(COUNTER==PWM)) { COUNTER=1; //计数器复位 P1_0=1; //P1.0 为高电平 } else if(COUNTER==PWMH) P1_0=0; //P1.0 变为低电平 } main() { PWMH=0x02; COUNTER=0x01; PWM=0x15; TMOD=0x02; TL0=0x38; TH0=0x38; ET0=1; EA=1; TR0=1; //高电平脉冲的个数 //PWM 周期//如果等于高电平脉冲数//定时器 0 在模式 2 下工作 //定时器每 200us 产生一次溢出 //自动重装的值 //使能定时器 0 中断 //使能总中断 //开始计时while(1) { if(P1_1==0) K1CHECK();//扫描 KEY1, if(P1_2==0) K2CHECK();//扫描 KEY2,如果按下 KEY2,跳转到 KEY2 处理程序 } } void K1CHECK()- 62 - { while(P1_1==0); if(PWMH!=PWM) { PWMH++; if(PWMH==PWM) { TR0=0; P1_0=1; } else { if(PWMH==0x02) { TR0=1; } } } } void K2CHECK() { unsigned char TEMP; while(P1_2==0); if(PWMH!=0x01) { PWMH--; TEMP=PWM; TEMP--; if(PWMH==0x01) { TR0=0; P1_0=0; } else { if(PWMH==TEMP) { TR0=1; } } } }- 63 -
更多搜索:
All rights reserved Powered by
文档资料库内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 stm32高低电平范围 的文章

 

随机推荐