久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機程序(FOSC/1000000)這里的1000000這個數值是哪里來的
[打印本頁]
作者:
wmq1517fc
時間:
2024-2-27 11:31
標題:
單片機程序(FOSC/1000000)這里的1000000這個數值是哪里來的
/**
主控MCU:STC15F104W
開關:INT0(P3.2) 下降沿觸發
亮度增加:INT2(P3.4) 下降沿觸發
亮度減少:INT3(P3.5) 下降沿觸發
PWM輸出:P3.3
**/
#include <reg51.h>
#include <intrins.h>
//#define FOSC 24000000L //晶振頻率
#define FOSC 6000000L //晶振頻率
#define MACHINE_CYCLE (FOSC / 1000000) //時鐘震蕩6次1μs
#define _1US 1 //1us
#define _50US 50 //50us
#define _100US 100 //100us
#define _150US 150 //150us
#define _200US 200 //200us
#define _250US 250 //250us
sfr INT_CLKO = 0x8f; //外部中斷與時鐘輸出控制寄存器
sfr AUXR = 0x8e; //輔助寄存器
sfr P3M1 = 0xB1; //P3口寄存器
sfr P3M0 = 0xB2;
signed int duty_cycle; //占空比,0-10,帶符號
unsigned int init_value; //定時器初值
unsigned int count; //定時器中斷次數
sbit pwm = P3 ^ 3; //PWM輸出口
bit flag; //燈開關狀態
//INT0初始化程序
void init_int0(void)
{
INT0 = 1;
IT0 = 1; //設置INT0的中斷類型 (1:僅下降沿 0:上升沿和下降沿)
EX0 = 1; //使能INT0中斷
}
//INT2初始化程序
void init_int2(void)
{
INT_CLKO |= 0x10; //(EX2 = 1)使能INT2中斷
}
//INT3初始化程序
void init_int3(void)
{
INT_CLKO |= 0x20; //(EX3 = 1)使能INT3中斷
}
//初始化計時值
void set_tm0_init_value(unsigned int value) reentrant
{
switch(value) {
case 50:
TL0 = (65536 - (_50US * MACHINE_CYCLE)) % 256;
TH0 = (65536 - _50US * MACHINE_CYCLE) / 256;
break;
case 100:
TL0 = (65536 - _100US * MACHINE_CYCLE) % 256;
TH0 = (65536 - _100US * MACHINE_CYCLE) / 256;
break;
case 150:
TL0 = (65536 - _150US * MACHINE_CYCLE) % 256;
TH0 = (65536 - _150US * MACHINE_CYCLE) / 256;
break;
case 200:
TL0 = (65536 - _200US * MACHINE_CYCLE) % 256;
TH0 = (65536 - _200US * MACHINE_CYCLE) / 256;
break;
case 250:
TL0 = (65536 - _250US * MACHINE_CYCLE) % 256;
TH0 = (65536 - _250US * MACHINE_CYCLE) / 256;
break;
default:
TL0 = (65536 - value * MACHINE_CYCLE) % 256;
TH0 = (65536 - value * MACHINE_CYCLE) / 256;
break;
}
}
//定時器0初始化程序
/**
時鐘周期 = 1 / FOSC = 1 / 6 MHz = 1/6us
機器周期 = 1 * 時鐘周期 = 1/6us (1T模式)
定時100us:
100us = 100 / (1/6) = 600機器周期
**/
void init_timer0(void)
{
TMOD = 0x00; //設置定時器0為模式0(16位自動重裝載)
set_tm0_init_value(init_value);
TR0 = 1; //定時器0開始計時
ET0 = 1; //使能定時器0中斷
}
/**
頻率 = 1 / 周期
**/
void main(void)
{
P3M1 = 0x00;
P3M0 = 0xFF;
AUXR |= 0x80; //定時器0為1T模式
duty_cycle = 5; //初始占空比為50%
count = 0;
init_value = 100; //初始頻率1kHz
init_int0();
init_int2();
init_int3();
init_timer0(); //定時器初始值為0.1ms,初始頻率為 1 / 0.001 = 1000Hz
flag = 0;
EA = 1;
while(1);
}
//INT0中斷服務程序
void ex_int0() interrupt 0 //INT0中斷入口
{
EA = 0;
flag = !flag;
if(flag) { //關燈
TR0 = 0;
ET0 = 0;
} else {
TR0 = 1;
ET0 = 1;
}
pwm = flag;
EA = 1;
}
//INT2中斷服務程序
void ex_int2() interrupt 10 //INT2中斷入口
{
EA = 0;
if(++duty_cycle > 10) {
duty_cycle = 10;
}
INT_CLKO &= 0xEF; //若需要手動清除中斷標志,可先關閉中斷,此時系統會自動清除內部的中斷標志
INT_CLKO |= 0x10; //然后再開中斷即可
EA = 1;
}
//INT3中斷服務程序
void ex_int3() interrupt 11 //INT3中斷入口
{
EA = 0;
if(--duty_cycle < 0) {
duty_cycle = 0;
}
INT_CLKO &= 0xDF; //若需要手動清除中斷標志,可先關閉中斷,此時系統會自動清除內部的中斷標志
INT_CLKO |= 0x20; //然后再開中斷即可
EA = 1;
}
//定時器0中斷服務程序
void tm0_isr() interrupt 1 using 1
{
EA = 0;
//初始化計時值
set_tm0_init_value(init_value);
//pwm = !pwm;
if(++count > 9) {
count = 0;
}
if(count < duty_cycle) {
pwm = 1;
} else {
pwm = 0;
}
EA = 1;
}
作者:
joyb
時間:
2024-2-27 16:19
1s=1000ms
1ms=1000us
則1s=1000,000us
作者:
明日之星8
時間:
2024-2-27 18:54
#define FOSC 6000000L //晶振頻率
#define MACHINE_CYCLE (FOSC / 1000000) //時鐘震蕩6次1μs
這兩行定義了時鐘頻率(其數字和實際安裝的晶振頻率對應)和
每微秒的時鐘數,當改換了其它頻率的晶振時,只要改“FOSC”
對應的數字就可以了,而“每微秒的時鐘數”可以自動同時改變,
1秒=1000000微秒,所以要除以這個數。
作者:
wmq1517fc
時間:
2024-3-4 20:06
謝謝各位的解答。
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
成人在线观看网站
|
中文字幕综合网
|
欧美精品一二三
|
亚洲精品久久久久
|
日韩在线免费视频
|
午夜精品久久久久久久久久蜜桃
|
免费看黄色录像
|
中文字幕在线观看亚洲
|
黄色片免费在线观看
|
免费毛片观看
|
精东影业一区二区三区
|
a毛片视频
|
精品一区二区国产
|
欧美日韩亚洲一区二区三区
|
91青青草
|
欧美日本一区二区三区
|
国产一级特黄aaa大片
|
色婷婷香蕉在线一区二区
|
√8天堂资源地址中文在线 av网址在线免费观看
|
xxxxx国产
|
国产网站视频
|
97精品国产97久久久久久免费
|
av手机天堂
|
欧美日韩专区
|
久在线视频
|
日本特级黄色片
|
国产成人精品毛片
|
日韩欧美精品一区二区
|
九九九色
|
www久久久
|
国产日韩免费
|
三a毛片
|
国产精品自拍av
|
成人激情视频在线观看
|
日本a级大片
|
亚洲三级在线观看
|
亚洲精品一区在线观看
|
日本丰满少妇做爰爽爽
|
欧美日韩国产三级
|
天天澡天天狠天天天做
|
成人在线观看网站
|