本帖最后由 你速度发生的 于 2020-6-21 00:11 编辑
我想咨询各位大佬,我是19级大一,我学习单片机有半年左右,对单片机的理解只到大概可以看懂,51普中的板子例程也都走了一遍。但是和我一师兄习单片机的师兄他就比我深入很多,我们那个时候制作一个小项目LCD1602液晶显示温度并设定温度上下限,蜂鸣器报警提示超限。我师兄他制作这个程序只有
这是不是说明我学习的进度慢了他很多,我看单片机的书看到时序,串口什么的原理就头疼,看久了就发呆去了,求各位大佬支招。主要是想问学习单片机是否要像我师兄那样深入的学习,我应该怎么学
- #include <reg51.h>
- #include "temp.h"
- #include <stdio.h>
- void LcdDisplay(int);
- void UsartConfiguration(void);
- /*******************************************************************************
- * 函数名 : main
- * 函数功能 : 主函数
- * 输入 : 无
- * 输出 : 无
- *******************************************************************************/
- void main()
- {
-
- UsartConfiguration();//初始化
- EA=1; //打开总中断
- while(1)
- {
- LcdDisplay(Ds18b20ReadTemp());
- Delay1ms(100);//0.1s钟刷一次
-
- }
- }
- /*******************************************************************************
- * 函数名 : LcdDisplay()
- * 函数功能 : LCD显示读取到的温度
- * 输入 : v
- * 输出 : 无
- *******************************************************************************/
- void LcdDisplay(int temp) //lcd显示
- {
- static int q=0;
- int i=0;
- char datas[] = {0, 0, 0, 0, 0}; //定义数组
- float tp;
-
- temp=temp-1;
-
- tp=temp;
- tp=tp*0.0625+0.5;
- // temp=tp*0.0625*100+0.5;
- // tp=(float)temp/100;
- printf("第%d次测量的温度为:+%0.2f\n",q++,tp);
- }
- /*******************************************************************************
- * 函 数 名 :UsartConfiguration()
- * 函数功能 :设置串口
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void UsartConfiguration(void)
- {
-
- TMOD=0x20;//即0010 0000,定时器/计数器1,工作方式2
- TH1=0xfd;//设置波特率为9600
- TL1=0xfd;
- TR1=1;//启动定时器/计数器1
- SCON=0x50; //0101 0000.串口工作方式1,允许串行控制
- PCON=0x00;//设置SMOD=0
- IE=0x90; //CPU允许中断,串行允许中断
- TI=1;//
- }
- 而我自己的
- /*******************************************************************************
- 注意事项:
- 根据自己使用的LCD1602是否带有转接板,如果带有转接板的即为4位,需在LCD.H头文件中
- 将宏#define LCD1602_4PINS打开,我们这里使用的LCD1602是8位,所以默认将该宏注释。
- 接线说明:(开发攻略每个实验章节内的实验现象都有对应的接线图说明)
- LCD1602接线参考LCD1602液晶显示实验接线图
- DS18B20传感器接线参考DS18B20温度传感器实验接线图
- 实验操作:
- LCD1602上显示采集的温度,同时
- 打开串口调试助手,将串口波特率选择9600,打开串口,此时在串口上就会显示采集的温度,串口截图参考文件夹下。
- *******************************************************************************/
- #include<reg51.h>
- #include"lcd.h"
- #include"temp.h"
- #include<intrins.h> //因为要用到左右移函数,所以加入这个头文件
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef unsigned char u8;
- sbit beep=P1^1;
- uchar i;
- int n=0;
- uchar CNCHAR[17] = "第1次测试温度为:";
- uchar lx[1]="1";
- void LcdDisplay(int);
- void UsartConfiguration();
- sbit LSA=P0^7;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- /*******************************************************************************
- * 函 数 名 : delay
- * 函数功能 : 延时函数,i=1时,大约延时10us
- *******************************************************************************/
- void delay(u16 i)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函数名 : main
- * 函数功能 : 主函数
- * 输入 : 无
- * 输出 : 无
- *******************************************************************************/
- void main()
- {
- UsartConfiguration();
- LcdInit(); //初始化LCD1602
- LcdWriteCom(0x88); //写地址 80表示初始地址
- LcdWriteData('C');
- while(1)
- {
- LcdDisplay(Ds18b20ReadTemp());
- if((Ds18b20ReadTemp()>480)||(Ds18b20ReadTemp()<400))
- {
- for(i=0;i<120;i++)
- {
- beep=~beep;
- delay(100);
- };
- }
- else
- {
- ;
- };
- // Delay1ms(1000);//1s钟刷一次
- }
- }
- /*******************************************************************************
- * 函数名 : LcdDisplay()
- * 函数功能 : LCD显示读取到的温度
- * 输入 : v
- * 输出 : 无
- *******************************************************************************/
- void LcdDisplay(int temp) //lcd显示
- {
- unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定义数组
- float tp;
- if(temp< 0) //当温度值为负数
- {
- LcdWriteCom(0x80); //写地址 80表示初始地址
- SBUF='-';//将接收到的数据放入到发送寄存器
- while(!TI); //等待发送数据完成
- TI=0; //清除发送完成标志位
- LcdWriteData('-'); //显示负
- //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
- //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
- //算由?.5,还是在小数点后面。
-
- }
- else
- {
- LcdWriteCom(0x80); //写地址 80表示初始地址
- LcdWriteData('+'); //显示正
- SBUF='+';//将接收到的数据放入到发送寄存器
- while(!TI); //等待发送数据完成
- TI=0; //清除发送完成标志位
- tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
- //如果温度是正的那么,那么正数的原码就是补码它本身
- temp=tp*0.0625*100+0.5;
- //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
- //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
- //算加上0.5,还是在小数点后面。
- }
- datas[0] = temp / 10000;
- datas[1] = temp % 10000 / 1000;
- datas[2] = temp % 1000 / 100;
- datas[3] = temp % 100 / 10;
- datas[4] = temp % 10;
- LcdWriteCom(0x82); //写地址 80表示初始地址
- LcdWriteData('0'+datas[0]); //百位
- SBUF = '0'+datas[0];//将接收到的数据放入到发送寄存器
- while (!TI); //等待发送数据完成
- TI = 0;
-
- LcdWriteCom(0x83); //写地址 80表示初始地址
- LcdWriteData('0'+datas[1]); //十位
- SBUF = '0'+datas[1];//将接收到的数据放入到发送寄存器
- while (!TI); //等待发送数据完成
- TI = 0;
- LcdWriteCom(0x84); //写地址 80表示初始地址
- LcdWriteData('0'+datas[2]); //个位
- SBUF = '0'+datas[2];//将接收到的数据放入到发送寄存器
- while (!TI); //等待发送数据完成
- TI = 0;
- LcdWriteCom(0x85); //写地址 80表示初始地址
- LcdWriteData('.'); //显示 ‘.’
- SBUF = '.';//将接收到的数据放入到发送寄存器
- while (!TI); //等待发送数据完成
- TI = 0;
- LcdWriteCom(0x86); //写地址 80表示初始地址
- LcdWriteData('0'+datas[3]); //显示小数点
- SBUF = '0'+datas[3];//将接收到的数据放入到发送寄存器
- while (!TI); //等待发送数据完成
- TI = 0;
- LcdWriteCom(0x87); //写地址 80表示初始地址
- LcdWriteData('0'+datas[4]); //显示小数点
- SBUF = '0'+datas[4];//将接收到的数据放入到发送寄存器
- while (!TI); //等待发送数据完成
- TI = 0;
- for(i=0; i<17; i++)
- {
- SBUF = CNCHAR[i];//将接收到的数据放入到发送寄存器
- while (!TI); //等待发送数据完成
- TI = 0;
- }
- if((CNCHAR[2]='1')&&(n<9))我只在这里修改了一下
- {
- n++;
- CNCHAR[2]=lx[0];
- lx[0]=lx[0]+1;
- }
- else
- {
- CNCHAR[2]='1';
- lx[0]='1';
- n=0;
- }
- }
- /*******************************************************************************
- * 函 数 名 :UsartConfiguration()
- * 函数功能 :设置串口
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void UsartConfiguration()
- {
- SCON=0x50;//设置串口工作方式1
- TMOD=0x20;//设置计数器工作方式2
- PCON=0x00;//即SMOD=1,波特率不加倍
- TH1=0xFD;//计数器初值。波特率是9600,晶振为11.0592MHz
- TL1=0xFD;
- // ES=1; //打开接收中断
- // EA=1; //打开总中断
- TR1=1;//打开计数器
- }
复制代码
|