tlc1549的C语言程序问题,AD转换后控制P2口的led灯亮,例如0-5V,分别对应1-8个led灯,如何设置下面的if语
//1602 四线制驱动程序,根据需要自己改端口定义和延时
#define LINE1 0
#define LINE2 1
#define LINE1_HEAD 0x80
#define LINE2_HEAD 0xC0
#define CLEARSCREEN LCD_en_com(0x01);LCD_delay(30)
/*************************************/
//change this part at different board
sbit DB7=P2^7;
sbit DB6=P2^6;
sbit DB5=P2^5;
sbit DB4=P2^4;
sbit LCD1602_RS=P2^1; //data command select 1 data 0 command pin 4
sbit LCD1602_RW=P2^2; //read write select 1 read 0 write pin 5
sbit LCD1602_EN=P2^3; //LCD enable signal pin 6
/********************************************************************/
void LCD_delay(unsigned int n)
{
unsigned int i=0,j=0;
for (i=n;i>0;i--)
for (j=0;j<12;j++);
}
void LCD_en_com(unsigned char command)
{
DB7=(command>>7)%2;
DB6=(command>>6)%2;
DB5=(command>>5)%2;
DB4=(command>>4)%2;
LCD1602_RS = 0; //RS 0
LCD1602_RW = 0;//RW 0
LCD1602_EN = 1;//EN --\|/__Write command
LCD_delay(2);
LCD1602_EN = 0;
DB7=(command>>3)%2;
DB6=(command>>2)%2;
DB5=(command>>1)%2;
DB4=(command>>0)%2;
LCD1602_RS = 0; //RS 0
LCD1602_RW = 0;//RW 0
LCD1602_EN = 1;//EN --\|/__Write command
LCD_delay(2);
LCD1602_EN = 0;
}
void LCD_en_dat(unsigned char command)
{
DB7=(command>>7)%2;
DB6=(command>>6)%2;
DB5=(command>>5)%2;
DB4=(command>>4)%2;
LCD1602_RS = 1;//RS 1
LCD1602_RW = 0;//RW 0
LCD1602_EN = 1;//EN --\|/__Write data
LCD_delay(2);
LCD1602_EN = 0;
DB7=(command>>3)%2;
DB6=(command>>2)%2;
DB5=(command>>1)%2;
DB4=(command>>0)%2;
LCD1602_RS = 1;//RS 1
LCD1602_RW = 0;//RW 0
LCD1602_EN = 1;//EN --\|/__Write data
LCD_delay(2);
LCD1602_EN = 0;
}
void LCD_set_xy(unsigned char x,unsigned char y)
{
unsigned char address;
if(y == LINE1)
address = LINE1_HEAD + x;
else
address = LINE2_HEAD + x;
LCD_delay(10);
LCD_en_com(address);
}
void LCD_write_string(unsigned char x,unsigned char y,unsigned char *s)
{
LCD_set_xy(x,y);
while(*s)
{
LCD_en_dat(*s);
s++;
}
}
/********************************************************************/
void InitTimer0(void)//200us
{
TMOD = 0x01;
TH0 = 0x0FE;
TL0 = 0x70;
EA = 1;
ET0 = 1;
TR0 = 1;
}
unsigned char LCD_ContCount=0;
sbit LCDCONT=P2^0;
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x0FE;
TL0 = 0x70;
if(LCD_ContCount<LCD_CONTRAST){LCDCONT=0;}
else{LCDCONT=1;}
LCD_ContCount++;
if(LCD_ContCount==100){LCD_ContCount=0;}
}
/********************************************************************/
void LCD_init(void)
{
LCD_delay(50);
LCD_en_com(0x33);//原来1602初始化成4位数据线之前必需先初始化成8位(此时命令发送方式是8位格式,但数据线只需接4位)
LCD_delay(10);
LCD_en_com(0x32);//然后再改到4位线宽,这样初始化才稳定
LCD_delay(10);
LCD_en_com(0x28);//四线模式设置
LCD_delay(10);
LCD_en_com(0x0c);//显示开--对应开关显示控制指令
LCD_delay(10);
CLEARSCREEN;
InitTimer0();
}
/********************************************************************/
至于AD,用片上自带的AD就行,没有具体的电路,只能帮你这些了。
另:楼上说用ADC0834的,STC12C5A60S2已经有AD了啊
value=(value*5.0/256.0) * 100; 试试!
main(){
for(;;)
{float u1=0;
u1=adc();
result=(500*(u1))/(1024);//10位,2的10次方
_nop_();
}
} //你的main到此已经结束了,
后面 Data=adc;
if (Data<128)
P2=0xFC;
else if (Data>=128)
P2=0x00;
段代码没起作用呀, Data=adc();为函数调用,要加括号
return(result); //return ad data 应该是return(DATA);
思路:(1)代码要分块,先调试将电压转化后的值随机输出到P2,再调试对应的调用值对应特定的灯; (2)你的ADC采用的好像是中断的方式,所以你要打开中断,DATA段代码要再main中实现,不要在中断程序中实现;(3)你定义了好几处result,最好各用各的名字;(4)分开调试。ADC模块,P2口的LED模块。两个模块都正常工作了,再放在一起调。代码就不会乱了
Data=result ;//这里是不是应该是result?
if (Data<128)
P2=0xFC;
else if (Data>=128)
P2=0x00;
后面几句想做什么不太清楚呀,是不是想让高两位亮灯?
你那个计数是不是得这样:result=(5*(u1))/(1024);//10位,2的10次方
这个有点不好说。
赏皇盐酸: uchar Data; …… Data = adc; ……10位的1549转换,...==== Data,应该用整型的变量才行.2.5V对应511,5V对应1023,这就对了.
遵义县18988298299: C51纠错:tlc1549的数据采集程序 - ?
赏皇盐酸: /*---------------- 采集一次AD ---------------*/ uint ad_once() { uchar i; uint j=0,e=0,f=0; ad_cs=1; f=ad_sda; _nop_(); ad_cs=0; //这句去掉试下.ad_scl=0; for(i=0;i{ e=ad_sda; j=j+e; //? e=0; ad_scl=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); ...
遵义县18988298299: 18b20与lm35dz 程序区别以及lm35dz+12864如何编程 用单片机C语言 - ?
赏皇盐酸: 18b20是数字温度传感器,可以用单片机直接读取温度;而LM35是模拟温度传感器,它的输出是一个模拟的电压,温度与输出的电压成线性关系,温度每上升一...
遵义县18988298299: C语言A<B<C的问题... - ?
赏皇盐酸: while(a<b<c) 这里的a<b<c求的是一个逻辑值,正确为1,错误为0,a=1,b=2,c=2,首先a<b成立,逻辑值为1,然后1<c,也成立,所以满足循环条件(逻辑值为0时不满足,为1满足),开始循环,交换a,b位置,再c--,,a=2, b=1, c=1,此时再循环,a<b不成立,逻辑值为0,0<c成立,逻辑值为1,满足循环条件,继续循环,得到 a=1, b=2, c=0,此时a<b不成立,逻辑值为0,0<c不成立,逻辑值为0,退出循环,输出a , b, c;就得到a=1,b=2,c=0了
遵义县18988298299: C51纠错:tlc1549的数据采集程序 - ?
赏皇盐酸: /采集一次AD uint ad_once() { uchar i; uint j=0,e=0,f=0; ad_cs=1; f=ad_sda; _nop_(); ad_cs=0; //这句去掉试下.ad_scl=0;...
遵义县18988298299: C语言a -- 的问题 - ?
赏皇盐酸: 这个很好理解的.首先你要明白a--的用法,即在使用了a后,再使a自身减一.你的式子为a=(a--)+3,先把a+3求出来等于8,再把八赋予给a,然后再使a的值自减1,当然结果就是7啊!呵呵,这个自加,自减还是要理解通透哦!嘿嘿
遵义县18988298299: c语言问题"a",变为'a' - ?
赏皇盐酸: str.c_str();该语句返回一个字符串的首地址,并不是把字符串"a" 转换成字符'a' 转换语句应该这么写` char a = str[0]; 这样就可以了` 标准库的string类支持下标取值;有问题也可以来我论坛求助`
遵义县18988298299: 一个c语言程序问题?
赏皇盐酸: #include<stdio.h> f(int a) { int b=0; static int c=3; a=c++,b++; \\这个地方的输入有误哦,中间不应该是逗号吧 return(a); } mian() { int a=2,i,k; for(i=0;i<2;i++); \\不知道你用这个for循环的目的,注意你的分号是紧跟在后面的 printf("%d\n",k);\\变量k的值没有初始化,这样输出会有问题的 } 你定义的函数就没有补调用,可以是你复制代码的时候,掉了一些语句吧
遵义县18988298299: 求助!C语言编程题!求任一字符串中a的个数! - ?
赏皇盐酸: #include void main() { int i,k=0; char s[200]; printf("\nEnter a string:\n"); gets(s); for(i=0;i { if(s[i]=='a') k++; } printf("a number is: %d times\n",k); }
遵义县18988298299: 帮忙分析下这个C语言程序(错误及如何改正) - ?
赏皇盐酸: 因为在调用scanf是它是从缓冲区中读取字符 但是它不移动缓冲区的指针所以它每次都是从相同的地方读入字符 解决办法是在每次循环里调用 刷新流函数flushall()就可以了 但是这样还是没有办法结束循环 下面给出解决程序 你的问题都解决了#include<stdio.h> void main() { int c; do { printf("Please input a number:"); c=getch(); if(c<=127&&c>=0) { printf("%d:%c\n",c,c); } else printf("Input error!"); } while(c!=32); }