百韵网 >>  正文

51单片机程序编写 51单片机程序编写(劳驾写得详细一点)?

来源:www.baiyundou.net   日期:较早时间

/*这是用LCD显示所测温度的代码,你参考一下,如果没问题的话,其他的功能你再添加就好了,不难*/

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

#define Nack_number 10

//**************端口定义**************************************************

uchar flag;     //LCD控制线接口

sbit RS=P1^0;   //RS端

sbit RW=P1^1;   //读写端

sbit LCDE=P2^5;   //使能端

//mlx90614端口定义

sbit SCK=P2^1; //时钟线

sbit SDA=P2^2; //数据线

//************数据定义****************************************************

bdata uchar flag1; //可位寻址数据

sbit bit_out=flag1^7;

sbit bit_in=flag1^0;

uchar tempH,tempL,err;


//**************************  LCD1602  ***********************************

//向LCD写入命令或数据*****************************************************

#define LCD_COMMAND 0       //命令

#define LCD_DATA 1       // 数据

#define LCD_CLEAR_SCREEN 0x01       // 清屏

#define LCD_HOMING   0x02       // 光标返回原点

//设置显示模式******* 0x08+   *********************************************

#define LCD_SHOW 0x04     //显示开

#define LCD_HIDE 0x00     //显示关

#define LCD_CURSOR 0x02 //显示光标

#define LCD_NO_CURSOR 0x00     //无光标

#define LCD_FLASH 0x01     //光标闪动

#define LCD_NO_FLASH 0x00     //光标不闪动

//设置输入模式********** 0x04+ ********************************************

#define LCD_AC_UP 0x02     //光标右移 AC+

#define LCD_AC_DOWN 0x00       //默认 光标左移 AC-

#define LCD_MOVE 0x01       //画面可平移

#define LCD_NO_MOVE 0x00       //默认 画面不移动


//**************************  mlx90614  ***********************************

//command mode  命令模式

#define RamAccess 0x00 //对RAM操作

#define EepomAccess 0x20 //对EEPRAM操作

#define Mode 0x60 //进入命令模式

#define ExitMode 0x61 //退出命令模式

#define ReadFlag 0xf0 //读标志

#define EnterSleep 0xff //进入睡眠模式

//ram address read only RAM地址(只读)

#define AbmientTempAddr 0x03 //周围温度

#define IR1Addr 0x04

#define IR2Addr 0x05

#define LineAbmientTempAddr 0x06   //环境温度

/*0x0000 0x4074 16500 0.01/单元

     -40   125*/

#define LineObj1TempAddr 0x07 //目标温度,红外温度

/*0x27ad-0x7fff 0x3559 22610 0.02/单元

  -70.01-382.19  0.01   452.2*/

#define LineObj2TempAddr 0x08

//eepom address  EEPROM地址

#define TObjMaxAddr 0x00 //测量范围上限设定

#define TObjMinAddr 0x01 //测量范围下限设定

#define PWMCtrlAddr 0x02 //PWM设定

#define TaRangeAddr 0x03 //环境温度设定

#define KeAddr 0x04 //频率修正系数

#define ConfigAddr 0x05 //配置寄存器

#define SMbusAddr 0x0e //器件地址设定

#define Reserverd1Addr 0x0f //保留

#define Reserverd2Addr 0x19 //保留

#define ID1Addr 0x1c //ID地址1

#define ID2Addr 0x1d //ID地址2

#define ID3Addr 0x1e //ID地址3

#define ID4Addr 0x1f //ID地址4


//************函数声明*****************************************************

void start(); //MLX90614发起始位子程序

void stop(); //MLX90614发结束位子程序

uchar ReadByte(void); //MLX90614接收字节子程序

void send_bit(void); //MLX90614发送位子程序

void SendByte(uchar number); //MLX90614接收字节子程序

void read_bit(void); //MLX90614接收位子程序

void delay(uint N); //延时程序

uint readtemp(void); //读温度数据

void init1602(void); //LCD初始化子程序

void busy(void); //LCD判断忙子程序

void cmd_wrt(uchar cmd); //LCD写命令子程序

void dat_wrt(uchar dat); //LCD写数据子程序

void display(uint Tem); //显示子程序

void Print(uchar *str); //字符串显示程序


//*************主函数*******************************************

void main()

{

uint Tem; //温度变量

SCK=1;

SDA=1;

delay(4);

SCK=0;

delay(1000);

SCK=1;

init1602(); //初始化LCD

while(1)

{

Tem=readtemp(); //读取温度

cmd_wrt(0x01); //清屏

Print("  Temperature:    "); //显示字符串  Temperature: 且换行

display(Tem); //显示温度

Print(" ^C"); //显示摄氏度

delay(10000); //延时再读取温度显示

}

}

void Print(uchar *str) //字符串显示程序

{

while(*str!='\0') //直到字符串结束

{

dat_wrt(*str); //转成ASCII码  

str++; //指向下一个字符

}

}


//*********输入转换并显示*********

void display(uint Tem)

{

uint T,a,b;

T=Tem*2;

if(T>=27315) //温度为正

{

T=T-27315; //

a=T/100; //温度整数

b=T-a*100; //温度小数

if(a>=100) //温度超过100度

{

dat_wrt(0x30+a/100); //显示温度百位

dat_wrt(0x30+a%100/10); //显示温度十位

dat_wrt(0x30+a%10); //显示温度个位

}

else if(a>=10) //温度超过10度

{

dat_wrt(0x30+a%100/10); //显示温度十位

dat_wrt(0x30+a%10); //显示温度个位

}

else //温度不超过10度

{

dat_wrt(0x30+a); //显示温度个位

}

dat_wrt(0x2e); //显示小数点

if(b>=10) //温度小数点后第1位数不等于0

{

dat_wrt(0x30+b/10); //显示温度小数点后第1位数

dat_wrt(0x30+b%10); //显示温度小数点后第2位数

}

else //温度小数点后第1位数等于0

{

dat_wrt(0x30); //显示温度小数点后第1位数0

dat_wrt(0x30+b); //显示温度小数点后第2位数

}

}

else //温度为负

{

T=27315-T;

a=T/100;

b=T-a*100;

dat_wrt(0x2d); //显示负号

if(a>=10) //温度低于负10度

{

dat_wrt(0x30+a/10); //显示温度十位

dat_wrt(0x30+a%10); //显示温度个位

}

else //温度高于负10度

{

dat_wrt(0x30+a); //显示温度个位

}

dat_wrt(0x2e); //显示小数点

if(b>=10) //温度小数点后第1位数不等于0

{

dat_wrt(0x30+b/10); //显示温度小数点后第1位数

dat_wrt(0x30+b%10); //显示温度小数点后第2位数

}

else //温度小数点后第1位数等于0

{

dat_wrt(0x30); //显示温度小数点后第1位数0

dat_wrt(0x30+b); //显示温度小数点后第2位数

}

}

}

//************************************

void start(void) //停止条件是 SCK=1时,SDA由1到0

{

SDA=1;

delay(4);

SCK=1;

delay(4);

SDA=0;

delay(4);

SCK=0;

delay(4);

}

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

void stop(void) //停止条件是 SCK=1时,SDA由0到1

{

SCK=0;

delay(4);

SDA=0;

delay(4);

SCK=1;

delay(4);

SDA=1;

}

//---------发送一个字节---------

void SendByte(uchar number)

{

uchar i,n,dat;

n=Nack_number; //可以重发次数

Send_again:

dat=number;

for(i=0;i<8;i++) //8位依次发送

{

if(dat&0x80)   //取最高位

{

bit_out=1;     //发1

}

else

{

bit_out=0;     //发0

}

send_bit();     //发送一个位

dat=dat<<1;     //左移一位

}

read_bit();   //接收1位 应答信号

if(bit_in==1)     //无应答时重发

{

stop();

if(n!=0)

{

n--;     //可以重发Nack_number=10次

goto Repeat; //重发

}

else

{

goto exit; //退出

}

}

else

{

goto exit;

}

Repeat:

start(); //重新开始

goto Send_again; //重发

exit: ; //退出

}

//-----------发送一个位---------

void send_bit(void)

{

if(bit_out==1)

{

SDA=1;   //发1

}

else

{

SDA=0;   //发0

}

_nop_();

SCK=1;   //上升沿

delay(4);delay(4);

SCK=0;

delay(4);delay(4);

}

//----------接收一个字节--------

uchar ReadByte(void)

{

uchar i,dat;

dat=0; //初值为0

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

{

dat=dat<<1; //左移

read_bit(); //接收一位

if(bit_in==1)

{

dat=dat+1; //为1时对应位加1

}

}

SDA=0; //发送应答信号0

send_bit();

return dat; //带回接收数据

}

//----------接收一个位----------

void read_bit(void)

{

SDA=1; //数据端先置1

bit_in=1;

SCK=1; //上升沿

delay(4);delay(4);

bit_in=SDA; //读数据

_nop_();

SCK=0;

delay(4);delay(4);

}



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

uint readtemp(void)

{

SCK=0;

start(); //开始条件

SendByte(0x00); //发送从地址00

SendByte(0x07); //发送命令

start(); //开始条件

SendByte(0x01); //读从地址00

bit_out=0;

tempL=ReadByte(); //读数据低字节

bit_out=0;

tempH=ReadByte(); //读数据高字节

bit_out=1;

err=ReadByte(); //读错误信息码

stop(); //停止条件

return(tempH*256+tempL);

}

//******************LCD显示子函数***********************

void init1602(void) //初始化LCD

{

cmd_wrt(0x01); //清屏

cmd_wrt(0x0c); //开显示,不显示光标,不闪烁

cmd_wrt(0x06); //完成一个字符码传送后,光标左移,显示不发生移位

cmd_wrt(0x38); //16×2显示,5×7点阵,8位数据接口

}

void busy(void) //LCD忙标志判断

{

flag=0x80; //赋初值 高位为1 禁止

while(flag&0x80) //读写操作使能位禁止时等待 继续检测

{

P0=0xff;

RS=0; //指向地址计数器

RW=1; //读

LCDE=1; //信号下降沿有效

flag=P0; //读状态位 高位为状态

LCDE=0;

}

}

void cmd_wrt(uchar cmd) //写命令子函数

{

LCDE=0;

busy(); //检测 读写操作使能吗

P0=cmd; //命令

RS=0; //指向命令计数器

RW=0; //写

LCDE=1; //高电平有效

LCDE=0;

}

void dat_wrt(uchar dat) //写数据子函数

{

busy(); //检测 读写操作使能吗

LCDE=0;

if(flag==16)

{

RS=0; //指向指令寄存器

RW=0; //写

P0=0XC0; //指向第二行

LCDE=1; //高电平有效

LCDE=0;

}

RS=1; //指向数据寄存器

RW=0; //写

P0=dat; //写数据

LCDE=1; //高电平有效

LCDE=0;

}

//------------延时--------------

void delay(uint n)

{

uint j;

for(j=0;j<n;j++)

{

_nop_();

}

}




不能帮你写,自己做吧,应该很简单.有问题自己分步把它整理解决:

  1. 验证确认你的51单片机正常工了

  2. 验证你的led显示程序是否有问题

  3. 验证MLX90614与51通讯正常.

  4. 51内部的温度判断处理程序是否有问题.

我觉得你最有可能的问题应该是与mlx90614通讯没做对.网上有很多它的通讯源码找一个参考一下.



程序应该有参考的吧,你把程序弄上来,看看哪里有问题

怎么给你写程序,没有实物

~

相关要点总结:

15894006143:如何在51单片机开发板上烧写程序?
生郊答:2.然后点击下图中箭头所指处,找到单片机型号STC89C52。然后,将51单片机开发板与电脑连接起来,初次连接时,会自动给电脑装一个驱动。3.单片机与电脑连接成功后,点击下图中【扫描】按钮,扫描出单片机与电脑连接的那个端口号。然后,点击【打开程序文件】按钮。4.在弹出的对话框中,选择刚刚编写的那个程序...

15894006143:C51单片机发送字符串程序怎么写
生郊答:5、点击窗口的Target 1左边的图标,选择如图的标签。勾选红色标注的地方(生成hex文件)。6、 这样就进行后面的书写程序,编译吧。然后进入下一步,烧写程序,点击打开“打开程序文件”。到保存程序的地方,选中后缀为hax的文件并双击。7、点击下载,此之前要连接单片机开发板,并且开发板电源处于关闭。

15894006143:请问C51单片机电子时钟的设计程序怎么样编写啊?
生郊答:BUFF_KEY EQU 21H ;键盘键 BUFF_LED1 EQU 22H ;数码管显示缓存 BUFF_LED2 EQU 23H BUFF_LED3 EQU 24H BUFF_LED4 EQU 25H BUFF_LED5 EQU 26H BUFF_LED6 EQU 27H BUFF_LED_LP EQU 28H ;T0键盘显示扫描缓存 HOR EQU 30H ;小时值缓存 MIN ...

15894006143:51单片机的汇编编程
生郊答:ORG 0000H MAIN: MOV SP,#07H MOV DPTR,#2000H ;起始地址 MOV R2,#03H ;初始化,定义1000次 MOV R3,#0E8H MOV R0,#00H ;清零,用于循环加1 MOV R4,#00H ;清零 MOV R5,#00H ;清零 CLR C MOV A,#0 JMP L3 ;跳转 L2: CLR C ;溢出后Cy清零 INC R5 ;高位加...

15894006143:向51单片机里写发出脉冲信号的c程序怎么编啊?
生郊答://用ADC0808控制PWM输出 //通过可变电阻调节脉冲宽度 include <reg51.h> define uchar unsigned char define uint unsigned int sbit CLK =P2^4;sbit ST=P2^5;sbit EOC=P2^6;sbit OE=P2^7;sbit PWM=P3^0;//延时 void Delay(uchar x){ uchar i;while(x--)for(i=0;i<40;i++);} v...

15894006143:51单片机,数据块传送程序设计,汇编语言程序怎么写?
生郊答:51单片机,数据块传送程序设计,汇编语言程序怎么写?将 RAM 中 2000H~2FFFH 存储内容的 前一半复制到 3000H~37FFH 存储区和 3800H~3FFFH 存储区,后一半复制到 4000H~47FFH 存储区和 4800H~ 4FFFH 存储区 --- RAM 中 2000H~2FFFH 的前一半是:2000H~27FFH,送到:3000H~37FFH、4000...

15894006143:c51单片机c语言交通灯的程序
生郊答:Proteus仿真原理图:程序如下:include <reg51.h> define uchar unsigned char define uint unsigned int uchar data buf[4];uchar data sec_dx=20;//东西数默认 uchar data sec_nb=30;//南北默认值 uchar data set_timedx=20;uchar data set_timenb=30;int n;uchar data b;//定时器中断...

15894006143:51单片机流水灯程序
生郊答:程序如下:include <reg52.h> sbit led1 = P2^0;sbit led2 = P2^1;sbit led3 = P2^2;sbit led4 = P2^3;sbit led5 = P2^4;sbit led6 = P2^5;sbit led7 = P2^6;sbit led8 = P2^7;void main(){ int i,j;//点亮第一个灯 led1 = 1;led2 = 0;led3 = 0;led4 = ...

15894006143:51单片机汇编语言-请编写程序将内部RAM 40H到4FH 中的16个数据按从小...
生郊答:冒泡排序程序如下:ORG 0000H LCALL SORT ; 跳转到排序程序 SJMP $ ; 。SORT: ; 数据冒泡排序程序 MOV R6, #16 ;参加排序数据的总个数 DEC R6 ; 比较次数 比 数据总数 少 1 L1:MOV R0, #40H ; 把数据的起始地址40h付给R0 MOV A, R6 ...

15894006143:朋友们帮忙写个51单片机的按键小程序?汇编的
生郊答:TT1: NOP ;延时但不是子程序 NOP NOP NOP NOP NOP DJNZ R6,TT MOV R6,#200 DJNZ R7,TT MOV R7,#200 SETB 20H AJMP TT end (2)数码管数据 p0,数码管控制p2 独立按键p1口 ,;对独立键进行按键次数计数,三位数码管显示。;K1按下后,进行加1计数 ;K2按下后,进行减1计数。;K3...

(编辑:本站网友)
相关推荐
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图
@ 百韵网