for(i=0;i<8;i++) //第二次从低到高读数,下降沿有效 { if(d0==1&&di==1) data2|=0x01<
if(data1==data2) return(data1);
}
5.键盘电路设计
6个按键,P2.2-P2.7接6个按键,P3.4接公共端,采用 动态扫描方式检测键盘。
6.
uint keyscan()
{
uchar temp; P33=0;
temp=P2&0xf0; if(temp!=0xf0) {
Delayms(10); temp=P2&0xf0; if(temp!=0xf0) {
switch(temp) {
case 0x70:return 1;break; case 0xb0:return 2;break; case 0xd0:return 3;break; case 0xe0:return 4;break; } }
} }
显示模块采用6个共阳极数码管,采用动态扫描的方式进行示。电路图如下:
显
delay1(200); //Delayms(1);
{
P26=1;
P27=1;
delay1(200);
//Delayms(1);
void Display(void)//显示温度的函数
P25=0; //选中第一个位选
图6:显示模块
P26=0; //选中第一个位选
P27=0; //选中第一个位选
P0 =LED[ucADC/2/100]; ; //显示
P0 = LED[ucADC/20/10];//显示
}
P0 = (LED[ucADC/2]-0x80); //显示 //Delayms(1); delay1(200); P25=1;
P24=0; //选中第一个位选 P0 = LED[ucADC/2*10]; //显示 //Delayms(1); delay1(200); P24=1;
void display2(uchar a,uchar b)//显示通道的函数 { P23=0; P0=LED[a]; //Delayms(5); delay1(200); P23=1; P22=0; P0=LED[b]; //Delayms(5); delay1(200); P22=1; }
6.软件设计 其他应用到的程序:
void main( void) {
uint num; write=0;
flag=0; channel=0; init();
ucADC=read_add(2); TMOD=0x01; ET0=1; EA=1;
TH0=(65536-50000)/256; TL0=(65536-50000)%6; TR0=1; while(1) { num=keyscan(); switch(num) { case 1:channel=0; break; case 2:channel=1; break; case 3:flag=1;break; case 4:flag=0;break; } ucADC = GetValue0832(channel); Display();display2(channel,1); if(write==1) { write=0; write_add(2,ucADC); } } }
void t0() interrupt 1//定时器0 {
TH0=(65536-50000)/256; TL0=(65536-50000)%6; tcnt++;
if (tcnt==100) {
tcnt=0; write=1; if(flag==1)
channel=~channel; } }
三.项目心得
系统基本实现了设计要求,通过这次课程设计,使我更加熟练的掌握了AT89C52、AT24C02、ADC0832等芯片的使用,熟悉了领用C51语言编写程序控制单片机。
四.参考文献 1、李全利,单片机原理及接口技术,高等教育出版社,2004 2、于永,51单片机常用模块与综合系统设计实例精讲,电子工业出版社,2007