52单片机调试程序

合集下载

51单片机串口调试程序

51单片机串口调试程序
/******************************************************************/
void UART_SER() interrupt 4
{
uchar Temp;//定义临时变量
if(RI)
{
RI=0;
//标志位清零
Temp=SBUF;
//读入缓冲区的值
#define uchar unsigned char
/******************************************************************//*名称:主函数*/
/*内容:打开串口调试程序,将波特率设置为9600,无奇偶校验*/
/*晶振11.0592MHz,发送和接收使用的格式相同,如都使用*/
打开串口调试?程序将波特率设置?为9600无奇偶校验晶振110592mh?z发送和接收使?用的格式相同?如都使用字符型格式在发送框输入?helloilovem?cu在接收框中同样可?以看到相同字?符说明设置和通?信正确波特率设置及?串口初始化define?baudra?te9600ul?define?fosc110592?00ul其中ul是不能省?略的代表长整型
//SM2=0->多级通信中使用的位,REN=1;
PCON=0;
if((PCON&0x80)==0x80) S_MOD=2;
TH1=256-(fosc*S_MOD)/(baudrate*12*32);//其中SMOD=0,
TL1=256-(fosc*S_MOD)/(baudrate*12*Байду номын сангаас2);
TR1=1;
P1=Temp;//把值输出到P1口,用于观察

单片机调试方案及流程

单片机调试方案及流程

单片机调试方案及流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 硬件连接:将 STM32 单片机开发板通过 USB 数据线连接到电脑。

基于STC52单片机的直流电机PWM调速系统

基于STC52单片机的直流电机PWM调速系统

实训报告实训名称直流电机调速试验系别电子与电气工程学院专业、班级09测控C1学生姓名、学号刘凡094821257 学生姓名、学号沈阳094821345 学生姓名、学号覃新造094820364 指导教师陈进实训地点16号楼212室实训日期2012 年5月20日基于STC52单片机的直流电机PWM调速系统摘要本文介绍一种基于STC52单片机控制的PWM直流电机脉宽调速系统。

系统以廉价的STC52单片机为控制核心,以直流电机为控制对象。

从系统的角度出发,对电路进行总体方案论证设计,确定电路各个的功能模块之间的功能衔接和接口设置,详细分析了各个模块的方案论证和参数设置。

整个系统利用52单片机的定时器产生1K左右的PWM脉冲,通过快速光耦6N137实现控制单元与驱动单元的强弱电隔离,采用4个9013和2个9012构成的H桥电路实现对直流电机的调速,用光电编码盘完成测速功能。

关键字STC52,PWM,光耦隔离,光电编码盘1前言1.1数字直流调速的意义现在电气传动的主要方向之一是电机调速系统采用微处理器实现数字化控制。

从上世纪80年代中后期起,世界各大电气公司如ABB、通用、西屋、西门子等都在竞相开发数字式调速传动装置,经过二十几年的发展,当前直流调速已发展到一个很高的技术水平:功率元件采用可控硅;控制板采用表面安装技术;控制方式采用电源换相、相位控制[1]。

特别是采用了微处理器及其他先进电力电子技术,使数字式直流调速装置在精度的准确性、控制性能的优良性和抗干扰的性能有很大的提高和发展,在国内外得到广泛的应用。

数字化直流调速装置作为目前最新控制水平的传动方式显示了强大优势。

全数字化直流调速系统不断升级换代,为工程应用和工业生产提供了优越的条件。

采用微处理器控制,使整个调速系统的数字化程度,智能化程度有很大改观;采用微处理器控制,使调速系统在结构上简单化,可靠性提高,操作维护变得简捷,电机稳态运行时转速精度等方面达到较高水平。

基于52单片机的智能温度控制程序

基于52单片机的智能温度控制程序

#include <reg52.h>#define uint unsigned int#define uchar unsigned charsbit SET=P3^1; //定义调整键sbit DEC=P3^2; //定义减少键sbit ADD=P3^3; //定义增加键sbit BEEP=P3^4; //定义蜂鸣器sbit fengshan=P3^0; // 定义风扇sbit jiare=P3^7; //定义加热sbit DQ=P3^6; //定义DS18B20总线I/Osbit DIAN=P0^7; //小数点bit shanshuo_st; //闪烁间隔标志bit beep_st; //蜂鸣器间隔标志uchar x=0; //计数器0signed char m; //温度值全局变量uchar n; //温度值全局变量uchar set_st=0; //状态标志signed char shangxian=38; //上限报警温度,默认值为38signed char xiaxian=5; //下限报警温度,默认值为5uchar code LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};void Delay(uint num); /*****延时子程序*****/void InitTimer(void); /*****初始化定时器0*****/void check_wendu(void); /*****读取温度*****/Disp_init(); /*****显示开机初始化等待画面*****/Disp_Temperature(); /*****显示温度子程序*****/Disp_alarm(uchar baojing); /*****显示报警温度子程序*****/void Alarm(void); /*****报警子程序*****/void Delay_DS18B20(int num); /*****延时子程序*****/void Init_DS18B20(void); /*****初始化DS18B20*****/unsigned char ReadOneChar(void); /*****读一个字节*****/void WriteOneChar(unsigned char dat); /*****写一个字节*****/unsigned int ReadTemperature(void); /*****读取温度*****/void jiare1(void); /****加热程序***/void fengshan1(void); /****风扇冷却程序***//*P2段选,P1位选*//////////////////////////////////*****主函数*****/void main(void){uint z;InitTimer(); //初始化定时器0EA=1; //全局中断开关TR0=1;ET0=1; //开启定时器0IT0=1;IT1=1;check_wendu();check_wendu();for(z=0;z<300;z++){Disp_init();}while(1){if(SET==0){Delay(2000);do{}while(SET==0);set_st++;x=0;shanshuo_st=1;if(set_st>2)set_st=0;}if(set_st==0){EX0=0; //关闭外部中断0EX1=0; //关闭外部中断1check_wendu();Disp_Temperature();Alarm(); //报警检测}else if(set_st==1){BEEP=1; //关闭蜂鸣器EX0=1; //开启外部中断0EX1=1; //开启外部中断1if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st){Disp_alarm(shangxian);} }else if(set_st==2){BEEP=1; //关闭蜂鸣器EX0=1; //开启外部中断0EX1=1; //开启外部中断1if(x>=10){shanshuo_st=~shanshuo_st;x=0;}if(shanshuo_st){Disp_alarm(xiaxian);}}jiare1(); /****加热程序***/fengshan1(); /****风扇冷却程序***/ }}///////*****延时子程序*****/void Delay(uint num){while(--num);}/*****初始化定时器0*****/void InitTimer(void){TMOD=0x01;TH0=(65536-50000)/256;//设置初值TL0=(65536-50000)%256;}/*****定时器0中断服务程序*****/void timer0(void) interrupt 1{TH0=(65536-50000)/256;//设置初值TL0=(65536-50000)%256;x++;}/*****外部中断0服务程序*****/void int0(void) interrupt 0 //设置下限温度{EX0=0; //关外部中断0if(DEC==0&&set_st==1){shangxian--;if(shangxian<xiaxian)shangxian=xiaxian;}else if(DEC==0&&set_st==2){xiaxian--;if(xiaxian<0)xiaxian=0;}}/*****外部中断1服务程序*****/void int1(void) interrupt 2{EX1=0; //关外部中断1if(ADD==0&&set_st==1){shangxian++;if(shangxian>99)shangxian=99;}else if(ADD==0&&set_st==2){xiaxian++;if(xiaxian>shangxian)xiaxian=shangxian;}}/*****读取温度*****/void check_wendu(void){uint a,b,c;c=ReadTemperature()-5; //获取温度值并减去DS18B20的温漂误差a=c/100; //计算得到十位数字b=c/10-a*10; //计算得到个位数字m=c/10; //计算得到整数位n=c-a*100-b*10; //计算得到小数位if(m<0){m=0;n=0;} //设置温度显示下限if(m>99){m=99;n=9;} //设置温度显示上限}/*****显示开机初始化等待画面*****/Disp_init(){P0=0xbf; //显示P2=0x7f;Delay(200);P2=0xbf;Delay(200);P2=0xdf;Delay(200);P2=0xef;Delay(200);P2=0xff; //关闭显示}/*****显示温度子程序*****/Disp_Temperature() //显示温度{P0=0xc6; //显示CP2=0x7f;Delay(300);P0=LEDData[n]; //显示个位P2=0xbf;Delay(300);P0=LEDData[m%10]; //显示十位DIAN=0; //显示小数点P2=0xdf;Delay(300);P0=LEDData[m/10]; //显示百位P2=0xef;Delay(300);P2=0xff; //关闭显示}/*****显示报警温度子程序*****/Disp_alarm(uchar baojing){P0=0xc6; //显示CP2=0x7f;Delay(200);P0=LEDData[baojing%10];//显示十位P2=0xbf;Delay(200);P0=LEDData[baojing/10];//显示百位P2=0xdf;Delay(200);if(set_st==1)P0=0x89;else if(set_st==2)P0=0xc7;//上限H、下限L标示P2=0xef;Delay(200);P2=0xff; //关闭显示}/*****报警子程序*****/void Alarm(void){if(x>=10){beep_st=~beep_st;x=0;}if((m>=shangxian&&beep_st==1)||(m<xiaxian&&beep_st==1))BEEP=0; else BEEP=1;}//////////////////////////////////////////////////////////////////*****延时子程序*****/void Delay_DS18B20(int num){while(num--);}/*****初始化DS18B20*****/void Init_DS18B20(void){unsigned char x=0;DQ=1; //DQ复位Delay_DS18B20(8); //稍做延时DQ=0; //单片机将DQ拉低Delay_DS18B20(80); //精确延时,大于480usDQ=1; //拉高总线Delay_DS18B20(14);x=DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败Delay_DS18B20(20);}/*****读一个字节*****/unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat=0;for(i=8;i>0;i--){DQ=0; //给脉冲信号dat>>=1;DQ=1; //给脉冲信号if(DQ)dat|=0x80;Delay_DS18B20(4);}return(dat);}/*****写一个字节*****/void WriteOneChar(unsigned char dat){unsigned char i=0;for(i=8;i>0;i--){DQ=0;DQ=dat&0x01;Delay_DS18B20(5);DQ=1;dat>>=1;}}/*****读取温度*****/unsigned int ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0x44); //启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器a=ReadOneChar(); //读低8位b=ReadOneChar(); //读高8位t=b;t<<=8;t=t|a;tt=t*0.0625;t=tt*10+0.5; //放大10倍输出并四舍五入return(t);}void jiare1(void){if(m<xiaxian)jiare=0;else jiare=1;}void fengshan1(void){if(m >shangxian)fengshan=0;else fengshan=1;}。

单片机AT89S52程序设计与调试-精品文档

单片机AT89S52程序设计与调试-精品文档

12 <<
5.2 C51程序设计

5.2.1 C51的程序结构
3 <
伪指令
伪指令是汇编程序能够识别并对汇编过程进行某种控 制的汇编命令。它不是单片机执行的指令,所以没有对应 的可执行目标码,汇编后产生的目标程序中不会再出现伪 指令。 1、起始地址设定伪指令: ORG 格式为:ORG 表达式 该指令的功能是向汇编器说明下面紧接的程序代码或常 数存放的起始地址(程序存储器地址)。在一个源程序中 ,可以多次使用ORG伪指令规定不同程序段或数据段存放 的起始地址,但要求地址值由小到大依序排列,不允许空 间重叠。 2、汇编结束伪指令: END 汇编程序遇到END伪指令后即结束汇编,处于END之 4 后的程序,汇编程序将不处理。
9 <
7、位地址赋值伪指令 BIT
符号名 BIT 表达式 功能是将表达式的值作为位地址赋给一个指定的符号 名。例如: SDA BIT P1.0 ; 数据输出 SCK BIT P1.1 ; 时钟输出 SHIFT_OUT: ; 移位输出子程序 MOV R6, #8 LP: RLC A MOV SDA, C SETB SCK NOP CLR SCK DJNZ R6, LP RET 10
ORG 1000H INT0_PROC: CLR IE0 … … END
; 所有汇编程序结束
5 <
3、字节数据定义伪指令 DB
[标号:] DB 字节数据表
功能是从标号指定的地址开始,在程序存储器中定义字 节数据。字节数据表可以是一个或多个字节数据、字符串或 表达式。该伪指令将字节数据表中的数据根据从左到右的顺 序依次存放在指定的存储单元中。一个数据占一个存储单元 。例如: ORG 500H DB 8,10,18 DB “ABC”

6050STC89C52单片机LCD调试程序

6050STC89C52单片机LCD调试程序

MPU6050?IIC 测试程序 ?使用单片机 STC89C52 晶振: 11.0592M 显示: LCD1602 功能:?显示加速度计和陀螺仪的 10 位原始数据************************************** #include<REG52.H> #include<math.h>#include<intrins.h> //Keil library #include <stdio.h> //Keil library #include <INTRINS.H> typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned int uint; /**************************************** 定义 51 单片机端口 ? ****************************************/ #define DataPort P0 sbit SCL=P1A 0; sbit SDA=P"1; sbit LCM_RS=P2A4; sbit LCM_RW=P2A5; sbit LCM_EN=P2A6;/**************************************** 定义 MPU6050 内部地址 ? ****************************************/ #define SMPLRT_DIV 0x19 #define CONFIG 0x1A #define GYRO_CONFIG 0x1B #define ACCEL_CONFIG 0x1C #define ACCEL_XOUT_H 0x3B#define ACCEL_XOUT_L 0x3C #define ACCEL_YOUT_H 0x3D #define ACCEL_YOUT_L 0x3E #define ACCEL_ZOUT_H 0x3F #define ACCEL_ZOUT_L 0x40 #defineTEMP_OUT_H 0x41 #define TEMP_OUT_L 0x42 #define GYRO_XOUT_H 0x43 #define GYRO_XOUT_L 0x44 #define GYRO_YOUT_H 0x45 #define GYRO_YOUT_L 0x46 #define GYRO_ZOUT_H 0x47 #define GYRO_ZOUT_L 0x48#define PWR_MGMT_1 0x6B // 电源,典型值: 0x00( 正常启用 ) #define WHO_AM 」0x75 〃IIC 地址寄存器(默认数值0x68,只读)? #define SlaveAddress 0xD0 //IIC 写入时的地址字节数据, +1 为读取 // 定义类型及变量 ?//****************************************? uchar dis[4];// 显示数字 (-511 至 512)的字符数组 int dis_data; // 变量//int?Temperature,Temp_h,Temp_l;? // 温度及高低位数据 ?//LCD1602 数据端口 //IIC 时钟引脚定义 //IIC 数据引脚定义 //LCD1602 命令端口 //LCD1602 命令端口 //LCD1602 命令端口//陀螺仪采样率,典型值: 0x07(125Hz)? // 低通滤波频率,典型值: 0x06(5Hz)? // 陀螺仪自检及测量范围,// 典型值: 0x18( 不自检, 2000deg/s)? // 加速计自检、测量范围及高通滤波频率 // 典型值: 0x01( 不自检, 2G ,5Hz)?// 函数声明?//****************************************?void delay(unsigned int k);〃延时LCD相关函数?void InitLcd(); // 初始化lcd1602?void lcd_printf(uchar *s,int temp_data);void WriteDataLCM(uchar dataW); //LCD 数据?void WriteCommandLCM(uchar CMD,uchar Attribc); //LCD 指令?void DisplayOneChar(uchar X,uchar Y,uchar DData); // 显示一个字符?void DisplayListChar(uchar X,uchar Y,uchar *DData,L); // 显示字符串MPU6050 操作函数void InitMPU6050(); // 初始化MPU6050?void Delay5us();void I2C_Start();void I2C_Stop();void I2C_SendACK(bit ack);bit I2C_RecvACK();void I2C_SendByte(uchar dat);uchar I2C_RecvByte();void I2C_ReadPage();void I2C_WritePage();void display_ACCEL_x();void display_ACCEL_y();void display_ACCEL_z();uchar Single_Readl2C(uchar REG_Address); /牍取 I2C数据?void Single_Writel2C(uchar REG_Address,uchar REG_data); //向I2C 写入数据// 整数转字符串?//****************************************?void lcd_printf(uchar *s,int temp_data){if(temp_data<0) {temp_data=-temp_data; *s='-';} else *s='?';*++s=temp_data/100+0x30; temp_data=temp_data%100; // 取余运算*++s=temp_data/10+0x30; temp_data=temp_data%10; // 取余运算*++s=temp_data+0x30; }〃****************************************// 延时*************************************** void delay(unsigned int k)//*{unsigned int i,j;for(i=0;i<k;i++){for(j=0;j<121;j++);}} //**************************************** //LCD1602 初始化//**************************************** void InitLcd() {WriteCommandLCM(0x38,1);WriteCommandLCM(0x08,1);WriteCommandLCM(0x01,1);WriteCommandLCM(0x06,1);WriteCommandLCM(0x0c,1);DisplayOneChar(0,0,'A');DisplayOneChar(0,1,'G');}//****************************************//LCD1602 写允许//**************************************** void WaitForEnable(void) {DataPort=0xff;LCM_RS=0;LCM_RW=1;_nop_();LCM_EN=1;_nop_();_nop_(); while(DataPort&0x80);LCM_EN=0;} //****************************************//LCD1602 写入命令void WriteCommandLCM(uchar CMD,uchar Attribc){if(Attribc) WaitForEnable();LCM_RS=0;LCM_RW=0;_nop_();DataPort=CMD;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0; }〃****************************************//LCD1602 写入数据?//****************************************void WriteDataLCM(uchar dataW){WaitForEnable();LCM_RS=1;LCM_RW=0;_nop_(); DataPort=dataW;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;} //**************************************** //LCD1602 写入一个字符?〃****************************************void DisplayOneChar(uchar X,uchar Y,uchar DData){Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;WriteCommandLCM(X,0);WriteDataLCM(DData); }//****************************************//LCD1602 显示字符串?〃****************************************void DisplayListChar(uchar X,uchar Y,uchar *DData,L) {uchar ListLength=0; Y&=0x1; X&=0xF;while(L--){DisplayOneChar(X,Y,DData[ListLength]);ListLength++;X++;}} //**************************************// 延时5 微秒(STC90C52RC@12M)// 不同的工作环境,需要调整此函数//当改用1T的MCU时,请调整此延时函数〃**************************************void Delay5us() {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}//**************************************?//I2C 起始信号//**************************************?void I2C_Start(){SDA=1; //拉高数据线SCL=1; //拉高时钟线Delay5us(); // 延时SDA=0; //产生下降沿Delay5us(); // 延时SCL=0; //拉低时钟线}//**************************************//I2C 停止信号〃**************************************void I2C_Stop(){SDA=0; //拉低数据线SCL=1; //拉高时钟线Delay5us();// 延时SDA=1; // 产生上升沿Delay5us(); // 延时}//**************************************//I2C 发送应答信号// 入口参数://ack(0:ACK 1:NAK)〃**************************************void I2C_SendACK(bit ack) {SDA=ack; // 写应答信号SCL=1; //拉高时钟线Delay5us(); // 延时SCL=0; //拉低时钟线Delay5us(); // 延时}//I2C 接收应答信号//**************************************?bit I2C_RecvACK(){SCL=1;//拉高时钟线Delay5us(); // 延时CY=SDA; //读应答信号SCL=0; //拉低时钟线Delay5us(); // 延时return CY;}//**************************************?//向I2C总线发送一个字节数据?//**************************************?void I2C_SendByte(uchar dat){uchar i;for(i=0;i<8;i++) // 8 位计数器{dat<<=1; //移出数据的最高位SDA=CY; //送数据口SCL=1; //拉高时钟线Delay5us(); // 延时SCL=0; //拉低时钟线Delay5us(); // 延时}I2C_RecvACK();}//从I2C总线接收一个字节数据?//**************************************?uchar I2C_RecvByte() {uchar i;uchar dat=0;SDA=1; // 使能内部上拉,准备读取数据for(i=0;i<8;i++)// 8 位计数器{dat<<=1;SCL=1; // 拉高时钟线Delay5us();// 延时dat|=SDA; // 读数据SCL=0; //拉低时钟线Delay5us(); // 延时}return dat;}//**************************************?//向I2C设备写入一个字节数据?//**************************************?void Single_WriteI2C(uchar REG_Address,uchar REG_data){I2C_Start(); // 起始信号I2C_SendByte(SlaveAddress); //发送设备地址+写信号I2C_SendByte(REG_Address); // 内部寄存器地址,I2C_SendByte(REG_data); // 内部寄存器数据,I2C_Stop(); // 发送停止信号}//**************************************?// 从I2C 设备读取一个字节数据?//**************************************?uchar Single_ReadI2C(uchar REG_Address){uchar REG_data;I2C_Start();// 起始信号??I2C_SendByte(SlaveAddress); // 发送设备地址+写信号??I2C_SendByte(REG_Address); //发送存储单元地址,从0 开始??I2C_Start(); //起始信号?I2C_SendByte(SlaveAddress+1); //发送设备地址+读信号REG_data=I2C_RecvByte(); //读出寄存器数据??I2C_SendACK(1); //接收应答信号I2C_Stop(); //停止信号return REG_data;}// 初始化MPU6050?//**************************************?void InitMPU6050(){Single_WriteI2C(PWR_MGMT_1,0x00); // 解除休眠状态Single_WriteI2C(SMPLRT_DIV,0x07);Single_WriteI2C(CONFIG,0x06);Single_WriteI2C(GYRO_CONFIG,0x18);Single_WriteI2C(ACCEL_CONFIG,0x01);}// 合成数据?//**************************************?int GetData(uchar REG_Address) {char H,L;H=Single_ReadI2C(REG_Address); L=Single_ReadI2C(REG_Address+1); return(H<<8)+L; // 合成数据}//**************************************? // 在1602 上显示10 位数据?列1H ><二**************************************QvoidDisp-aylOBifDasinfva-ueccharxcchary)宀Va_uen640>福£l o a蒲議-cdlprinff(disyv a -u e)y />^^^J E ^lDisp_ayLisfchar(xydis4)wm^^〉WWoidmain()宀de-ay(500)八、/ 一曲恋肆 _ni 产cd()-二藩sm裆毬去_nifMPU6050()s裆毬去 MPU6050de-ay(150)八whi-es宀Disp_ay 」OBifDa5r(GefDa5r(ACCELIXOUTIH)2o=脣引X*§口隔wDisp_ay 」0BifDa5r(GefDa5r(ACCELIYOUTIH)j o r 脣引 Y *§口廊w Disp_ay 」0BifDa5r(GefDaQr(ACCELIZOUTIH二20)-匡引z *§口iw wDisp_ay 」0BifDa5r(GefDaQr(GYROIXOUTIH)2DDisp_ay 」0BifDa5r(GefDa5r(GYROIYOUTIH)sDV和引 Y^d B wDisp-ayloBifDasGefDasGYROIZOUTIH二23-=削引 N盘>lw wde-ay(500)八。

单片机程序调试步骤

单片机程序调试步骤

步骤:①首先建立工程项目文件;②为工程选择目标器件(如TA89S52);③工程项目设置软硬件调试环境;④创建源程序文件并输入程序代码;⑤保存创建的源程序项目文件;⑥把源程序文件添加到项目中;第一步:建立工程项目文件双击桌面Keil uVision3.LNK快捷图标得到图1KEIL 图在打开的下界面中点工程项得到图2。

图1打开工程下拉菜单,选择点击“新建工程“,首先在这里要新建一个工程项目文件。

图2为工程文件取一个名称,确定选择存放的路径(事先为每一个工程单独建立一个目录),在建立工程时形成的所有文件全部存放在这个目录下,如起工程名y2(此时不加后缀),保存类型选择 Project Files(*.uv2)点保存选择新建图3接下来选择CPU驱动芯片,如AT89S52芯片,然后点确定。

图4这时提示:复制标准的8051开始代码到工程项目文件夹或添加文件到工程项目文件夹?(如果选择Y之后将会产生一个STARTUP文件,对我们实验是一个无用的文件,会在个别计算机上会导致不能创建目标文件,同时会产生一个空白的工程项目文件),选择N之后只建立一个空白的工程项目文件,我们选N便于操作。

至此用户就完成了建立一个空白的工程项目文件,并为工程选好了目标器件,但却是空白的工程项目文件。

第二步:建立源文件在界面中打开文件下拉菜单,在打开的选项中点“新建”,产生一个新建空白文件。

点新图1在新建空白文件中输入源程序文件图3在确认源程序无错时点保存,这时界面上弹出提示“另存为”菜单,选择好保存路径,也就是刚才保存建立工程项目文件的目录路径,输入文件名,如(要有后缀,汇编程序是*.asm),然后点击保存。

图4这时仅仅是完成了汇编程序的建立而已,但汇编程序与工程项目文件现在还没建立任何关系,此时应把源程序文件添加到工程中,构成一个完整的工程项目。

第三步:将源程序文件添加到工程项目中在左侧Project Windows窗口内右击 Source Group1,在弹出下拉菜单中选种Add Files to Group‘Source Group1’(向工程中添加源文件)命令,点arget选择图5在弹出的菜单栏中点文件类型一栏下拉菜单,选Asm Source Files (*.a*:*.src:*.a*)即(汇编程序),文件框中选择将刚才创建的源程序文件然后点Add,这时在文件名框后出现刚才选中文件,在点击CLOSE完成源程序文件向工程项目的添加。

单片机程序调试步骤

单片机程序调试步骤

步骤:①首先建立工程项目文件;②为工程选择目标器件(如TA89S52);③工程项目设置软硬件调试环境;④创建源程序文件并输入程序代码;⑤保存创建的源程序项目文件;⑥把源程序文件添加到项目中;第一步:建立工程项目文件双击桌面Keil uVision3.LNK快捷图标得到图1KEIL 图标在打开的下界面中点工程项得到图2。

图1打开工程下拉菜单,选择点击“新建工程“,首先在这里要新建一个工程项目文件。

图2为工程文件取一个名称,确定选择存放的路径(事先为每一个工程单独建立一个目录),在建立工程时形成的所有文件全部存放在这个目录下,如起工程名y2(此时不加后缀),保存类型选择 ProjectFiles(*.uv2)点保存选择新建工图3接下来选择CPU驱动芯片,如AT89S52芯片,然后点确定。

图4这时提示:复制标准的8051开始代码到工程项目文件夹或添加文件到工程项目文件夹?(如果选择Y之后将会产生一个STARTUP文件,对我们实验是一个无用的文件,会在个别计算机上会导致不能创建目标文件,同时会产生一个空白的工程项目文件),选择N之后只建立一个空白的工程项目文件,我们选N便于操作。

至此用户就完成了建立一个空白的工程项目文件,并为工程选好了目标器件,但却是空白的工程项目文件。

第二步:建立源文件在界面中打开文件下拉菜单,在打开的选项中点“新建”,产生一个新建空白文件。

点新建图1在新建空白文件中输入源程序文件图3在确认源程序无错时点保存,这时界面上弹出提示“另存为”菜单,选择好保存路径,也就是刚才保存建立工程项目文件的目录路径,输入文件名,如(要有后缀,汇编程序是*.asm),然后点击保存。

图4这时仅仅是完成了汇编程序的建立而已,但汇编程序与工程项目文件现在还没建立任何关系,此时应把源程序文件添加到工程中,构成一个完整的工程项目。

第三步:将源程序文件添加到工程项目中在左侧Project Windows窗口内右击 Source Group1,在弹出下拉菜单中选种 Add Files to Group‘Source Group1’(向工程中添加源文件)命令,点Target,选右键点Source选择图5在弹出的菜单栏中点文件类型一栏下拉菜单,选Asm Source Files(*.a*:*.src:*.a*)即(汇编程序),文件框中选择将刚才创建的源程序文件然后点Add,这时在文件名框后出现刚才选中文件,在点击CLOSE完成源程序文件向工程项目的添加。

单片机AT89S52程序设计与调试

单片机AT89S52程序设计与调试

THANKS FOR WATCHING
感谢您的观看
单片机AT89S52程序设计与调试
目 录
• 单片机AT89S52简介 • 程序设计与开发 • 硬件接口与外设编程 • 调试技术与方法 • 实际应用案例分析
01 单片机AT89S52简介
AT89S52的特性与参数
8位微控制器 20个引脚 8KB的Flash存储器
AT89S52的特性与参数
工作电压范围:4.0V至5.5V
计数器
用于对外界事件进行计数,如外部脉冲、按钮按下等。
中断系统编程
外部中断
01
当单片机接收到外部信号时,触发中断。
定时器中断
02
当定时器溢出时,触发中断。
串行通信中断
03
当串行通信接收到数据时,触发中断。
串行通信接口编程
串行通信协议
遵循一定的通信协议,如RS232、RS485 等。
VS
Hale Waihona Puke 数据发送与接收32个I/O端口
256字节的RAM
01
03 02
AT89S52的特性与参数
01
工作频率:0Hz至40MHz
02
内部时钟振荡器
03
看门狗定时器
AT89S52的特性与参数
01
三个定时器/计 数器
02
串行通信接口
数据指针
03
04
掉电模式和空 闲模式
AT89S52的应用领域
智能仪表
01
02
工业控制
智能家居
检查代码语法错误、逻辑错误等。
仿真测试
在仿真环境中测试代码功能。
实际硬件测试
将代码下载到单片机中,进行实际硬件测试。

基于STC89C52RC的TSL2561调试程序

基于STC89C52RC的TSL2561调试程序

基于STC89C52RC的TSL2561调试程序/////////////////////////////////////////////////Config.h文件////////////////////////////////////////////////////////#ifndef _CONFIG_H#define _CONFIG_H/* 通用头文件*/#include#include/* 数据类型定义*//*typedef signed char int8; // 8位有符号整型数typedef signed int int16; //16位有符号整型数typedef signed long int32; //32位有符号整型数*/typedef unsigned char u8; // 8位无符号整型数typedef unsigned int u16; //16位无符号整型数typedef unsigned long u32; //32位无符号整型数/* 全局运行参数定义*/#define SYS_MCLK (11059200/12) //系统主时钟频率,即振荡器频率÷12 /* IO引脚分配定义sbit KEY_IN_1 = P2^4; //矩阵按键的扫描输入引脚1sbit KEY_IN_2 = P2^5; //矩阵按键的扫描输入引脚2sbit KEY_IN_3 = P2^6; //矩阵按键的扫描输入引脚3sbit KEY_IN_4 = P2^7; //矩阵按键的扫描输入引脚4sbit KEY_OUT_1 = P2^3; //矩阵按键的扫描输出引脚1sbit KEY_OUT_2 = P2^2; //矩阵按键的扫描输出引脚2sbit KEY_OUT_3 = P2^1; //矩阵按键的扫描输出引脚3sbit KEY_OUT_4 = P2^0; //矩阵按键的扫描输出引脚4 */sbit ADDR0 = P1^0; //LED位选译码地址引脚0sbit ADDR1 = P1^1; //LED位选译码地址引脚1sbit ADDR2 = P1^2; //LED位选译码地址引脚2sbit ADDR3 = P1^3; //LED位选译码地址引脚3sbit ENLED = P1^4; //LED显示部件的总使能引脚#define LCD12864_DB P0 //1602液晶数据端口sbit LCD12864_RES = P1^0; //1602液晶指令/数据选择引脚sbit LCD12864_RW = P1^1; //1602液晶读写引脚sbit LCD12864_EN = P1^5; //1602液晶使能引脚sbit DS1302_CE = P1^7; //DS1302片选引脚sbit DS1302_CK = P3^5; //DS1302通信时钟引脚sbit DS1302_IO = P3^4; //DS1302通信数据引脚sbit I2C_SCL = P2^7; //I2C总线时钟引脚sbit I2C_SDA = P2^6; //I2C总线数据引脚sbit BUZZER = P1^6; //蜂鸣器控制引脚sbit IO_18B20 = P3^2; //DS18B20通信引脚sbit IR_INPUT = P3^3; //红外接收引脚#include "LCD12864.H"#include "I2C.H"#include "TSL2561.h"#endif///////////////////////////////////////////////I2C通信协议////////////////////////////////////////////////#include "config.h"#define I2CDelay() {_nop_();_nop_();_nop_();_nop_();}/* 产生总线起始信号*/void I2CStart(){I2C_SDA = 1; //首先确保SDA、SCL都是高电平I2C_SCL = 1;I2CDelay();I2C_SDA = 0; //先拉低SDAI2CDelay();I2C_SCL = 0; //再拉低SCL}/* 产生总线停止信号*/void I2CStop(){I2C_SCL = 0; //首先确保SDA、SCL都是低电平I2C_SDA = 0;I2CDelay();I2C_SCL = 1; //先拉高SCLI2CDelay();I2C_SDA = 1; //再拉高SDAI2CDelay();/* I2C总线写操作,dat-待写入字节,返回值-从机应答位的值*/ bit I2CWrite(unsigned char dat){bit ack; //用于暂存应答位的值unsigned char mask; //用于探测字节内某一位值的掩码变量for (mask=0x80; mask!=0; mask>>=1) //从高位到低位依次进行{if ((mask&dat) == 0) //该位的值输出到SDA上I2C_SDA = 0;elseI2C_SDA = 1;I2CDelay();I2C_SCL = 1; //拉高SCLI2CDelay();I2C_SCL = 0; //再拉低SCL,完成一个位周期}I2C_SDA = 1; //8位数据发送完后,主机释放SDA,以检测从机应答I2CDelay();I2C_SCL = 1; //拉高SCLack = I2C_SDA; //读取此时的SDA值,即为从机的应答值I2CDelay();I2C_SCL = 0; //再拉低SCL完成应答位,并保持住总线return (~ack); //应答值取反以符合通常的逻辑://0=不存在或忙或写入失败,1=存在且空闲或写入成功}/* I2C总线读操作,并发送非应答信号,返回值-读到的字节*/unsigned char I2CReadNAK(){unsigned char mask;unsigned char dat;I2C_SDA = 1; //首先确保主机释放SDAfor (mask=0x80; mask!=0; mask>>=1) //从高位到低位依次进行{I2CDelay();I2C_SCL = 1; //拉高SCLif(I2C_SDA == 0) //读取SDA的值dat &= ~mask; //为0时,dat中对应位清零elsedat |= mask; //为1时,dat中对应位置1I2CDelay();I2C_SCL = 0; //再拉低SCL,以使从机发送出下一位}I2C_SDA = 1; //8位数据发送完后,拉高SDA,发送非应答信号I2CDelay();I2C_SCL = 1; //拉高SCLI2CDelay();I2C_SCL = 0; //再拉低SCL完成非应答位,并保持住总线return dat;}/* I2C总线读操作,并发送应答信号,返回值-读到的字节* unsigned char I2CReadACK(){unsigned char mask;unsigned char dat;I2C_SDA = 1; //首先确保主机释放SDAfor (mask=0x80; mask!=0; mask>>=1) //从高位到低位依次进行{I2CDelay();I2C_SCL = 1; //拉高SCLif(I2C_SDA == 0) //读取SDA的值dat &= ~mask; //为0时,dat中对应位清零elsedat |= mask; //为1时,dat中对应位置1I2CDelay();I2C_SCL = 0; //再拉低SCL,以使从机发送出下一位}I2C_SDA = 0; //8位数据发送完后,拉低SDA,发送应答信号I2CDelay();I2C_SCL = 1; //拉高SCLI2CDelay();I2C_SCL = 0; //再拉低SCL完成应答位,并保持住总线return dat;} */////////////////////////////////////////////////LCD12864显示//////////////////////////////////////////////////#include "config.h"u8 zhbuf[]={"预览"}; //中文数组u8 ehbuf[]={"yulan"}; //英文字符数组u8 code imbuf[]={ //图片码128*64 宽16,高320x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00,0x00,0x00, };/*写等待*/void Write_Ready(){u8 sta=0;LCD12864_RES = 0;LCD12864_RW = 1;do{LCD12864_EN = 1;sta = P0;LCD12864_EN = 0;}while(sta&0x80);}/*读RAM中数据*/u8 Read_12864_RAM(){u8 ram=0;LCD12864_RES = 1;LCD12864_RW = 1;LCD12864_EN = 1;ram = P0;LCD12864_EN = 0;return ram;}/*写指令*/void Write_12864_Cmd(u8 cmd){Write_Ready();LCD12864_RES = 0;LCD12864_RW = 0;P0 = cmd;LCD12864_EN = 1;LCD12864_EN = 0;}/*写数据*/void Write_12864_Dat(u8 dat){Write_Ready();LCD12864_RES = 1;LCD12864_RW = 0;P0 = dat;LCD12864_EN = 1;LCD12864_EN = 0;}/*设置起始坐标*/void Set_DDRAM_XY(u8 x,u8 y){if(x>=7)x=7;if(y>=3)y=3;switch(y){case 0:Write_12864_Cmd(0x80+x);break; case 1:Write_12864_Cmd(0x90+x);break; case 2:Write_12864_Cmd(0x88+x);break;case 3:Write_12864_Cmd(0x98+x);break;default : break;}}/*显示连续的2个字符*/void Show_Double_12864_Char(u8 x,u8 y,u8 *c) { Set_DDRAM_XY(x,y);Write_12864_Dat(*c);Write_12864_Dat(*(c+1));}/*显示单个字符*/void Show_Single_12864_Char(u8 x,u8 y,u8 *c) { Set_DDRAM_XY(x,y);Write_12864_Dat(*c);}/*显示中文字符串*/void Show_12864_ZH(u8 x,u8 y,u8 *zh){u8* p=zh;Set_DDRAM_XY(x,y);while((*p)!='\0'){Write_12864_Dat(*p++);}}/*显示一串数值*//*u8 dec 小数位为0不显示小数*/void Show_12864_NUM(u8 x,u8 y,u8 dec,u16 num) {u8 i;u8 numbuf[6];for(i=0;num;i++){numbuf[i]=num%10+'0';num/=10;}Set_DDRAM_XY(x,y);for(;i;i--){if(i==dec){Write_12864_Dat(0X2E); //显示小数点}Write_12864_Dat(*(numbuf+(i-1))); //显示数值}}/*显示英文字符串*/void Show_12864_EH(u8 x,u8 y,u8 *eh){u8* p=eh;Set_DDRAM_XY(x,y);while((*p)!='\0'){Write_12864_Dat(*p++);}}/*显示图案*/void Show_12864_IM(u8 code *im){unsigned char x,y,i;unsigned int tmp=0;for(i=0;i<9;){ //分两屏,上半屏和下半屏,因为起始地址不同,需要分开for(x=0;x<32;x++){ //32行Write_12864_Cmd(0x34);Write_12864_Cmd(0x80+x);//列地址Write_12864_Cmd(0x80+i); //行地址,下半屏,即第三行地址0X88Write_12864_Cmd(0x30);for(y=0;y<16;y++)Write_12864_Dat(im[tmp+y]);//读取数据写入LCDtmp+=16;}i+=8;}Write_12864_Cmd(0x36); //扩充功能设定Write_12864_Cmd(0x30);}/*初始化12864*/void Init_Lcd12864(){Read_12864_RAM();Show_Single_12864_Char(0,0,'A');Show_Double_12864_Char(0,0,"AB");Show_12864_NUM(0,0,1,123);Show_12864_ZH(0,0,"预览");Show_12864_EH(0,0,"yulan");Show_12864_IM(imbuf);Write_12864_Cmd(0X30); //8位数据,基本指令Write_12864_Cmd(0X0C); //开显示,关游标Write_12864_Cmd(0X01); //清屏Write_12864_Cmd(0X02); //地址归位Write_12864_Cmd(0X80); //设置DDRAM地址}////////////////////////////////////////////////////////////TSL2561代码//////////////////////////////////////////////////#include "config.h"/*初始化TSL2561*/void Init_TSL2561(){TSL2561_Write(0X80|TSL2561_CONTROL,0x03); //选择控制寄存器//工作模式TSL2561_Write(0X80|TSL2561_TIME,0x01); //选择转换时间控制寄存器}/*读TSL2561寄存器中的数据,addr是寄存器地址*/u8 TSL2561_Read(u8 addr){u8 lx=0;I2CStart();I2CWrite(TSL2561_WR); //选择TSL2561I2CWrite(0X80|addr); //选择寄存器。

基于ST89C52单片机的自动往返小车(含程序)

基于ST89C52单片机的自动往返小车(含程序)

基本原理:1.电机驱动调速模块 方案一:采用电阻网络或数字电位器调整电动机的分压,从而达到调速的目的。

但是电阻络只能实现有级调速,而数字电阻的元器件价格昂贵。

更主要的问题在于一般电动机的电阻较小,但电流很大;分压不仅会降低效率,而且很难实现。

方案二:采用继电器对电动机的开或关进行控制,通过开关的切换对小车的速度进行调整。

方案的优点是电路较为简单,缺点是继电器的响应时间慢,机械结构易损坏,寿命较短,可靠性不高。

方案三:采用达林顿管TIP4组成的PWM 电路。

用单片机控制达林顿管使之工作在占空比可调的状态,精确调整电机转速。

方案四:采用L298N 来控制电机的正转和反转来实现小车的前进和后退。

加上单片机的程序PWM ,实现整车的加速和减速,精确小车的速度。

基于上述理论分析,拟选择方案四。

2.路面黑带检测模块黑带检测的原理是:红外光线照射到路面并反射,由于黑带和白纸的系数不同,可根据接的红外线的强弱判断是否到达黑带。

方案一:可见光发光二极管和光敏二极管组成的发射—接收电路。

这种方案的缺点在于其他环境光源会对光敏二极管的工作产生很大的干扰,一旦外界光亮条件改变,很可能造成误判和漏判;虽然产生超高亮发光二极管可以降低一定的干扰,但这又将增加额外的功率损耗。

方案二:反射式的红外发射—接收器。

由于采用红外管代替普通可见光管,可以降单片机黑带检测路程和时间显示LED 显示路程,时间L298N 电机驱动模块低环境干扰。

基于上述理论分析,拟选择方案二。

3. 电源选择方案一:所有器件采用电源供电,这样供电电路比较简单;但是由于电动机启动瞬时电流很大,会造成电压不稳,干扰严重,缺点十分明显。

方案二:双电源供电,将电动机驱动电源和单片机以及周边电路电源完全隔离,这样做虽然不如单电源方便灵活,但可以将电动机驱动所造成的干扰彻底消除,提高了系统的稳定性。

基于上述理论分析,拟选择方案二。

4. 控制单元模块方案一:采用纯数字电路该方案外部检测采用光电转换,系统控制部分采用数字电路译码对小车电动机两端电压调整,来控制小车的运行。

关于52单片机驱动74HC595控制LCD1602的程序文件

关于52单片机驱动74HC595控制LCD1602的程序文件

关于52单片机驱动74HC595控制LCD1602的程序谁能帮忙写个52单片机驱动74hc595控制LCD1602的程序#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define LcdBus P0sbit LED1602_RS=P2^6; //LCD端口定义sbit LED1602_RW=P2^5 ;sbit LED1602_EN=P2^4 ;void LcdIni(void);void WrOp(uchar dat);void WrDat(uchar dat);void ChkBusy(void);void print_LCD(uchar disp[],uchar num);//延时n ms子程序void delayms(unsigned int n){unsigned int i,j;for(i=0;i<n;i++)for(j=0;j<120;j++);}main(){uchar disp1[16]={'S','u','n','J','i','e',' ','m','a','d','e',' ','a','t',' ',' '};uchar disp2[16]={'2','0','0','8',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};while(1){LcdIni();WrOp(0x80); //数据指针地址第一行print_LCD(disp1,16);WrOp(0xc0); //第二行print_LCD(disp2,4);delayms(3000);WrOp(0x01);}}/**************************************************************************************** **名称:led1602显示程序模块功能:驱动1602 包括数据口P1 三个控制口编译:keil杰时间:2008-8-9**************************************************************************************** ***/void print_LCD(uchar disp[],uchar num) //显示数组disp 显示长度为num {uchar i;for(i=0;i<num;i++){WrDat(disp[i]);delayms(300);}}void LcdIni(){WrOp(0x38);WrOp(0x06); //光标加1WrOp(0x0f); //开显示光标闪烁// WrOp(0x0c); //开显示光标不闪烁}void WrOp(uchar dat){//uchar i;ChkBusy();LED1602_RS=0; //RS=0LED1602_RW=0; //RW=0LED1602_EN=0; //EN=0LcdBus=dat; //送数据LED1602_EN=1; //EN=1delayms(10); //延时LED1602_EN=0; //EN=0}void WrDat(uchar dat){//uchar i;ChkBusy();LED1602_RS=1; //rs=1LED1602_RW=0; //rw=0LED1602_EN=0; //en=0LcdBus=dat; //送数据LED1602_EN=1; //en=1delayms(10);; //延时LED1602_EN=0; //en=0}void ChkBusy(){LED1602_RS=0; //RS=0LED1602_RW=1; //RW=1LED1602_EN=1; //EN=1while(LcdBus&0x80); //送数据LED1602_EN=0; //en=0}74hc595驱动问题#define uc unsigned char#define ui unsigned int#include<iom128v.h>uc Bmp[]={/*------------------------------------------------------------------------------ ; 源文件/ 文字:; 宽×高(像素): 64×8; 字模格式/大小: 单色点阵液晶字模,横向取模,字节正序/64字节; 数据转换日期: 2009-4-7 11:11:41------------------------------------------------------------------------------*/0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x10, 0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04, 0x04,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01};uc B1[8]={0};uc B2[8]={0};void delay(ui n) //延时函数{ui j;ui i;for(i=0;i<n;i++)for(j=0;j<20;j++);}void H_B1(uc h) //十六进制转换为二进制,转换后放在数组B1中{B1[7]=h&0x01;B1[6]=h&0x02;B1[5]=h&0x04;B1[4]=h&0x08;B1[3]=h&0x10;B1[2]=h&0x20;B1[1]=h&0x40;B1[0]=h&0x80;}void H_B2(uc h) //十六进制转换为二进制,转换后放在数组B2中{B2[0]=h&0x01;B2[1]=h&0x02;B2[2]=h&0x04;B2[3]=h&0x08;B2[4]=h&0x10;B2[5]=h&0x20;B2[6]=h&0x40;B2[7]=h&0x80;}void print(void) //扫描函数{uc byte=0;uc j=0;uc row=7; //扫第一行uc column;uc bit=0;uc h=0;PORTD=row; //行数赋给PDH_B1(Bmp[0]);while(1){for(row=7;row!=0xff;row--){PORTD=row; //行数赋给PDPORTF=0X00; //给一个扫描点PORTC=0xff;PORTC=0x00;PORTF=0XFF;for(byte=0;byte<8;byte++){H_B1(Bmp[byte+j]);for(bit=0;bit<8;bit++){//delay(2000);PORTC=0xff; //时钟上升沿//delay(1000);if(B1[bit]==0) PORTE=0Xff;//如果该点不应亮则74_138输出高阻else {PORTE=0X00; delay(40);}//否则输出低电平PORTF=0XFF; //扫描点后面通通熄灭//delay(2000);PORTC=0x00; //时钟下降沿}PORTG=0Xff;//delay(2000);PORTG=0X00;//bit=0;}j+=8;byte=0;}j=0;}}void main(void){DDRC=0XFF; //PC口为时钟输出DDRD=0XFF; //PD为行选,连74_138的ABC输入端DDRF=0XFF; //PF为列选,扫描点,接74_595的DS端DDRE|=0X80; //PE7为输出,74_138使能控制,低电平有效DDRG =0Xff;PORTG=0X00;PORTE=0XFF; delay(5000); PORTE=0X00; //开机信号//PORTE=0X00;print();}这是我刚写的一个64*8的点阵扫描程序用74HC595做行选,但是没用锁存,可以显示,但亮度很低。

关于52单片机驱动74HC595控制LCD1602的程序

关于52单片机驱动74HC595控制LCD1602的程序

关于52单片机驱动74HC595控制LCD1602的程序谁能帮忙写个52单片机驱动74hc595控制LCD1602的程序#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define LcdBus P0sbit LED1602_RS=P2^6; //LCD端口定义sbit LED1602_RW=P2^5 ;sbit LED1602_EN=P2^4 ;void LcdIni(void);void WrOp(uchar dat);void WrDat(uchar dat);void ChkBusy(void);void print_LCD(uchar disp[],uchar num);//延时n ms子程序void delayms(unsigned int n){unsigned int i,j;for(i=0;i<n;i++)for(j=0;j<120;j++);}main(){uchar disp1[16]={'S','u','n','J','i','e',' ','m','a','d','e','','a','t',' ',' '};uchar disp2[16]={'2','0','0','8',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};while(1){LcdIni();WrOp(0x80); //数据指针地址第一行print_LCD(disp1,16);WrOp(0xc0); //第二行print_LCD(disp2,4);delayms(3000);WrOp(0x01);}}/******************************************************************** **********************名称:led1602显示程序模块功能:驱动1602 包括数据口 P1 三个控制口编译:keil作者:孙杰时间:2008-8-9********************************************************************* **********************/void print_LCD(uchar disp[],uchar num) //显示数组disp 显示长度为num {uchar i;for(i=0;i<num;i++){WrDat(disp[i]);delayms(300);}}void LcdIni(){WrOp(0x38);WrOp(0x06); //光标加1WrOp(0x0f); //开显示光标闪烁// WrOp(0x0c); //开显示光标不闪烁}void WrOp(uchar dat){//uchar i;ChkBusy();LED1602_RS=0; //RS=0LED1602_RW=0; //RW=0LED1602_EN=0; //EN=0LcdBus=dat; //送数据LED1602_EN=1; //EN=1delayms(10); //延时LED1602_EN=0; //EN=0}void WrDat(uchar dat){//uchar i;ChkBusy();LED1602_RS=1; //rs=1LED1602_RW=0; //rw=0LED1602_EN=0; //en=0LcdBus=dat; //送数据LED1602_EN=1; //en=1delayms(10);; //延时LED1602_EN=0; //en=0}void ChkBusy(){LED1602_RS=0; //RS=0LED1602_RW=1; //RW=1LED1602_EN=1; //EN=1while(LcdBus&0x80); //送数据LED1602_EN=0; //en=0}74hc595驱动问题#define uc unsigned char#define ui unsigned int#include<iom128v.h>uc Bmp[]={/*------------------------------------------------------------------------------; 源文件 / 文字 :; 宽×高(像素): 64×8; 字模格式/大小 : 单色点阵液晶字模,横向取模,字节正序/64字节; 数据转换日期 : 2009-4-7 11:11:41------------------------------------------------------------------------------*/0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x40,0x40,0x40,0x40,0x40,0x40 ,0x40,0x40,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x10 ,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04 ,0x04,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01 ,0x01,0x01};uc B1[8]={0};uc B2[8]={0};void delay(ui n) //延时函数{ui j;ui i;for(i=0;i<n;i++)for(j=0;j<20;j++);}void H_B1(uc h) //十六进制转换为二进制,转换后放在数组B1中{B1[7]=h&0x01;B1[6]=h&0x02;B1[5]=h&0x04;B1[4]=h&0x08;B1[3]=h&0x10;B1[2]=h&0x20;B1[1]=h&0x40;B1[0]=h&0x80;}void H_B2(uc h) //十六进制转换为二进制,转换后放在数组B2中{B2[0]=h&0x01;B2[1]=h&0x02;B2[2]=h&0x04;B2[3]=h&0x08;B2[4]=h&0x10;B2[5]=h&0x20;B2[6]=h&0x40;B2[7]=h&0x80;}void print(void) //扫描函数{uc byte=0;uc j=0;uc row=7; //扫第一行uc column;uc bit=0;uc h=0;PORTD=row; //行数赋给PDH_B1(Bmp[0]);while(1){for(row=7;row!=0xff;row--){PORTD=row; //行数赋给PDPORTF=0X00; //给一个扫描点PORTC=0xff;PORTC=0x00;PORTF=0XFF;for(byte=0;byte<8;byte++){H_B1(Bmp[byte+j]);for(bit=0;bit<8;bit++){//delay(2000);PORTC=0xff; //时钟上升沿//delay(1000);if(B1[bit]==0) PORTE=0Xff;//如果该点不应亮则74_138输出高阻else {PORTE=0X00; delay(40);}//否则输出低电平PORTF=0XFF; //扫描点后面通通熄灭//delay(2000);PORTC=0x00; //时钟下降沿}PORTG=0Xff;//delay(2000);PORTG=0X00;//bit=0;}j+=8;byte=0;}j=0;}}void main(void){DDRC=0XFF; //PC口为时钟输出DDRD=0XFF; //PD为行选,连74_138的ABC输入端DDRF=0XFF; //PF为列选,扫描点,接74_595的DS端DDRE|=0X80; //PE7为输出,74_138使能控制,低电平有效 DDRG =0Xff;PORTG=0X00;PORTE=0XFF; delay(5000); PORTE=0X00; //开机信号//PORTE=0X00;print();}这是我刚写的一个64*8的点阵扫描程序用74HC595做行选,但是没用锁存,可以显示,但亮度很低。

S52单片机学习开发板使用说明书

S52单片机学习开发板使用说明书

单片机开发板使用说明书免责声明....................................................................................................... 前言 (6)使用前准备 (6)1 开发板安装和连接 (6)1.1 供电线和下载线连接 (7)1.1.1 AT89S5X 芯片 (7)1.1.2 STC89C5X 芯片 (7)1.1.3 Atmega16 芯片 (7)1.1.4 Atmega8 芯片 (7)2 芯片安装与拔插 (8)2.1 芯片安装和更换 (8)3 程序烧写与运行 (9)4 下载软件说明 (13)功能分类 (17)第1 章LED 流水灯 (17)1.1 硬件连接 (17)1.2 软件操作 (18)1.2.1 汇编部分程序 (18)1.2.2 C 语言程序 (18)第2 章数码管 (19)2.1 硬件连接 (19)2.2 软件操作 (20)2.3 注意事项 (21)第3 章独立按键 (21)3.1 硬件连接 (21)3.2 软件操作 (21)3.3 注意事项 (22)第4 章矩阵键盘 (22)4.1 硬件连接 (22)4.2 软件操作 (23)4.3 注意事项 (24)第5 章继电器 (24)5.1 硬件连接 (24)5.2 注意事项 (25)第6 章喇叭 (25)6.1 硬件连接 (25)6.2 软件操作 (26)6.3 注意事项 (26)第7 章定时器 (26)7.1 硬件知识 (26)7.2 软件操作 (26)第8 章EEPROM (27)8.1 硬件连接 (27)8.2 软件操作 (27)8.3 注意事项 (27)第9 章DS1302 (28)9.1 硬件连接 (28)第10 章步进电机 (29)10.1 硬件连接 (29)10.2 软件操作 (29)10.3 注意事项 (29)第11 章18B20 (30)11.1 硬件连接 (31)11.2 注意事项 (31)第12 章1602 液晶 (31)12.1 硬件连接 (31)12.2 软件操作 (32)12.3 注意事项 (32)第13 章12864 液晶 (33)13.1 硬件连接 (33)13.2 软件操作 (33)13.3 注意事项 (34)第14 章红外发射 (34)14.1 硬件连接 (34)14.2 软件操作 (34)14.3 注意事项 (36)第15 章红外接收 (36)15.1 硬件连接 (36)15.2 软件操作 (37)15.3 注意事项 (37)第16 章串口通信 (38)16.1 硬件连接 (38)16.2 软件操作 (39)16.3 注意事项 (40)第17 章PS2 键盘 (40)17.1 硬件连接 (40)17.2 软件实例 (40)第18 章LED 点阵 (40)18.1 硬件结构原理 (40)18.2 软件操作实例 (43)第19 章ADC 模数转换 (42)19.1 ADC 工作原理 (43)第20 章光敏\热敏实例 (45)20.1 工作原理 (45)第20 章DAC 数模转换 (46)20.1DAC 工作原理 (46)第21 章555 时基电路 (46)21.1 结构原理 (46)21.2 常用电路 (47)21.3 注意事项 (48)第22 章PWM (48)22.1 工作原理 (48)22.2 软件实例 (48)第23 章AVR 芯片使用 (48)23.1 硬件连接 (48)23.2 注意事项 (49)第24 章SST 仿真芯片使用 (50)24.1 硬件连接 (50)24.2 软件操作..................................................................................................................................51.24.3注意事项 (53)第25 章编程器使用 (53)25.1 支持可编程芯片种类 (53)25.2 注意事项 (53)第26 章电源输出/输入 (53)26.1 硬件连接 (55)26.2 注意事项 (56)第27 章ISP 功能接口 (57)27.1 硬件连接 (57)27.2 注意事项 (57)第28 章晶振更换 (57)28.1 硬件连接 (57)28.2 注意事项 (57)常见问题解答 (59)附录 (61)免责声明为了安全有效的使用该产品,请您使用前仔细阅读以下信息本 产品可以通过USB供电,供电流<500mA ,自带保护可以有效保护电脑自行外接电源是请注意电源极性和电压参数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档