- 打卡等级:以坛为家I
- 打卡总天数:337
- 最近打卡:2025-04-30 07:42:48
高级会员
- 积分
- 816
|
发表于 2023-4-2 14:57:44
|
显示全部楼层
第13个程序:定时器
/************************************
1 按下按键,每10ms最末尾数字加1,
再次那些按键停止计数
硬件条件:
屠龙刀2022-6-20,自己搭接的四位数码管
P0.1 数码管最低位阳极控制开关,低电平开。
P0.2 数码管次低位阳极控制开关,低电平开。
P0.3 数码管次高位阳极控制开关,低电平开。
P0.4 数码管最高位位阳极控制开关,低电平开。
P2.0-P2.7对应数码管a b c d e f g dp。
P7.5 蜂鸣器控制
*************************************/
#include "stc.h"
#include "usb.h"
#define MAIN_Fosc 24000000UL
#define Beep P75 //蜂鸣器脚位定义
#define Key1 P32 //按键1脚位定义
#define Key2 P33 //按键2脚位定义
#define DELAY 1 //延时时间宏定义
#define DELAY1s 1000 //延时时间宏定义
u8 SegLED [21] = {
0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,
0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0XFF
};//共阳数码管0-9显示代码,0-9带点显示代码
u8 SegTex[7] = {0X89,0XF1,0XC7,0XA3,0X8C,0XC1,0XCE};//共阳数码管H J L o P U r显示代码
u8 WeiLed[5] = {0XEF,0XF7,0XFB,0XFD,0XF9};//数码管位选控制最高到位到最低位
u8 ShowLed[4] = {1,0,0,0};
//u8 ShowLed[4] = {5,0,9,1};
u8 num = 3;
u32 Scount; //1ms计数
bit RunStats; //运行状态标志
void sys_init(); //系统初始化
void delay_ms(u16); //延时函数
//USB调试及复位所需定义
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#"; //设置自动复位到ISP区的用户接口命令
void LEDsfr()
{
P0 = WeiLed[num]; //数码管位给P0口
P2 = SegLED[ShowLed[num]]; //数码管段给P2口
if(num>0) //数码管显示大于0就自减
num--;
else
num = 3; //数码管显示等于0就显示3
}
void Timer0_Init(void) //1毫秒@24.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初始值
TH0 = 0xF8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void main()
{
sys_init(); //系统初始化
usb_init(); //USB初始化
Timer0_Init(); //定时器0初始化
EA = 1; //打开总中断
while (1)
{
if( DeviceState != DEVSTATE_CONFIGURED ) //
continue;
if( bUsbOutReady )
{
usb_OUT_done();
}
/*******按下按键,4位数码管每100ms最末尾数字加1,
再次那些按键停止计数 *************/
if(Key1 == 0) //按键按下
{
delay_ms(10); //延时10ms去抖
if(Key1 == 0) //确认按键按下
P75 = 0; //按下按键蜂鸣器响
delay_ms(10); //蜂鸣器响10ms
P75 = 1; //蜂鸣器停止响
// while(Key1 == 0); //按键松开动作
if(RunStats==0) //运行状态为0
Scount = 0; //计数清零
RunStats = !RunStats; //运行状态翻转
while(Key1 == 0); //按键按下动作
}
}
}
void Timer0_Isr(void) interrupt 1
{
LEDsfr(); //数码管刷新
if(RunStats==1) //运行状态
{
Scount++; //1ms计数自加
}
ShowLed[0] = Scount/10000%10; //数码管显示最高位
ShowLed[1] = Scount/1000%10; //数码管显示次高位
ShowLed[2] = Scount/100%10; //数码管显示次低位
ShowLed[3] = Scount/10%10; //数码管显示最低位
}
void sys_init()
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M0 = 0X00; //P0口设置为准双向口
P0M1 = 0X00;
P1M0 = 0X00; //P1口设置为准双向口
P1M1 = 0X00;
P2M0 = 0X00; //P2口设置为准双向口
P2M1 = 0X00;
P3M0 = 0X00; //P3口设置为准双向口
P3M1 = 0X00;
P4M0 = 0X00; //P4口设置为准双向口
P4M1 = 0X00;
P5M0 = 0X00; //P5口设置为准双向口
P5M1 = 0X00;
P6M0 = 0X00; //P6口设置为准双向口
P6M1 = 0X00;
P7M0 = 0X00; //P7口设置为准双向口
P7M1 = 0X00;
P3M0 &= ~0x03; //P30P31设置为高阻输入
P3M1 |= 0x03;
//设置USB使用的时钟源
IRC48MCR = 0x80; //使能内部48M高速IRC
while (!(IRC48MCR & 0x01)); //等待时钟稳定
USBCLK = 0x00; //使用CDC功能需要使用这两行,HID功能禁用这两行。
USBCON = 0x90;
}
void delay_ms(u16 ms)
{
u16 i;
do{
i = MAIN_Fosc/6000;
while(--i);
}while(--ms);
}
程序压缩如附件:
|
|