AD采集(电位器模拟温度)

以前的比赛和训练题目,也就是用滑动变阻器改变电压,然后进行AD采集

 可以用于此方面功能,第三小题当时比赛现场写的,这里没体现此功能。可以配合我之前写的pwm控制电机程序实现

#include <STC12C5A60S2.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define ADC_POWER 0x80
#define ADC_FLAG 0x10
#define ADC_START 0x08
#define ADC_SPEEDLL 0x00
#define ADC_SPEEDL 0x20
#define ADC_SPEEDH 0x40
#define ADC_SPEEDHH 0x60
uint wdbai=0,wdshi=0,wdshifen=0,wdge=0,hbai=0,hshi=0,hge=0,hshifen=0,v1=0, temp=0;
uchar wdfu=0;
uchar code num[]={"0123456789 e:.-"};
sbit E  =  P3^4;      //使能端  
sbit RS  =  P3^5;     //命令/数据选择       
sbit RW  =  P3^6;     //读写口      
sbit PSB =  P3^7;     //串并选择   

void delay(uint z)
{
	uint x,y;
for(x=z; x>0; x--)
  for(y=920; y>0; y--);                         
}

void init_adc()
{
 P1ASF=0x01;      //AD功能寄存器,设置IO口转换(使用P1^0)
 ADC_RES=0;		  //清理结果寄存器的值
 ADC_RESL=0;	  //清理
 ADC_CONTR=0x80;  //开启AD电源并设置转换周期转换一次
				  //ADC_POWER=1;CHS2,1,0为0,设置P1^0作为输入
 delay(2);	  //
}
uint get_adc()
{
 uint  d=0;
 ADC_CONTR=0x88;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 while(!ADC_CONTR&0x10);
 ADC_CONTR&=~0x10;
 d|=ADC_RES;
 d<<=2;
 d|=ADC_RESL;
 return d;
}
void chuli1(long temperature)
{
 float t;
 uint huashi;
 if(temperature&0x8000)         //判断是否为负数
   {
     temperature=~temperature+1;//取反+1
     wdfu='-';               //显示负号
   }
 else
   {
     wdfu='+';               
   }
   t=temperature*0.0625+0.05;     //计算出温度值,百分位四舍五入
   temperature=t*10;              //显示到小数点后一位,乘十,分离得到十分位
   huashi=temperature*1.8+32*10;
  wdbai=temperature/1000;
  wdshi=(temperature%1000)/100;   
  wdge=((temperature%1000)%100)/10;
  wdshifen=((temperature%1000)%100)%10;    
  
  hbai=huashi/1000;
  hshi=(huashi%1000)/100;   
  hge=((huashi%1000)%100)/10;
  hshifen=((huashi%1000)%100)%10; 
}

//12864///
bit busy()  //查忙
{
	bit result;
	P0=0X00; 
	RS=0;			//命令/数据选择,为0时选择命令    
	RW=1;			//读/写选择,为1时选择读
	E=1;			//使能
	delay(1);
	result = (bit)(P0&0x80); //查忙标志位,等待标志位为0,即表示写入完毕
	E=0;			//关闭读写 
	return (result);
}

void wcode(uchar cmd)   //向lcd写一命令
{
	while(busy());  					 //查忙
	RS=0;							 //命令/数据选择,为0时选择命令 
	RW=0;							 //读/写选择,为0时选择写
	E=0;
	_nop_();
  _nop_(); 
	P0=cmd;				 //送入命令
	delay(1);				//等待
	E=1;							
	delay(1);
	E=0;
}

void wdata(uchar dat) 	//向LCD写一数据
{
	while(busy());
	RS=1;            //H为数据
	RW=0;
	E=0;
	P0=dat;
	delay(1);
	E=1;
	delay(1);
	E=0;
}

void initlcd()    //LCD初始化
{
	PSB=1;     //设置为8BIT并口工作模式  H并行 L串行
	delay(10);
	wcode(0x34);
	delay(5);
	wcode(0x30);  //选择基本指令集
	delay(5);
	wcode(0x0c);  //开显示,无游标
	delay(5);
	wcode(0x01);	//清除显示,并且设定地址指针为00H
	delay(5);
	wcode(0x06);	//指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
}

void dis(uchar x,uchar y,uchar code *s)  //任意位置显示字符串
{                         //x为横坐标,y位纵坐标,*s表示指针,为数据的首地址
	switch(y)    						//选择纵坐标
	{
		case 0:wcode(0x80+x);break;  //第一行
		case 1:wcode(0x90+x);break;	 //第二行
		case 2:wcode(0x88+x);break;  //第三行
		case 3:wcode(0x98+x);break;  //第四行
		default:break;
	}
	while(*s>0)										 //写入数据,直到数据为空
	{
		wdata(*s);									 //写数据
		delay(10);									//下一字符
		s++;
	}
}  
void showGB(uchar *HZ)  //显示单个汉子
{
   wdata(HZ[0]);                //写入汉字高八位数据
   wdata(HZ[1]);                //写入低八位
}
void wrnum(uchar s)
{
	wdata(num[s]);
	delay(1);
}
/
void show()
{
	v1=get_adc();	
	temp=(uint)((v1*5.0*10)/1024)*41;
	chuli1(temp);
	
	wcode(0x80);
	wdata(wdfu);
	wrnum(wdbai);
	wrnum(wdshi);
	wrnum(wdge);
	wdata('.');	
	wrnum(wdshifen);
  wdata('C');  
}

void main()
{
	init_adc();
	initlcd();
	while(1)
	{
		show();
	}
}

51程序零零碎碎整理在博客里了,还有些不是特别完善,写的很全的就不放了。自己来来回回写了20-30个,然后开始学32了,现在一直在用。最近还要学ziggbe。今年全国电赛得好好准备了,去年大一省赛弄得不行。FPGA没怎么好好学下去倒是。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随风飘零翼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值