找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2703|回复: 1
收起左侧

基于STC15F2K60S2单片机的stc-b单片机学习板实现导航按键测试

[复制链接]
ID:226131 发表于 2017-8-9 15:04 | 显示全部楼层 |阅读模式
使用头文件如下:
**************************/
#include "STC15F2K60S2.H"
#include <intrins.h>     //_cror_();
#define uint unsigned int
#define ulint unsigned long
#define uchar unsigned char
#define ADC_FLAG 0x10
/**************************
引脚别名定义如下:
**************************/
sbit SEL0 = P2^0;
sbit SEL1 = P2^1;
sbit SEL2 = P2^2;
sbit LED_SEL = P2^3;
/**************************
定义变量如下:
**************************/
uint global = 0;
uint date_h = 0;
ulint sum = 0;
uint x = 0;
uint y = 0;
uchar seg_flag;
//0123456789-
char duanxuan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//选择哪一位数码管
uchar weixuan[] = {0x00,0x06,0x07};
//初始化系统
void InitSYS(){

//P0口推挽输出,用于给数码管和发光二极管增加电流
P0M1 = 0x00;
P0M0 = 0xff;
//P2.3(即LED_SEL),P2.2,P2.1为推挽输出
P2M1 = 0x00;
P2M0 = 0x0E;
seg_flag = 0;

TMOD = 0x00;  //定时器0,工作方式1;
EA = 1;    //打开总中断;
  TH0 = (65535-1000)/256;   //定时器初值 定时大约1mS
TL0 = (65535-1000)%256;
ET0 = 1;   //打开定时中断;
TR0 = 1;   //启动定时器;
}
//初始化ADC
void InitADC()
{
P1ASF = 0x80;   //P1.7作为A/D使用
ADC_RES = 0;   //清零ADC结果寄存器
ADC_CONTR = 0X8F;  //打开ADC电源  540个时钟周期转换一次 选择P1.7作为A/D输入来用
CLK_DIV = 0X00;   //ADRJ = 0   ADC_RES存放高八位结果
EADC = 1;    //允许ADC中断
PADC = 1;    //ADC中断优先级为1
}
//显示高三位和低五位
void HighThree()
{
  x = date_h&0xE0;     //将八位转换结果的低五位清零
  x = _cror_(x,5);     //将高三位移到低三位 获取高三位数值
  y = date_h&0x1F;     //将八位转换结果的高三位清零
}
void timer0() interrupt 1 {

seg_flag++;
if(seg_flag==4)
  seg_flag = 0;
P0 = 0x00;
switch(seg_flag) {
  case 0:
   LED_SEL = 0;    //选择数码管显示
   P2 = weixuan[seg_flag];
   P0 = duanxuan[x];   //显示ADC转换结果高三位的十进制值
   break;
  case 1:
   LED_SEL = 0;    //选择数码管显示
   P2 = weixuan[seg_flag];
   P0 = duanxuan[y/10];  //显示ADC转换结果低五位的十进制值的高位
   break;
  case 2:
   LED_SEL = 0;    //选择数码管显示
   P2 = weixuan[seg_flag];
   P0 = duanxuan[y%10];  //显示ADC转换结果低五位的十进制值的低位
   break;
  case 3:
   LED_SEL = 1;    //选择发光二极管显示
   P0=date_h;
   break;
}

}
//AD中断
void adc_isr() interrupt 5
{
IE=0x00;      //关闭所有中断,防止数据没有采集完就进入新的中断
ADC_CONTR&=~0X10;    //将ADC_FLAG位清零

global++;
if(global>1000)     //将采集1000次后的数据求出平均值
{
  date_h=(sum+500)/1000;//四舍五入
  HighThree();           //获取转换结果高三位和低五位
  global=0;
  sum=0;
}
sum+=ADC_RES;
ADC_CONTR|=0X08;   //将ADC_START进行软件置位
IE=0xa2;     //开启中断
}
void main()        //主函数
{
InitSYS();
InitADC();
while(1)
  ;
}
回复

使用道具 举报

ID:226131 发表于 2017-8-21 19:26 | 显示全部楼层
我猜你是湖大的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表