stc8g1k08a+cd4017红绿灯
2,4脚供电,567脚控制三个灯,另外三只脚控制cd4017脉冲输入,复位清零和数码管共阴极
数字只能显示一位0-9
hex文件
蓝奏云
main.c
sfr p5 = 0xc8;//p5端口寄存器
sfr P5M1 = 0xc9;//p5端口m1配置寄存器
sfr P5M0 = 0xca;//p5端口m0配置寄存器
sbit p54 = p5^4;//p5.4端口
sbit p55 = p5^5;//p5.5端口
sfr P3 = 0xB0;
sfr P3M1 = 0xB1;
sfr P3M0 = 0xB2;
sbit p33 = P3^3;
sbit p32 = P3^2;
sbit p31 = P3^1;
sbit p30 = P3^0;
sfr TCON = 0x88;//定时器控制寄存器
sfr TMOD = 0x89;//定时器模式寄存器
sfr TH0 = 0x8c;//定时器t0高8位寄存器
sfr TL0 = 0x8a;//定时器t0低8位寄存器
sfr AUXR = 0x8e;//辅助寄存器1
sfr TH1 = 0x8d;//定时器t1高8位寄存器
sfr TL1 = 0x8b;//定时器t1低8位寄存器
sbit TF0 = TCON^5;//定时器t0溢出标志位
sbit TR0 = TCON^4;//定时器t0运行控制位
sbit TF1 = TCON^7;//定时器t0运行控制位
sbit TR1 = TCON^6;//定时器t0运行控制位
sfr IE = 0xa8;//中断允许寄存器
sbit EA = IE^7;//总中断允许控制位 0屏蔽中断 1开放中断
sbit ET0 = IE^1;//定时器计数器1溢出允许中断位 0禁止t0中断 1允许t0中断
void delayms(int t);//延时函数声明
void Timer0_Init(void);//定时器0声明
void zhongduan_init(void){
EA = 1;//启用中断
ET0 = 1;//允许t0中断
}
int s=1;
void led_display(int n)
{
s=0;
while(s<1000){
p33=0;//cd4017开始计数
p55=1;//数码管负极,拉高不显示
switch (n) {
case 0:
if (s<600) {
p55 = 0;
}
break;
case 1:
if (s >100 && s < 300) {
p55 = 0;
}
break;
case 2:
if(s<200||(s>300&&s<500)||(s>600&&s<700)){
p55=0;
}
break;
case 3:
if((s>600&&s<700)||s<400){
p55=0;
}
break;
case 4:
if (s >100&&s<300||(s>500&&s<700)) {
p55 = 0;
}
else{
p55=1;
}
break;
case 5:
if (s < 100 || (s > 200 && s < 400) || (s > 500 && s < 700))
p55 = 0;
break;
case 6:
if (s<100||s >200&&s<700) {
p55 = 0;
}
else{
p55=1;
}
break;
case 7:
if (s<300) {
p55 = 0;
}
else{
p55=1;
}
break;
case 8:
if (s <700) {
p55 = 0;
}
else{
p55=1;
}
break;
case 9:
if (s<700&s >500||s<400) {
p55 = 0;
}
else{
p55=1;
}
break;
}
if (s!=0&&s%100==0){
p54=1; //cd4017计数加一
p54=!p54;
}
s++;
}
p33=1;//cd4017复位
}
/*
p55接数码管共阴极
p54接cd4017时钟输入端cp(14脚)
p33接cd4017复位清零CR(15脚)
p32红灯负极
p31绿灯负极
p30黄灯负极
*/
int x=0;
int number=1;
int c=0;
int led_c;
void main() {
P5M1 = 0x00;
P5M0 = 0xff;
p55=0;//p5.5端口低电平
p54 = 1;
P3M0 |= 0x0f;
P3M1 &= ~0x0f;
p30=1;
p31=1;
p32=1;
p33=1;//cd4017复位
EA = 1;//总中断控制位,启用中断
//启用定时器0中断
ET0 = 1;//允许t0中断
AUXR |= 0x80; //定时器时钟1T模式 t0不频 t1 12分频
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初始值 205
TH0 = 0xD4; //设置定时初始值 212
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
s=0;
delayms(1000);//延时
while(1){
led_c=1;//led 1红2绿3黄
while(led_c<=3){
switch(led_c){
case 1:
p32=0;
p31=1;
p30=1;
break;
case 2:
p32=1;
p31=0;
p30=1;
break;
case 3:
p32=1;
p31=1;
p30=0;
break;
}
number=0;//从0开始显示
while(number<=9){
led_display(number);
delayms(1);
c++;
if(c==50){
c=0;
number++;
}
}
led_c++;
}
}
}
void Timer0_Init(void) //定时器,1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初始值 205
TH0 = 0xD4; //设置定时初始值 212
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
// 等待定时器溢出
while (!TF0); // 等待TF0置位
// 停止定时器并清除溢出标志
TR0 = 0; // 停止定时器0
TF0 = 0; // 清除TF0标志
}
void delayms(int t){//延时函数
int i=0;
while(i<t){
Timer0_Init();
i++;
}
}