以前的比赛和训练题目,也就是用滑动变阻器改变电压,然后进行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没怎么好好学下去倒是。