程序如下,高手帮忙看看,是通过温度传感器获取数据然后通过单片机输出到PC上面
- 提问者网友:嗝是迷路的屁
- 2021-12-21 06:26
#define UINT8 unsigned char
UINT8 temp()
{
UINT8 temp;
temp=ZSYS_ADC_GET(0);//获取温度值,已经经过AD转换了
return temp;
}
main()
{
UINT8 temp1;
temp1=temp();
ZHAL_LCD_DIS_STRING(0,3,&temp1,4,0);//LCD显示
zPrintf(1,"\n%02x",temp1);//输出到PC
}
下面解释下函数的意思:
ZHAL_LCD_DIS_STRING(0,3,&temp1,4,0);//0和3是LCD的横纵向的地址,4是输出宽度,0就忽略不讲了,默认的。这个函数原型是ZHAL_LCD_DIS_STRING(x,y,*p,w,0);
zPrintf(1,"\n%02x",temp1);//1代表通过异步串口UART1输出,引号里的为输出格式
ZSYS_ADC_GET(0);//这是API中通过通道ACH0获得模数转换器的值的函数
我的问题是:
1.输出格式符是%02x呢还是%u呢,貌似我运行了,都不是我理想中的结果啊。
2.LCD显示始终是乱码。怎么回事?希望高手帮忙
- 五星知识达人网友:有你哪都是故乡
- 2021-12-21 07:04
(1)函数temp()跟ZSYS_ADC_GET(0)没有什么不同,因为你只是赋了值。
所以,temp1=temp();可用temp1=ZSYS_ADC_GET(0);代替,省去一个函数。少个函数,在检查故障时就更容易。
(2)主函数没有“初始化”代码。也不知你用的是什么单片机或者什么操作系统。应考虑是否对LCD进行初始化操作。与 PC通讯是使用的什么连接?USB?串口?是否也要对通讯协议进行定义或者初始化?
(3)如果你的程序不是运行于单片机系统的操作系统上,main()函数中应该有主循环
while(1){;}
不然就会乱。
(4)也许,你再多提供点信息,网友回答就来得更快。
- 1楼网友:毛毛
- 2021-12-21 07:45
一块温度传感器ds18b20和一块单片机就行了(欢迎提问)
#include<reg52.h> #define uchar unsigned char #define uint unsigned int
#define jump_rom 0xcc #define start 0x44 #define read_eerom 0xbe
sbit dq = p2^3; //ds18b20数据口
unsigned char tmph,tmpl;
sbit e=p2^7; //1602使能引脚 sbit rw=p2^6; //1602读写引脚 sbit rs=p2^5; //1602数据/命令选择引脚
void delay_1() { int i,j; for(i=0; i<=10; i++) for(j=0; j<=2; j++) ; }
void enable(uchar del) { p0 = del; rs = 0; rw = 0; e = 0; delay_1(); e = 1; delay_1(); }
void write(uchar del) { p0 = del; rs = 1; rw = 0; e = 0; delay_1(); e = 1; delay_1(); }
void l1602_init(void) { enable(0x01); enable(0x38); enable(0x0c); enable(0x06); enable(0xd0); }
void l1602_char(uchar hang,uchar lie,char sign) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); write(sign); }
void l1602_string(uchar hang,uchar lie,uchar *p) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); while(1) { if(*p == '\0') break; write(*p); p++; } }
void delay(uint n) { int i; for(i=0; i<n; i++) ; }
uchar reset(void) { uchar deceive_ready; dq = 0; delay(29); dq = 1; delay(3); deceive_ready = dq; delay(25); return(deceive_ready); }
uchar read_bit(void) { uchar i; dq = 0; dq = 1; for(i=0; i<3; i++); return(dq); }
void write_bit(uchar bitval) { dq=0;if(bitval==1) dq=1; delay(5); dq=1; }
uchar read_byte(void) { uchar i,m,receive_data; m = 1; receive_data = 0; for(i=0; i<8; i++) { if(read_bit()) { receive_data = receive_data + (m << i); } delay(6); } return(receive_data); }
void write_byte(uchar val) { uchar i,temp; for(i=0; i<8; i++) { temp = val >> i; temp = temp & 0x01; write_bit(temp); delay(5); } }
void main() { float tt; uint temp; p2 = 0x00; l1602_init(); l1602_string(1,1," ds18b20 test "); l1602_string(2,1,"temperature:00`c"); while(1) { reset(); write_byte(jump_rom); write_byte(start); reset(); write_byte(jump_rom); write_byte(read_eerom); tmpl = read_byte(); tmph = read_byte(); temp = tmph; temp <<= 8; temp = temp | tmpl; tt = tmpl * 0.0625; temp = tmpl / 16 + tmph * 16; l1602_char(2,13,temp/10%10 + 48); l1602_char(2,14,temp%10 + 48); } }